1# clang-format off
2# REQUIRES: lld, x86
3
4# RUN: llvm-mc -triple=x86_64-windows-msvc --filetype=obj %p/Inputs/inline_sites.s > %t.obj
5# RUN: lld-link -debug:full -nodefaultlib -entry:main -base:0x140000000 %t.obj -out:%t.exe
6# RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -s \
7# RUN:     %p/Inputs/inline_sites.lldbinit 2>&1 | FileCheck %s
8
9# CHECK:      (lldb) image dump line-table a.cpp -v
10# CHECK-NEXT: Line table
11# CHECK-NEXT: 0x0000000140001000: /tmp/a.cpp:2
12# CHECK-NEXT: 0x0000000140001004: /tmp/a.h:5, is_start_of_statement = TRUE, is_prologue_end = TRUE
13# CHECK-NEXT: 0x000000014000100c: /tmp/a.h:6
14# CHECK-NEXT: 0x0000000140001010: /tmp/a.h:7
15# CHECK-NEXT: 0x0000000140001018: /tmp/a.h:9
16# CHECK-NEXT: 0x000000014000101c: /tmp/b.h:5, is_start_of_statement = TRUE, is_prologue_end = TRUE
17# CHECK-NEXT: 0x0000000140001022: /tmp/b.h:6
18# CHECK-NEXT: 0x0000000140001026: /tmp/b.h:7
19# CHECK-NEXT: 0x000000014000102a: /tmp/c.h:5, is_start_of_statement = TRUE, is_prologue_end = TRUE
20# CHECK-NEXT: 0x0000000140001031: /tmp/c.h:6
21# CHECK-NEXT: 0x0000000140001035: /tmp/c.h:7
22# CHECK-NEXT: 0x0000000140001039: /tmp/a.cpp:3
23# CHECK-NEXT: 0x000000014000103d: /tmp/a.cpp:4
24# CHECK-NEXT: 0x0000000140001044: /tmp/a.h:8, is_start_of_statement = TRUE
25# CHECK-NEXT: 0x0000000140001046: /tmp/a.cpp:4, is_terminal_entry = TRUE
26
27#CHECK: (lldb) b a.h:5
28#CHECK: Breakpoint 1: where = {{.*}}`main + 4 [inlined] Namespace1::foo at a.h:5, address = 0x0000000140001004
29#CHECK: (lldb) b a.h:6
30#CHECK: Breakpoint 2: where = {{.*}}`main + 12 [inlined] Namespace1::foo + 8 at a.h:6, address = 0x000000014000100c
31#CHECK: (lldb) b a.h:7
32#CHECK: Breakpoint 3: where = {{.*}}`main + 16 [inlined] Namespace1::foo + 12 at a.h:7, address = 0x0000000140001010
33#CHECK: (lldb) b a.h:8
34#CHECK: Breakpoint 4: where = {{.*}}`main + 68 [inlined] Namespace1::foo at a.h:8, address = 0x0000000140001044
35#CHECK: (lldb) b a.h:9
36#CHECK: Breakpoint 5: where = {{.*}}`main + 24 [inlined] Namespace1::foo + 20 at a.h:9, address = 0x0000000140001018
37#CHECK: (lldb) b b.h:5
38#CHECK: Breakpoint 6: where = {{.*}}`main + 28 [inlined] Class1::bar at b.h:5, address = 0x000000014000101c
39#CHECK: (lldb) b b.h:6
40#CHECK: Breakpoint 7: where = {{.*}}`main + 34 [inlined] Class1::bar + 6 at b.h:6, address = 0x0000000140001022
41#CHECK: (lldb) b b.h:7
42#CHECK: Breakpoint 8: where = {{.*}}`main + 38 [inlined] Class1::bar + 10 at b.h:7, address = 0x0000000140001026
43#CHECK: (lldb) b c.h:5
44#CHECK: Breakpoint 9: where = {{.*}}`main + 42 [inlined] Namespace2::Class2::func at c.h:5, address = 0x000000014000102a
45#CHECK: (lldb) b c.h:6
46#CHECK: Breakpoint 10: where = {{.*}}`main + 49 [inlined] Namespace2::Class2::func + 7 at c.h:6, address = 0x0000000140001031
47#CHECK: (lldb) b c.h:7
48#CHECK: Breakpoint 11: where = {{.*}}`main + 53 [inlined] Namespace2::Class2::func + 11 at c.h:7, address = 0x0000000140001035
49#CHECK: (lldb) b a.cpp:3
50#CHECK: Breakpoint 12: where = {{.*}}`main + 57 at a.cpp:3, address = 0x0000000140001039
51#CHECK: (lldb) b a.cpp:4
52#CHECK: Breakpoint 13: where = {{.*}}`main + 61 at a.cpp:4, address = 0x000000014000103d
53#CHECK: (lldb) b a.h:8
54#CHECK: Breakpoint 14: where = {{.*}}`main + 68 [inlined] Namespace1::foo at a.h:8, address = 0x0000000140001044
55
56# CEHCK-LABEL: (lldb) image lookup -a 0x140001003 -v
57# CHECK:       Summary: {{.*}}`main + 3 at a.cpp:2
58# CHECK:       Function: id = {{.*}}, name = "main", range = [0x0000000140001000-0x0000000140001046)
59# CHECK:       Blocks: id = {{.*}}, range = [0x140001000-0x140001046)
60# CHECK:       LineEntry: [0x0000000140001000-0x0000000140001004): /tmp/a.cpp:2
61# CHECK-NEXT:  Variable: id = {{.*}}, name = "argc", type = "int", valid ranges = [0x0000000140001000-0x000000014000102d)
62# CHECK-NEXT:  Variable: id = {{.*}}, name = "argv", type = "char **", valid ranges = [0x0000000140001000-0x0000000140001045)
63
64# CEHCK-LABEL: (lldb) image lookup -a 0x140001004 -v
65# CHECK:       Summary: {{.*}}`main + 4 [inlined] Namespace1::foo at a.h:5
66# CHECK-NEXT:           {{.*}}`main + 4 at a.cpp:3
67# CHECK:       Function: id = {{.*}}, name = "main", range = [0x0000000140001000-0x0000000140001046)
68# CHECK:         Blocks: id = {{.*}}, range = [0x140001000-0x140001046)
69# CHECK-NEXT:            id = {{.*}}, ranges = [0x140001004-0x140001039)[0x140001044-0x140001046), name = "Namespace1::foo", decl = a.h:4
70# CHECK:       LineEntry: [0x0000000140001004-0x000000014000100c): /tmp/a.h:5
71# CHECK-NEXT:  Variable: id = {{.*}}, name = "foo_local", type = "int", valid ranges = [0x0000000140001004-0x0000000140001039)
72# CHECK-NEXT:  Variable: id = {{.*}}, name = "argc", type = "int", valid ranges = [0x0000000140001000-0x000000014000102d)
73# CHECK-NEXT:  Variable: id = {{.*}}, name = "argv", type = "char **", valid ranges = [0x0000000140001000-0x0000000140001045)
74# CHECK-NEXT:  Variable: id = {{.*}}, name = "main_local", type = "int", valid ranges = [0x0000000140001004-0x0000000140001046)
75
76# CEHCK-LABEL: (lldb) image lookup -a 0x140001010 -v
77# CHECK:       Summary: {{.*}}`main + 16 [inlined] Namespace1::foo + 12 at a.h:7
78# CHECK-NEXT:           {{.*}}`main + 4 at a.cpp:3
79# CHECK:       Function: id = {{.*}}, name = "main", range = [0x0000000140001000-0x0000000140001046)
80# CHECK:         Blocks: id = {{.*}}, range = [0x140001000-0x140001046)
81# CHECK-NEXT:            id = {{.*}}, ranges = [0x140001004-0x140001039)[0x140001044-0x140001046), name = "Namespace1::foo", decl = a.h:4
82# CHECK:       LineEntry: [0x0000000140001010-0x0000000140001018): /tmp/a.h:7
83# CHECK-NEXT:  Variable: id = {{.*}}, name = "foo_local", type = "int", valid ranges = [0x0000000140001004-0x0000000140001039)
84# CHECK-NEXT:  Variable: id = {{.*}}, name = "argc", type = "int", valid ranges = [0x0000000140001000-0x000000014000102d)
85# CHECK-NEXT:  Variable: id = {{.*}}, name = "argv", type = "char **", valid ranges = [0x0000000140001000-0x0000000140001045)
86# CHECK-NEXT:  Variable: id = {{.*}}, name = "main_local", type = "int", valid ranges = [0x0000000140001004-0x0000000140001046)
87
88# CEHCK-LABEL: (lldb) image lookup -a 0x14000101c -v
89# CHECK:       Summary: {{.*}}`main + 28 [inlined] Class1::bar at b.h:5
90# CHECK-NEXT:           {{.*}}`main + 28 [inlined] Namespace1::foo + 24 at a.h:9
91# CHECK-NEXT:           {{.*}}`main + 4 at a.cpp:3
92# CHECK:       Function: id = {{.*}}, name = "main", range = [0x0000000140001000-0x0000000140001046)
93# CHECK:         Blocks: id = {{.*}}, range = [0x140001000-0x140001046)
94# CHECK-NEXT:            id = {{.*}}, ranges = [0x140001004-0x140001039)[0x140001044-0x140001046), name = "Namespace1::foo", decl = a.h:4
95# CHECK-NEXT:            id = {{.*}}, range = [0x14000101c-0x140001039), name = "Class1::bar", decl = b.h:4
96# CHECK:       LineEntry: [0x000000014000101c-0x0000000140001022): /tmp/b.h:5
97# CHECK-NEXT:  Variable: id = {{.*}}, name = "x", type = "int", valid ranges = [0x000000014000101c-0x000000014000101e)
98# CHECK-NEXT:  Variable: id = {{.*}}, name = "bar_local", type = "int", valid ranges = [0x000000014000101c-0x0000000140001039)
99# CHECK-NEXT:  Variable: id = {{.*}}, name = "foo_local", type = "int", valid ranges = [0x0000000140001004-0x0000000140001039)
100# CHECK-NEXT:  Variable: id = {{.*}}, name = "argc", type = "int", valid ranges = [0x0000000140001000-0x000000014000102d)
101# CHECK-NEXT:  Variable: id = {{.*}}, name = "argv", type = "char **", valid ranges = [0x0000000140001000-0x0000000140001045)
102# CHECK-NEXT:  Variable: id = {{.*}}, name = "main_local", type = "int", valid ranges = [0x0000000140001004-0x0000000140001046)
103
104# CEHCK-LABEL: (lldb) image lookup -a 0x14000102a -v
105# CHECK:       Summary: {{.*}}`main + 42 [inlined] Namespace2::Class2::func at c.h:5
106# CHECK-NEXT:           {{.*}}`main + 42 [inlined] Class1::bar + 14 at b.h:7
107# CHECK-NEXT:           {{.*}}`main + 28 [inlined] Namespace1::foo + 24 at a.h:9
108# CHECK-NEXT:           {{.*}}`main + 4 at a.cpp:3
109# CHECK:       Function: id = {{.*}}, name = "main", range = [0x0000000140001000-0x0000000140001046)
110# CHECK:         Blocks: id = {{.*}}, range = [0x140001000-0x140001046)
111# CHECK-NEXT:            id = {{.*}}, ranges = [0x140001004-0x140001039)[0x140001044-0x140001046), name = "Namespace1::foo", decl = a.h:4
112# CHECK-NEXT:            id = {{.*}}, range = [0x14000101c-0x140001039), name = "Class1::bar", decl = b.h:4
113# CHECK-NEXT:            id = {{.*}}, range = [0x14000102a-0x140001039), name = "Namespace2::Class2::func", decl = c.h:4
114# CHECK:       LineEntry: [0x000000014000102a-0x0000000140001031): /tmp/c.h:5
115# CHECK-NEXT:  Variable: id = {{.*}}, name = "x", type = "int", valid ranges = [0x000000014000102a-0x0000000140001039)
116# CHECK-NEXT:  Variable: id = {{.*}}, name = "func_local", type = "int", valid ranges = [0x000000014000102a-0x0000000140001039)
117# CHECK-NEXT:  Variable: id = {{.*}}, name = "bar_local", type = "int", valid ranges = [0x000000014000101c-0x0000000140001039)
118# CHECK-NEXT:  Variable: id = {{.*}}, name = "foo_local", type = "int", valid ranges = [0x0000000140001004-0x0000000140001039)
119# CHECK-NEXT:  Variable: id = {{.*}}, name = "argc", type = "int", valid ranges = [0x0000000140001000-0x000000014000102d)
120# CHECK-NEXT:  Variable: id = {{.*}}, name = "argv", type = "char **", valid ranges = [0x0000000140001000-0x0000000140001045)
121# CHECK-NEXT:  Variable: id = {{.*}}, name = "main_local", type = "int", valid ranges = [0x0000000140001004-0x0000000140001046)
122
123# CEHCK-LABEL: (lldb) image lookup -a 0x140001039 -v
124# CHECK:       Summary: {{.*}}`main + 57 at a.cpp:3
125# CHECK:       Function: id = {{.*}}, name = "main", range = [0x0000000140001000-0x0000000140001046)
126# CHECK:         Blocks: id = {{.*}}, range = [0x140001000-0x140001046)
127# CHECK:       LineEntry: [0x0000000140001039-0x000000014000103d): /tmp/a.cpp:3
128# CHECK-NEXT:  Variable: id = {{.*}}, name = "argv", type = "char **", valid ranges = [0x0000000140001000-0x0000000140001045)
129# CHECK-NEXT:  Variable: id = {{.*}}, name = "main_local", type = "int", valid ranges = [0x0000000140001004-0x0000000140001046)
130
131# CEHCK-LABEL: (lldb) image lookup -a 0x140001044 -v
132# CHECK:       Summary: {{.*}}`main + 68 [inlined] Namespace1::foo at a.h:8
133# CHECK-NEXT:           {{.*}}`main + 68 at a.cpp:3
134# CHECK:       Function: id = {{.*}}, name = "main", range = [0x0000000140001000-0x0000000140001046)
135# CHECK:         Blocks: id = {{.*}}, range = [0x140001000-0x140001046)
136# CHECK-NEXT:            id = {{.*}}, ranges = [0x140001004-0x140001039)[0x140001044-0x140001046), name = "Namespace1::foo", decl = a.h:4
137# CHECK:       LineEntry: [0x0000000140001044-0x0000000140001046): /tmp/a.h:8
138# CHECK-NEXT:  Variable: id = {{.*}}, name = "foo_local", type = "int", valid ranges = [0x0000000140001044-0x0000000140001046)
139# CHECK-NEXT:  Variable: id = {{.*}}, name = "argc", type = "int", valid ranges = [0x0000000140001044-0x0000000140001045)
140# CHECK-NEXT:  Variable: id = {{.*}}, name = "argv", type = "char **", valid ranges = [0x0000000140001000-0x0000000140001045)
141# CHECK-NEXT:  Variable: id = {{.*}}, name = "main_local", type = "int", valid ranges = [0x0000000140001004-0x0000000140001046)
142
143# CHECK-LABEL: (lldb) target modules dump ast
144# CHECK-NEXT:  Dumping clang ast for 1 modules.
145# CHECK-NEXT:  TranslationUnitDecl {{.*}} <undeserialized declarations>
146# CHECK-NEXT:  |-FunctionDecl {{.*}} main 'int (int, char **)'
147# CHECK-NEXT:  | |-ParmVarDecl {{.*}} argc 'int'
148# CHECK-NEXT:  | `-ParmVarDecl {{.*}} argv 'char **'
149# CHECK-NEXT:  |-NamespaceDecl {{.*}} Namespace1
150# CHECK-NEXT:  | `-FunctionDecl {{.*}} foo 'int (int)' inline
151# CHECK-NEXT:  |   `-ParmVarDecl {{.*}} x 'int'
152# CHECK-NEXT:  |-CXXRecordDecl {{.*}} <undeserialized declarations> class Class1
153# CHECK-NEXT:  | |-AccessSpecDecl {{.*}} public
154# CHECK-NEXT:  | `-CXXMethodDecl {{.*}} bar 'int (int)' static
155# CHECK-NEXT:  |   `-ParmVarDecl {{.*}} 'int'
156# CHECK-NEXT:  `-NamespaceDecl {{.*}} Namespace2
157# CHECK-NEXT:    `-CXXRecordDecl {{.*}} <undeserialized declarations> class Class2
158# CHECK-NEXT:      |-AccessSpecDecl {{.*}} public
159# CHECK-NEXT:      `-CXXMethodDecl {{.*}} func 'int (int)' static
160# CHECK-NEXT:        `-ParmVarDecl {{.*}} 'int'
161