blob: c975f7c5d700025e341be5bb24ae879334ae30f7 [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
Aaron Ballmanb6a77022018-04-17 11:57:47 +00005// CHECK: @unit1.a = private unnamed_addr constant %struct.U1A { i16 12 }, align 2
6// CHECK-NEXT: [[STRUCT_STR_U1:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U1A {\0A\00"
7// CHECK-NEXT: [[FIELD_U1:@[0-9]+]] = private unnamed_addr constant [11 x i8] c"short a : \00"
8// CHECK-NEXT: [[FORMAT_U1:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"%hd\0A\00"
9// CHECK-NEXT: [[END_STRUCT_U1:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
10
11// CHECK: @unit2.a = private unnamed_addr constant %struct.U2A { i16 12 }, align 2
12// CHECK-NEXT: [[STRUCT_STR_U2:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U2A {\0A\00"
13// CHECK-NEXT: [[FIELD_U2:@[0-9]+]] = private unnamed_addr constant [20 x i8] c"unsigned short a : \00"
14// CHECK-NEXT: [[FORMAT_U2:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"%hu\0A\00"
15// CHECK-NEXT: [[END_STRUCT_U2:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
16
17// CHECK: @unit3.a = private unnamed_addr constant %struct.U3A { i32 12 }, align 4
18// CHECK-NEXT: [[STRUCT_STR_U3:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U3A {\0A\00"
19// CHECK-NEXT: [[FIELD_U3:@[0-9]+]] = private unnamed_addr constant [9 x i8] c"int a : \00"
20// CHECK-NEXT: [[FORMAT_U3:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%d\0A\00"
21// CHECK-NEXT: [[END_STRUCT_U3:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
22
23// CHECK: @unit4.a = private unnamed_addr constant %struct.U4A { i32 12 }, align 4
24// CHECK-NEXT: [[STRUCT_STR_U4:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U4A {\0A\00"
25// CHECK-NEXT: [[FIELD_U4:@[0-9]+]] = private unnamed_addr constant [18 x i8] c"unsigned int a : \00"
26// CHECK-NEXT: [[FORMAT_U4:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%u\0A\00"
27// CHECK-NEXT: [[END_STRUCT_U4:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
28
29// CHECK: @unit5.a = private unnamed_addr constant %struct.U5A { i64 12 }, align 8
30// CHECK-NEXT: [[STRUCT_STR_U5:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U5A {\0A\00"
31// CHECK-NEXT: [[FIELD_U5:@[0-9]+]] = private unnamed_addr constant [10 x i8] c"long a : \00"
32// CHECK-NEXT: [[FORMAT_U5:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"%ld\0A\00"
33// CHECK-NEXT: [[END_STRUCT_U5:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
34
35// CHECK: @unit6.a = private unnamed_addr constant %struct.U6A { i64 12 }, align 8
36// CHECK-NEXT: [[STRUCT_STR_U6:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U6A {\0A\00"
37// CHECK-NEXT: [[FIELD_U6:@[0-9]+]] = private unnamed_addr constant [19 x i8] c"unsigned long a : \00"
38// CHECK-NEXT: [[FORMAT_U6:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"%lu\0A\00"
39// CHECK-NEXT: [[END_STRUCT_U6:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
40
41// CHECK: @unit7.a = private unnamed_addr constant %struct.U7A { i64 12 }, align 8
42// CHECK-NEXT: [[STRUCT_STR_U7:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U7A {\0A\00"
43// CHECK-NEXT: [[FIELD_U7:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"long long a : \00"
44// CHECK-NEXT: [[FORMAT_U7:@[0-9]+]] = private unnamed_addr constant [6 x i8] c"%lld\0A\00"
45// CHECK-NEXT: [[END_STRUCT_U7:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
46
47// CHECK: @unit8.a = private unnamed_addr constant %struct.U8A { i64 12 }, align 8
48// CHECK-NEXT: [[STRUCT_STR_U8:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U8A {\0A\00"
49// CHECK-NEXT: [[FIELD_U8:@[0-9]+]] = private unnamed_addr constant [24 x i8] c"unsigned long long a : \00"
50// CHECK-NEXT: [[FORMAT_U8:@[0-9]+]] = private unnamed_addr constant [6 x i8] c"%llu\0A\00"
51// CHECK-NEXT: [[END_STRUCT_U8:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
52
53// CHECK: @unit9.a = private unnamed_addr constant %struct.U9A { i8 97 }, align 1
54// CHECK-NEXT: [[STRUCT_STR_U9:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U9A {\0A\00"
55// CHECK-NEXT: [[FIELD_U9:@[0-9]+]] = private unnamed_addr constant [10 x i8] c"char a : \00"
56// CHECK-NEXT: [[FORMAT_U9:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%c\0A\00"
57// CHECK-NEXT: [[END_STRUCT_U9:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
58
59// CHECK: @.str = private unnamed_addr constant [4 x i8] c"LSE\00", align 1
60
61// CHECK: @unit10.a = private unnamed_addr constant %struct.U10A { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0) }, align 8
62// CHECK-NEXT: [[STRUCT_STR_U10:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U10A {\0A\00"
63// CHECK-NEXT: [[FIELD_U10:@[0-9]+]] = private unnamed_addr constant [12 x i8] c"char * a : \00"
64// CHECK-NEXT: [[FORMAT_U10:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%s\0A\00"
65// CHECK-NEXT: [[END_STRUCT_U10:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
66
67// CHECK: @unit11.a = private unnamed_addr constant %struct.U11A { i8* inttoptr (i64 305419896 to i8*) }, align 8
68// CHECK-NEXT: [[STRUCT_STR_U11:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U11A {\0A\00"
69// CHECK-NEXT: [[FIELD_U11:@[0-9]+]] = private unnamed_addr constant [12 x i8] c"void * a : \00"
70// CHECK-NEXT: [[FORMAT_U11:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%p\0A\00"
71// CHECK-NEXT: [[END_STRUCT_U11:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
72
73// CHECK: @unit12.a = private unnamed_addr constant %struct.U12A { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0) }, align 8
74// CHECK-NEXT: [[STRUCT_STR_U12:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U12A {\0A\00"
75// CHECK-NEXT: [[FIELD_U12:@[0-9]+]] = private unnamed_addr constant [18 x i8] c"const char * a : \00"
76// CHECK-NEXT: [[FORMAT_U12:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%s\0A\00"
77// CHECK-NEXT: [[END_STRUCT_U12:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
78
79// CHECK: @unit13.a = private unnamed_addr constant %struct.U13A { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0) }, align 8
80// CHECK-NEXT: [[STRUCT_STR_U13:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U13A {\0A\00"
81// CHECK-NEXT: [[FIELD_U13:@[0-9]+]] = private unnamed_addr constant [20 x i8] c"const charstar a : \00"
82// CHECK-NEXT: [[FORMAT_U13:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%s\0A\00"
83// CHECK-NEXT: [[END_STRUCT_U13:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
84
85// CHECK: @unit14.a = private unnamed_addr constant %struct.U14A { double 0x3FF1F9ACFFA7EB6C }, align 8
86// CHECK-NEXT: [[STRUCT_STR_U14:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U14A {\0A\00"
87// CHECK-NEXT: [[FIELD_U14:@[0-9]+]] = private unnamed_addr constant [12 x i8] c"double a : \00"
88// CHECK-NEXT: [[FORMAT_U14:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%f\0A\00"
89// CHECK-NEXT: [[END_STRUCT_U14:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
90
91// CHECK: @unit15.a = private unnamed_addr constant %struct.U15A { [3 x i32] [i32 1, i32 2, i32 3] }, align 4
92// CHECK-NEXT: [[STRUCT_STR_U15:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U15A {\0A\00"
93// CHECK-NEXT: [[FIELD_U15:@[0-9]+]] = private unnamed_addr constant [13 x i8] c"int [3] a : \00"
94// CHECK-NEXT: [[FORMAT_U15:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%p\0A\00"
95// CHECK-NEXT: [[END_STRUCT_U15:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00"
96
Aaron Ballman06525342018-04-10 21:58:13 +000097int printf(const char *fmt, ...) {
98 return 0;
99}
100
101void unit1() {
102 struct U1A {
103 short a;
104 };
105
106 struct U1A a = {
107 .a = 12,
108 };
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000109 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U1]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000110 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U1A, %struct.U1A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000111 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* [[FIELD_U1]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000112 // CHECK: [[LOAD1:%[0-9]+]] = load i16, i16* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000113 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U1]], i32 0, i32 0), i16 [[LOAD1]])
114 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U1]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000115 __builtin_dump_struct(&a, &printf);
116}
117
118void unit2() {
119 struct U2A {
120 unsigned short a;
121 };
122
123 struct U2A a = {
124 .a = 12,
125 };
126
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000127 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U2]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000128 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U2A, %struct.U2A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000129 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* [[FIELD_U2]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000130 // CHECK: [[LOAD1:%[0-9]+]] = load i16, i16* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000131 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U2]], i32 0, i32 0), i16 [[LOAD1]])
132 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U2]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000133 __builtin_dump_struct(&a, &printf);
134}
135
136void unit3() {
137 struct U3A {
138 int a;
139 };
140
141 struct U3A a = {
142 .a = 12,
143 };
144
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000145 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U3]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000146 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U3A, %struct.U3A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000147 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* [[FIELD_U3]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000148 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000149 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U3]], i32 0, i32 0), i32 [[LOAD1]])
150 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U3]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000151 __builtin_dump_struct(&a, &printf);
152}
153
154void unit4() {
155 struct U4A {
156 unsigned int a;
157 };
158
159 struct U4A a = {
160 .a = 12,
161 };
162
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000163 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U4]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000164 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U4A, %struct.U4A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000165 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* [[FIELD_U4]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000166 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000167 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U4]], i32 0, i32 0), i32 [[LOAD1]])
168 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U4]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000169 __builtin_dump_struct(&a, &printf);
170}
171
172void unit5() {
173 struct U5A {
174 long a;
175 };
176
177 struct U5A a = {
178 .a = 12,
179 };
180
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000181 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U5]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000182 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U5A, %struct.U5A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000183 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* [[FIELD_U5]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000184 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000185 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U5]], i32 0, i32 0), i64 [[LOAD1]])
186 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U5]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000187 __builtin_dump_struct(&a, &printf);
188}
189
190void unit6() {
191 struct U6A {
192 unsigned long a;
193 };
194
195 struct U6A a = {
196 .a = 12,
197 };
198
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000199 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U6]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000200 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U6A, %struct.U6A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000201 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* [[FIELD_U6]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000202 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000203 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U6]], i32 0, i32 0), i64 [[LOAD1]])
204 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U6]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000205 __builtin_dump_struct(&a, &printf);
206}
207
208void unit7() {
209 struct U7A {
210 long long a;
211 };
212
213 struct U7A a = {
214 .a = 12,
215 };
216
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000217 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U7]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000218 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U7A, %struct.U7A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000219 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[FIELD_U7]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000220 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000221 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* [[FORMAT_U7]], i32 0, i32 0), i64 [[LOAD1]])
222 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U7]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000223 __builtin_dump_struct(&a, &printf);
224}
225
226void unit8() {
227 struct U8A {
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000228 unsigned long long a;
Aaron Ballman06525342018-04-10 21:58:13 +0000229 };
230
231 struct U8A a = {
232 .a = 12,
233 };
234
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000235 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U8]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000236 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U8A, %struct.U8A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000237 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([24 x i8], [24 x i8]* [[FIELD_U8]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000238 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000239 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* [[FORMAT_U8]], i32 0, i32 0), i64 [[LOAD1]])
240 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U8]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000241 __builtin_dump_struct(&a, &printf);
242}
243
244void unit9() {
245 struct U9A {
246 char a;
247 };
248
249 struct U9A a = {
250 .a = 'a',
251 };
252
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000253 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U9]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000254 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U9A, %struct.U9A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000255 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* [[FIELD_U9]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000256 // CHECK: [[LOAD1:%[0-9]+]] = load i8, i8* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000257 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U9]], i32 0, i32 0), i8 [[LOAD1]])
258 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U9]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000259 __builtin_dump_struct(&a, &printf);
260}
261
262void unit10() {
263 struct U10A {
264 char *a;
265 };
266
267 struct U10A a = {
268 .a = "LSE",
269 };
270
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000271 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U10]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000272 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U10A, %struct.U10A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000273 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* [[FIELD_U10]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000274 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000275 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U10]], i32 0, i32 0), i8* [[LOAD1]])
276 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U10]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000277 __builtin_dump_struct(&a, &printf);
278}
279
280void unit11() {
281 struct U11A {
282 void *a;
283 };
284
285 struct U11A a = {
286 .a = (void *)0x12345678,
287 };
288
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000289 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U11]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000290 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U11A, %struct.U11A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000291 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* [[FIELD_U11]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000292 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000293 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U11]], i32 0, i32 0), i8* [[LOAD1]])
294 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U11]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000295 __builtin_dump_struct(&a, &printf);
296}
297
298void unit12() {
299 struct U12A {
300 const char *a;
301 };
302
303 struct U12A a = {
304 .a = "LSE",
305 };
306
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000307 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U12]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000308 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U12A, %struct.U12A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000309 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* [[FIELD_U12]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000310 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000311 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U12]], i32 0, i32 0), i8* [[LOAD1]])
312 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U12]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000313 __builtin_dump_struct(&a, &printf);
314}
315
316void unit13() {
317 typedef char *charstar;
318 struct U13A {
319 const charstar a;
320 };
321
322 struct U13A a = {
323 .a = "LSE",
324 };
325
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000326 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U13]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000327 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U13A, %struct.U13A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000328 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* [[FIELD_U13]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000329 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000330 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U13]], i32 0, i32 0), i8* [[LOAD1]])
331 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U13]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000332 __builtin_dump_struct(&a, &printf);
333}
334
335void unit14() {
336 struct U14A {
337 double a;
338 };
339
340 struct U14A a = {
341 .a = 1.123456,
342 };
343
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000344 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U14]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000345 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U14A, %struct.U14A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000346 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* [[FIELD_U14]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000347 // CHECK: [[LOAD1:%[0-9]+]] = load double, double* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000348 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U14]], i32 0, i32 0), double [[LOAD1]])
349 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U14]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000350 __builtin_dump_struct(&a, &printf);
351}
352
353void unit15() {
354 struct U15A {
355 int a[3];
356 };
357
358 struct U15A a = {
359 .a = {1, 2, 3},
360 };
361
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000362 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U15]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000363 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U15A, %struct.U15A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000364 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* [[FIELD_U15]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000365 // CHECK: [[LOAD1:%[0-9]+]] = load [3 x i32], [3 x i32]* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000366 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U15]], i32 0, i32 0), [3 x i32] [[LOAD1]])
367 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U15]], i32 0, i32 0)
Aaron Ballman06525342018-04-10 21:58:13 +0000368 __builtin_dump_struct(&a, &printf);
369}
370
371void test1() {
372 struct T1A {
373 int a;
374 char *b;
375 };
376
377 struct T1A a = {
378 .a = 12,
379 .b = "LSE",
380 };
381
382 // CHECK: call i32 (i8*, ...) @printf(
383 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T1A, %struct.T1A* %a, i32 0, i32 0
384 // CHECK: call i32 (i8*, ...) @printf(
385 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
386 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]])
387 // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.T1A, %struct.T1A* %a, i32 0, i32 1
388 // CHECK: call i32 (i8*, ...) @printf(
389 // CHECK: [[LOAD2:%[0-9]+]] = load i8*, i8** [[RES2]],
390 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD2]])
391 // CHECK: call i32 (i8*, ...) @printf(
392 __builtin_dump_struct(&a, &printf);
393}
394
395void test2() {
396 struct T2A {
397 int a;
398 };
399
400 struct T2B {
401 int b;
402 struct T2A a;
403 };
404
405 struct T2B b = {
406 .b = 24,
407 .a = {
408 .a = 12,
409 }
410 };
411
412 // CHECK: call i32 (i8*, ...) @printf(
413 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T2B, %struct.T2B* %b, i32 0, i32 0
414 // CHECK: call i32 (i8*, ...) @printf(
415 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
416 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]])
417 // CHECK: [[NESTED_STRUCT:%[0-9]+]] = getelementptr inbounds %struct.T2B, %struct.T2B* %b, i32 0, i32 1
418 // CHECK: call i32 (i8*, ...) @printf(
419 // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.T2A, %struct.T2A* [[NESTED_STRUCT]], i32 0, i32 0
420 // CHECK: call i32 (i8*, ...) @printf(
421 // CHECK: [[LOAD2:%[0-9]+]] = load i32, i32* [[RES2]],
422 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD2]])
423 // CHECK: call i32 (i8*, ...) @printf(
424 __builtin_dump_struct(&b, &printf);
425}
426
427void test3() {
428 struct T3A {
429 union {
430 int a;
431 char b[4];
432 };
433 };
434
435 struct T3A a = {
436 .a = 42,
437 };
438
439 // CHECK: call i32 (i8*, ...) @printf(
440 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T3A, %struct.T3A* %a, i32 0, i32 0
441 // CHECK: call i32 (i8*, ...) @printf(
442 // CHECK: [[BC1:%[0-9]+]] = bitcast %union.anon* [[RES1]] to i32*
443 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[BC1]],
444 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]])
445 // CHECK: [[BC2:%[0-9]+]] = bitcast %union.anon* [[RES1]] to [4 x i8]*
446 // CHECK: [[LOAD2:%[0-9]+]] = load [4 x i8], [4 x i8]* [[BC2]],
447 // CHECK: call i32 (i8*, ...) @printf({{.*}}, [4 x i8] [[LOAD2]])
448 // CHECK: call i32 (i8*, ...) @printf(
449 __builtin_dump_struct(&a, &printf);
450}
451
452void test4() {
453 struct T4A {
454 union {
455 struct {
456 void *a;
457 };
458 struct {
459 unsigned long b;
460 };
461 };
462 };
463
464 struct T4A a = {
465 .a = (void *)0x12345678,
466 };
467
468 // CHECK: call i32 (i8*, ...) @printf(
469 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T4A, %struct.T4A* %a, i32 0, i32 0
470 // CHECK: call i32 (i8*, ...) @printf(
471 // CHECK: [[BC1:%[0-9]+]] = bitcast %union.anon.0* [[RES1]] to %struct.anon*
472 // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.anon, %struct.anon* [[BC1]], i32 0, i32 0
473 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES2]],
474 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD1]])
475
476 // CHECK: [[BC2:%[0-9]+]] = bitcast %union.anon.0* [[RES1]] to %struct.anon.1*
477 // CHECK: [[RES3:%[0-9]+]] = getelementptr inbounds %struct.anon.1, %struct.anon.1* [[BC2]], i32 0, i32 0
478 // CHECK: [[LOAD2:%[0-9]+]] = load i64, i64* [[RES3]],
479 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i64 [[LOAD2]])
480 // CHECK: call i32 (i8*, ...) @printf(
481 __builtin_dump_struct(&a, &printf);
482}