r199037 - SPARC passes non-trivial C++ objects indirectly like everybody else.

Jakob Stoklund Olesen stoklund at 2pi.dk
Sat Jan 11 22:54:56 PST 2014


Author: stoklund
Date: Sun Jan 12 00:54:56 2014
New Revision: 199037

URL: http://llvm.org/viewvc/llvm-project?rev=199037&view=rev
Log:
SPARC passes non-trivial C++ objects indirectly like everybody else.

Added:
    cfe/trunk/test/CodeGenCXX/sparcv9-abi.cpp
Modified:
    cfe/trunk/lib/CodeGen/TargetInfo.cpp

Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=199037&r1=199036&r2=199037&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Sun Jan 12 00:54:56 2014
@@ -5362,6 +5362,11 @@ SparcV9ABIInfo::classifyType(QualType Ty
   if (!isAggregateTypeForABI(Ty))
     return ABIArgInfo::getDirect();
 
+  // If a C++ object has either a non-trivial copy constructor or a non-trivial
+  // destructor, it is passed with an explicit indirect pointer / sret pointer.
+  if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
+    return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
+
   // This is a small aggregate type that should be passed in registers.
   // Build a coercion type from the LLVM struct type.
   llvm::StructType *StrTy = dyn_cast<llvm::StructType>(CGT.ConvertType(Ty));

Added: cfe/trunk/test/CodeGenCXX/sparcv9-abi.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/sparcv9-abi.cpp?rev=199037&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/sparcv9-abi.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/sparcv9-abi.cpp Sun Jan 12 00:54:56 2014
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -triple sparcv9-unknown-unknown -emit-llvm %s -o - | FileCheck %s
+
+struct pod {
+  int a, b;
+};
+
+void f0();
+void f1(struct pod);
+
+struct notpod {
+  int a, b;
+  ~notpod() { f0(); }
+};
+
+void f2(struct notpod);
+
+// CHECK-LABEL: caller
+// CHECK: call void @_Z2f13pod(i64
+// CHECK: call void @_Z2f26notpod(%struct.notpod*
+void caller()
+{
+  pod p1;
+  notpod p2;
+  f1(p1);
+  f2(p2);
+}





More information about the cfe-commits mailing list