[cfe-commits] r150200 - in /cfe/trunk: lib/CodeGen/TargetInfo.cpp test/CodeGen/mips64-class-return.cpp
Akira Hatanaka
ahatanaka at mips.com
Thu Feb 9 11:54:16 PST 2012
Author: ahatanak
Date: Thu Feb 9 13:54:16 2012
New Revision: 150200
URL: http://llvm.org/viewvc/llvm-project?rev=150200&view=rev
Log:
Class objects passed by value follow the same rules as structure objects.
Double fields of by-value class objects should be passed in floating point
registers.
Modified:
cfe/trunk/lib/CodeGen/TargetInfo.cpp
cfe/trunk/test/CodeGen/mips64-class-return.cpp
Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=150200&r1=150199&r2=150200&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Thu Feb 9 13:54:16 2012
@@ -3065,9 +3065,10 @@
if (Ty->isComplexType())
return CGT.ConvertType(Ty);
- const RecordType *RT = Ty->getAsStructureType();
+ const RecordType *RT = Ty->getAs<RecordType>();
- if (!RT)
+ // Unions are passed in integer registers.
+ if (!RT || !RT->isStructureOrClassType())
return 0;
const RecordDecl *RD = RT->getDecl();
@@ -3080,6 +3081,8 @@
llvm::IntegerType *I64 = llvm::IntegerType::get(getVMContext(), 64);
SmallVector<llvm::Type*, 8> ArgList;
+ // Iterate over fields in the struct/class and check if there are any aligned
+ // double fields.
for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
i != e; ++i, ++idx) {
const QualType Ty = (*i)->getType();
@@ -3101,7 +3104,7 @@
LastOffset = Offset + 64;
}
- // This structure doesn't have an aligned double field.
+ // This struct/class doesn't have an aligned double field.
if (!LastOffset)
return 0;
Modified: cfe/trunk/test/CodeGen/mips64-class-return.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/mips64-class-return.cpp?rev=150200&r1=150199&r2=150200&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/mips64-class-return.cpp (original)
+++ cfe/trunk/test/CodeGen/mips64-class-return.cpp Thu Feb 9 13:54:16 2012
@@ -16,8 +16,13 @@
float f;
};
+class D2 : public B0 {
+ double d2;
+};
+
extern D0 gd0;
extern D1 gd1;
+extern D2 gd2;
// CHECK: define { i64, i64 } @_Z4foo1v()
D0 foo1(void) {
@@ -29,3 +34,13 @@
return gd1;
}
+// CHECK: define void @_Z4foo32D2(i64 %a0.coerce0, double %a0.coerce1)
+void foo3(D2 a0) {
+ gd2 = a0;
+}
+
+// CHECK: define void @_Z4foo42D0(%class.D0* nocapture byval %a0)
+void foo4(D0 a0) {
+ gd0 = a0;
+}
+
More information about the cfe-commits
mailing list