1 /* { dg-do compile } */
2 /* { dg-options "-fstack-usage" } */
3 
4 /* This is aimed at testing basic support for -fstack-usage in the back-ends.
5    See the SPARC back-end for example (grep flag_stack_usage_info in sparc.c).
6    Once it is implemented, adjust SIZE below so that the stack usage for the
7    function FOO is reported as 256 or 264 in the stack usage (.su) file.
8    Then check that this is the actual stack usage in the assembly file.  */
9 
10 #if defined(__aarch64__)
11 #  define SIZE 256 /* No frame pointer for leaf functions (default) */
12 #elif defined(__arc__)
13 #  define SIZE (256-4)
14 #elif defined(__i386__)
15 #  define SIZE 248
16 #elif defined(__x86_64__)
17 #  ifndef _WIN64
18 #    define SIZE 356
19 #  else
20 #    define SIZE (256 - 24)
21 #  endif
22 #elif defined (__sparc__)
23 #  if defined (__arch64__)
24 #    define SIZE 76
25 #  else
26 #    define SIZE 160
27 #  endif
28 #elif defined(__hppa__)
29 #  define SIZE 192
30 #elif defined (__alpha__)
31 #  define SIZE 240
32 #elif defined (__ia64__)
33 #  define SIZE 272
34 #elif defined(__mips__)
35 #  if defined (__mips_abicalls) \
36       || (defined _MIPS_SIM && (_MIPS_SIM ==_ABIN32 || _MIPS_SIM==_ABI64))
37 #    define SIZE 240
38 #  else
39 #    define SIZE 248
40 #  endif
41 #elif defined (__nds32__)
42 #  define SIZE 248 /* 256 - 8 bytes, only $fp and padding bytes are saved in
43                       the register save area under O0 optimization level.  */
44 #elif defined (__powerpc64__) || defined (__ppc64__) || defined (__POWERPC64__) \
45       || defined (__PPC64__)
46 #  if _CALL_ELF == 2
47 #     define SIZE 208
48 #  else
49 #     define SIZE 180
50 #  endif
51 #elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) \
52       || defined (__POWERPC__) || defined (PPC) || defined (_IBMR2)
53 #  if defined (__ALTIVEC__)
54 #    if defined (__APPLE__)
55 #      define SIZE 204
56 #    else
57 #      define SIZE 220
58 #    endif
59 #  elif defined (_AIX)
60 #    define SIZE 208
61 #  else
62 #    define SIZE 240
63 #  endif
64 #elif defined (__AVR__)
65 #  define SIZE 254
66 #elif defined (__s390x__)
67 #  define SIZE 96  /* 256 - 160 bytes for register save area */
68 #elif defined (__s390__)
69 #  define SIZE 160 /* 256 -  96 bytes for register save area */
70 #elif defined (__SPU__)
71 #  define SIZE 224
72 #elif defined (__epiphany__)
73 #  define SIZE (256 - __EPIPHANY_STACK_OFFSET__)
74 #elif defined (__RL78__)
75 #  define SIZE 254
76 #elif defined (__sh__)
77 #  define SIZE 252
78 #elif defined (__frv__)
79 #  define SIZE 248
80 #elif defined (xstormy16)
81 #  define SIZE 254
82 #elif defined (__nios2__)
83 #  define SIZE 252
84 #else
85 #  define SIZE 256
86 #endif
87 
foo(void)88 int foo (void)
89 {
90   char arr[SIZE];
91   arr[0] = 1;
92   return 0;
93 }
94 
95 /* { dg-final { scan-stack-usage "foo\t\(256|264\)\tstatic" } } */
96 /* { dg-final { cleanup-stack-usage } } */
97