modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/20010122-1.c (about) 1 /* { dg-skip-if "requires frame pointers" { *-*-* } "-fomit-frame-pointer" "" } */ 2 /* { dg-require-effective-target return_address } */ 3 4 extern void exit (int); 5 extern void abort (void); 6 extern void *alloca (__SIZE_TYPE__); 7 char *dummy (void); 8 9 #define NOINLINE __attribute__((noinline)) __attribute__ ((noclone)) 10 11 void *save_ret1[6]; 12 void *test4a (char *); 13 void *test5a (char *); 14 void *test6a (char *); 15 16 void NOINLINE *test1 (void) 17 { 18 void * temp; 19 temp = __builtin_return_address (0); 20 return temp; 21 } 22 23 void NOINLINE *test2 (void) 24 { 25 void * temp; 26 dummy (); 27 temp = __builtin_return_address (0); 28 return temp; 29 } 30 31 void NOINLINE *test3 (void) 32 { 33 void * temp; 34 temp = __builtin_return_address (0); 35 dummy (); 36 return temp; 37 } 38 39 void NOINLINE *test4 (void) 40 { 41 char * save = (char*) alloca (4); 42 43 return test4a (save); 44 } 45 46 void *NOINLINE test4a (char * p) 47 { 48 void * temp; 49 temp = __builtin_return_address (1); 50 return temp; 51 } 52 53 void NOINLINE *test5 (void) 54 { 55 char * save = (char*) alloca (4); 56 57 return test5a (save); 58 } 59 60 void NOINLINE *test5a (char * p) 61 { 62 void * temp; 63 dummy (); 64 temp = __builtin_return_address (1); 65 return temp; 66 } 67 68 void NOINLINE *test6 (void) 69 { 70 char * save = (char*) alloca (4); 71 72 return test6a (save); 73 } 74 75 void NOINLINE *test6a (char * p) 76 { 77 void * temp; 78 temp = __builtin_return_address (1); 79 dummy (); 80 return temp; 81 } 82 83 void *(*func1[6])(void) = { test1, test2, test3, test4, test5, test6 }; 84 85 char * NOINLINE call_func1 (int i) 86 { 87 save_ret1[i] = func1[i] (); 88 } 89 90 static void *ret_addr; 91 void *save_ret2[6]; 92 void test10a (char *); 93 void test11a (char *); 94 void test12a (char *); 95 96 void NOINLINE test7 (void) 97 { 98 ret_addr = __builtin_return_address (0); 99 return; 100 } 101 102 void NOINLINE test8 (void) 103 { 104 dummy (); 105 ret_addr = __builtin_return_address (0); 106 return; 107 } 108 109 void NOINLINE test9 (void) 110 { 111 ret_addr = __builtin_return_address (0); 112 dummy (); 113 return; 114 } 115 116 void NOINLINE test10 (void) 117 { 118 char * save = (char*) alloca (4); 119 120 test10a (save); 121 } 122 123 void NOINLINE test10a (char * p) 124 { 125 ret_addr = __builtin_return_address (1); 126 return; 127 } 128 129 void NOINLINE test11 (void) 130 { 131 char * save = (char*) alloca (4); 132 133 test11a (save); 134 } 135 136 void NOINLINE test11a (char * p) 137 { 138 dummy (); 139 ret_addr = __builtin_return_address (1); 140 return; 141 } 142 143 void NOINLINE test12 (void) 144 { 145 char * save = (char*) alloca (4); 146 147 test12a (save); 148 } 149 150 void NOINLINE test12a (char * p) 151 { 152 ret_addr = __builtin_return_address (1); 153 dummy (); 154 return; 155 } 156 157 char * dummy (void) 158 { 159 char * save = (char*) alloca (4); 160 161 return save; 162 } 163 164 void (*func2[6])(void) = { test7, test8, test9, test10, test11, test12 }; 165 166 void NOINLINE call_func2 (int i) 167 { 168 func2[i] (); 169 save_ret2[i] = ret_addr; 170 } 171 172 int main (void) 173 { 174 int i; 175 176 for (i = 0; i < 6; i++) { 177 call_func1(i); 178 } 179 180 if (save_ret1[0] != save_ret1[1] 181 || save_ret1[1] != save_ret1[2]) 182 abort (); 183 if (save_ret1[3] != save_ret1[4] 184 || save_ret1[4] != save_ret1[5]) 185 abort (); 186 if (save_ret1[3] && save_ret1[0] != save_ret1[3]) 187 abort (); 188 189 190 for (i = 0; i < 6; i++) { 191 call_func2(i); 192 } 193 194 if (save_ret2[0] != save_ret2[1] 195 || save_ret2[1] != save_ret2[2]) 196 abort (); 197 if (save_ret2[3] != save_ret2[4] 198 || save_ret2[4] != save_ret2[5]) 199 abort (); 200 if (save_ret2[3] && save_ret2[0] != save_ret2[3]) 201 abort (); 202 203 exit (0); 204 }