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