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