1/* builtin_frame_address(n) with n>0 has always been troublesome ...
2   especially when the S/390 packed stack layout comes into play.  */
3
4/* { dg-do run } */
5/* { dg-options "-O3 -fno-optimize-sibling-calls -mbackchain -mpacked-stack -msoft-float" } */
6
7#ifdef __s390x__
8/* 64bit: 3 words to be saved: backchain, r14 and r15  */
9#define SAVE_AREA_SIZE 3*8
10#else
11/* 32bit: 4 words to be saved: backchain, r13, r14 and r15  */
12#define SAVE_AREA_SIZE 4*4
13#endif
14extern void abort(void);
15
16#define EXPAND_CHECK(n)						\
17  void __attribute__((noinline))				\
18    foo1_##n (void *p)						\
19  {								\
20    if (p - __builtin_frame_address (n) != SAVE_AREA_SIZE)	\
21      abort ();							\
22  }								\
23  void __attribute__((noinline))				\
24    foo2_##n (void *p)						\
25  {								\
26    if (p - __builtin_frame_address (n) != SAVE_AREA_SIZE)	\
27      abort ();							\
28    foo1_##n (__builtin_frame_address (n));			\
29  }								\
30  void __attribute__((noinline))				\
31    foo3_##n ()							\
32  {								\
33    foo2_##n (__builtin_frame_address (n));			\
34  }								\
35  void __attribute__((noinline))				\
36    foo4_##n ()							\
37  {								\
38    foo3_##n ();						\
39  }
40
41EXPAND_CHECK (0)
42EXPAND_CHECK (1)
43EXPAND_CHECK (2)
44
45int
46main ()
47{
48  foo4_0 ();
49  foo4_1 ();
50  foo4_2 ();
51
52  return 0;
53}
54