diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def --- a/clang/include/clang/Basic/Features.def +++ b/clang/include/clang/Basic/Features.def @@ -92,6 +92,7 @@ FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread)) FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow)) FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo)) +FEATURE(swiftasynccc, PP.getTargetInfo().isSwiftAsyncCCSupported()) // Objective-C features FEATURE(objc_arr, LangOpts.ObjCAutoRefCount) // FIXME: REMOVE? FEATURE(objc_arc, LangOpts.ObjCAutoRefCount) diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -1415,6 +1415,17 @@ virtual CallingConvKind getCallingConvKind(bool ClangABICompat4) const; + /// \brief Is the Swift async calling convention supported for this target. + bool isSwiftAsyncCCSupported() const { + auto &triple = getTriple(); + return triple.getArch() == llvm::Triple::x86_64 || triple.isARM() || + triple.isAArch64(); + } + + CallingConvCheckResult checkSwiftAsyncCCSupported() const { + return isSwiftAsyncCCSupported() ? CCCR_OK : CCCR_Error; + } + /// Controls if __builtin_longjmp / __builtin_setjmp can be lowered to /// llvm.eh.sjlj.longjmp / llvm.eh.sjlj.setjmp. virtual bool hasSjLjLowering() const { diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -537,13 +537,14 @@ switch (CC) { case CC_C: case CC_Swift: - case CC_SwiftAsync: case CC_PreserveMost: case CC_PreserveAll: case CC_OpenCLKernel: case CC_AArch64VectorCall: case CC_Win64: return CCCR_OK; + case CC_SwiftAsync: + return checkSwiftAsyncCCSupported(); default: return CCCR_Warning; } @@ -811,9 +812,10 @@ case CC_PreserveMost: case CC_PreserveAll: case CC_Swift: - case CC_SwiftAsync: case CC_Win64: return CCCR_OK; + case CC_SwiftAsync: + return checkSwiftAsyncCCSupported(); default: return CCCR_Warning; } diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -1120,9 +1120,10 @@ case CC_AAPCS: case CC_AAPCS_VFP: case CC_Swift: - case CC_SwiftAsync: case CC_OpenCLKernel: return CCCR_OK; + case CC_SwiftAsync: + return checkSwiftAsyncCCSupported(); default: return CCCR_Warning; } @@ -1200,8 +1201,9 @@ case CC_PreserveMost: case CC_PreserveAll: case CC_Swift: - case CC_SwiftAsync: return CCCR_OK; + case CC_SwiftAsync: + return checkSwiftAsyncCCSupported(); default: return CCCR_Warning; } diff --git a/clang/lib/Basic/Targets/PPC.h b/clang/lib/Basic/Targets/PPC.h --- a/clang/lib/Basic/Targets/PPC.h +++ b/clang/lib/Basic/Targets/PPC.h @@ -450,8 +450,9 @@ CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { switch (CC) { case CC_Swift: - case CC_SwiftAsync: return CCCR_OK; + case CC_SwiftAsync: + return checkSwiftAsyncCCSupported(); default: return CCCR_Warning; } diff --git a/clang/lib/Basic/Targets/SystemZ.h b/clang/lib/Basic/Targets/SystemZ.h --- a/clang/lib/Basic/Targets/SystemZ.h +++ b/clang/lib/Basic/Targets/SystemZ.h @@ -141,9 +141,10 @@ switch (CC) { case CC_C: case CC_Swift: - case CC_SwiftAsync: case CC_OpenCLKernel: return CCCR_OK; + case CC_SwiftAsync: + return checkSwiftAsyncCCSupported(); default: return CCCR_Warning; } diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h --- a/clang/lib/Basic/Targets/WebAssembly.h +++ b/clang/lib/Basic/Targets/WebAssembly.h @@ -129,8 +129,9 @@ switch (CC) { case CC_C: case CC_Swift: - case CC_SwiftAsync: return CCCR_OK; + case CC_SwiftAsync: + return checkSwiftAsyncCCSupported(); default: return CCCR_Warning; } diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -344,11 +344,12 @@ case CC_C: case CC_PreserveMost: case CC_Swift: - case CC_SwiftAsync: case CC_X86Pascal: case CC_IntelOclBicc: case CC_OpenCLKernel: return CCCR_OK; + case CC_SwiftAsync: + return checkSwiftAsyncCCSupported(); default: return CCCR_Warning; } @@ -703,7 +704,6 @@ switch (CC) { case CC_C: case CC_Swift: - case CC_SwiftAsync: case CC_X86VectorCall: case CC_IntelOclBicc: case CC_Win64: @@ -712,6 +712,8 @@ case CC_X86RegCall: case CC_OpenCLKernel: return CCCR_OK; + case CC_SwiftAsync: + return checkSwiftAsyncCCSupported(); default: return CCCR_Warning; } @@ -785,10 +787,11 @@ case CC_PreserveAll: case CC_X86_64SysV: case CC_Swift: - case CC_SwiftAsync: case CC_X86RegCall: case CC_OpenCLKernel: return CCCR_OK; + case CC_SwiftAsync: + return checkSwiftAsyncCCSupported(); default: return CCCR_Warning; }