1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This is a test for complicated stack traces.
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// - In deep-A.vgtest, the stack trace is larger than the asked-for depth
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   (12 vs. 8) so not all of the trace is shown.
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// - In deep-B.vgtest, we have --alloc-fn=a6..a12, which means that get_XCon
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   needs to redo the IP getting, because 7 functions get removed from the
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   trace, which is more than the initial overestimate of 3.
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// - In deep-C.vgtest, we have --alloc-fn=a3..a12, which means that get_XCon
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   ends up with an empty stack trace after removing all the alloc-fns.
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   It then redoes it.
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// - In deep-D.vgtest, we have --alloc-fn=main..a12, which means we have a
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   stack trace with a single "(below main)" entry.
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a12(int n) { malloc(n); }
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a11(int n) { a12(n); }
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a10(int n) { a11(n); }
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a9 (int n) { a10(n); }
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a8 (int n) { a9 (n); }
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a7 (int n) { a8 (n); }
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a6 (int n) { a7 (n); }
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a5 (int n) { a6 (n); }
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a4 (int n) { a5 (n); }
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a3 (int n) { a4 (n); }
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a2 (int n) { a3 (n); }
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid a1 (int n) { a2 (n); }
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(void)
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // This one exceeds the default --depth.
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < 10; i++)
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      a1(400);    // divisible by 16 -- no slop
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
39