Author: antangelo Date: 2024-06-26T18:54:41-04:00 New Revision: 5dcf3d5335a8bd936c89a4cdf1da909e6b995b6f
URL: https://github.com/llvm/llvm-project/commit/5dcf3d5335a8bd936c89a4cdf1da909e6b995b6f DIFF: https://github.com/llvm/llvm-project/commit/5dcf3d5335a8bd936c89a4cdf1da909e6b995b6f.diff LOG: [MS ABI]: Support preserve_none in MS ABI (#96487) Fixes ICE when compiling preserve_nonecc functions on Windows and adds support for the calling convention on AArch64 for Windows targets. Added: clang/test/CodeGenCXX/msabi-preserve-none-cc.cpp Modified: clang/lib/AST/MicrosoftMangle.cpp clang/lib/Basic/Targets/AArch64.cpp clang/test/Sema/preserve-none-call-conv.c Removed: ################################################################################ diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 3923d34274703..8cbaad62bf9d7 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -447,8 +447,8 @@ class MicrosoftCXXNameMangler { void mangleDecayedArrayType(const ArrayType *T); void mangleArrayType(const ArrayType *T); void mangleFunctionClass(const FunctionDecl *FD); - void mangleCallingConvention(CallingConv CC); - void mangleCallingConvention(const FunctionType *T); + void mangleCallingConvention(CallingConv CC, SourceRange Range); + void mangleCallingConvention(const FunctionType *T, SourceRange Range); void mangleIntegerLiteral(const llvm::APSInt &Number, const NonTypeTemplateParmDecl *PD = nullptr, QualType TemplateArgType = QualType()); @@ -888,7 +888,8 @@ void MicrosoftCXXNameMangler::mangleVirtualMemPtrThunk( Out << "$B"; mangleNumber(OffsetInVFTable); Out << 'A'; - mangleCallingConvention(MD->getType()->castAs<FunctionProtoType>()); + mangleCallingConvention(MD->getType()->castAs<FunctionProtoType>(), + MD->getSourceRange()); } void MicrosoftCXXNameMangler::mangleName(GlobalDecl GD) { @@ -2768,7 +2769,7 @@ void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T, mangleQualifiers(Quals, /*IsMember=*/false); } - mangleCallingConvention(CC); + mangleCallingConvention(CC, Range); // <return-type> ::= <type> // ::= @ # structors (they have no declared return type) @@ -2949,7 +2950,8 @@ void MicrosoftCXXNameMangler::mangleFunctionClass(const FunctionDecl *FD) { Out << 'Y'; } } -void MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) { +void MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC, + SourceRange Range) { // <calling-convention> ::= A # __cdecl // ::= B # __export __cdecl // ::= C # __pascal @@ -2962,7 +2964,10 @@ void MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) { // ::= J # __export __fastcall // ::= Q # __vectorcall // ::= S # __attribute__((__swiftcall__)) // Clang-only - // ::= T # __attribute__((__swiftasynccall__)) + // ::= W # __attribute__((__swiftasynccall__)) + // ::= U # __attribute__((__preserve_most__)) + // ::= V # __attribute__((__preserve_none__)) // + // Clang-only // // Clang-only // ::= w # __regcall // ::= x # __regcall4 @@ -2974,28 +2979,55 @@ void MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) { switch (CC) { default: - llvm_unreachable("Unsupported CC for mangling"); + break; case CC_Win64: case CC_X86_64SysV: - case CC_C: Out << 'A'; break; - case CC_X86Pascal: Out << 'C'; break; - case CC_X86ThisCall: Out << 'E'; break; - case CC_X86StdCall: Out << 'G'; break; - case CC_X86FastCall: Out << 'I'; break; - case CC_X86VectorCall: Out << 'Q'; break; - case CC_Swift: Out << 'S'; break; - case CC_SwiftAsync: Out << 'W'; break; - case CC_PreserveMost: Out << 'U'; break; + case CC_C: + Out << 'A'; + return; + case CC_X86Pascal: + Out << 'C'; + return; + case CC_X86ThisCall: + Out << 'E'; + return; + case CC_X86StdCall: + Out << 'G'; + return; + case CC_X86FastCall: + Out << 'I'; + return; + case CC_X86VectorCall: + Out << 'Q'; + return; + case CC_Swift: + Out << 'S'; + return; + case CC_SwiftAsync: + Out << 'W'; + return; + case CC_PreserveMost: + Out << 'U'; + return; + case CC_PreserveNone: + Out << 'V'; + return; case CC_X86RegCall: if (getASTContext().getLangOpts().RegCall4) Out << "x"; else Out << "w"; - break; + return; } + + DiagnosticsEngine &Diags = Context.getDiags(); + unsigned DiagID = Diags.getCustomDiagID( + DiagnosticsEngine::Error, "cannot mangle this calling convention yet"); + Diags.Report(Range.getBegin(), DiagID) << Range; } -void MicrosoftCXXNameMangler::mangleCallingConvention(const FunctionType *T) { - mangleCallingConvention(T->getCallConv()); +void MicrosoftCXXNameMangler::mangleCallingConvention(const FunctionType *T, + SourceRange Range) { + mangleCallingConvention(T->getCallConv(), Range); } void MicrosoftCXXNameMangler::mangleThrowSpecification( diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 31d8121b91d10..2692ddec26ff4 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1536,6 +1536,7 @@ WindowsARM64TargetInfo::checkCallingConvention(CallingConv CC) const { case CC_OpenCLKernel: case CC_PreserveMost: case CC_PreserveAll: + case CC_PreserveNone: case CC_Swift: case CC_SwiftAsync: case CC_Win64: diff --git a/clang/test/CodeGenCXX/msabi-preserve-none-cc.cpp b/clang/test/CodeGenCXX/msabi-preserve-none-cc.cpp new file mode 100644 index 0000000000000..29df5e4d84a70 --- /dev/null +++ b/clang/test/CodeGenCXX/msabi-preserve-none-cc.cpp @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -fdeclspec -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple aarch64-unknown-windows-msvc -fdeclspec -emit-llvm %s -o - | FileCheck %s + +void __attribute__((__preserve_none__)) f() {} +// CHECK-DAG: @"?f@@YVXXZ" + +void (__attribute__((__preserve_none__)) *p)(); +// CHECK-DAG: @"?p@@3P6VXXZEA + +namespace { +void __attribute__((__preserve_none__)) __attribute__((__used__)) f() { } +} +// CHECK-DAG: @"?f@?A0x{{[^@]*}}@@YVXXZ" + +namespace n { +void __attribute__((__preserve_none__)) f() {} +} +// CHECK-DAG: @"?f@n@@YVXXZ" + +struct __declspec(dllexport) S { + S(const S &) = delete; + S & operator=(const S &) = delete; + void __attribute__((__preserve_none__)) m() { } +}; +// CHECK-DAG: @"?m@S@@QEAVXXZ" + +void f(void (__attribute__((__preserve_none__))())) {} +// CHECK-DAG: @"?f@@YAXP6VXXZ@Z" diff --git a/clang/test/Sema/preserve-none-call-conv.c b/clang/test/Sema/preserve-none-call-conv.c index 4508095863de5..678fa7d5317e5 100644 --- a/clang/test/Sema/preserve-none-call-conv.c +++ b/clang/test/Sema/preserve-none-call-conv.c @@ -1,4 +1,5 @@ // RUN: %clang_cc1 %s -fsyntax-only -triple x86_64-unknown-unknown -verify +// RUN: %clang_cc1 %s -fsyntax-only -triple aarch64-unknown-unknown -verify typedef void typedef_fun_t(int); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits