diff options
author | Christian Pirker <cpirker@a-bix.com> | 2014-07-03 09:28:12 +0000 |
---|---|---|
committer | Christian Pirker <cpirker@a-bix.com> | 2014-07-03 09:28:12 +0000 |
commit | c3d3217525d531afe3c08eca12b77144d01786b8 (patch) | |
tree | 4f43e2f4094dd84ebe06521d80f17edd54bc36c5 /clang/test/CodeGen/arm-be-result-return.c | |
parent | 6b3544eb1d109dfc5d24a3a77f5496c4a6edd341 (diff) | |
download | bcm5719-llvm-c3d3217525d531afe3c08eca12b77144d01786b8.tar.gz bcm5719-llvm-c3d3217525d531afe3c08eca12b77144d01786b8.zip |
ARMEB: Fix function result return for composite types
Reviewed at http://reviews.llvm.org/D4364
llvm-svn: 212261
Diffstat (limited to 'clang/test/CodeGen/arm-be-result-return.c')
-rw-r--r-- | clang/test/CodeGen/arm-be-result-return.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/clang/test/CodeGen/arm-be-result-return.c b/clang/test/CodeGen/arm-be-result-return.c new file mode 100644 index 00000000000..aadc4e18845 --- /dev/null +++ b/clang/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 +} + |