[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-26 Thread via cfe-commits

https://github.com/antangelo closed 
https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-26 Thread Reid Kleckner via cfe-commits

https://github.com/rnk approved this pull request.

Thanks!

https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-25 Thread via cfe-commits


@@ -2986,6 +2989,9 @@ void 
MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) {
 case CC_Swift: Out << 'S'; break;

antangelo wrote:

Done

https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-25 Thread via cfe-commits

https://github.com/antangelo updated 
https://github.com/llvm/llvm-project/pull/96487

>From 1e95098e324860268d55e72a14090f9524c7dde1 Mon Sep 17 00:00:00 2001
From: Antonio Abbatangelo 
Date: Mon, 24 Jun 2024 09:49:28 -0400
Subject: [PATCH 1/2] [MS ABI]: Support preserve_none in MS ABI

---
 clang/lib/AST/MicrosoftMangle.cpp |  8 +-
 clang/lib/Basic/Targets/AArch64.cpp   |  1 +
 .../CodeGenCXX/msabi-preserve-none-cc.cpp | 28 +++
 clang/test/Sema/preserve-none-call-conv.c |  1 +
 4 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/CodeGenCXX/msabi-preserve-none-cc.cpp

diff --git a/clang/lib/AST/MicrosoftMangle.cpp 
b/clang/lib/AST/MicrosoftMangle.cpp
index 3923d34274703..b49a96f105cfb 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -2962,7 +2962,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
@@ -2986,6 +2989,9 @@ void 
MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) {
 case CC_Swift: Out << 'S'; break;
 case CC_SwiftAsync: Out << 'W'; break;
 case CC_PreserveMost: Out << 'U'; break;
+case CC_PreserveNone:
+  Out << 'V';
+  break;
 case CC_X86RegCall:
   if (getASTContext().getLangOpts().RegCall4)
 Out << "x";
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 0..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);
 

>From 2f08dfbab5a2b92759a5a1d05a306dddbe5bdcf0 Mon Sep 17 00:00:00 2001
From: Antonio Abbatangelo 
Date: Wed, 26 Jun 2024 01:30:09 -0400
Subject: [PATCH 2/2] Emit error instead of abort on unsupported calling
 convention in MicrosoftMangle

---
 clang/lib/AST/MicrosoftMangle.cpp | 64 ++-
 1 file changed, 45 insertions(+), 19 deletions(-)

diff --git a/clang/lib/AST/MicrosoftMangle.cpp 
b/clang/lib/AST/MicrosoftMangle.cpp
index b49a96f105cfb..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 

[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-25 Thread Reid Kleckner via cfe-commits


@@ -2986,6 +2989,9 @@ void 
MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) {
 case CC_Swift: Out << 'S'; break;

rnk wrote:

The default case here should be a proper compiler error, not an unreachable, 
since there's no good way to prevent arbitrary calling conventions from 
reaching the mangler.

If you search this file, you can find examples of "cannot yet mangle". Please 
copy that error handling pattern and use it in the default case for this switch 
to improve handling of cases like this in the future.

https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-25 Thread Reid Kleckner via cfe-commits


@@ -2986,6 +2989,9 @@ void 
MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) {
 case CC_Swift: Out << 'S'; break;
 case CC_SwiftAsync: Out << 'W'; break;
 case CC_PreserveMost: Out << 'U'; break;
+case CC_PreserveNone:
+  Out << 'V';

rnk wrote:

This is not a good long term solution. I emailed the relevant external 
Microsoft mailing list for discussing these issues and CC'd some folks to 
inquire about a better long term solution, but we can continue with this 
approach for now.

https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-25 Thread Reid Kleckner via cfe-commits

https://github.com/rnk edited https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-25 Thread Reid Kleckner via cfe-commits

https://github.com/rnk commented:

Thanks for looking at this, let's make this an error instead of a crash in the 
future.

https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-25 Thread Aaron Ballman via cfe-commits

AaronBallman wrote:

Do you need me to land the changes on your behalf?

https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-25 Thread Aaron Ballman via cfe-commits

AaronBallman wrote:

> The `preserve_none` calling convention is new in clang 19 and hasn't been 
> released yet; do fixes need a release note if they happen within the release 
> cycle a feature is added? 

Nope, no need for a release note in this case; I forgot that this was new for 
clang 19 rather than in clang 18.

https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-24 Thread via cfe-commits

antangelo wrote:

The `preserve_none` calling convention is new in clang 19 and hasn't been 
released yet; do fixes need a release note if they happen within the release 
cycle a feature is added? 

https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-24 Thread Aaron Ballman via cfe-commits

https://github.com/AaronBallman approved this pull request.

Generally LGTM, though the changes should come with a release note in 
`clang/docs/ReleaseNotes.rst` so users know about the fix.

https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-24 Thread Aaron Ballman via cfe-commits

https://github.com/AaronBallman edited 
https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-24 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: None (antangelo)


Changes

Fixes ICE when compiling preserve_nonecc functions on Windows and adds support 
for the calling convention on AArch64 for Windows targets.

---
Full diff: https://github.com/llvm/llvm-project/pull/96487.diff


4 Files Affected:

- (modified) clang/lib/AST/MicrosoftMangle.cpp (+7-1) 
- (modified) clang/lib/Basic/Targets/AArch64.cpp (+1) 
- (added) clang/test/CodeGenCXX/msabi-preserve-none-cc.cpp (+28) 
- (modified) clang/test/Sema/preserve-none-call-conv.c (+1) 


``diff
diff --git a/clang/lib/AST/MicrosoftMangle.cpp 
b/clang/lib/AST/MicrosoftMangle.cpp
index 3923d34274703..b49a96f105cfb 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -2962,7 +2962,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
@@ -2986,6 +2989,9 @@ void 
MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) {
 case CC_Swift: Out << 'S'; break;
 case CC_SwiftAsync: Out << 'W'; break;
 case CC_PreserveMost: Out << 'U'; break;
+case CC_PreserveNone:
+  Out << 'V';
+  break;
 case CC_X86RegCall:
   if (getASTContext().getLangOpts().RegCall4)
 Out << "x";
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 0..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);
 

