1 /* PR target/59644 */
2 /* { dg-do run { target lp64 } } */
3 /* { dg-options "-O2 -ffreestanding -mno-sse -mpreferred-stack-boundary=3 -maccumulate-outgoing-args -mno-red-zone" } */
4
5 /* This test uses __builtin_trap () instead of e.g. abort,
6 because due to -mpreferred-stack-boundary=3 it should not call
7 any library function from within main (). */
8
9 #include <stdarg.h>
10
11 __attribute__((noinline, noclone))
12 int
bar(int x,int y,int z,int w,const char * fmt,va_list ap)13 bar (int x, int y, int z, int w, const char *fmt, va_list ap)
14 {
15 if (x != 1 || y != 2 || z != 3 || w != 4)
16 __builtin_trap ();
17 if (fmt[0] != 'f' || fmt[1] != 'o' || fmt[2] != 'o' || fmt[3])
18 __builtin_trap ();
19 if (va_arg (ap, int) != 5 || va_arg (ap, int) != 6
20 || va_arg (ap, long long) != 7LL)
21 __builtin_trap ();
22 return 9;
23 }
24
25 __attribute__((noinline, noclone, optimize ("Os")))
26 int
foo(const char * fmt,...)27 foo (const char *fmt, ...)
28 {
29 va_list ap;
30 va_start (ap, fmt);
31 int r = bar (1, 2, 3, 4, fmt, ap);
32 va_end (ap);
33 return r;
34 }
35
36 int
main()37 main ()
38 {
39 if (foo ("foo", 5, 6, 7LL) != 9)
40 __builtin_trap ();
41 return 0;
42 }
43