Skip to content

Commit 1c66aea

Browse files
committed
[Volatile] Mark VolatileMappedRegister as @Frozen, transparent init, allow NULL pointer
1 parent 7d44c2b commit 1c66aea

File tree

5 files changed

+89
-12
lines changed

5 files changed

+89
-12
lines changed

stdlib/public/Volatile/Volatile.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,14 @@ import Swift
2323
/// or reordered with other volatile operations by the compiler. They may be
2424
/// reordered with non-volatile operations. For details, see
2525
/// <https://llvm.org/docs/LangRef.html#volatile-memory-accesses>.
26+
@frozen
2627
public struct VolatileMappedRegister<Pointee> {
27-
public var _rawPointer: Builtin.RawPointer
28+
@usableFromInline
29+
let _rawPointer: Builtin.RawPointer
30+
31+
@_transparent
2832
public init(unsafeBitPattern: UInt) {
29-
_rawPointer = UnsafeRawPointer(bitPattern: unsafeBitPattern)!._rawValue
33+
self._rawPointer = Builtin.inttoptr_Word(unsafeBitPattern._builtinWordValue)
3034
}
3135
}
3236

test/Volatile/volatile-ir.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
import _Volatile
77

88
public func test_uint8() -> UInt8 {
9-
let p = VolatileMappedRegister<UInt8>(unsafeBitPattern: 0xf000baaa)
9+
let p = VolatileMappedRegister<UInt8>(unsafeBitPattern: 0xf000baa9)
1010
p.store(42)
1111
return p.load()
1212
}
1313

1414
// CHECK: define {{.*}}i8 @"$s4main10test_uint8s5UInt8VyF"()
15-
// CHECK: store atomic volatile i8 42, ptr %3 monotonic, align 1
16-
// CHECK: [[RET:%.*]] = load atomic volatile i8, ptr %4 monotonic, align 1
15+
// CHECK: store atomic volatile i8 42, ptr {{.*}} monotonic, align 1
16+
// CHECK: [[RET:%.*]] = load atomic volatile i8, ptr {{.*}} monotonic, align 1
1717
// CHECK: ret i8 [[RET]]
1818
// CHECK: }
1919

@@ -24,8 +24,8 @@ public func test_uint16() -> UInt16 {
2424
}
2525

2626
// CHECK: define {{.*}}i16 @"$s4main11test_uint16s6UInt16VyF"()
27-
// CHECK: store atomic volatile i16 42, ptr %3 monotonic, align 2
28-
// CHECK: [[RET:%.*]] = load atomic volatile i16, ptr %4 monotonic, align 2
27+
// CHECK: store atomic volatile i16 42, ptr {{.*}} monotonic, align 2
28+
// CHECK: [[RET:%.*]] = load atomic volatile i16, ptr {{.*}} monotonic, align 2
2929
// CHECK: ret i16 [[RET]]
3030
// CHECK: }
3131

@@ -36,8 +36,8 @@ public func test_uint32() -> UInt32 {
3636
}
3737

3838
// CHECK: define {{.*}}i32 @"$s4main11test_uint32s6UInt32VyF"()
39-
// CHECK: store atomic volatile i32 42, ptr %3 monotonic, align 4
40-
// CHECK: [[RET:%.*]] = load atomic volatile i32, ptr %4 monotonic, align 4
39+
// CHECK: store atomic volatile i32 42, ptr {{.*}} monotonic, align 4
40+
// CHECK: [[RET:%.*]] = load atomic volatile i32, ptr {{.*}} monotonic, align 4
4141
// CHECK: ret i32 [[RET]]
4242
// CHECK: }
4343

@@ -48,7 +48,7 @@ public func test_uint64() -> UInt64 {
4848
}
4949

5050
// CHECK: define {{.*}}i64 @"$s4main11test_uint64s6UInt64VyF"()
51-
// CHECK: store atomic volatile i64 42, ptr %3 monotonic, align 8
52-
// CHECK: [[RET:%.*]] = load atomic volatile i64, ptr %4 monotonic, align 8
51+
// CHECK: store atomic volatile i64 42, ptr {{.*}} monotonic, align 8
52+
// CHECK: [[RET:%.*]] = load atomic volatile i64, ptr {{.*}} monotonic, align 8
5353
// CHECK: ret i64 [[RET]]
5454
// CHECK: }

