@@ -370,44 +370,56 @@ Optional<llvm::VersionTuple>
370370swift::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