1 // RUN: %clang_cc1 -triple=x86_64-pc-windows-msvc -debug-info-kind=limited \
2 // RUN:    -std=c++11 -gcodeview -gno-column-info -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 -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 -gno-column-info -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 -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 
foo(int x,int y,int z)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