aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.dg/fpomit-8.c
blob: 471cdf5c5d7dfb84203436c47b6416827f69cc07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/* { dg-do run { target {{ i?86-*-* x86_64-*-* } && lp64 } } } */
/* { dg-options "-O2 -fno-omit-frame-pointer -fshrink-wrap-frame-pointer" } */
/* { dg-output "stack_depth = 8" } */

#include <stdio.h>

void* address[1000];
int sizes[1000];
int N;
int main();
void *main_ret_address;

__attribute((noinline)) int 
get_stack_traces (void **result)
{
   void **sp = (void**) __builtin_frame_address (0);
   int n = 0;
   while (sp) {
       if ((*(char **)(sp+1)) == main_ret_address)
          return n;

       void **next_sp = (void**) *sp;
       result[n] = *(sp+1);
       if (next_sp > sp)
          sizes[n] = (char*)next_sp - (char*)sp;
       else
           sizes[n] = 0;
       sp = next_sp;
       n++;
   }
   return n;
}

__attribute__((noinline)) int bar(int level)
{
  int a[100];

  int i;

   if (level == 0)
     {
       N = get_stack_traces (address);
       return 0;
      }

  for (i = 0; i < 100; i++)
    a[i] = i + 10;

  return bar (level - 1) + a[0] + a[99];
}

__attribute__((noinline)) int foo()
{

  int a[100];

  int i;

  for (i = 0; i < 100; i++)
    a[i] = i + 10;


  return bar (5) + a[0] + a[99];
}


int main()
{
  int i, n;

  main_ret_address = __builtin_return_address (0);
  n = foo();

   fprintf (stderr, "return value = %d, stack_depth = %d\n", n, N);

   for (i = 0; i < N; i++)
     {
         fprintf (stderr, "Frame[%d]: addr = %p, stack_size = %d\n", i,
                  address[i], sizes[i]);

     }

   return 0;
}