Skip to content

Commit 942b0e8

Browse files
authored
The concurrency compat library should not be unconditionally used in arm64e builds (swiftlang#39385)
1 parent fef225c commit 942b0e8

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

lib/Basic/Platform.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -370,44 +370,56 @@ Optional<llvm::VersionTuple>
370370
swift::getSwiftRuntimeCompatibilityVersionForTarget(
371371
const llvm::Triple &Triple) {
372372
unsigned Major, Minor, Micro;
373-
374-
if (Triple.getArchName() == "arm64e")
375-
return llvm::VersionTuple(5, 3);
373+
#define MAX(a, b) ((a) > (b) ? (a) : (b))
376374

377375
if (Triple.isMacOSX()) {
378376
Triple.getMacOSXVersion(Major, Minor, Micro);
377+
378+
auto floorFor64e = [&Triple](llvm::VersionTuple v) {
379+
if (Triple.getArchName() != "arm64e") return v;
380+
// macOS got first arm64e support in 11.0, i.e. VersionTuple(5, 3)
381+
return MAX(v, llvm::VersionTuple(5, 3));
382+
};
383+
379384
if (Major == 10) {
380385
if (Triple.isAArch64() && Minor <= 16)
381-
return llvm::VersionTuple(5, 3);
386+
return floorFor64e(llvm::VersionTuple(5, 3));
382387

383388
if (Minor <= 14) {
384-
return llvm::VersionTuple(5, 0);
389+
return floorFor64e(llvm::VersionTuple(5, 0));
385390
} else if (Minor <= 15) {
386391
if (Micro <= 3) {
387-
return llvm::VersionTuple(5, 1);
392+
return floorFor64e(llvm::VersionTuple(5, 1));
388393
} else {
389-
return llvm::VersionTuple(5, 2);
394+
return floorFor64e(llvm::VersionTuple(5, 2));
390395
}
391396
}
392397
} else if (Major == 11) {
393-
return llvm::VersionTuple(5, 3);
398+
return floorFor64e(llvm::VersionTuple(5, 3));
394399
}
395400
} else if (Triple.isiOS()) { // includes tvOS
396401
Triple.getiOSVersion(Major, Minor, Micro);
397402

403+
auto floorFor64e = [&Triple](llvm::VersionTuple v) {
404+
if (Triple.getArchName() != "arm64e") return v;
405+
// iOS got first arm64e support in 12.0, which has a Swift runtime version
406+
// older than 5.0, so let's floor at VersionTuple(5, 0) instead.
407+
return MAX(v, llvm::VersionTuple(5, 0));
408+
};
409+
398410
// arm64 simulators and macCatalyst are introduced in iOS 14.0/tvOS 14.0
399411
// with Swift 5.3
400412
if (Triple.isAArch64() && Major <= 14 &&
401413
(Triple.isSimulatorEnvironment() || Triple.isMacCatalystEnvironment()))
402-
return llvm::VersionTuple(5, 3);
414+
return floorFor64e(llvm::VersionTuple(5, 3));
403415

404416
if (Major <= 12) {
405-
return llvm::VersionTuple(5, 0);
417+
return floorFor64e(llvm::VersionTuple(5, 0));
406418
} else if (Major <= 13) {
407419
if (Minor <= 3) {
408-
return llvm::VersionTuple(5, 1);
420+
return floorFor64e(llvm::VersionTuple(5, 1));
409421
} else {
410-
return llvm::VersionTuple(5, 2);
422+
return floorFor64e(llvm::VersionTuple(5, 2));
411423
}
412424
}
413425
} else if (Triple.isWatchOS()) {

0 commit comments

Comments
 (0)