Skip to content

Commit 7d44c2b

Browse files
committed
[Volatile] Add a -enable-experimental-feature Volatile
1 parent e722fc7 commit 7d44c2b

File tree

7 files changed

+35
-11
lines changed

7 files changed

+35
-11
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -925,6 +925,9 @@ ERROR(cannot_import_embedded_module,none,
925925
ERROR(cannot_import_non_embedded_module,none,
926926
"module %0 cannot be imported in embedded Swift mode",
927927
(Identifier))
928+
ERROR(volatile_is_experimental,none,
929+
"importing _Volatile module requires '-enable-experimental-feature Volatile'", ())
930+
928931
ERROR(need_cxx_interop_to_import_module,none,
929932
"module %0 was built with C++ interoperability enabled, but "
930933
"current compilation does not enable C++ interoperability",

include/swift/Basic/Features.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,9 @@ EXPERIMENTAL_FEATURE(RawLayout, true)
317317
/// Enables the "embedded" swift mode (no runtime).
318318
EXPERIMENTAL_FEATURE(Embedded, true)
319319

320+
/// Enables importing the Volatile module
321+
EXPERIMENTAL_FEATURE(Volatile, true)
322+
320323
/// Enables noncopyable generics
321324
SUPPRESSIBLE_EXPERIMENTAL_FEATURE(NoncopyableGenerics, true)
322325

lib/AST/FeatureSet.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,7 @@ static bool usesFeatureRawLayout(Decl *decl) {
505505
}
506506

507507
UNINTERESTING_FEATURE(Embedded)
508+
UNINTERESTING_FEATURE(Volatile)
508509
UNINTERESTING_FEATURE(SuppressedAssociatedTypes)
509510

510511
static bool usesFeatureNoncopyableGenerics(Decl *decl) {

lib/Sema/ImportResolution.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,15 @@ ImportResolver::getModule(ImportPath::Module modulePath) {
397397
}
398398
}
399399

400+
// Only allow importing "Volatile" with Feature::Volatile or Feature::Embedded
401+
if (!ctx.LangOpts.hasFeature(Feature::Volatile) &&
402+
!ctx.LangOpts.hasFeature(Feature::Embedded)) {
403+
if (ctx.getRealModuleName(moduleID.Item).str() == "_Volatile") {
404+
ctx.Diags.diagnose(SourceLoc(), diag::volatile_is_experimental);
405+
return nullptr;
406+
}
407+
}
408+
400409
// If the imported module name is the same as the current module,
401410
// skip the Swift module loader and use the Clang module loader instead.
402411
// This allows a Swift module to extend a Clang module of the same name.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: not %target-swift-emit-ir %s -module-name main -parse-as-library 2>&1 | %FileCheck %s
3+
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -enable-experimental-feature Volatile
4+
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -enable-experimental-feature Embedded
5+
6+
import _Volatile
7+
8+
// CHECK: importing _Volatile module requires '-enable-experimental-feature Volatile'

test/Volatile/volatile-ir.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// RUN: %empty-directory(%t)
2-
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -Onone | %FileCheck %s
3-
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -O | %FileCheck %s
4-
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -Osize | %FileCheck %s
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
55

66
import _Volatile
77

88
public func test_uint8() -> UInt8 {
9-
let p = VolatileMappedRegister<UInt8>(bitPattern: 0xf000baaa)
9+
let p = VolatileMappedRegister<UInt8>(unsafeBitPattern: 0xf000baaa)
1010
p.store(42)
1111
return p.load()
1212
}
@@ -18,7 +18,7 @@ public func test_uint8() -> UInt8 {
1818
// CHECK: }
1919

2020
public func test_uint16() -> UInt16 {
21-
let p = VolatileMappedRegister<UInt16>(bitPattern: 0xf000baaa)
21+
let p = VolatileMappedRegister<UInt16>(unsafeBitPattern: 0xf000baaa)
2222
p.store(42)
2323
return p.load()
2424
}
@@ -30,7 +30,7 @@ public func test_uint16() -> UInt16 {
3030
// CHECK: }
3131

3232
public func test_uint32() -> UInt32 {
33-
let p = VolatileMappedRegister<UInt32>(bitPattern: 0xf000baaa)
33+
let p = VolatileMappedRegister<UInt32>(unsafeBitPattern: 0xf000baaa)
3434
p.store(42)
3535
return p.load()
3636
}
@@ -42,7 +42,7 @@ public func test_uint32() -> UInt32 {
4242
// CHECK: }
4343

4444
public func test_uint64() -> UInt64 {
45-
let p = VolatileMappedRegister<UInt64>(bitPattern: 0xf000baaa)
45+
let p = VolatileMappedRegister<UInt64>(unsafeBitPattern: 0xf000baaa)
4646
p.store(42)
4747
return p.load()
4848
}

test/Volatile/volatile-repeat-loads.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// RUN: %empty-directory(%t)
2-
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -Onone | %FileCheck %s
3-
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -O | %FileCheck %s
4-
// RUN: %target-swift-emit-ir %s -module-name main -parse-as-library -Osize | %FileCheck %s
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
55

66
import _Volatile
77

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

0 commit comments

Comments
 (0)