| /* { dg-do run } */ |
| /* { dg-options "-O2 -fno-inline" } */ |
| |
| /* Test pass-by-reference and pointer-typed argument passing on stack. |
| This test shall pass on any of the following four combinitions: |
| {big-endian, little-endian} {LP64, ILP32}. */ |
| |
| struct s5 |
| { |
| double a; |
| double b; |
| double c; |
| double d; |
| double e; |
| } gS = {1.0, 2.0, 3.0, 4.0, 5.0}; |
| |
| double __attribute__ ((noinline)) |
| foo (struct s5 p1, struct s5 p2, struct s5 p3, struct s5 p4, |
| struct s5 p5, struct s5 p6, struct s5 p7, struct s5 p8, |
| struct s5 p9) |
| { |
| asm (""); |
| return p9.c; |
| } |
| |
| void abort (void); |
| int printf (const char *, ...); |
| |
| int main (void) |
| { |
| printf ("Here we print out some values and more importantly hope that" |
| " the stack is getting a bit dirty for the bug to manifest itself" |
| "\n\t%f, %f, %f, %f, %f\n", gS.a, gS.b, gS.c, gS.d, gS.e); |
| |
| if (foo (gS, gS, gS, gS, gS, gS, gS, gS, gS) != 3.0) |
| abort (); |
| |
| return 0; |
| } |