[clang] ecfc9b9 - [MS] For unknown ISAs, pass non-trivially copyable arguments indirectly

Reid Kleckner via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 24 16:29:57 PDT 2020


Author: Reid Kleckner
Date: 2020-09-24T16:29:48-07:00
New Revision: ecfc9b971269a86b101cddf1fd9f0976be4096d0

URL: https://github.com/llvm/llvm-project/commit/ecfc9b971269a86b101cddf1fd9f0976be4096d0
DIFF: https://github.com/llvm/llvm-project/commit/ecfc9b971269a86b101cddf1fd9f0976be4096d0.diff

LOG: [MS] For unknown ISAs, pass non-trivially copyable arguments indirectly

Passing them directly is likely to be non-conforming, since it usually
involves copying the bytes of the record. For unknown architectures, we
don't know what MSVC does or will do, but we should at least try to
conform as well as we can.

Added: 
    clang/test/CodeGenCXX/microsoft-abi-unknown-arch.cpp

Modified: 
    clang/lib/CodeGen/MicrosoftCXXABI.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp
index 5fcb892f7fb8..cae79099dd6b 100644
--- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp
+++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp
@@ -825,7 +825,7 @@ MicrosoftCXXABI::getRecordArgABI(const CXXRecordDecl *RD) const {
   switch (CGM.getTarget().getTriple().getArch()) {
   default:
     // FIXME: Implement for other architectures.
-    return RAA_Default;
+    return RAA_Indirect;
 
   case llvm::Triple::thumb:
     // Pass things indirectly for now because it is simple.

diff  --git a/clang/test/CodeGenCXX/microsoft-abi-unknown-arch.cpp b/clang/test/CodeGenCXX/microsoft-abi-unknown-arch.cpp
new file mode 100644
index 000000000000..bb0364186eb4
--- /dev/null
+++ b/clang/test/CodeGenCXX/microsoft-abi-unknown-arch.cpp
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple=ppc64-windows-msvc | FileCheck %s
+
+// The purpose of this test is to see that we do something reasonable for
+// architectures where we haven't checked what MSVC does.
+
+struct A {
+  A() : a(42) {}
+  A(const A &o) : a(o.a) {}
+  ~A() {}
+  int a;
+};
+
+struct B {
+  A foo(A o);
+};
+
+A B::foo(A x) {
+  return x;
+}
+
+// CHECK-LABEL: define void @"?foo at B@@QEAA?AUA@@U2@@Z"(%struct.B* %this, %struct.A* noalias sret align 4 %agg.result, %struct.A* %x)


        


More information about the cfe-commits mailing list