summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGen/struct-union-BE.c
diff options
context:
space:
mode:
authorStrahinja Petrovic <strahinja.petrovic@rt-rk.com>2016-06-24 12:12:41 +0000
committerStrahinja Petrovic <strahinja.petrovic@rt-rk.com>2016-06-24 12:12:41 +0000
commit515a1eb44cda8600a3ef900c00831c3c393ca94b (patch)
tree31e3acf517f5adf14d3b3fb4c53a1874b7a383d5 /clang/test/CodeGen/struct-union-BE.c
parent034d2c92e8406e057d8884c00b617485875b70ea (diff)
downloadbcm5719-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.c48
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);
+}
OpenPOWER on IntegriCloud