[MS] For unknown ISAs, pass non-trivially copyable arguments indirectly
authorReid Kleckner <rnk@google.com>
Thu, 24 Sep 2020 21:11:06 +0000 (14:11 -0700)
committerReid Kleckner <rnk@google.com>
Thu, 24 Sep 2020 23:29:48 +0000 (16:29 -0700)
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.

clang/lib/CodeGen/MicrosoftCXXABI.cpp
clang/test/CodeGenCXX/microsoft-abi-unknown-arch.cpp [new file with mode: 0644]

index 5fcb892..cae7909 100644 (file)
@@ -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 (file)
index 0000000..bb03641
--- /dev/null
@@ -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@B@@QEAA?AUA@@U2@@Z"(%struct.B* %this, %struct.A* noalias sret align 4 %agg.result, %struct.A* %x)