[PATCH] ARMEB: Fix function result return for composite types

Christian Pirker cpirker at a-bix.com
Wed Jul 2 10:18:54 PDT 2014


Hi all,

ARM AAPCS-ABI specifies the result format of composite types in section 5.4 "Result Return":
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.
Any bits in r0 that lie outside the bounds of the result have unspecified values.

This patch implements return format of composite types <= 4 bytes by using the "upper" part of register r0 (instead of lower part as in little endian) to transfer the data value.
CFE emits additional shift instructions in big endian mode.

Please review, thanks,
Christian

http://reviews.llvm.org/D4364

Files:
  lib/CodeGen/TargetInfo.cpp
  test/CodeGen/arm-be-result-return.c

Index: lib/CodeGen/TargetInfo.cpp
===================================================================
--- lib/CodeGen/TargetInfo.cpp
+++ lib/CodeGen/TargetInfo.cpp
@@ -4379,12 +4379,16 @@
   // are returned indirectly.
   uint64_t Size = getContext().getTypeSize(RetTy);
   if (Size <= 32) {
-    // Return in the smallest viable integer type.
-    if (Size <= 8)
-      return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
-    if (Size <= 16)
-      return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
-    return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
+    if (getDataLayout().isLittleEndian()) {
+      // Return in the smallest viable integer type.
+      if (Size <= 8)
+        return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
+      if (Size <= 16)
+        return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
+      return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
+    } else
+      // Return in 32 bit integer integer type (as if loaded by LDR, AAPCS 5.4)
+      return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
   }
 
   markAllocatedGPRs(1, 1);
Index: test/CodeGen/arm-be-result-return.c
===================================================================
--- test/CodeGen/arm-be-result-return.c
+++ test/CodeGen/arm-be-result-return.c
@@ -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
+}
+
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4364.11028.patch
Type: text/x-patch
Size: 2324 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140702/4f876ba3/attachment.bin>


More information about the cfe-commits mailing list