|
|
extern void exit (int);
|
extern void exit (int);
|
extern void abort (void);
|
extern void abort (void);
|
extern void *alloca (__SIZE_TYPE__);
|
extern void *alloca (__SIZE_TYPE__);
|
char *dummy (void);
|
char *dummy (void);
|
|
|
#define NOINLINE __attribute__((noinline))
|
#define NOINLINE __attribute__((noinline))
|
|
|
void *save_ret1[6];
|
void *save_ret1[6];
|
void *test4a (char *);
|
void *test4a (char *);
|
void *test5a (char *);
|
void *test5a (char *);
|
void *test6a (char *);
|
void *test6a (char *);
|
|
|
void NOINLINE *test1 (void)
|
void NOINLINE *test1 (void)
|
{
|
{
|
void * temp;
|
void * temp;
|
temp = __builtin_return_address (0);
|
temp = __builtin_return_address (0);
|
return temp;
|
return temp;
|
}
|
}
|
|
|
void NOINLINE *test2 (void)
|
void NOINLINE *test2 (void)
|
{
|
{
|
void * temp;
|
void * temp;
|
dummy ();
|
dummy ();
|
temp = __builtin_return_address (0);
|
temp = __builtin_return_address (0);
|
return temp;
|
return temp;
|
}
|
}
|
|
|
void NOINLINE *test3 (void)
|
void NOINLINE *test3 (void)
|
{
|
{
|
void * temp;
|
void * temp;
|
temp = __builtin_return_address (0);
|
temp = __builtin_return_address (0);
|
dummy ();
|
dummy ();
|
return temp;
|
return temp;
|
}
|
}
|
|
|
void NOINLINE *test4 (void)
|
void NOINLINE *test4 (void)
|
{
|
{
|
char * save = (char*) alloca (4);
|
char * save = (char*) alloca (4);
|
|
|
return test4a (save);
|
return test4a (save);
|
}
|
}
|
|
|
void *NOINLINE test4a (char * p)
|
void *NOINLINE test4a (char * p)
|
{
|
{
|
void * temp;
|
void * temp;
|
temp = __builtin_return_address (1);
|
temp = __builtin_return_address (1);
|
return temp;
|
return temp;
|
}
|
}
|
|
|
void NOINLINE *test5 (void)
|
void NOINLINE *test5 (void)
|
{
|
{
|
char * save = (char*) alloca (4);
|
char * save = (char*) alloca (4);
|
|
|
return test5a (save);
|
return test5a (save);
|
}
|
}
|
|
|
void NOINLINE *test5a (char * p)
|
void NOINLINE *test5a (char * p)
|
{
|
{
|
void * temp;
|
void * temp;
|
dummy ();
|
dummy ();
|
temp = __builtin_return_address (1);
|
temp = __builtin_return_address (1);
|
return temp;
|
return temp;
|
}
|
}
|
|
|
void NOINLINE *test6 (void)
|
void NOINLINE *test6 (void)
|
{
|
{
|
char * save = (char*) alloca (4);
|
char * save = (char*) alloca (4);
|
|
|
return test6a (save);
|
return test6a (save);
|
}
|
}
|
|
|
void NOINLINE *test6a (char * p)
|
void NOINLINE *test6a (char * p)
|
{
|
{
|
void * temp;
|
void * temp;
|
temp = __builtin_return_address (1);
|
temp = __builtin_return_address (1);
|
dummy ();
|
dummy ();
|
return temp;
|
return temp;
|
}
|
}
|
|
|
void *(*func1[6])(void) = { test1, test2, test3, test4, test5, test6 };
|
void *(*func1[6])(void) = { test1, test2, test3, test4, test5, test6 };
|
|
|
char * NOINLINE call_func1 (int i)
|
char * NOINLINE call_func1 (int i)
|
{
|
{
|
save_ret1[i] = func1[i] ();
|
save_ret1[i] = func1[i] ();
|
}
|
}
|
|
|
static void *ret_addr;
|
static void *ret_addr;
|
void *save_ret2[6];
|
void *save_ret2[6];
|
void test10a (char *);
|
void test10a (char *);
|
void test11a (char *);
|
void test11a (char *);
|
void test12a (char *);
|
void test12a (char *);
|
|
|
void NOINLINE test7 (void)
|
void NOINLINE test7 (void)
|
{
|
{
|
ret_addr = __builtin_return_address (0);
|
ret_addr = __builtin_return_address (0);
|
return;
|
return;
|
}
|
}
|
|
|
void NOINLINE test8 (void)
|
void NOINLINE test8 (void)
|
{
|
{
|
dummy ();
|
dummy ();
|
ret_addr = __builtin_return_address (0);
|
ret_addr = __builtin_return_address (0);
|
return;
|
return;
|
}
|
}
|
|
|
void NOINLINE test9 (void)
|
void NOINLINE test9 (void)
|
{
|
{
|
ret_addr = __builtin_return_address (0);
|
ret_addr = __builtin_return_address (0);
|
dummy ();
|
dummy ();
|
return;
|
return;
|
}
|
}
|
|
|
void NOINLINE test10 (void)
|
void NOINLINE test10 (void)
|
{
|
{
|
char * save = (char*) alloca (4);
|
char * save = (char*) alloca (4);
|
|
|
test10a (save);
|
test10a (save);
|
}
|
}
|
|
|
void NOINLINE test10a (char * p)
|
void NOINLINE test10a (char * p)
|
{
|
{
|
ret_addr = __builtin_return_address (1);
|
ret_addr = __builtin_return_address (1);
|
return;
|
return;
|
}
|
}
|
|
|
void NOINLINE test11 (void)
|
void NOINLINE test11 (void)
|
{
|
{
|
char * save = (char*) alloca (4);
|
char * save = (char*) alloca (4);
|
|
|
test11a (save);
|
test11a (save);
|
}
|
}
|
|
|
void NOINLINE test11a (char * p)
|
void NOINLINE test11a (char * p)
|
{
|
{
|
dummy ();
|
dummy ();
|
ret_addr = __builtin_return_address (1);
|
ret_addr = __builtin_return_address (1);
|
return;
|
return;
|
}
|
}
|
|
|
void NOINLINE test12 (void)
|
void NOINLINE test12 (void)
|
{
|
{
|
char * save = (char*) alloca (4);
|
char * save = (char*) alloca (4);
|
|
|
test12a (save);
|
test12a (save);
|
}
|
}
|
|
|
void NOINLINE test12a (char * p)
|
void NOINLINE test12a (char * p)
|
{
|
{
|
ret_addr = __builtin_return_address (1);
|
ret_addr = __builtin_return_address (1);
|
dummy ();
|
dummy ();
|
return;
|
return;
|
}
|
}
|
|
|
char * dummy (void)
|
char * dummy (void)
|
{
|
{
|
char * save = (char*) alloca (4);
|
char * save = (char*) alloca (4);
|
|
|
return save;
|
return save;
|
}
|
}
|
|
|
void (*func2[6])(void) = { test7, test8, test9, test10, test11, test12 };
|
void (*func2[6])(void) = { test7, test8, test9, test10, test11, test12 };
|
|
|
void NOINLINE call_func2 (int i)
|
void NOINLINE call_func2 (int i)
|
{
|
{
|
func2[i] ();
|
func2[i] ();
|
save_ret2[i] = ret_addr;
|
save_ret2[i] = ret_addr;
|
}
|
}
|
|
|
int main (void)
|
int main (void)
|
{
|
{
|
int i;
|
int i;
|
|
|
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 6; i++) {
|
call_func1(i);
|
call_func1(i);
|
}
|
}
|
|
|
if (save_ret1[0] != save_ret1[1]
|
if (save_ret1[0] != save_ret1[1]
|
|| save_ret1[1] != save_ret1[2])
|
|| save_ret1[1] != save_ret1[2])
|
abort ();
|
abort ();
|
if (save_ret1[3] != save_ret1[4]
|
if (save_ret1[3] != save_ret1[4]
|
|| save_ret1[4] != save_ret1[5])
|
|| save_ret1[4] != save_ret1[5])
|
abort ();
|
abort ();
|
if (save_ret1[3] && save_ret1[0] != save_ret1[3])
|
if (save_ret1[3] && save_ret1[0] != save_ret1[3])
|
abort ();
|
abort ();
|
|
|
|
|
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 6; i++) {
|
call_func2(i);
|
call_func2(i);
|
}
|
}
|
|
|
if (save_ret2[0] != save_ret2[1]
|
if (save_ret2[0] != save_ret2[1]
|
|| save_ret2[1] != save_ret2[2])
|
|| save_ret2[1] != save_ret2[2])
|
abort ();
|
abort ();
|
if (save_ret2[3] != save_ret2[4]
|
if (save_ret2[3] != save_ret2[4]
|
|| save_ret2[4] != save_ret2[5])
|
|| save_ret2[4] != save_ret2[5])
|
abort ();
|
abort ();
|
if (save_ret2[3] && save_ret2[0] != save_ret2[3])
|
if (save_ret2[3] && save_ret2[0] != save_ret2[3])
|
abort ();
|
abort ();
|
|
|
exit (0);
|
exit (0);
|
}
|
}
|
|
|