blob: 48f2f008401568b75b1760676fddc1133df65c72 [file] [log] [blame]
Bob Wilson48b68a02012-01-31 23:52:58 +00001// RUN: %clang_cc1 %s -triple=thumbv7-apple-ios3.0 -fno-use-cxa-atexit -target-abi apcs-gnu -emit-llvm -o - -fexceptions | FileCheck %s
John McCall1e7fe752010-09-02 09:58:18 +00002
John McCall5cd91b52010-09-08 01:44:27 +00003// CHECK: @_ZZN5test74testEvE1x = internal global i32 0, align 4
4// CHECK: @_ZGVZN5test74testEvE1x = internal global i32 0
5// CHECK: @_ZZN5test84testEvE1x = internal global [[TEST8A:.*]] zeroinitializer, align 1
6// CHECK: @_ZGVZN5test84testEvE1x = internal global i32 0
7
John McCall1e7fe752010-09-02 09:58:18 +00008typedef typeof(sizeof(int)) size_t;
Chris Lattnerc9a85f92010-04-26 20:35:54 +00009
10class foo {
11public:
12 foo();
13 virtual ~foo();
14};
15
16class bar : public foo {
17public:
18 bar();
19};
20
21// The global dtor needs the right calling conv with -fno-use-cxa-atexit
22// rdar://7817590
23bar baz;
24
John McCall30fa3702012-04-06 18:21:06 +000025// PR9593
26// Make sure atexit(3) is used for global dtors.
27
28// CHECK: call [[BAR:%.*]]* @_ZN3barC1Ev(
29// CHECK-NEXT: call i32 @atexit(void ()* @__dtor_baz)
30
31// CHECK: define internal void @__dtor_baz()
32// CHECK: call [[BAR]]* @_ZN3barD1Ev([[BAR]]* @baz)
33
John McCall4c40d982010-08-31 07:33:07 +000034// Destructors and constructors must return this.
35namespace test1 {
36 void foo();
37
38 struct A {
39 A(int i) { foo(); }
40 ~A() { foo(); }
41 void bar() { foo(); }
42 };
43
44 // CHECK: define void @_ZN5test14testEv()
45 void test() {
46 // CHECK: [[AV:%.*]] = alloca [[A:%.*]], align 1
47 // CHECK: call [[A]]* @_ZN5test11AC1Ei([[A]]* [[AV]], i32 10)
48 // CHECK: invoke void @_ZN5test11A3barEv([[A]]* [[AV]])
49 // CHECK: call [[A]]* @_ZN5test11AD1Ev([[A]]* [[AV]])
50 // CHECK: ret void
51 A a = 10;
52 a.bar();
53 }
54
Rafael Espindola0691a5c2011-01-25 19:10:24 +000055 // CHECK: define linkonce_odr [[A]]* @_ZN5test11AC1Ei([[A]]* %this, i32 %i) unnamed_addr
John McCall4c40d982010-08-31 07:33:07 +000056 // CHECK: [[THIS:%.*]] = alloca [[A]]*, align 4
57 // CHECK: store [[A]]* {{.*}}, [[A]]** [[THIS]]
58 // CHECK: [[THIS1:%.*]] = load [[A]]** [[THIS]]
Manman Ren63fd4082013-03-20 16:59:38 +000059 // CHECK: [[THIS2:%.*]] = call [[A]]* @_ZN5test11AC2Ei(
60 // CHECK: ret [[A]]* [[THIS2]]
John McCall4c40d982010-08-31 07:33:07 +000061
Rafael Espindola0691a5c2011-01-25 19:10:24 +000062 // CHECK: define linkonce_odr [[A]]* @_ZN5test11AD1Ev([[A]]* %this) unnamed_addr
John McCall4c40d982010-08-31 07:33:07 +000063 // CHECK: [[THIS:%.*]] = alloca [[A]]*, align 4
64 // CHECK: store [[A]]* {{.*}}, [[A]]** [[THIS]]
65 // CHECK: [[THIS1:%.*]] = load [[A]]** [[THIS]]
Manman Ren63fd4082013-03-20 16:59:38 +000066 // CHECK: [[THIS2:%.*]] = call [[A]]* @_ZN5test11AD2Ev(
67 // CHECK: ret [[A]]* [[THIS2]]
John McCall4c40d982010-08-31 07:33:07 +000068}
69
70// Awkward virtual cases.
71namespace test2 {
72 void foo();
73
74 struct A {
75 int x;
76
77 A(int);
78 virtual ~A() { foo(); }
79 };
80
81 struct B {
82 int y;
83 int z;
84
85 B(int);
86 virtual ~B() { foo(); }
87 };
88
89 struct C : A, virtual B {
90 int q;
91
92 C(int i) : A(i), B(i) { foo(); }
93 ~C() { foo(); }
94 };
95
96 void test() {
97 C c = 10;
98 }
99
John McCall1e7fe752010-09-02 09:58:18 +0000100 // Tests at eof
101}
102
103namespace test3 {
104 struct A {
105 int x;
106 ~A();
107 };
108
109 void a() {
110 // CHECK: define void @_ZN5test31aEv()
111 // CHECK: call noalias i8* @_Znam(i32 48)
112 // CHECK: store i32 4
113 // CHECK: store i32 10
114 A *x = new A[10];
115 }
116
117 void b(int n) {
118 // CHECK: define void @_ZN5test31bEi(
119 // CHECK: [[N:%.*]] = load i32*
120 // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 4)
121 // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
Eli Friedman5536daa2011-04-09 19:54:33 +0000122 // CHECK: [[OR:%.*]] = or i1
123 // CHECK: [[SZ:%.*]] = select i1 [[OR]]
John McCall1e7fe752010-09-02 09:58:18 +0000124 // CHECK: call noalias i8* @_Znam(i32 [[SZ]])
125 // CHECK: store i32 4
126 // CHECK: store i32 [[N]]
127 A *x = new A[n];
128 }
129
130 void c() {
131 // CHECK: define void @_ZN5test31cEv()
132 // CHECK: call noalias i8* @_Znam(i32 808)
133 // CHECK: store i32 4
134 // CHECK: store i32 200
135 A (*x)[20] = new A[10][20];
136 }
137
138 void d(int n) {
139 // CHECK: define void @_ZN5test31dEi(
140 // CHECK: [[N:%.*]] = load i32*
John McCall1e7fe752010-09-02 09:58:18 +0000141 // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 80)
John McCall7d166272011-05-15 07:14:44 +0000142 // CHECK: [[NE:%.*]] = mul i32 [[N]], 20
John McCall1e7fe752010-09-02 09:58:18 +0000143 // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
144 // CHECK: [[SZ:%.*]] = select
145 // CHECK: call noalias i8* @_Znam(i32 [[SZ]])
146 // CHECK: store i32 4
147 // CHECK: store i32 [[NE]]
148 A (*x)[20] = new A[n][20];
149 }
150
151 void e(A *x) {
152 // CHECK: define void @_ZN5test31eEPNS_1AE(
153 // CHECK: icmp eq {{.*}}, null
154 // CHECK: getelementptr {{.*}}, i64 -8
155 // CHECK: getelementptr {{.*}}, i64 4
156 // CHECK: bitcast {{.*}} to i32*
157 // CHECK: load
158 // CHECK: invoke {{.*}} @_ZN5test31AD1Ev
159 // CHECK: call void @_ZdaPv
160 delete [] x;
161 }
162
163 void f(A (*x)[20]) {
164 // CHECK: define void @_ZN5test31fEPA20_NS_1AE(
165 // CHECK: icmp eq {{.*}}, null
166 // CHECK: getelementptr {{.*}}, i64 -8
167 // CHECK: getelementptr {{.*}}, i64 4
168 // CHECK: bitcast {{.*}} to i32*
169 // CHECK: load
170 // CHECK: invoke {{.*}} @_ZN5test31AD1Ev
171 // CHECK: call void @_ZdaPv
172 delete [] x;
173 }
174}
175
176namespace test4 {
177 struct A {
178 int x;
179 void operator delete[](void *, size_t sz);
180 };
181
182 void a() {
183 // CHECK: define void @_ZN5test41aEv()
184 // CHECK: call noalias i8* @_Znam(i32 48)
185 // CHECK: store i32 4
186 // CHECK: store i32 10
187 A *x = new A[10];
188 }
189
190 void b(int n) {
191 // CHECK: define void @_ZN5test41bEi(
192 // CHECK: [[N:%.*]] = load i32*
193 // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 4)
194 // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
195 // CHECK: [[SZ:%.*]] = select
196 // CHECK: call noalias i8* @_Znam(i32 [[SZ]])
197 // CHECK: store i32 4
198 // CHECK: store i32 [[N]]
199 A *x = new A[n];
200 }
201
202 void c() {
203 // CHECK: define void @_ZN5test41cEv()
204 // CHECK: call noalias i8* @_Znam(i32 808)
205 // CHECK: store i32 4
206 // CHECK: store i32 200
207 A (*x)[20] = new A[10][20];
208 }
209
210 void d(int n) {
211 // CHECK: define void @_ZN5test41dEi(
212 // CHECK: [[N:%.*]] = load i32*
John McCall1e7fe752010-09-02 09:58:18 +0000213 // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 80)
John McCall7d166272011-05-15 07:14:44 +0000214 // CHECK: [[NE:%.*]] = mul i32 [[N]], 20
John McCall1e7fe752010-09-02 09:58:18 +0000215 // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
216 // CHECK: [[SZ:%.*]] = select
217 // CHECK: call noalias i8* @_Znam(i32 [[SZ]])
218 // CHECK: store i32 4
219 // CHECK: store i32 [[NE]]
220 A (*x)[20] = new A[n][20];
221 }
222
223 void e(A *x) {
224 // CHECK: define void @_ZN5test41eEPNS_1AE(
225 // CHECK: [[ALLOC:%.*]] = getelementptr inbounds {{.*}}, i64 -8
226 // CHECK: getelementptr inbounds {{.*}}, i64 4
227 // CHECK: bitcast
228 // CHECK: [[T0:%.*]] = load i32*
229 // CHECK: [[T1:%.*]] = mul i32 4, [[T0]]
230 // CHECK: [[T2:%.*]] = add i32 [[T1]], 8
231 // CHECK: call void @_ZN5test41AdaEPvm(i8* [[ALLOC]], i32 [[T2]])
232 delete [] x;
233 }
234
235 void f(A (*x)[20]) {
236 // CHECK: define void @_ZN5test41fEPA20_NS_1AE(
237 // CHECK: [[ALLOC:%.*]] = getelementptr inbounds {{.*}}, i64 -8
238 // CHECK: getelementptr inbounds {{.*}}, i64 4
239 // CHECK: bitcast
240 // CHECK: [[T0:%.*]] = load i32*
241 // CHECK: [[T1:%.*]] = mul i32 4, [[T0]]
242 // CHECK: [[T2:%.*]] = add i32 [[T1]], 8
243 // CHECK: call void @_ZN5test41AdaEPvm(i8* [[ALLOC]], i32 [[T2]])
244 delete [] x;
245 }
246}
247
John McCallfc400282010-09-03 01:26:39 +0000248// <rdar://problem/8386802>: don't crash
249namespace test5 {
250 struct A {
251 ~A();
252 };
253
254 // CHECK: define void @_ZN5test54testEPNS_1AE
255 void test(A *a) {
256 // CHECK: [[PTR:%.*]] = alloca [[A:%.*]]*, align 4
257 // CHECK-NEXT: store [[A]]* {{.*}}, [[A]]** [[PTR]], align 4
258 // CHECK-NEXT: [[TMP:%.*]] = load [[A]]** [[PTR]], align 4
259 // CHECK-NEXT: call [[A]]* @_ZN5test51AD1Ev([[A]]* [[TMP]])
260 // CHECK-NEXT: ret void
261 a->~A();
262 }
263}
264
265namespace test6 {
266 struct A {
267 virtual ~A();
268 };
269
270 // CHECK: define void @_ZN5test64testEPNS_1AE
271 void test(A *a) {
272 // CHECK: [[AVAR:%.*]] = alloca [[A:%.*]]*, align 4
273 // CHECK-NEXT: store [[A]]* {{.*}}, [[A]]** [[AVAR]], align 4
274 // CHECK-NEXT: [[V:%.*]] = load [[A]]** [[AVAR]], align 4
275 // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq [[A]]* [[V]], null
276 // CHECK-NEXT: br i1 [[ISNULL]]
Timur Iskhodzhanov0f9827f2013-02-15 14:45:22 +0000277 // CHECK: [[T0:%.*]] = bitcast [[A]]* [[V]] to void ([[A]]*)***
278 // CHECK-NEXT: [[T1:%.*]] = load void ([[A]]*)*** [[T0]]
279 // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds void ([[A]]*)** [[T1]], i64 1
280 // CHECK-NEXT: [[T3:%.*]] = load void ([[A]]*)** [[T2]]
281 // CHECK-NEXT: call void [[T3]]([[A]]* [[V]])
John McCallfc400282010-09-03 01:26:39 +0000282 // CHECK-NEXT: br label
283 // CHECK: ret void
284 delete a;
285 }
286}
287
John McCall5cd91b52010-09-08 01:44:27 +0000288namespace test7 {
289 int foo();
290
291 // Static and guard tested at top of file
292
293 // CHECK: define void @_ZN5test74testEv()
294 void test() {
295 // CHECK: [[T0:%.*]] = load i32* @_ZGVZN5test74testEvE1x
296 // CHECK-NEXT: [[T1:%.*]] = and i32 [[T0]], 1
297 // CHECK-NEXT: [[T2:%.*]] = icmp eq i32 [[T1]], 0
298 // CHECK-NEXT: br i1 [[T2]]
299 // -> fallthrough, end
300 // CHECK: [[T3:%.*]] = call i32 @__cxa_guard_acquire(i32* @_ZGVZN5test74testEvE1x)
301 // CHECK-NEXT: [[T4:%.*]] = icmp ne i32 [[T3]], 0
302 // CHECK-NEXT: br i1 [[T4]]
303 // -> fallthrough, end
304 // CHECK: [[INIT:%.*]] = invoke i32 @_ZN5test73fooEv()
305 // CHECK: store i32 [[INIT]], i32* @_ZZN5test74testEvE1x, align 4
306 // CHECK-NEXT: call void @__cxa_guard_release(i32* @_ZGVZN5test74testEvE1x)
307 // CHECK-NEXT: br label
308 // -> end
309 // end:
310 // CHECK: ret void
311 static int x = foo();
312
Bill Wendling285cfd82011-09-19 20:31:14 +0000313 // CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
314 // CHECK-NEXT: cleanup
John McCall5cd91b52010-09-08 01:44:27 +0000315 // CHECK: call void @__cxa_guard_abort(i32* @_ZGVZN5test74testEvE1x)
Bill Wendling285cfd82011-09-19 20:31:14 +0000316 // CHECK: resume { i8*, i32 }
John McCall5cd91b52010-09-08 01:44:27 +0000317 }
318}
319
320namespace test8 {
321 struct A {
322 A();
323 ~A();
324 };
325
326 // Static and guard tested at top of file
327
328 // CHECK: define void @_ZN5test84testEv()
329 void test() {
330 // CHECK: [[T0:%.*]] = load i32* @_ZGVZN5test84testEvE1x
331 // CHECK-NEXT: [[T1:%.*]] = and i32 [[T0]], 1
332 // CHECK-NEXT: [[T2:%.*]] = icmp eq i32 [[T1]], 0
333 // CHECK-NEXT: br i1 [[T2]]
334 // -> fallthrough, end
335 // CHECK: [[T3:%.*]] = call i32 @__cxa_guard_acquire(i32* @_ZGVZN5test84testEvE1x)
336 // CHECK-NEXT: [[T4:%.*]] = icmp ne i32 [[T3]], 0
337 // CHECK-NEXT: br i1 [[T4]]
338 // -> fallthrough, end
339 // CHECK: [[INIT:%.*]] = invoke [[TEST8A]]* @_ZN5test81AC1Ev([[TEST8A]]* @_ZZN5test84testEvE1x)
340
341 // FIXME: Here we register a global destructor that
342 // unconditionally calls the destructor. That's what we've always
343 // done for -fno-use-cxa-atexit here, but that's really not
344 // semantically correct at all.
345
346 // CHECK: call void @__cxa_guard_release(i32* @_ZGVZN5test84testEvE1x)
347 // CHECK-NEXT: br label
348 // -> end
349 // end:
350 // CHECK: ret void
351 static A x;
352
Bill Wendling285cfd82011-09-19 20:31:14 +0000353 // CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
354 // CHECK-NEXT: cleanup
John McCall5cd91b52010-09-08 01:44:27 +0000355 // CHECK: call void @__cxa_guard_abort(i32* @_ZGVZN5test84testEvE1x)
Bill Wendling285cfd82011-09-19 20:31:14 +0000356 // CHECK: resume { i8*, i32 }
John McCall5cd91b52010-09-08 01:44:27 +0000357 }
358}
359
John McCallf3bbb152013-01-25 23:36:19 +0000360// rdar://12836470
361// Use a larger-than-mandated array cookie when allocating an
362// array whose type is overaligned.
363namespace test9 {
364 class __attribute__((aligned(16))) A {
365 float data[4];
366 public:
367 A();
368 ~A();
369 };
370
371 A *testNew(unsigned n) {
372 return new A[n];
373 }
374// CHECK: define [[TEST9:%.*]]* @_ZN5test97testNewEj(i32
375// CHECK: [[N_VAR:%.*]] = alloca i32, align 4
376// CHECK: [[N:%.*]] = load i32* [[N_VAR]], align 4
377// CHECK-NEXT: [[T0:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[N]], i32 16)
378// CHECK-NEXT: [[O0:%.*]] = extractvalue { i32, i1 } [[T0]], 1
379// CHECK-NEXT: [[T1:%.*]] = extractvalue { i32, i1 } [[T0]], 0
380// CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 16)
381// CHECK-NEXT: [[O1:%.*]] = extractvalue { i32, i1 } [[T2]], 1
382// CHECK-NEXT: [[OVERFLOW:%.*]] = or i1 [[O0]], [[O1]]
383// CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0
384// CHECK-NEXT: [[T4:%.*]] = select i1 [[OVERFLOW]], i32 -1, i32 [[T3]]
385// CHECK-NEXT: [[ALLOC:%.*]] = call noalias i8* @_Znam(i32 [[T4]])
386// CHECK-NEXT: [[T0:%.*]] = bitcast i8* [[ALLOC]] to i32*
387// CHECK-NEXT: store i32 16, i32* [[T0]]
388// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i32* [[T0]], i32 1
389// CHECK-NEXT: store i32 [[N]], i32* [[T1]]
390// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8* [[ALLOC]], i64 16
391// CHECK-NEXT: bitcast i8* [[T0]] to [[TEST9]]*
392// Array allocation follows.
393
394 void testDelete(A *array) {
395 delete[] array;
396 }
397// CHECK: define void @_ZN5test910testDeleteEPNS_1AE(
398// CHECK: [[BEGIN:%.*]] = load [[TEST9]]**
399// CHECK-NEXT: [[T0:%.*]] = icmp eq [[TEST9]]* [[BEGIN]], null
400// CHECK-NEXT: br i1 [[T0]],
401// CHECK: [[T0:%.*]] = bitcast [[TEST9]]* [[BEGIN]] to i8*
402// CHECK-NEXT: [[ALLOC:%.*]] = getelementptr inbounds i8* [[T0]], i64 -16
403// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8* [[ALLOC]], i64 4
404// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to i32*
405// CHECK-NEXT: [[N:%.*]] = load i32* [[T1]]
406// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[TEST9]]* [[BEGIN]], i32 [[N]]
407// CHECK-NEXT: [[T0:%.*]] = icmp eq [[TEST9]]* [[BEGIN]], [[END]]
408// CHECK-NEXT: br i1 [[T0]],
409// Array deallocation follows.
410}
411
John McCall4c40d982010-08-31 07:33:07 +0000412 // CHECK: define linkonce_odr [[C:%.*]]* @_ZTv0_n12_N5test21CD1Ev(
413 // CHECK: call [[C]]* @_ZN5test21CD1Ev(
414 // CHECK: ret [[C]]* undef
415
416 // CHECK: define linkonce_odr void @_ZTv0_n12_N5test21CD0Ev(
417 // CHECK: call void @_ZN5test21CD0Ev(
418 // CHECK: ret void
John McCall4c40d982010-08-31 07:33:07 +0000419
John McCall30fa3702012-04-06 18:21:06 +0000420// CH_ECK: @_GLOBAL__D_a()
421// CH_ECK: call %class.bar* @_ZN3barD1Ev(%class.bar* @baz)