diff --git a/include/swift/AST/PlatformConditionKinds.def b/include/swift/AST/PlatformConditionKinds.def index 147e74359ff2a..75d7491345b68 100644 --- a/include/swift/AST/PlatformConditionKinds.def +++ b/include/swift/AST/PlatformConditionKinds.def @@ -31,6 +31,9 @@ PLATFORM_CONDITION(Arch, "arch") /// The active endianness target (big or little) PLATFORM_CONDITION_(Endianness, "endian") +/// The active arch target pointer bit width (_32 or _64) +PLATFORM_CONDITION_(PointerBitWidth, "pointerBitWidth") + /// Runtime support (_ObjC or _Native) PLATFORM_CONDITION_(Runtime, "runtime") diff --git a/lib/Basic/LangOptions.cpp b/lib/Basic/LangOptions.cpp index 4b0c4c1ba7b6d..48595776a27d7 100644 --- a/lib/Basic/LangOptions.cpp +++ b/lib/Basic/LangOptions.cpp @@ -84,6 +84,11 @@ static const SupportedConditionalValue SupportedConditionalCompilationEndianness "big" }; +static const SupportedConditionalValue SupportedConditionalCompilationPointerBitWidths[] = { + "_32", + "_64" +}; + static const SupportedConditionalValue SupportedConditionalCompilationRuntimes[] = { "_ObjC", "_Native", @@ -114,6 +119,8 @@ ArrayRef getSupportedConditionalCompilationValues(con return SupportedConditionalCompilationArches; case PlatformConditionKind::Endianness: return SupportedConditionalCompilationEndianness; + case PlatformConditionKind::PointerBitWidth: + return SupportedConditionalCompilationPointerBitWidths; case PlatformConditionKind::Runtime: return SupportedConditionalCompilationRuntimes; case PlatformConditionKind::CanImport: @@ -181,6 +188,7 @@ checkPlatformConditionSupported(PlatformConditionKind Kind, StringRef Value, case PlatformConditionKind::OS: case PlatformConditionKind::Arch: case PlatformConditionKind::Endianness: + case PlatformConditionKind::PointerBitWidth: case PlatformConditionKind::Runtime: case PlatformConditionKind::TargetEnvironment: case PlatformConditionKind::PtrAuth: @@ -405,6 +413,25 @@ std::pair LangOptions::setTarget(llvm::Triple triple) { break; } + // Set the "_pointerBitWidth" platform condition. + switch (Target.getArch()) { + default: llvm_unreachable("undefined architecture pointer bit width"); + case llvm::Triple::ArchType::arm: + case llvm::Triple::ArchType::thumb: + case llvm::Triple::ArchType::aarch64_32: + case llvm::Triple::ArchType::x86: + case llvm::Triple::ArchType::wasm32: + addPlatformConditionValue(PlatformConditionKind::PointerBitWidth, "_32"); + break; + case llvm::Triple::ArchType::aarch64: + case llvm::Triple::ArchType::ppc64: + case llvm::Triple::ArchType::ppc64le: + case llvm::Triple::ArchType::x86_64: + case llvm::Triple::ArchType::systemz: + addPlatformConditionValue(PlatformConditionKind::PointerBitWidth, "_64"); + break; + } + // Set the "runtime" platform condition. addPlatformConditionValue(PlatformConditionKind::Runtime, EnableObjCInterop ? "_ObjC" : "_Native"); diff --git a/lib/Parse/ParseIfConfig.cpp b/lib/Parse/ParseIfConfig.cpp index 392e94afb4f40..5f9edcb704d18 100644 --- a/lib/Parse/ParseIfConfig.cpp +++ b/lib/Parse/ParseIfConfig.cpp @@ -378,7 +378,7 @@ class ValidateIfConfigCondition : return E; } - // ( 'os' | 'arch' | '_endian' | '_runtime' ) '(' identifier ')'' + // ( 'os' | 'arch' | '_endian' | '_pointerBitWidth' | '_runtime' ) '(' identifier ')'' auto Kind = getPlatformConditionKind(*KindName); if (!Kind.has_value()) { D.diagnose(E->getLoc(), diag::unsupported_platform_condition_expression); @@ -412,6 +412,8 @@ class ValidateIfConfigCondition : DiagName = "architecture"; break; case PlatformConditionKind::Endianness: DiagName = "endianness"; break; + case PlatformConditionKind::PointerBitWidth: + DiagName = "pointer bit width"; break; case PlatformConditionKind::CanImport: DiagName = "import conditional"; break; case PlatformConditionKind::TargetEnvironment: diff --git a/test/Parse/ConditionalCompilation/aarch64AndroidTarget.swift b/test/Parse/ConditionalCompilation/aarch64AndroidTarget.swift index ca5f3a7af7075..275d1d2f4521c 100644 --- a/test/Parse/ConditionalCompilation/aarch64AndroidTarget.swift +++ b/test/Parse/ConditionalCompilation/aarch64AndroidTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(arm64) && os(Android) && _runtime(_Native) && _endian(little) +#if arch(arm64) && os(Android) && _runtime(_Native) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/arm64AppleTVOSTarget.swift b/test/Parse/ConditionalCompilation/arm64AppleTVOSTarget.swift index 00852964bab76..a9a614b86063c 100644 --- a/test/Parse/ConditionalCompilation/arm64AppleTVOSTarget.swift +++ b/test/Parse/ConditionalCompilation/arm64AppleTVOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(arm64) && os(tvOS) && _runtime(_ObjC) && _endian(little) +#if arch(arm64) && os(tvOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/arm64IOSTarget.swift b/test/Parse/ConditionalCompilation/arm64IOSTarget.swift index 70006c484b724..f1a8febd5fdfe 100644 --- a/test/Parse/ConditionalCompilation/arm64IOSTarget.swift +++ b/test/Parse/ConditionalCompilation/arm64IOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(arm64) && os(iOS) && _runtime(_ObjC) && _endian(little) +#if arch(arm64) && os(iOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/armAndroidTarget.swift b/test/Parse/ConditionalCompilation/armAndroidTarget.swift index 5372b7416deed..835e2856fdf35 100644 --- a/test/Parse/ConditionalCompilation/armAndroidTarget.swift +++ b/test/Parse/ConditionalCompilation/armAndroidTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(arm) && os(Android) && _runtime(_Native) && _endian(little) +#if arch(arm) && os(Android) && _runtime(_Native) && _endian(little) && _pointerBitWidth(_32) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/armIOSTarget.swift b/test/Parse/ConditionalCompilation/armIOSTarget.swift index 90ab40d6d7021..6d515b4edb3b6 100644 --- a/test/Parse/ConditionalCompilation/armIOSTarget.swift +++ b/test/Parse/ConditionalCompilation/armIOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(arm) && os(iOS) && _runtime(_ObjC) && _endian(little) +#if arch(arm) && os(iOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_32) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/armWatchOSTarget.swift b/test/Parse/ConditionalCompilation/armWatchOSTarget.swift index ef0d23e6e152e..56e51ff687e2f 100644 --- a/test/Parse/ConditionalCompilation/armWatchOSTarget.swift +++ b/test/Parse/ConditionalCompilation/armWatchOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(arm) && os(watchOS) && _runtime(_ObjC) && _endian(little) +#if arch(arm) && os(watchOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_32) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/i386AppleTVOSTarget.swift b/test/Parse/ConditionalCompilation/i386AppleTVOSTarget.swift index 310ee6704e824..2e1d1f1bd8873 100644 --- a/test/Parse/ConditionalCompilation/i386AppleTVOSTarget.swift +++ b/test/Parse/ConditionalCompilation/i386AppleTVOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(i386) && os(tvOS) && _runtime(_ObjC) && _endian(little) +#if arch(i386) && os(tvOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_32) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/i386IOSTarget.swift b/test/Parse/ConditionalCompilation/i386IOSTarget.swift index 714291c79a99f..072288714df6a 100644 --- a/test/Parse/ConditionalCompilation/i386IOSTarget.swift +++ b/test/Parse/ConditionalCompilation/i386IOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(i386) && os(iOS) && _runtime(_ObjC) && _endian(little) +#if arch(i386) && os(iOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_32) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/i386WatchOSTarget.swift b/test/Parse/ConditionalCompilation/i386WatchOSTarget.swift index 91303a92416fb..e7e1c5d4b87b1 100644 --- a/test/Parse/ConditionalCompilation/i386WatchOSTarget.swift +++ b/test/Parse/ConditionalCompilation/i386WatchOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(i386) && os(watchOS) && _runtime(_ObjC) && _endian(little) +#if arch(i386) && os(watchOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_32) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/identifierName.swift b/test/Parse/ConditionalCompilation/identifierName.swift index ca20cf9b08a20..2335b313ce798 100644 --- a/test/Parse/ConditionalCompilation/identifierName.swift +++ b/test/Parse/ConditionalCompilation/identifierName.swift @@ -5,10 +5,11 @@ func f2( FOO: Int, swift: Int, _compiler_version: Int, - os: Int, arch: Int, _endian: Int, _runtime: Int, + os: Int, arch: Int, _endian: Int, _pointerBitWidth: Int, _runtime: Int, targetEnvironment: Int, arm: Int, i386: Int, macOS: Int, OSX: Int, Linux: Int, big: Int, little: Int, + _32: Int, _64: Int, _ObjC: Int, _Native: Int, simulator: Int ) { @@ -21,6 +22,8 @@ func f2( _ = arch + i386 + arm #elseif _endian(big) && _endian(little) _ = _endian + big + little +#elseif _pointerBitWidth(_32) && _pointerBitWidth(_64) + _ = _pointerBitWidth + _32 + _64 #elseif _runtime(_ObjC) && _runtime(_Native) _ = _runtime + _ObjC + _Native #elseif targetEnvironment(simulator) @@ -34,10 +37,11 @@ func f2( func f2() { let FOO = 1, swift = 1, _compiler_version = 1, - os = 1, arch = 1, _endian = 1, _runtime = 1, + os = 1, arch = 1, _endian = 1, _pointerBitWidth = 1, _runtime = 1, targetEnvironment = 1, arm = 1, i386 = 1, macOS = 1, OSX = 1, Linux = 1, big = 1, little = 1, + _32 = 1, _64 = 1, _ObjC = 1, _Native = 1, simulator = 1 @@ -49,6 +53,8 @@ func f2() { _ = arch + i386 + arm #elseif _endian(big) && _endian(little) _ = _endian + big + little +#elseif _pointerBitWidth(_32) && _pointerBitWidth(_64) + _ = _pointerBitWidth + _32 + _64 #elseif _runtime(_ObjC) && _runtime(_Native) _ = _runtime + _ObjC + _Native #elseif targetEnvironment(simulator) @@ -62,10 +68,11 @@ func f2() { struct S { let FOO = 1, swift = 1, _compiler_version = 1, - os = 1, arch = 1, _endian = 1, _runtime = 1, + os = 1, arch = 1, _endian = 1, _pointerBitWidth = 1, _runtime = 1, targetEnvironment = 1, arm = 1, i386 = 1, macOS = 1, OSX = 1, Linux = 1, big = 1, little = 1, + _32 = 1, _64 = 1, _ObjC = 1, _Native = 1, simulator = 1 @@ -73,6 +80,7 @@ struct S { #elseif os(macOS) && os(OSX) && os(Linux) #elseif arch(i386) && arch(arm) #elseif _endian(big) && _endian(little) +#elseif _pointerBitWidth(_32) && _pointerBitWidth(_64) #elseif _runtime(_ObjC) && _runtime(_Native) #elseif targetEnvironment(simulator) #elseif swift(>=1.0) && _compiler_version("4.*.0") diff --git a/test/Parse/ConditionalCompilation/powerpc64LinuxTarget.swift b/test/Parse/ConditionalCompilation/powerpc64LinuxTarget.swift index cac8c0714fcc1..a8a78c78cf37e 100644 --- a/test/Parse/ConditionalCompilation/powerpc64LinuxTarget.swift +++ b/test/Parse/ConditionalCompilation/powerpc64LinuxTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -typecheck %s -verify -target powerpc64-unknown-linux-gnu -disable-objc-interop -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target powerpc64-unknown-linux-gnu -#if arch(powerpc64) && os(Linux) && _runtime(_Native) && _endian(big) +#if arch(powerpc64) && os(Linux) && _runtime(_Native) && _endian(big) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/powerpc64leLinuxTarget.swift b/test/Parse/ConditionalCompilation/powerpc64leLinuxTarget.swift index 406c2ab586dc3..3a44535d072a7 100644 --- a/test/Parse/ConditionalCompilation/powerpc64leLinuxTarget.swift +++ b/test/Parse/ConditionalCompilation/powerpc64leLinuxTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -typecheck %s -verify -target powerpc64le-unknown-linux-gnu -disable-objc-interop -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target powerpc64le-unknown-linux-gnu -#if arch(powerpc64le) && os(Linux) && _runtime(_Native) && _endian(little) +#if arch(powerpc64le) && os(Linux) && _runtime(_Native) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/s390xLinuxTarget.swift b/test/Parse/ConditionalCompilation/s390xLinuxTarget.swift index b5cb6f7d6adf8..5d81f205fde5c 100644 --- a/test/Parse/ConditionalCompilation/s390xLinuxTarget.swift +++ b/test/Parse/ConditionalCompilation/s390xLinuxTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -typecheck %s -verify -target s390x-unknown-linux-gnu -disable-objc-interop -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target s390x-unknown-linux-gnu -#if arch(s390x) && os(Linux) && _runtime(_Native) && _endian(big) +#if arch(s390x) && os(Linux) && _runtime(_Native) && _endian(big) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/wasm32Target.swift b/test/Parse/ConditionalCompilation/wasm32Target.swift index 96e173ee4259f..a07f214642f07 100644 --- a/test/Parse/ConditionalCompilation/wasm32Target.swift +++ b/test/Parse/ConditionalCompilation/wasm32Target.swift @@ -1,7 +1,7 @@ // RUN: %swift -typecheck %s -verify -target wasm32-unknown-wasi -disable-objc-interop -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename %s -target wasm32-unknown-wasi -#if arch(wasm32) && os(WASI) && _runtime(_Native) && _endian(little) +#if arch(wasm32) && os(WASI) && _runtime(_Native) && _endian(little) && _pointerBitWidth(_32) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x64AppleTVOSTarget.swift b/test/Parse/ConditionalCompilation/x64AppleTVOSTarget.swift index 5d66a3e0becf6..18efbed451547 100644 --- a/test/Parse/ConditionalCompilation/x64AppleTVOSTarget.swift +++ b/test/Parse/ConditionalCompilation/x64AppleTVOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(x86_64) && os(tvOS) && _runtime(_ObjC) && _endian(little) +#if arch(x86_64) && os(tvOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x64CygwinTarget.swift b/test/Parse/ConditionalCompilation/x64CygwinTarget.swift index f70986503eb96..2d9ac6d6e7846 100644 --- a/test/Parse/ConditionalCompilation/x64CygwinTarget.swift +++ b/test/Parse/ConditionalCompilation/x64CygwinTarget.swift @@ -1,7 +1,6 @@ // RUN: %swift -typecheck %s -verify -target x86_64-unknown-windows-cygnus -disable-objc-interop -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target x86_64-unknown-windows-cygnus - -#if arch(x86_64) && os(Cygwin) && _runtime(_Native) && _endian(little) +#if arch(x86_64) && os(Cygwin) && _runtime(_Native) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x64FreeBSDTarget.swift b/test/Parse/ConditionalCompilation/x64FreeBSDTarget.swift index 6bbac73f13194..0a54a5650435b 100644 --- a/test/Parse/ConditionalCompilation/x64FreeBSDTarget.swift +++ b/test/Parse/ConditionalCompilation/x64FreeBSDTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -typecheck %s -verify -target x86_64-unknown-freebsd10 -disable-objc-interop -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target x86_64-unknown-freebsd10 -#if arch(x86_64) && os(FreeBSD) && _runtime(_Native) && _endian(little) +#if arch(x86_64) && os(FreeBSD) && _runtime(_Native) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x64IOSTarget.swift b/test/Parse/ConditionalCompilation/x64IOSTarget.swift index 8e5de16089de9..0d0c79091c67d 100644 --- a/test/Parse/ConditionalCompilation/x64IOSTarget.swift +++ b/test/Parse/ConditionalCompilation/x64IOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(x86_64) && os(iOS) && _runtime(_ObjC) && _endian(little) +#if arch(x86_64) && os(iOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x64LinuxTarget.swift b/test/Parse/ConditionalCompilation/x64LinuxTarget.swift index 7d66db0395517..337d0d72bb054 100644 --- a/test/Parse/ConditionalCompilation/x64LinuxTarget.swift +++ b/test/Parse/ConditionalCompilation/x64LinuxTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -typecheck %s -verify -target x86_64-unknown-linux-gnu -disable-objc-interop -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target x86_64-unknown-linux-gnu -#if arch(x86_64) && os(Linux) && _runtime(_Native) && _endian(little) +#if arch(x86_64) && os(Linux) && _runtime(_Native) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x64OSXTarget.swift b/test/Parse/ConditionalCompilation/x64OSXTarget.swift index eb9ffff0d47d6..8aeb0b03c76d6 100644 --- a/test/Parse/ConditionalCompilation/x64OSXTarget.swift +++ b/test/Parse/ConditionalCompilation/x64OSXTarget.swift @@ -1,14 +1,14 @@ // RUN: %swift -typecheck %s -verify -target x86_64-apple-macosx10.9 -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target x86_64-apple-macosx10.9 -#if arch(x86_64) && os(OSX) && _runtime(_ObjC) && _endian(little) +#if arch(x86_64) && os(OSX) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif var y = x -#if arch(x86_64) && os(macOS) && _runtime(_ObjC) && _endian(little) +#if arch(x86_64) && os(macOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_64) class CC {} var xx = CC() #endif diff --git a/test/Parse/ConditionalCompilation/x64WindowsTarget.swift b/test/Parse/ConditionalCompilation/x64WindowsTarget.swift index 9ca49e724bc30..36739552e8b14 100644 --- a/test/Parse/ConditionalCompilation/x64WindowsTarget.swift +++ b/test/Parse/ConditionalCompilation/x64WindowsTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -typecheck %s -verify -target x86_64-unknown-windows-msvc -disable-objc-interop -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target x86_64-unknown-windows-msvc -#if arch(x86_64) && os(Windows) && _runtime(_Native) && _endian(little) +#if arch(x86_64) && os(Windows) && _runtime(_Native) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x86_64PS4Target.swift b/test/Parse/ConditionalCompilation/x86_64PS4Target.swift index 4c1c80970351c..77d2b1d635605 100644 --- a/test/Parse/ConditionalCompilation/x86_64PS4Target.swift +++ b/test/Parse/ConditionalCompilation/x86_64PS4Target.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(x86_64) && os(PS4) && _runtime(_Native) && _endian(little) +#if arch(x86_64) && os(PS4) && _runtime(_Native) && _endian(little) && _pointerBitWidth(_64) class C {} var x = C() #endif