1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Demonstrate Memcheck correctly handling chain of 64 recursive
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   calls, each of which allocates a 1 M array on the stack.  Requires
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   --main-stacksize=67117057 (on amd64-linux) or above, but works fine
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if you specify that. */
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define N_MBYTES 64
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define N_INTS_PER_MBYTE (1048576 / sizeof(int))
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint rec ( int depth )
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, zzz;
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int arr[N_INTS_PER_MBYTE];
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (depth == 0) return 0;
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < N_INTS_PER_MBYTE; i++)
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      arr[i] = i * depth;
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   zzz = rec(depth-1);
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < N_INTS_PER_MBYTE; i++)
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       zzz += arr[i];
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return zzz;
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int sum;
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr, "lsframe2: start\n");
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sum = rec(N_MBYTES);
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr, "lsframe2: done, result is %d\n", sum);
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
35