1 // RUN: %clang_cc1 -triple mips-linux-gnu -S -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS 2 // RUN: %clang_cc1 -triple mips64-linux-gnu -S -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS64 3 // RUN: %clang_cc1 -triple armebv7-linux-gnueabihf -S -emit-llvm %s -o - | FileCheck %s -check-prefix=ARM 4 5 #include <stdarg.h> 6 7 extern void abort() __attribute__((noreturn)); 8 9 struct tiny { 10 char c; 11 }; 12 13 union data { 14 char c; 15 }; 16 17 void fstr(int n, ...) { 18 struct tiny x; 19 va_list ap; 20 va_start (ap,n); 21 x = va_arg (ap, struct tiny); 22 if (x.c != 10) 23 abort(); 24 va_end (ap); 25 // MIPS-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i32 3 26 // MIPS64-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i64 7 27 // ARM-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i32 3 28 } 29 30 void funi(int n, ...) { 31 union data x; 32 va_list ap; 33 va_start (ap,n); 34 x = va_arg (ap, union data); 35 if (x.c != 10) 36 abort(); 37 va_end (ap); 38 // MIPS-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i32 3 39 // MIPS64-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i64 7 40 // ARM-NOT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %argp.cur, i32 3 41 } 42 43 void foo() { 44 struct tiny x[3]; 45 union data y; 46 x[0].c = 10; 47 fstr(1, x[0]); 48 funi(1, y); 49 } 50