111
|
1 /* This test has architecture specific function passing details. */
|
|
2 /* { dg-do compile } */
|
|
3 /* { dg-options "-O2 -fdump-tree-stdarg" } */
|
|
4
|
|
5 #include <stdarg.h>
|
|
6
|
|
7 extern void foo (int, va_list);
|
|
8 extern void bar (int);
|
|
9 struct S1 { int i; double d; int j; double e; } s1;
|
|
10 struct S2 { double d; long i; } s2;
|
|
11 int y;
|
|
12 _Complex int ci;
|
|
13 _Complex double cd;
|
|
14
|
|
15 /* Here va_arg can be executed more than once for one va_start. */
|
|
16 void
|
|
17 f1 (int i, ...)
|
|
18 {
|
|
19 va_list ap;
|
|
20 va_start (ap, i);
|
|
21 while (i-- > 0)
|
|
22 s1 = va_arg (ap, struct S1);
|
|
23 va_end (ap);
|
|
24 }
|
|
25 /* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save 0 GPR units and 0 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
|
|
26 /* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
|
|
27 /* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
|
|
28 /* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target aarch64*-*-* } } } */
|
|
29
|
|
30 void
|
|
31 f2 (int i, ...)
|
|
32 {
|
|
33 va_list ap;
|
|
34 va_start (ap, i);
|
|
35 while (i-- > 0)
|
|
36 s2 = va_arg (ap, struct S2);
|
|
37 va_end (ap);
|
|
38 }
|
|
39 /* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and all FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
|
|
40 /* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
|
|
41 /* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
|
|
42 /* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target aarch64*-*-* } } } */
|
|
43
|
|
44 /* Here va_arg can be executed at most as many times as va_start. */
|
|
45 void
|
|
46 f3 (int i, ...)
|
|
47 {
|
|
48 va_list ap;
|
|
49 int j = i;
|
|
50 while (j-- > 0)
|
|
51 {
|
|
52 va_start (ap, i);
|
|
53 s1 = va_arg (ap, struct S1);
|
|
54 va_end (ap);
|
|
55 bar (s1.i);
|
|
56 }
|
|
57 }
|
|
58 /* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 0 GPR units and 0 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
|
|
59 /* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 32 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
|
|
60 /* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 1 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
|
|
61 /* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 8 GPR units and 0 FPR units" "stdarg" { target aarch64*-*-* } } } */
|
|
62
|
|
63 void
|
|
64 f4 (int i, ...)
|
|
65 {
|
|
66 va_list ap;
|
|
67 int j = i;
|
|
68 while (j-- > 0)
|
|
69 {
|
|
70 va_start (ap, i);
|
|
71 s2 = va_arg (ap, struct S2);
|
|
72 y = va_arg (ap, int);
|
|
73 va_end (ap);
|
|
74 bar (s2.i);
|
|
75 }
|
|
76 }
|
|
77 /* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 16 GPR units and 16 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
|
|
78 /* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 24 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
|
|
79 /* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 2 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
|
|
80 /* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 24 GPR units and 0 FPR units" "stdarg" { target aarch64*-*-* } } } */
|
|
81
|
|
82 void
|
|
83 f5 (int i, ...)
|
|
84 {
|
|
85 va_list ap;
|
|
86 va_start (ap, i);
|
|
87 ci = va_arg (ap, _Complex int);
|
|
88 ci += va_arg (ap, _Complex int);
|
|
89 va_end (ap);
|
|
90 bar (__real__ ci + __imag__ ci);
|
|
91 }
|
|
92 /* { dg-final { scan-tree-dump "f5: va_list escapes 0, needs to save 16 GPR units and 0 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
|
|
93 /* { dg-final { scan-tree-dump "f5: va_list escapes 0, needs to save 32 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
|
|
94 /* { dg-final { scan-tree-dump "f5: va_list escapes 0, needs to save (4|2) GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
|
|
95 /* { dg-final { scan-tree-dump "f5: va_list escapes 0, needs to save 16 GPR units and 0 FPR units" "stdarg" { target aarch64*-*-* } } } */
|
|
96
|
|
97 void
|
|
98 f6 (int i, ...)
|
|
99 {
|
|
100 va_list ap;
|
|
101 va_start (ap, i);
|
|
102 ci = va_arg (ap, _Complex int);
|
|
103 cd = va_arg (ap, _Complex double);
|
|
104 va_end (ap);
|
|
105 bar (__real__ ci + __imag__ cd);
|
|
106 }
|
|
107 /* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save 8 GPR units and 32 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
|
|
108 /* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save 32 GPR units and 3" "stdarg" { target alpha*-*-linux* } } } */
|
|
109 /* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save (3|2) GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
|
|
110 /* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save 8 GPR units and 32 FPR units" "stdarg" { target aarch64*-*-* } } } */
|
|
111
|
|
112 void
|
|
113 f7 (int i, ...)
|
|
114 {
|
|
115 va_list ap;
|
|
116 va_start (ap, i);
|
|
117 cd = va_arg (ap, _Complex double);
|
|
118 cd += va_arg (ap, _Complex double);
|
|
119 va_end (ap);
|
|
120 bar (__real__ cd + __imag__ cd);
|
|
121 }
|
|
122 /* { dg-final { scan-tree-dump "f7: va_list escapes 0, needs to save 0 GPR units and 64 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
|
|
123 /* { dg-final { scan-tree-dump "f7: va_list escapes 0, needs to save 32 GPR units and 2" "stdarg" { target alpha*-*-linux* } } } */
|
|
124 /* { dg-final { scan-tree-dump "f7: va_list escapes 0, needs to save 2 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
|
|
125 /* { dg-final { scan-tree-dump "f7: va_list escapes 0, needs to save 0 GPR units and 64 FPR units" "stdarg" { target aarch64*-*-* } } } */
|