]> granicus.if.org Git - clang/commitdiff
Check for homogeneous aggregate return values with ARM's AAPCS-VFP ABI.
authorBob Wilson <bob.wilson@apple.com>
Wed, 2 Nov 2011 04:51:36 +0000 (04:51 +0000)
committerBob Wilson <bob.wilson@apple.com>
Wed, 2 Nov 2011 04:51:36 +0000 (04:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143530 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/TargetInfo.cpp
test/CodeGen/arm-aapcs-vfp.c

index 3744a29b3e0e0bb96f50d64c95a84085d5aaca61..88505e695d7a203e76f3d39406284cae0f566d75 100644 (file)
@@ -2671,6 +2671,14 @@ ABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy) const {
   if (isEmptyRecord(getContext(), RetTy, true))
     return ABIArgInfo::getIgnore();
 
+  // Check for homogeneous aggregates with AAPCS-VFP.
+  if (getABIKind() == AAPCS_VFP) {
+    const Type *Base = 0;
+    if (isHomogeneousAggregate(RetTy, Base, getContext()))
+      // Homogeneous Aggregates are returned directly.
+      return ABIArgInfo::getDirect();
+  }
+
   // Aggregates <= 4 bytes are returned in r0; other aggregates
   // are returned indirectly.
   uint64_t Size = getContext().getTypeSize(RetTy);
index 20b8a742dd4145a87f429b321a3b86ccb0538f15..017c14524e9754fed3663a11c1f295c3a9f282b4 100644 (file)
@@ -12,10 +12,10 @@ struct homogeneous_struct {
   float f3;
   float f4;
 };
-// CHECK: define arm_aapcs_vfpcc void @test_struct(float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})
-extern void struct_callee(struct homogeneous_struct);
-void test_struct(struct homogeneous_struct arg) {
-  struct_callee(arg);
+// CHECK: define arm_aapcs_vfpcc %struct.homogeneous_struct @test_struct(float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})
+extern struct homogeneous_struct struct_callee(struct homogeneous_struct);
+struct homogeneous_struct test_struct(struct homogeneous_struct arg) {
+  return struct_callee(arg);
 }
 
 struct nested_array {