1b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen//===-- main.c --------------------------------------------------*- C++ -*-===//
2b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen//
3b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen//                     The LLVM Compiler Infrastructure
4b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen//
5b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen// This file is distributed under the University of Illinois Open Source
6b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen// License. See LICENSE.TXT for details.
7b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen//
8b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen//===----------------------------------------------------------------------===//
9b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen#include <stdio.h>
10b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen
11b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen// This simple program is to demonstrate the capability of the lldb command
12b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen// "breakpoint command add" to add a set of commands to a breakpoint to be
13b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen// executed when the breakpoint is hit.
14b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen//
15b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen// In particular, we want to break within c(), but only if the immediate caller
16b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen// is a().
17b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen
18b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chenint a(int);
19b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chenint b(int);
20b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chenint c(int);
21b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen
22b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chenint a(int val)
23b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen{
24b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    if (val <= 1)
25b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen        return b(val);
26b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    else if (val >= 3)
27b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen        return c(val); // Find the line number where c's parent frame is a here.
28b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen
29b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    return val;
30b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen}
31b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen
32b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chenint b(int val)
33b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen{
34b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    return c(val);
35b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen}
36b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen
37b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chenint c(int val)
38b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen{
39b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    return val + 3;
40b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen}
41b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen
42b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chenint main (int argc, char const *argv[])
43b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen{
44b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    int A1 = a(1);  // a(1) -> b(1) -> c(1)
45b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    printf("a(1) returns %d\n", A1);
46b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen
47b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    int B2 = b(2);  // b(2) -> c(2)
48b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    printf("b(2) returns %d\n", B2);
49b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen
50b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    int A3 = a(3);  // a(3) -> c(3)
51b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    printf("a(3) returns %d\n", A3);
52b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen
53b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen    return 0;
54b883d17a9b85c07bf47a55d40b7f6061778f0fc7Johnny Chen}
55