| // RUN: %clang_cc1 -triple mips-linux-gnu -S -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS |
| // RUN: %clang_cc1 -triple mips64-linux-gnu -S -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS64 |
| // RUN: %clang_cc1 -triple armebv7-linux-gnueabihf -S -emit-llvm %s -o - | FileCheck %s -check-prefix=ARM |
| |
| #include <stdarg.h> |
| |
| extern void abort() __attribute__((noreturn)); |
| |
| 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); |
| } |