blob: ca8c96e10b6af94838cab2033b94d0a899015ea0 [file] [log] [blame]
Aaron Ballman06525342018-04-10 21:58:13 +00001// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2
3#include "Inputs/stdio.h"
4
5int printf(const char *fmt, ...) {
6 return 0;
7}
8
9void unit1() {
10 struct U1A {
11 short a;
12 };
13
14 struct U1A a = {
15 .a = 12,
16 };
17
18 // CHECK: call i32 (i8*, ...) @printf(
19 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U1A, %struct.U1A* %a, i32 0, i32 0
20 // CHECK: call i32 (i8*, ...) @printf(
21 // CHECK: [[LOAD1:%[0-9]+]] = load i16, i16* [[RES1]],
22 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i16 [[LOAD1]])
23 // CHECK: call i32 (i8*, ...) @printf(
24 __builtin_dump_struct(&a, &printf);
25}
26
27void unit2() {
28 struct U2A {
29 unsigned short a;
30 };
31
32 struct U2A a = {
33 .a = 12,
34 };
35
36 // CHECK: call i32 (i8*, ...) @printf(
37 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U2A, %struct.U2A* %a, i32 0, i32 0
38 // CHECK: call i32 (i8*, ...) @printf(
39 // CHECK: [[LOAD1:%[0-9]+]] = load i16, i16* [[RES1]],
40 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i16 [[LOAD1]])
41 // CHECK: call i32 (i8*, ...) @printf(
42 __builtin_dump_struct(&a, &printf);
43}
44
45void unit3() {
46 struct U3A {
47 int a;
48 };
49
50 struct U3A a = {
51 .a = 12,
52 };
53
54 // CHECK: call i32 (i8*, ...) @printf(
55 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U3A, %struct.U3A* %a, i32 0, i32 0
56 // CHECK: call i32 (i8*, ...) @printf(
57 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
58 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]])
59 // CHECK: call i32 (i8*, ...) @printf(
60 __builtin_dump_struct(&a, &printf);
61}
62
63void unit4() {
64 struct U4A {
65 unsigned int a;
66 };
67
68 struct U4A a = {
69 .a = 12,
70 };
71
72 // CHECK: call i32 (i8*, ...) @printf(
73 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U4A, %struct.U4A* %a, i32 0, i32 0
74 // CHECK: call i32 (i8*, ...) @printf(
75 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
76 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]])
77 // CHECK: call i32 (i8*, ...) @printf(
78 __builtin_dump_struct(&a, &printf);
79}
80
81void unit5() {
82 struct U5A {
83 long a;
84 };
85
86 struct U5A a = {
87 .a = 12,
88 };
89
90 // CHECK: call i32 (i8*, ...) @printf(
91 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U5A, %struct.U5A* %a, i32 0, i32 0
92 // CHECK: call i32 (i8*, ...) @printf(
93 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
94 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i64 [[LOAD1]])
95 // CHECK: call i32 (i8*, ...) @printf(
96 __builtin_dump_struct(&a, &printf);
97}
98
99void unit6() {
100 struct U6A {
101 unsigned long a;
102 };
103
104 struct U6A a = {
105 .a = 12,
106 };
107
108 // CHECK: call i32 (i8*, ...) @printf(
109 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U6A, %struct.U6A* %a, i32 0, i32 0
110 // CHECK: call i32 (i8*, ...) @printf(
111 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
112 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i64 [[LOAD1]])
113 // CHECK: call i32 (i8*, ...) @printf(
114 __builtin_dump_struct(&a, &printf);
115}
116
117void unit7() {
118 struct U7A {
119 long long a;
120 };
121
122 struct U7A a = {
123 .a = 12,
124 };
125
126 // CHECK: call i32 (i8*, ...) @printf(
127 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U7A, %struct.U7A* %a, i32 0, i32 0
128 // CHECK: call i32 (i8*, ...) @printf(
129 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
130 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i64 [[LOAD1]])
131 // CHECK: call i32 (i8*, ...) @printf(
132 __builtin_dump_struct(&a, &printf);
133}
134
135void unit8() {
136 struct U8A {
137 long long a;
138 };
139
140 struct U8A a = {
141 .a = 12,
142 };
143
144 // CHECK: call i32 (i8*, ...) @printf(
145 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U8A, %struct.U8A* %a, i32 0, i32 0
146 // CHECK: call i32 (i8*, ...) @printf(
147 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
148 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i64 [[LOAD1]])
149 // CHECK: call i32 (i8*, ...) @printf(
150 __builtin_dump_struct(&a, &printf);
151}
152
153void unit9() {
154 struct U9A {
155 char a;
156 };
157
158 struct U9A a = {
159 .a = 'a',
160 };
161
162 // CHECK: call i32 (i8*, ...) @printf(
163 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U9A, %struct.U9A* %a, i32 0, i32 0
164 // CHECK: call i32 (i8*, ...) @printf(
165 // CHECK: [[LOAD1:%[0-9]+]] = load i8, i8* [[RES1]],
166 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8 [[LOAD1]])
167 // CHECK: call i32 (i8*, ...) @printf(
168 __builtin_dump_struct(&a, &printf);
169}
170
171void unit10() {
172 struct U10A {
173 char *a;
174 };
175
176 struct U10A a = {
177 .a = "LSE",
178 };
179
180 // CHECK: call i32 (i8*, ...) @printf(
181 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U10A, %struct.U10A* %a, i32 0, i32 0
182 // CHECK: call i32 (i8*, ...) @printf(
183 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
184 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD1]])
185 // CHECK: call i32 (i8*, ...) @printf(
186 __builtin_dump_struct(&a, &printf);
187}
188
189void unit11() {
190 struct U11A {
191 void *a;
192 };
193
194 struct U11A a = {
195 .a = (void *)0x12345678,
196 };
197
198 // CHECK: call i32 (i8*, ...) @printf(
199 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U11A, %struct.U11A* %a, i32 0, i32 0
200 // CHECK: call i32 (i8*, ...) @printf(
201 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
202 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD1]])
203 // CHECK: call i32 (i8*, ...) @printf(
204 __builtin_dump_struct(&a, &printf);
205}
206
207void unit12() {
208 struct U12A {
209 const char *a;
210 };
211
212 struct U12A a = {
213 .a = "LSE",
214 };
215
216 // CHECK: call i32 (i8*, ...) @printf(
217 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U12A, %struct.U12A* %a, i32 0, i32 0
218 // CHECK: call i32 (i8*, ...) @printf(
219 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
220 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD1]])
221 // CHECK: call i32 (i8*, ...) @printf(
222 __builtin_dump_struct(&a, &printf);
223}
224
225void unit13() {
226 typedef char *charstar;
227 struct U13A {
228 const charstar a;
229 };
230
231 struct U13A a = {
232 .a = "LSE",
233 };
234
235 // CHECK: call i32 (i8*, ...) @printf(
236 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U13A, %struct.U13A* %a, i32 0, i32 0
237 // CHECK: call i32 (i8*, ...) @printf(
238 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
239 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD1]])
240 // CHECK: call i32 (i8*, ...) @printf(
241 __builtin_dump_struct(&a, &printf);
242}
243
244void unit14() {
245 struct U14A {
246 double a;
247 };
248
249 struct U14A a = {
250 .a = 1.123456,
251 };
252
253 // CHECK: call i32 (i8*, ...) @printf(
254 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U14A, %struct.U14A* %a, i32 0, i32 0
255 // CHECK: call i32 (i8*, ...) @printf(
256 // CHECK: [[LOAD1:%[0-9]+]] = load double, double* [[RES1]],
257 // CHECK: call i32 (i8*, ...) @printf({{.*}}, double [[LOAD1]])
258 // CHECK: call i32 (i8*, ...) @printf(
259 __builtin_dump_struct(&a, &printf);
260}
261
262void unit15() {
263 struct U15A {
264 int a[3];
265 };
266
267 struct U15A a = {
268 .a = {1, 2, 3},
269 };
270
271 // CHECK: call i32 (i8*, ...) @printf(
272 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U15A, %struct.U15A* %a, i32 0, i32 0
273 // CHECK: call i32 (i8*, ...) @printf(
274 // CHECK: [[LOAD1:%[0-9]+]] = load [3 x i32], [3 x i32]* [[RES1]],
275 // CHECK: call i32 (i8*, ...) @printf({{.*}}, [3 x i32] [[LOAD1]])
276 // CHECK: call i32 (i8*, ...) @printf(
277 __builtin_dump_struct(&a, &printf);
278}
279
280void test1() {
281 struct T1A {
282 int a;
283 char *b;
284 };
285
286 struct T1A a = {
287 .a = 12,
288 .b = "LSE",
289 };
290
291 // CHECK: call i32 (i8*, ...) @printf(
292 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T1A, %struct.T1A* %a, i32 0, i32 0
293 // CHECK: call i32 (i8*, ...) @printf(
294 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
295 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]])
296 // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.T1A, %struct.T1A* %a, i32 0, i32 1
297 // CHECK: call i32 (i8*, ...) @printf(
298 // CHECK: [[LOAD2:%[0-9]+]] = load i8*, i8** [[RES2]],
299 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD2]])
300 // CHECK: call i32 (i8*, ...) @printf(
301 __builtin_dump_struct(&a, &printf);
302}
303
304void test2() {
305 struct T2A {
306 int a;
307 };
308
309 struct T2B {
310 int b;
311 struct T2A a;
312 };
313
314 struct T2B b = {
315 .b = 24,
316 .a = {
317 .a = 12,
318 }
319 };
320
321 // CHECK: call i32 (i8*, ...) @printf(
322 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T2B, %struct.T2B* %b, i32 0, i32 0
323 // CHECK: call i32 (i8*, ...) @printf(
324 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
325 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]])
326 // CHECK: [[NESTED_STRUCT:%[0-9]+]] = getelementptr inbounds %struct.T2B, %struct.T2B* %b, i32 0, i32 1
327 // CHECK: call i32 (i8*, ...) @printf(
328 // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.T2A, %struct.T2A* [[NESTED_STRUCT]], i32 0, i32 0
329 // CHECK: call i32 (i8*, ...) @printf(
330 // CHECK: [[LOAD2:%[0-9]+]] = load i32, i32* [[RES2]],
331 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD2]])
332 // CHECK: call i32 (i8*, ...) @printf(
333 __builtin_dump_struct(&b, &printf);
334}
335
336void test3() {
337 struct T3A {
338 union {
339 int a;
340 char b[4];
341 };
342 };
343
344 struct T3A a = {
345 .a = 42,
346 };
347
348 // CHECK: call i32 (i8*, ...) @printf(
349 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T3A, %struct.T3A* %a, i32 0, i32 0
350 // CHECK: call i32 (i8*, ...) @printf(
351 // CHECK: [[BC1:%[0-9]+]] = bitcast %union.anon* [[RES1]] to i32*
352 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[BC1]],
353 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]])
354 // CHECK: [[BC2:%[0-9]+]] = bitcast %union.anon* [[RES1]] to [4 x i8]*
355 // CHECK: [[LOAD2:%[0-9]+]] = load [4 x i8], [4 x i8]* [[BC2]],
356 // CHECK: call i32 (i8*, ...) @printf({{.*}}, [4 x i8] [[LOAD2]])
357 // CHECK: call i32 (i8*, ...) @printf(
358 __builtin_dump_struct(&a, &printf);
359}
360
361void test4() {
362 struct T4A {
363 union {
364 struct {
365 void *a;
366 };
367 struct {
368 unsigned long b;
369 };
370 };
371 };
372
373 struct T4A a = {
374 .a = (void *)0x12345678,
375 };
376
377 // CHECK: call i32 (i8*, ...) @printf(
378 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T4A, %struct.T4A* %a, i32 0, i32 0
379 // CHECK: call i32 (i8*, ...) @printf(
380 // CHECK: [[BC1:%[0-9]+]] = bitcast %union.anon.0* [[RES1]] to %struct.anon*
381 // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.anon, %struct.anon* [[BC1]], i32 0, i32 0
382 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES2]],
383 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD1]])
384
385 // CHECK: [[BC2:%[0-9]+]] = bitcast %union.anon.0* [[RES1]] to %struct.anon.1*
386 // CHECK: [[RES3:%[0-9]+]] = getelementptr inbounds %struct.anon.1, %struct.anon.1* [[BC2]], i32 0, i32 0
387 // CHECK: [[LOAD2:%[0-9]+]] = load i64, i64* [[RES3]],
388 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i64 [[LOAD2]])
389 // CHECK: call i32 (i8*, ...) @printf(
390 __builtin_dump_struct(&a, &printf);
391}