From 13aeee0d36199e0c54c1b045540383d8383b030c Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Mon, 2 Apr 2018 22:25:50 +0000 Subject: [PATCH] CodeGenCXX: support PreserveMostCC in MS ABI Microsoft has reserved 'U' for the PreserveMostCC which is used in the swift runtime. Add support for this. This allows the swift runtime to be built for Windows again. llvm-svn: 329025 --- clang/lib/AST/MicrosoftMangle.cpp | 1 + clang/lib/Basic/Targets/X86.h | 1 + clang/test/CodeGenCXX/msabi-swiftcall-cc.cpp | 47 ++++++++++++++++++-- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 9d49e0f1799f..046c8fd7f752 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -2184,6 +2184,7 @@ void MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) { case CC_X86FastCall: Out << 'I'; break; case CC_X86VectorCall: Out << 'Q'; break; case CC_Swift: Out << 'S'; break; + case CC_PreserveMost: Out << 'U'; break; case CC_X86RegCall: Out << 'w'; break; } } diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h index f8029400e80c..91db1dfdf31b 100644 --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -287,6 +287,7 @@ public: case CC_X86VectorCall: case CC_X86RegCall: case CC_C: + case CC_PreserveMost: case CC_Swift: case CC_X86Pascal: case CC_IntelOclBicc: diff --git a/clang/test/CodeGenCXX/msabi-swiftcall-cc.cpp b/clang/test/CodeGenCXX/msabi-swiftcall-cc.cpp index e74c6b080a47..d8205ed192a5 100644 --- a/clang/test/CodeGenCXX/msabi-swiftcall-cc.cpp +++ b/clang/test/CodeGenCXX/msabi-swiftcall-cc.cpp @@ -1,28 +1,67 @@ // RUN: %clang_cc1 -triple i686-unknown-windows-msvc -fdeclspec -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -fdeclspec -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-64 void __attribute__((__swiftcall__)) f() {} // CHECK-DAG: @"?f@@YSXXZ" +// CHECK-64-DAG: @"?f@@YSXXZ" void (__attribute__((__swiftcall__)) *p)(); // CHECK-DAG: @"?p@@3P6SXXZA" +// CHECK-64-DAG: @"?p@@3P6SXXZEA namespace { void __attribute__((__swiftcall__)) __attribute__((__used__)) f() { } -// CHECK-DAG: "?f@?A@@YSXXZ" } +// CHECK-DAG: @"?f@?A@@YSXXZ" +// CHECK-64-DAG: @"?f@?A@@YSXXZ" namespace n { void __attribute__((__swiftcall__)) f() {} -// CHECK-DAG: "?f@n@@YSXXZ" } +// CHECK-DAG: @"?f@n@@YSXXZ" +// CHECK-64-DAG: @"?f@n@@YSXXZ" struct __declspec(dllexport) S { S(const S &) = delete; S & operator=(const S &) = delete; void __attribute__((__swiftcall__)) m() { } - // CHECK-DAG: "?m@S@@QASXXZ" }; +// CHECK-DAG: @"?m@S@@QASXXZ" +// CHECK-64-DAG: @"?m@S@@QEASXXZ" void f(void (__attribute__((__swiftcall__))())) {} -// CHECK-DAG: "?f@@YAXP6SXXZ@Z" +// CHECK-DAG: @"?f@@YAXP6SXXZ@Z" +// CHECK-64-DAG: @"?f@@YAXP6SXXZ@Z" + +void __attribute__((__preserve_most__)) g() {} +// CHECK-DAG: @"?g@@YUXXZ" +// CHECK-64-DAG: @"?g@@YUXXZ" + +void (__attribute__((__preserve_most__)) *q)(); +// CHECK-DAG: @"?q@@3P6UXXZA" +// CHECK-64-DAG: @"?q@@3P6UXXZEA" + +namespace { +void __attribute__((__preserve_most__)) __attribute__((__used__)) g() {} +} +// CHECK-DAG: @"?g@?A@@YUXXZ" +// CHECK-64-DAG: @"?g@?A@@YUXXZ" + +namespace n { +void __attribute__((__preserve_most__)) g() {} +} +// CHECK-DAG: @"?g@n@@YUXXZ" +// CHECK-64-DAG: @"?g@n@@YUXXZ" + +struct __declspec(dllexport) T { + T(const T &) = delete; + T & operator=(const T &) = delete; + void __attribute__((__preserve_most__)) m() {} +}; +// CHECK-DAG: @"?m@T@@QAUXXZ" +// CHECK-64-DAG: @"?m@T@@QEAUXXZ" + +void g(void (__attribute__((__preserve_most__))())) {} +// CHECK-DAG: @"?g@@YAXP6UXXZ@Z" +// CHECK-64-DAG: @"?g@@YAXP6UXXZ@Z"