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 +} + _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
