r212261 - ARMEB: Fix function result return for composite types

Christian Pirker cpirker at a-bix.com
Thu Jul 3 02:28:12 PDT 2014


Author: cpirker
Date: Thu Jul  3 04:28:12 2014
New Revision: 212261

URL: http://llvm.org/viewvc/llvm-project?rev=212261&view=rev
Log:
ARMEB: Fix function result return for composite types

Reviewed at http://reviews.llvm.org/D4364


Added:
    cfe/trunk/test/CodeGen/arm-be-result-return.c
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=212261&r1=212260&r2=212261&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Thu Jul  3 04:28:12 2014
@@ -4379,6 +4379,10 @@ ABIArgInfo ARMABIInfo::classifyReturnTyp
   // are returned indirectly.
   uint64_t Size = getContext().getTypeSize(RetTy);
   if (Size <= 32) {
+    if (getDataLayout().isBigEndian())
+      // Return in 32 bit integer integer type (as if loaded by LDR, AAPCS 5.4)
+      return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
+
     // Return in the smallest viable integer type.
     if (Size <= 8)
       return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));

Added: cfe/trunk/test/CodeGen/arm-be-result-return.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm-be-result-return.c?rev=212261&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/arm-be-result-return.c (added)
+++ cfe/trunk/test/CodeGen/arm-be-result-return.c Thu Jul  3 04:28:12 2014
@@ -0,0 +1,37 @@
+// RUN: %clang_cc1 -triple armebv7-arm-none-eabi -emit-llvm -w -o - %s | FileCheck %s
+
+// this tests for AAPCS section 5.4:
+// A Composite Type not larger than 4 bytes is returned in r0.
+// The format is as if the result had been stored in memory at a
+// word-aligned address and then loaded into r0 with an LDR instruction
+
+extern union Us { short s; } us;
+union Us callee_us() { return us; }
+// CHECK-LABEL: callee_us()
+// CHECK: zext i16
+// CHECK: shl 
+// CHECK: ret i32
+
+void caller_us() {
+  us = callee_us();
+// CHECK-LABEL: caller_us()
+// CHECK: call i32
+// CHECK: lshr i32
+// CHECK: trunc i32
+}
+
+extern struct Ss { short s; } ss;
+struct Ss callee_ss() { return ss; }
+// CHECK-LABEL: callee_ss()
+// CHECK: zext i16
+// CHECK: shl 
+// CHECK: ret i32
+
+void caller_ss() {
+  ss = callee_ss();
+// CHECK-LABEL: caller_ss()
+// CHECK: call i32
+// CHECK: lshr i32
+// CHECK: trunc i32
+}
+





More information about the cfe-commits mailing list