test/Volatile/volatile-null.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -enable-experimental-feature Volatile -Onone | %FileCheck %s
3+
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -enable-experimental-feature Volatile -O | %FileCheck %s
4+
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -enable-experimental-feature Volatile -Osize | %FileCheck %s
5+
6+
import _Volatile
7+
8+
public func test_volatilepointer() {
9+
let p = VolatileMappedRegister<UInt8>(unsafeBitPattern: 0)
10+
p.store(42)
11+
}
12+
13+
// CHECK: define {{.*}}void @"$s4main20test_volatilepointeryyF"()
14+
// CHECK: store atomic volatile i8 42, ptr null monotonic, align {{.*}}
15+
// CHECK: ret void
16+
// CHECK: }

test/Volatile/volatile-repeat-loads.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import _Volatile
77

88
public func test_volatilepointer() -> UInt8 {
9-
let p = VolatileMappedRegister<UInt8>(unsafeBitPattern: 0xf000baaa)
9+
let p = VolatileMappedRegister<UInt8>(unsafeBitPattern: 0xf000baa9)
1010
p.store(42)
1111
let a = p.load()
1212
let b = p.load()

test/embedded/volatile-ir.swift

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -enable-experimental-feature Embedded -Onone | %FileCheck %s
3+
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -enable-experimental-feature Embedded -O | %FileCheck %s
4+
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -enable-experimental-feature Embedded -Osize | %FileCheck %s
5+
6+
// REQUIRES: swift_in_compiler
7+
// REQUIRES: OS=macosx || OS=linux-gnu
8+
9+
import _Volatile
10+
11+
public func test_uint8() -> UInt8 {
12+
let p = VolatileMappedRegister<UInt8>(unsafeBitPattern: 0xf000baa9)
13+
p.store(42)
14+
return p.load()
15+
}
16+
17+
// CHECK: define {{.*}}i8 @"$s4main10test_uint8s5UInt8VyF"()
18+
// CHECK: store atomic volatile i8 42, ptr inttoptr (i64 4026579625 to ptr) monotonic, align 1
19+
// CHECK: [[RET:%.*]] = load atomic volatile i8, ptr inttoptr (i64 4026579625 to ptr) monotonic, align 1
20+
// CHECK: ret i8 [[RET]]
21+
// CHECK: }
22+
23+
public func test_uint16() -> UInt16 {
24+
let p = VolatileMappedRegister<UInt16>(unsafeBitPattern: 0xf000baaa)
25+
p.store(42)
26+
return p.load()
27+
}
28+
29+
// CHECK: define {{.*}}i16 @"$s4main11test_uint16s6UInt16VyF"()
30+
// CHECK: store atomic volatile i16 42, ptr inttoptr (i64 4026579626 to ptr) monotonic, align 2
31+
// CHECK: [[RET:%.*]] = load atomic volatile i16, ptr inttoptr (i64 4026579626 to ptr) monotonic, align 2
32+
// CHECK: ret i16 [[RET]]
33+
// CHECK: }
34+
35+
public func test_uint32() -> UInt32 {
36+
let p = VolatileMappedRegister<UInt32>(unsafeBitPattern: 0xf000baaa)
37+
p.store(42)
38+
return p.load()
39+
}
40+
41+
// CHECK: define {{.*}}i32 @"$s4main11test_uint32s6UInt32VyF"()
42+
// CHECK: store atomic volatile i32 42, ptr inttoptr (i64 4026579626 to ptr) monotonic, align 4
43+
// CHECK: [[RET:%.*]] = load atomic volatile i32, ptr inttoptr (i64 4026579626 to ptr) monotonic, align 4
44+
// CHECK: ret i32 [[RET]]
45+
// CHECK: }
46+
47+
public func test_uint64() -> UInt64 {
48+
let p = VolatileMappedRegister<UInt64>(unsafeBitPattern: 0xf000baaa)
49+
p.store(42)
50+
return p.load()
51+
}
52+
53+
// CHECK: define {{.*}}i64 @"$s4main11test_uint64s6UInt64VyF"()
54+
// CHECK: store atomic volatile i64 42, ptr inttoptr (i64 4026579626 to ptr) monotonic, align 8
55+
// CHECK: [[RET:%.*]] = load atomic volatile i64, ptr inttoptr (i64 4026579626 to ptr) monotonic, align 8
56+
// CHECK: ret i64 [[RET]]
57+
// CHECK: }

0 commit comments

Comments
 (0)