1 | // RUN: %clang_cc1 -triple=x86_64-pc-windows-msvc -debug-info-kind=limited \ |
2 | // RUN: -std=c++11 -gcodeview -emit-llvm -o - %s \ |
3 | // RUN: | FileCheck -check-prefix=NONEST %s |
4 | // RUN: %clang_cc1 -triple=x86_64-pc-windows-msvc -debug-info-kind=limited \ |
5 | // RUN: -std=c++11 -gcodeview -dwarf-column-info -emit-llvm -o - %s \ |
6 | // RUN: | FileCheck -check-prefix=COLUMNS %s |
7 | // RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -debug-info-kind=limited \ |
8 | // RUN: -std=c++11 -emit-llvm -o - %s | FileCheck -check-prefix=NESTED %s |
9 | // RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -debug-info-kind=limited \ |
10 | // RUN: -std=c++11 -dwarf-column-info -emit-llvm -o - %s \ |
11 | // RUN: | FileCheck -check-prefix=COLUMNS %s |
12 | |
13 | class Foo { |
14 | public: |
15 | static Foo create(); |
16 | void func(); |
17 | int *begin(); |
18 | int *end(); |
19 | }; |
20 | |
21 | int bar(int x, int y); |
22 | int baz(int x, int y); |
23 | int qux(int x, int y); |
24 | int onearg(int x); |
25 | int noargs(); |
26 | int noargs1(); |
27 | Foo range(int x); |
28 | |
29 | int foo(int x, int y, int z) { |
30 | int a = bar(x, y) + |
31 | baz(x, z) + |
32 | qux(y, z); |
33 | // NONEST: call i32 @{{.*}}bar{{.*}}, !dbg ![[LOC:[0-9]+]] |
34 | // NONEST: call i32 @{{.*}}baz{{.*}}, !dbg ![[LOC]] |
35 | // NONEST: call i32 @{{.*}}qux{{.*}}, !dbg ![[LOC]] |
36 | // NONEST: store i32 {{.*}}, i32* %a,{{.*}} !dbg ![[LOC]] |
37 | // NESTED: call i32 @{{.*}}bar{{.*}}, !dbg ![[BAR:[0-9]+]] |
38 | // NESTED: call i32 @{{.*}}baz{{.*}}, !dbg ![[BAZ:[0-9]+]] |
39 | // NESTED: call i32 @{{.*}}qux{{.*}}, !dbg ![[QUX:[0-9]+]] |
40 | // NESTED: store i32 {{.*}}, i32* %a,{{.*}} !dbg ![[BAR]] |
41 | // COLUMNS: call i32 @{{.*}}bar{{.*}}, !dbg ![[BAR:[0-9]+]] |
42 | // COLUMNS: call i32 @{{.*}}baz{{.*}}, !dbg ![[BAZ:[0-9]+]] |
43 | // COLUMNS: call i32 @{{.*}}qux{{.*}}, !dbg ![[QUX:[0-9]+]] |
44 | // COLUMNS: store i32 {{.*}}, i32* %a,{{.*}} !dbg ![[DECLA:[0-9]+]] |
45 | |
46 | int i = 1, b = 0, c = 0; |
47 | // NONEST: store i32 1, i32* %i,{{.*}} !dbg ![[ILOC:[0-9]+]] |
48 | // NONEST: store i32 0, i32* %b,{{.*}} !dbg ![[ILOC]] |
49 | // NONEST: store i32 0, i32* %c,{{.*}} !dbg ![[ILOC]] |
50 | // NESTED: store i32 1, i32* %i,{{.*}} !dbg ![[ILOC:[0-9]+]] |
51 | // NESTED: store i32 0, i32* %b,{{.*}} !dbg ![[ILOC]] |
52 | // NESTED: store i32 0, i32* %c,{{.*}} !dbg ![[ILOC]] |
53 | // COLUMNS: store i32 1, i32* %i,{{.*}} !dbg ![[ILOC:[0-9]+]] |
54 | // COLUMNS: store i32 0, i32* %b,{{.*}} !dbg ![[BLOC:[0-9]+]] |
55 | // COLUMNS: store i32 0, i32* %c,{{.*}} !dbg ![[CLOC:[0-9]+]] |
56 | |
57 | while (i > 0) { |
58 | b = bar(a, b); |
59 | --i; |
60 | } |
61 | // NONEST: call i32 @{{.*}}bar{{.*}}, !dbg ![[WHILE1:[0-9]+]] |
62 | // NONEST: store i32 %{{[^,]+}}, i32* %i,{{.*}} !dbg ![[WHILE2:[0-9]+]] |
63 | // NESTED: call i32 @{{.*}}bar{{.*}}, !dbg ![[WHILE1:[0-9]+]] |
64 | // NESTED: store i32 %{{[^,]+}}, i32* %i,{{.*}} !dbg ![[WHILE2:[0-9]+]] |
65 | // COLUMNS: call i32 @{{.*}}bar{{.*}}, !dbg ![[WHILE1:[0-9]+]] |
66 | // COLUMNS: store i32 %{{[^,]+}}, i32* %i,{{.*}} !dbg ![[WHILE2:[0-9]+]] |
67 | |
68 | for (i = 0; i < 1; i++) { |
69 | b = bar(a, b); |
70 | c = qux(a, c); |
71 | } |
72 | // NONEST: call i32 @{{.*}}bar{{.*}}, !dbg ![[FOR1:[0-9]+]] |
73 | // NONEST: call i32 @{{.*}}qux{{.*}}, !dbg ![[FOR2:[0-9]+]] |
74 | // NESTED: call i32 @{{.*}}bar{{.*}}, !dbg ![[FOR1:[0-9]+]] |
75 | // NESTED: call i32 @{{.*}}qux{{.*}}, !dbg ![[FOR2:[0-9]+]] |
76 | // COLUMNS: call i32 @{{.*}}bar{{.*}}, !dbg ![[FOR1:[0-9]+]] |
77 | // COLUMNS: call i32 @{{.*}}qux{{.*}}, !dbg ![[FOR2:[0-9]+]] |
78 | |
79 | if (a < b) { |
80 | int t = a; |
81 | a = b; |
82 | b = t; |
83 | } |
84 | // NONEST: store i32 %{{[^,]+}}, i32* %t,{{.*}} !dbg ![[IF1:[0-9]+]] |
85 | // NONEST: store i32 %{{[^,]+}}, i32* %a,{{.*}} !dbg ![[IF2:[0-9]+]] |
86 | // NONEST: store i32 %{{[^,]+}}, i32* %b,{{.*}} !dbg ![[IF3:[0-9]+]] |
87 | // NESTED: store i32 %{{[^,]+}}, i32* %t,{{.*}} !dbg ![[IF1:[0-9]+]] |
88 | // NESTED: store i32 %{{[^,]+}}, i32* %a,{{.*}} !dbg ![[IF2:[0-9]+]] |
89 | // NESTED: store i32 %{{[^,]+}}, i32* %b,{{.*}} !dbg ![[IF3:[0-9]+]] |
90 | // COLUMNS: store i32 %{{[^,]+}}, i32* %t,{{.*}} !dbg ![[IF1:[0-9]+]] |
91 | // COLUMNS: store i32 %{{[^,]+}}, i32* %a,{{.*}} !dbg ![[IF2:[0-9]+]] |
92 | // COLUMNS: store i32 %{{[^,]+}}, i32* %b,{{.*}} !dbg ![[IF3:[0-9]+]] |
93 | |
94 | int d = onearg( |
95 | noargs()); |
96 | // NONEST: call i32 @{{.*}}noargs{{.*}}, !dbg ![[DECLD:[0-9]+]] |
97 | // NONEST: call i32 @{{.*}}onearg{{.*}}, !dbg ![[DECLD]] |
98 | // NONEST: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[DECLD]] |
99 | // NESTED: call i32 @{{.*}}noargs{{.*}}, !dbg ![[DNOARGS:[0-9]+]] |
100 | // NESTED: call i32 @{{.*}}onearg{{.*}}, !dbg ![[DECLD:[0-9]+]] |
101 | // NESTED: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[DECLD]] |
102 | // COLUMNS: call i32 @{{.*}}noargs{{.*}}, !dbg ![[DNOARGS:[0-9]+]] |
103 | // COLUMNS: call i32 @{{.*}}onearg{{.*}}, !dbg ![[DONEARG:[0-9]+]] |
104 | // COLUMNS: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[DECLD:[0-9]+]] |
105 | |
106 | d = onearg(noargs()); |
107 | // NONEST: call i32 @{{.*}}noargs{{.*}}, !dbg ![[SETD:[0-9]+]] |
108 | // NONEST: call i32 @{{.*}}onearg{{.*}}, !dbg ![[SETD]] |
109 | // NONEST: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[SETD]] |
110 | // NESTED: call i32 @{{.*}}noargs{{.*}}, !dbg ![[SETD:[0-9]+]] |
111 | // NESTED: call i32 @{{.*}}onearg{{.*}}, !dbg ![[SETD]] |
112 | // NESTED: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[SETD]] |
113 | // COLUMNS: call i32 @{{.*}}noargs{{.*}}, !dbg ![[SETDNOARGS:[0-9]+]] |
114 | // COLUMNS: call i32 @{{.*}}onearg{{.*}}, !dbg ![[SETDONEARG:[0-9]+]] |
115 | // COLUMNS: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[SETD:[0-9]+]] |
116 | |
117 | for (const auto x : range(noargs())) noargs1(); |
118 | // NONEST: call i32 @{{.*}}noargs{{.*}}, !dbg ![[RANGEFOR:[0-9]+]] |
119 | // NONEST: call {{.+}} @{{.*}}range{{.*}}, !dbg ![[RANGEFOR]] |
120 | // NONEST: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[RANGEFOR_BODY:[0-9]+]] |
121 | // NESTED: call i32 @{{.*}}noargs{{.*}}, !dbg ![[RANGEFOR:[0-9]+]] |
122 | // NESTED: call {{.+}} @{{.*}}range{{.*}}, !dbg ![[RANGEFOR]] |
123 | // NESTED: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[RANGEFOR_BODY:[0-9]+]] |
124 | // COLUMNS: call i32 @{{.*}}noargs{{.*}}, !dbg ![[RANGEFOR_NOARGS:[0-9]+]] |
125 | // COLUMNS: call {{.+}} @{{.*}}range{{.*}}, !dbg ![[RANGEFOR_RANGE:[0-9]+]] |
126 | // COLUMNS: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[RANGEFOR_BODY:[0-9]+]] |
127 | |
128 | if (noargs() && noargs1()) { |
129 | Foo::create().func(); |
130 | } |
131 | // NONEST: call i32 @{{.*}}noargs{{.*}}, !dbg ![[AND:[0-9]+]] |
132 | // NONEST: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[AND]] |
133 | // NONEST: call {{.+}} @{{.*}}create{{.*}}, !dbg ![[AND_BODY:[0-9]+]] |
134 | // NONEST: call void @{{.*}}func{{.*}}, !dbg ![[AND_BODY]] |
135 | // NESTED: call i32 @{{.*}}noargs{{.*}}, !dbg ![[AND:[0-9]+]] |
136 | // NESTED: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[AND]] |
137 | // NESTED: call {{.+}} @{{.*}}create{{.*}}, !dbg ![[AND_BODY:[0-9]+]] |
138 | // NESTED: call void @{{.*}}func{{.*}}, !dbg ![[AND_BODY]] |
139 | // COLUMNS: call i32 @{{.*}}noargs{{.*}}, !dbg ![[ANDLHS:[0-9]+]] |
140 | // COLUMNS: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[ANDRHS:[0-9]+]] |
141 | // COLUMNS: call {{.+}} @{{.*}}create{{.*}}, !dbg ![[AND_CREATE:[0-9]+]] |
142 | // COLUMNS: call void @{{.*}}func{{.*}}, !dbg ![[AND_FUNC:[0-9]+]] |
143 | |
144 | return a - |
145 | (b * z); |
146 | // NONEST: mul nsw i32 {{.*}}, !dbg ![[RETLOC:[0-9]+]] |
147 | // NONEST: sub nsw i32 {{.*}}, !dbg ![[RETLOC]] |
148 | // NONEST: ret i32 {{.*}}, !dbg ![[RETLOC]] |
149 | // NESTED: mul nsw i32 {{.*}}, !dbg ![[RETMUL:[0-9]+]] |
150 | // NESTED: sub nsw i32 {{.*}}, !dbg ![[RETSUB:[0-9]+]] |
151 | // NESTED: ret i32 {{.*}}, !dbg ! |
152 | // COLUMNS: mul nsw i32 {{.*}}, !dbg ![[RETMUL:[0-9]+]] |
153 | // COLUMNS: sub nsw i32 {{.*}}, !dbg ![[RETSUB:[0-9]+]] |
154 | // COLUMNS: ret i32 {{.*}}, !dbg ! |
155 | } |
156 | |
157 | // NONEST: ![[WHILE1]] = !DILocation( |
158 | // NONEST: ![[WHILE2]] = !DILocation( |
159 | // NONEST: ![[FOR1]] = !DILocation( |
160 | // NONEST: ![[FOR2]] = !DILocation( |
161 | // NONEST: ![[IF1]] = !DILocation( |
162 | // NONEST: ![[IF2]] = !DILocation( |
163 | // NONEST: ![[IF3]] = !DILocation( |
164 | // NONEST: ![[RANGEFOR]] = !DILocation( |
165 | // NONEST-SAME: line: [[RANGEFOR_LINE:[0-9]+]] |
166 | // NONEST: ![[RANGEFOR_BODY]] = !DILocation( |
167 | // NONEST-SAME: line: [[RANGEFOR_LINE]] |
168 | |
169 | // NESTED: ![[BAR]] = !DILocation( |
170 | // NESTED: ![[BAZ]] = !DILocation( |
171 | // NESTED: ![[QUX]] = !DILocation( |
172 | // NESTED: ![[DECLD]] = !DILocation |
173 | // NESTED: ![[DNOARGS]] = !DILocation |
174 | // NESTED: ![[RANGEFOR]] = !DILocation( |
175 | // NESTED-SAME: line: [[RANGEFOR_LINE:[0-9]+]] |
176 | // NESTED: ![[RANGEFOR_BODY]] = !DILocation( |
177 | // NESTED-SAME: line: [[RANGEFOR_LINE]] |
178 | // NESTED: ![[RETSUB]] = !DILocation( |
179 | // NESTED: ![[RETMUL]] = !DILocation( |
180 | |
181 | // COLUMNS: ![[DECLA]] = !DILocation( |
182 | // COLUMNS: ![[BAR]] = !DILocation( |
183 | // COLUMNS: ![[BAZ]] = !DILocation( |
184 | // COLUMNS: ![[QUX]] = !DILocation( |
185 | // COLUMNS: ![[ILOC]] = !DILocation( |
186 | // COLUMNS: ![[BLOC]] = !DILocation( |
187 | // COLUMNS: ![[CLOC]] = !DILocation( |
188 | // COLUMNS: ![[DECLD]] = !DILocation( |
189 | // COLUMNS: ![[DNOARGS]] = !DILocation( |
190 | // COLUMNS: ![[DONEARG]] = !DILocation( |
191 | // COLUMNS: ![[SETDNOARGS]] = !DILocation( |
192 | // COLUMNS: ![[SETDONEARG]] = !DILocation( |
193 | // COLUMNS: ![[SETD]] = !DILocation( |
194 | // COLUMNS: ![[RANGEFOR_NOARGS]] = !DILocation( |
195 | // COLUMNS: ![[RANGEFOR_RANGE]] = !DILocation( |
196 | // COLUMNS: ![[RANGEFOR_BODY]] = !DILocation( |
197 | // COLUMNS: ![[ANDLHS]] = !DILocation |
198 | // COLUMNS: ![[ANDRHS]] = !DILocation |
199 | // COLUMNS: ![[AND_CREATE]] = !DILocation |
200 | // COLUMNS: ![[AND_FUNC]] = !DILocation |
201 | // COLUNMS: ![[RETSUB]] = !DILocation( |
202 | // COLUMNS: ![[RETMUL]] = !DILocation( |
203 | |