Skip to content

Commit 294342a

Browse files
drexinxwu
andauthored
Add _pointerBitWidth platform condition (#41534)
* Add _pointerBitWidth platform condition * Fixes after rebasing --------- Co-authored-by: Xiaodi Wu <[email protected]>
1 parent aee9da5 commit 294342a

25 files changed

+66
-27
lines changed

include/swift/AST/PlatformConditionKinds.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ PLATFORM_CONDITION(Arch, "arch")
3131
/// The active endianness target (big or little)
3232
PLATFORM_CONDITION_(Endianness, "endian")
3333

34+
/// The active arch target pointer bit width (_32 or _64)
35+
PLATFORM_CONDITION_(PointerBitWidth, "pointerBitWidth")
36+
3437
/// Runtime support (_ObjC or _Native)
3538
PLATFORM_CONDITION_(Runtime, "runtime")
3639

lib/Basic/LangOptions.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ static const SupportedConditionalValue SupportedConditionalCompilationEndianness
8484
"big"
8585
};
8686

87+
static const SupportedConditionalValue SupportedConditionalCompilationPointerBitWidths[] = {
88+
"_32",
89+
"_64"
90+
};
91+
8792
static const SupportedConditionalValue SupportedConditionalCompilationRuntimes[] = {
8893
"_ObjC",
8994
"_Native",
@@ -114,6 +119,8 @@ ArrayRef<SupportedConditionalValue> getSupportedConditionalCompilationValues(con
114119
return SupportedConditionalCompilationArches;
115120
case PlatformConditionKind::Endianness:
116121
return SupportedConditionalCompilationEndianness;
122+
case PlatformConditionKind::PointerBitWidth:
123+
return SupportedConditionalCompilationPointerBitWidths;
117124
case PlatformConditionKind::Runtime:
118125
return SupportedConditionalCompilationRuntimes;
119126
case PlatformConditionKind::CanImport:
@@ -181,6 +188,7 @@ checkPlatformConditionSupported(PlatformConditionKind Kind, StringRef Value,
181188
case PlatformConditionKind::OS:
182189
case PlatformConditionKind::Arch:
183190
case PlatformConditionKind::Endianness:
191+
case PlatformConditionKind::PointerBitWidth:
184192
case PlatformConditionKind::Runtime:
185193
case PlatformConditionKind::TargetEnvironment:
186194
case PlatformConditionKind::PtrAuth:
@@ -405,6 +413,25 @@ std::pair<bool, bool> LangOptions::setTarget(llvm::Triple triple) {
405413
break;
406414
}
407415

416+
// Set the "_pointerBitWidth" platform condition.
417+
switch (Target.getArch()) {
418+
default: llvm_unreachable("undefined architecture pointer bit width");
419+
case llvm::Triple::ArchType::arm:
420+
case llvm::Triple::ArchType::thumb:
421+
case llvm::Triple::ArchType::aarch64_32:
422+
case llvm::Triple::ArchType::x86:
423+
case llvm::Triple::ArchType::wasm32:
424+
addPlatformConditionValue(PlatformConditionKind::PointerBitWidth, "_32");
425+
break;
426+
case llvm::Triple::ArchType::aarch64:
427+
case llvm::Triple::ArchType::ppc64:
428+
case llvm::Triple::ArchType::ppc64le:
429+
case llvm::Triple::ArchType::x86_64:
430+
case llvm::Triple::ArchType::systemz:
431+
addPlatformConditionValue(PlatformConditionKind::PointerBitWidth, "_64");
432+
break;
433+
}
434+
408435
// Set the "runtime" platform condition.
409436
addPlatformConditionValue(PlatformConditionKind::Runtime,
410437
EnableObjCInterop ? "_ObjC" : "_Native");

lib/Parse/ParseIfConfig.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ class ValidateIfConfigCondition :
378378
return E;
379379
}
380380

381-
// ( 'os' | 'arch' | '_endian' | '_runtime' ) '(' identifier ')''
381+
// ( 'os' | 'arch' | '_endian' | '_pointerBitWidth' | '_runtime' ) '(' identifier ')''
382382
auto Kind = getPlatformConditionKind(*KindName);
383383
if (!Kind.has_value()) {
384384
D.diagnose(E->getLoc(), diag::unsupported_platform_condition_expression);
@@ -412,6 +412,8 @@ class ValidateIfConfigCondition :
412412
DiagName = "architecture"; break;
413413
case PlatformConditionKind::Endianness:
414414
DiagName = "endianness"; break;
415+
case PlatformConditionKind::PointerBitWidth:
416+
DiagName = "pointer bit width"; break;
415417
case PlatformConditionKind::CanImport:
416418
DiagName = "import conditional"; break;
417419
case PlatformConditionKind::TargetEnvironment:

test/Parse/ConditionalCompilation/aarch64AndroidTarget.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let i: Int = "Hello"
88
#endif
99

10-
#if arch(arm64) && os(Android) && _runtime(_Native) && _endian(little)
10+
#if arch(arm64) && os(Android) && _runtime(_Native) && _endian(little) && _pointerBitWidth(_64)
1111
class C {}
1212
var x = C()
1313
#endif

test/Parse/ConditionalCompilation/arm64AppleTVOSTarget.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let i: Int = "Hello"
88
#endif
99

10-
#if arch(arm64) && os(tvOS) && _runtime(_ObjC) && _endian(little)
10+
#if arch(arm64) && os(tvOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_64)
1111
class C {}
1212
var x = C()
1313
#endif

test/Parse/ConditionalCompilation/arm64IOSTarget.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let i: Int = "Hello"
88
#endif
99

10-
#if arch(arm64) && os(iOS) && _runtime(_ObjC) && _endian(little)
10+
#if arch(arm64) && os(iOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_64)
1111
class C {}
1212
var x = C()
1313
#endif

test/Parse/ConditionalCompilation/armAndroidTarget.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let i: Int = "Hello"
88
#endif
99

10-
#if arch(arm) && os(Android) && _runtime(_Native) && _endian(little)
10+
#if arch(arm) && os(Android) && _runtime(_Native) && _endian(little) && _pointerBitWidth(_32)
1111
class C {}
1212
var x = C()
1313
#endif

test/Parse/ConditionalCompilation/armIOSTarget.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let i: Int = "Hello"
88
#endif
99

10-
#if arch(arm) && os(iOS) && _runtime(_ObjC) && _endian(little)
10+
#if arch(arm) && os(iOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_32)
1111
class C {}
1212
var x = C()
1313
#endif

test/Parse/ConditionalCompilation/armWatchOSTarget.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let i: Int = "Hello"
88
#endif
99

10-
#if arch(arm) && os(watchOS) && _runtime(_ObjC) && _endian(little)
10+
#if arch(arm) && os(watchOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_32)
1111
class C {}
1212
var x = C()
1313
#endif

test/Parse/ConditionalCompilation/i386AppleTVOSTarget.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let i: Int = "Hello"
88
#endif
99

10-
#if arch(i386) && os(tvOS) && _runtime(_ObjC) && _endian(little)
10+
#if arch(i386) && os(tvOS) && _runtime(_ObjC) && _endian(little) && _pointerBitWidth(_32)
1111
class C {}
1212
var x = C()
1313
#endif

0 commit comments

Comments
 (0)