blob: a1c4ef9eea25dab8f2e08b889e6460ad9e4934f5 [file] [log] [blame]
Dehao Chene239e952016-10-07 15:21:29 +00001// RUN: %clang_cc1 -w -debug-info-kind=line-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -mllvm -no-discriminators -emit-llvm %s -o - -triple %itanium_abi_triple | FileCheck %s
2// RUN: %clang_cc1 -w -debug-info-kind=line-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -mllvm -no-discriminators -emit-llvm %s -o - -triple i686-linux-gnu | FileCheck %s
David Blaikie66e41972015-01-14 07:38:27 +00003
David Blaikie538deff2014-12-09 20:52:24 +00004int &src();
David Blaikie8ec8dfe2014-12-09 21:10:43 +00005int *sink();
Reid Kleckner60e54da2014-12-10 00:47:33 +00006extern "C" __complex float complex_src();
7extern "C" __complex float *complex_sink();
David Blaikie0b7fad62014-12-08 21:48:57 +00008
David Blaikie8ec8dfe2014-12-09 21:10:43 +00009// CHECK-LABEL: define
David Blaikie0b7fad62014-12-08 21:48:57 +000010void f1() {
David Blaikie9b479662015-01-25 01:19:10 +000011 *sink()
David Blaikie73ca5692014-12-09 00:32:22 +000012 // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]]
David Blaikie9b479662015-01-25 01:19:10 +000013#line 100
14 = //
15 src();
David Blaikie0b7fad62014-12-08 21:48:57 +000016}
17
David Blaikie73ca5692014-12-09 00:32:22 +000018struct foo {
19 int i;
20 int &j;
David Blaikie538deff2014-12-09 20:52:24 +000021 __complex float k;
David Blaikie73ca5692014-12-09 00:32:22 +000022 foo();
23};
24
David Blaikie8ec8dfe2014-12-09 21:10:43 +000025// CHECK-LABEL: define
David Blaikie73ca5692014-12-09 00:32:22 +000026foo::foo()
David Blaikie8ec8dfe2014-12-09 21:10:43 +000027 :
David Blaikie73ca5692014-12-09 00:32:22 +000028#line 200
David Blaikie8ec8dfe2014-12-09 21:10:43 +000029 i // CHECK: store i32 {{.*}} !dbg [[DBG_FOO_VALUE:!.*]]
30 (src()),
31 j // CHECK: store i32* {{.*}} !dbg [[DBG_FOO_REF:!.*]]
32 (src()),
33 k // CHECK: store float {{.*}} !dbg [[DBG_FOO_COMPLEX:!.*]]
34 (complex_src()) {
35}
36
Reid Kleckner60e54da2014-12-10 00:47:33 +000037// CHECK-LABEL: define {{.*}}f2{{.*}}
David Blaikie8ec8dfe2014-12-09 21:10:43 +000038void f2() {
David Blaikie9b479662015-01-25 01:19:10 +000039 // CHECK: store float {{.*}} !dbg [[DBG_F2:!.*]]
40 *complex_sink()
David Blaikie8ec8dfe2014-12-09 21:10:43 +000041#line 300
David Blaikie9b479662015-01-25 01:19:10 +000042 = //
43 complex_src();
David Blaikie73ca5692014-12-09 00:32:22 +000044}
45
David Blaikie93e9cf82014-12-09 21:32:00 +000046// CHECK-LABEL: define
47void f3() {
David Blaikie9b479662015-01-25 01:19:10 +000048 // CHECK: store float {{.*}} !dbg [[DBG_F3:!.*]]
49 *complex_sink()
David Blaikie93e9cf82014-12-09 21:32:00 +000050#line 400
David Blaikie9b479662015-01-25 01:19:10 +000051 += //
52 complex_src();
David Blaikie93e9cf82014-12-09 21:32:00 +000053}
54
David Blaikie7f138812014-12-09 22:04:13 +000055// CHECK-LABEL: define
56void f4() {
57#line 500
58 auto x // CHECK: store {{.*}} !dbg [[DBG_F4:!.*]]
59 = src();
60}
61
David Blaikie00de22f2014-12-09 22:15:02 +000062// CHECK-LABEL: define
63void f5() {
64#line 600
65 auto x // CHECK: store float {{.*}} !dbg [[DBG_F5:!.*]]
66 = complex_src();
67}
68
David Blaikied73f3c62014-12-09 23:33:26 +000069struct agg { int i; };
70agg agg_src();
71
72// CHECK-LABEL: define
73void f6() {
74 agg x;
David Blaikie9f7ae2c2015-01-25 01:25:37 +000075 // CHECK: call void @llvm.memcpy{{.*}} !dbg [[DBG_F6:!.*]]
76 x
David Blaikied73f3c62014-12-09 23:33:26 +000077#line 700
David Blaikie9f7ae2c2015-01-25 01:25:37 +000078 = //
79 agg_src();
David Blaikied73f3c62014-12-09 23:33:26 +000080}
81
David Blaikief0aceb22014-12-10 01:03:48 +000082// CHECK-LABEL: define
83void f7() {
84 int *src1();
85 int src2();
86#line 800
87 int x = ( // CHECK: load {{.*}} !dbg [[DBG_F7:!.*]]
88 src1())[src2()];
89}
90
David Blaikied85548d2014-12-10 01:16:09 +000091// CHECK-LABEL: define
92void f8() {
93 int src1[1];
94 int src2();
95#line 900
96 int x = ( // CHECK: load {{.*}} !dbg [[DBG_F8:!.*]]
97 src1)[src2()];
98}
99
David Blaikie7c5da412014-12-10 01:34:25 +0000100// CHECK-LABEL: define
101void f9(int i) {
102 int src1[1][i];
103 int src2();
104#line 1000
105 auto x = ( // CHECK: getelementptr {{.*}} !dbg [[DBG_F9:!.*]]
106 src1)[src2()];
107}
108
David Blaikie09f12fa2014-12-14 18:48:18 +0000109inline void *operator new(decltype(sizeof(1)), void *p) noexcept { return p; }
David Blaikiea2c11242014-12-10 19:04:09 +0000110
111// CHECK-LABEL: define
112void f10() {
113 void *void_src();
Richard Smith902a0232015-02-14 01:52:20 +0000114 (
David Blaikie09f12fa2014-12-14 18:48:18 +0000115 // CHECK: store {{.*}} !dbg [[DBG_F10_STORE:!.*]]
David Blaikiea2c11242014-12-10 19:04:09 +0000116#line 1100
117 new (void_src()) int(src()));
118}
119
David Blaikie47d28e02015-01-14 07:10:46 +0000120// noexcept just to simplify the codegen a bit
121void fn() noexcept(true);
122
123struct bar {
124 bar();
125 // noexcept(false) to convolute the global dtor
126 ~bar() noexcept(false);
127};
128// global ctor cleanup
129// CHECK-LABEL: define
130// CHECK: invoke{{ }}
131// CHECK: invoke{{ }}
132// CHECK: to label {{.*}}, !dbg [[DBG_GLBL_CTOR_B:!.*]]
David Blaikie66e41972015-01-14 07:38:27 +0000133
134// terminate caller
135// CHECK-LABEL: define
136
David Blaikie47d28e02015-01-14 07:10:46 +0000137// global dtor cleanup
138// CHECK-LABEL: define
139// CHECK: invoke{{ }}
140// CHECK: invoke{{ }}
141// CHECK: to label {{.*}}, !dbg [[DBG_GLBL_DTOR_B:!.*]]
David Blaikie71fb83e2015-01-16 22:55:09 +0000142#line 1200
David Blaikie47d28e02015-01-14 07:10:46 +0000143bar b[1] = { //
144 (fn(), //
145 bar())};
146
David Blaikie66e41972015-01-14 07:38:27 +0000147// CHECK-LABEL: define
148__complex double f11() {
149 __complex double f;
150// CHECK: store {{.*}} !dbg [[DBG_F11:!.*]]
David Blaikie71fb83e2015-01-16 22:55:09 +0000151#line 1300
David Blaikie66e41972015-01-14 07:38:27 +0000152 return f;
153}
154
155// CHECK-LABEL: define
156void f12() {
157 int f12_1();
158 void f12_2(int = f12_1());
David Blaikieea3e51d2015-06-29 17:29:50 +0000159// CHECK: call {{.*}}{{(signext )?}}i32 {{.*}} !dbg [[DBG_F12:!.*]]
David Blaikie71fb83e2015-01-16 22:55:09 +0000160#line 1400
David Blaikie66e41972015-01-14 07:38:27 +0000161 f12_2();
162}
163
164// CHECK-LABEL: define
165void f13() {
166// CHECK: call {{.*}} !dbg [[DBG_F13:!.*]]
167#define F13_IMPL 1, src()
168 1,
David Blaikie71fb83e2015-01-16 22:55:09 +0000169#line 1500
David Blaikie66e41972015-01-14 07:38:27 +0000170 F13_IMPL;
171}
172
David Blaikie01fb5fb2015-01-18 01:48:19 +0000173struct f14_impl {
174 f14_impl(int);
David Blaikie71fb83e2015-01-16 22:55:09 +0000175};
176
177// CHECK-LABEL: define
David Blaikie1c39bbb2015-01-18 00:37:04 +0000178struct f14_use {
David Blaikie01fb5fb2015-01-18 01:48:19 +0000179// CHECK: call {{.*}}f14_impl{{.*}}, !dbg [[DBG_F14_CTOR_CALL:![0-9]*]]
David Blaikiea81d4102015-01-18 00:12:58 +0000180#line 1600
David Blaikie01fb5fb2015-01-18 01:48:19 +0000181 f14_impl v{//
182 1};
David Blaikie1c39bbb2015-01-18 00:37:04 +0000183 f14_use();
184};
185
186f14_use::f14_use() = default;
David Blaikie71fb83e2015-01-16 22:55:09 +0000187
188// CHECK-LABEL: define
David Blaikiec6593072015-01-18 01:57:54 +0000189// CHECK-LABEL: define
David Blaikie01fb5fb2015-01-18 01:48:19 +0000190void func(foo);
191void f15(foo *f) {
192 func(
193// CHECK: getelementptr {{.*}}, !dbg [[DBG_F15:![0-9]*]]
194#line 1700
195 f[3]);
196}
David Blaikie71fb83e2015-01-16 22:55:09 +0000197
David Blaikiec6593072015-01-18 01:57:54 +0000198// CHECK-LABEL: define
199void f16(__complex float f) {
200 __complex float g = //
201// CHECK: add {{.*}}, !dbg [[DBG_F16:![0-9]*]]
202#line 1800
203 f + 1;
204}
205
David Blaikie2d321fb2015-01-24 23:35:17 +0000206// CHECK-LABEL: define
207void f17(int *x) {
208 1,
209// CHECK: getelementptr {{.*}}, !dbg [[DBG_F17:![0-9]*]]
210#line 1900
211 x[1];
212}
213
David Blaikie298720d2015-01-28 19:50:09 +0000214// CHECK-LABEL: define
215void f18(int a, int b) {
216// CHECK: icmp {{.*}}, !dbg [[DBG_F18_1:![0-9]*]]
217// CHECK: br {{.*}}, !dbg [[DBG_F18_2:![0-9]*]]
218#line 2000
219 if (a //
220 && //
221 b)
222 ;
223}
224
225// CHECK-LABEL: define
226void f19(int a, int b) {
227// CHECK: icmp {{.*}}, !dbg [[DBG_F19_1:![0-9]*]]
228// CHECK: br {{.*}}, !dbg [[DBG_F19_2:![0-9]*]]
229#line 2100
230 if (a //
231 || //
232 b)
233 ;
234}
235
236// CHECK-LABEL: define
237void f20(int a, int b, int c) {
238// CHECK: icmp {{.*}}, !dbg [[DBG_F20_1:![0-9]*]]
239// FIXME: Conditional operator's exprloc should be the '?' not the start of the
240// expression, then this would go in the right place. (but adding getExprLoc to
241// the ConditionalOperator breaks the ARC migration tool - need to investigate
242// further).
243// CHECK: br {{.*}}, !dbg [[DBG_F20_1]]
244#line 2200
245 if (a //
246 ? //
247 b : c)
248 ;
249}
250
David Blaikie14177b72015-02-03 22:37:17 +0000251// CHECK-LABEL: define
252int f21_a(int = 0);
253void f21_b(int = f21_a());
254void f21() {
255// CHECK: call {{.*}}f21_b{{.*}}, !dbg [[DBG_F21:![0-9]*]]
256#line 2300
257 f21_b();
258}
259
David Blaikie4d524432015-02-04 19:47:54 +0000260// CHECK-LABEL: define
261struct f22_dtor {
262 ~f22_dtor();
263};
264void f22() {
265 {
266 f22_dtor f;
267 src();
NAKAMURA Takumib1980e62015-02-05 01:02:34 +0000268// CHECK: invoke {{.*}}src
David Blaikie4d524432015-02-04 19:47:54 +0000269// CHECK: call {{.*}}, !dbg [[DBG_F22:![0-9]*]]
270// CHECK: call {{.*}}, !dbg [[DBG_F22]]
271#line 2400
272 }
273}
274
David Blaikie2221aba2015-02-09 18:47:14 +0000275// CHECK-LABEL: define
276struct f23_struct {
277};
278f23_struct f23_a();
279void f23_b(f23_struct = f23_a());
280void f23() {
281// CHECK: call {{.*}}f23_a{{.*}}, !dbg [[DBG_F23:![0-9]*]]
282#line 2500
283 f23_b();
284}
285
David Blaikie20937be2015-02-09 18:55:57 +0000286// CHECK-LABEL: define
287void f24_a(__complex float = complex_src());
288void f24() {
289// CHECK: call {{.*}}complex_src{{.*}}, !dbg [[DBG_F24:![0-9]*]]
290#line 2600
291 f24_a();
292}
293
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +0000294// CHECK: [[DBG_F1]] = !DILocation(line: 100,
295// CHECK: [[DBG_FOO_VALUE]] = !DILocation(line: 200,
296// CHECK: [[DBG_FOO_REF]] = !DILocation(line: 202,
297// CHECK: [[DBG_FOO_COMPLEX]] = !DILocation(line: 204,
298// CHECK: [[DBG_F2]] = !DILocation(line: 300,
299// CHECK: [[DBG_F3]] = !DILocation(line: 400,
300// CHECK: [[DBG_F4]] = !DILocation(line: 500,
301// CHECK: [[DBG_F5]] = !DILocation(line: 600,
302// CHECK: [[DBG_F6]] = !DILocation(line: 700,
303// CHECK: [[DBG_F7]] = !DILocation(line: 800,
304// CHECK: [[DBG_F8]] = !DILocation(line: 900,
305// CHECK: [[DBG_F9]] = !DILocation(line: 1000,
306// CHECK: [[DBG_F10_STORE]] = !DILocation(line: 1100,
307// CHECK: [[DBG_GLBL_CTOR_B]] = !DILocation(line: 1200,
308// CHECK: [[DBG_GLBL_DTOR_B]] = !DILocation(line: 1200,
309// CHECK: [[DBG_F11]] = !DILocation(line: 1300,
310// CHECK: [[DBG_F12]] = !DILocation(line: 1400,
311// CHECK: [[DBG_F13]] = !DILocation(line: 1500,
312// CHECK: [[DBG_F14_CTOR_CALL]] = !DILocation(line: 1600,
313// CHECK: [[DBG_F15]] = !DILocation(line: 1700,
314// CHECK: [[DBG_F16]] = !DILocation(line: 1800,
315// CHECK: [[DBG_F17]] = !DILocation(line: 1900,
316// CHECK: [[DBG_F18_1]] = !DILocation(line: 2000,
317// CHECK: [[DBG_F18_2]] = !DILocation(line: 2001,
318// CHECK: [[DBG_F19_1]] = !DILocation(line: 2100,
319// CHECK: [[DBG_F19_2]] = !DILocation(line: 2101,
320// CHECK: [[DBG_F20_1]] = !DILocation(line: 2200,
321// CHECK: [[DBG_F23]] = !DILocation(line: 2500,
322// CHECK: [[DBG_F24]] = !DILocation(line: 2600,