``




https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-24 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-backend-aarch64

Author: None (antangelo)


Changes

Fixes ICE when compiling preserve_nonecc functions on Windows and adds support 
for the calling convention on AArch64 for Windows targets.

---
Full diff: https://github.com/llvm/llvm-project/pull/96487.diff


4 Files Affected:

- (modified) clang/lib/AST/MicrosoftMangle.cpp (+7-1) 
- (modified) clang/lib/Basic/Targets/AArch64.cpp (+1) 
- (added) clang/test/CodeGenCXX/msabi-preserve-none-cc.cpp (+28) 
- (modified) clang/test/Sema/preserve-none-call-conv.c (+1) 


``diff
diff --git a/clang/lib/AST/MicrosoftMangle.cpp 
b/clang/lib/AST/MicrosoftMangle.cpp
index 3923d34274703..b49a96f105cfb 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -2962,7 +2962,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
@@ -2986,6 +2989,9 @@ void 
MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) {
 case CC_Swift: Out << 'S'; break;
 case CC_SwiftAsync: Out << 'W'; break;
 case CC_PreserveMost: Out << 'U'; break;
+case CC_PreserveNone:
+  Out << 'V';
+  break;
 case CC_X86RegCall:
   if (getASTContext().getLangOpts().RegCall4)
 Out << "x";
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 0..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);
 

``




https://github.com/llvm/llvm-project/pull/96487
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MS ABI]: Support preserve_none in MS ABI (PR #96487)

2024-06-24 Thread via cfe-commits

https://github.com/antangelo created 
https://github.com/llvm/llvm-project/pull/96487

Fixes ICE when compiling preserve_nonecc functions on Windows and adds support 
for the calling convention on AArch64 for Windows targets.

>From 1e95098e324860268d55e72a14090f9524c7dde1 Mon Sep 17 00:00:00 2001
From: Antonio Abbatangelo 
Date: Mon, 24 Jun 2024 09:49:28 -0400
Subject: [PATCH] [MS ABI]: Support preserve_none in MS ABI

---
 clang/lib/AST/MicrosoftMangle.cpp |  8 +-
 clang/lib/Basic/Targets/AArch64.cpp   |  1 +
 .../CodeGenCXX/msabi-preserve-none-cc.cpp | 28 +++
 clang/test/Sema/preserve-none-call-conv.c |  1 +
 4 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/CodeGenCXX/msabi-preserve-none-cc.cpp

diff --git a/clang/lib/AST/MicrosoftMangle.cpp 
b/clang/lib/AST/MicrosoftMangle.cpp
index 3923d34274703..b49a96f105cfb 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -2962,7 +2962,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
@@ -2986,6 +2989,9 @@ void 
MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) {
 case CC_Swift: Out << 'S'; break;
 case CC_SwiftAsync: Out << 'W'; break;
 case CC_PreserveMost: Out << 'U'; break;
+case CC_PreserveNone:
+  Out << 'V';
+  break;
 case CC_X86RegCall:
   if (getASTContext().getLangOpts().RegCall4)
 Out << "x";
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 0..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