diff options
author | Strahinja Petrovic <strahinja.petrovic@rt-rk.com> | 2016-06-24 12:12:41 +0000 |
---|---|---|
committer | Strahinja Petrovic <strahinja.petrovic@rt-rk.com> | 2016-06-24 12:12:41 +0000 |
commit | 515a1eb44cda8600a3ef900c00831c3c393ca94b (patch) | |
tree | 31e3acf517f5adf14d3b3fb4c53a1874b7a383d5 /clang/test/CodeGen/struct-union-BE.c | |
parent | 034d2c92e8406e057d8884c00b617485875b70ea (diff) | |
download | bcm5719-llvm-515a1eb44cda8600a3ef900c00831c3c393ca94b.tar.gz bcm5719-llvm-515a1eb44cda8600a3ef900c00831c3c393ca94b.zip |
This patch fixes problem with passing structures and unions
smaller than register as argument in variadic functions on
big endian architectures.
Differential Revision: http://reviews.llvm.org/D21611
llvm-svn: 273665
Diffstat (limited to 'clang/test/CodeGen/struct-union-BE.c')
-rw-r--r-- | clang/test/CodeGen/struct-union-BE.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/clang/test/CodeGen/struct-union-BE.c b/clang/test/CodeGen/struct-union-BE.c new file mode 100644 index 00000000000..9d1c86dee54 --- /dev/null +++ b/clang/test/CodeGen/struct-union-BE.c @@ -0,0 +1,48 @@ +// RUN: %clang -O2 -target mips-linux-gnu -EB -S -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS +// RUN: %clang -O2 -target mips64-linux-gnu -EB -S -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS64 +// RUN: %clang -O2 -target armeb-linux-gnueabihf -march=armv7a -EB -S -emit-llvm %s -o - | FileCheck %s -check-prefix=ARM + +#include <stdarg.h> +#include <stdlib.h> + +struct tiny { + char c; +}; + +union data { + char c; +}; + +void fstr(int n, ...) { + struct tiny x; + va_list ap; + va_start (ap,n); + x = va_arg (ap, struct tiny); + if (x.c != 10) + abort(); + va_end (ap); +// MIPS-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i32 3 +// MIPS64-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i64 7 +// ARM-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i32 3 +} + +void funi(int n, ...) { + union data x; + va_list ap; + va_start (ap,n); + x = va_arg (ap, union data); + if (x.c != 10) + abort(); + va_end (ap); +// MIPS-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i32 3 +// MIPS64-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i64 7 +// ARM-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i32 3 +} + +void foo() { + struct tiny x[3]; + union data y; + x[0].c = 10; + fstr(1, x[0]); + funi(1, y); +} |