1 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s |
2 | |
3 | #include "Inputs/stdio.h" |
4 | #include <stdint.h> |
5 | |
6 | // CHECK: @__const.unit1.a = private unnamed_addr constant %struct.U1A { i16 12 }, align 2 |
7 | // CHECK-NEXT: [[STRUCT_STR_U1:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U1A {\0A\00" |
8 | // CHECK-NEXT: [[FIELD_U1:@[0-9]+]] = private unnamed_addr constant [11 x i8] c"short a : \00" |
9 | // CHECK-NEXT: [[FORMAT_U1:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"%hd\0A\00" |
10 | // CHECK-NEXT: [[END_STRUCT_U1:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
11 | |
12 | // CHECK: @__const.unit2.a = private unnamed_addr constant %struct.U2A { i16 12 }, align 2 |
13 | // CHECK-NEXT: [[STRUCT_STR_U2:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U2A {\0A\00" |
14 | // CHECK-NEXT: [[FIELD_U2:@[0-9]+]] = private unnamed_addr constant [20 x i8] c"unsigned short a : \00" |
15 | // CHECK-NEXT: [[FORMAT_U2:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"%hu\0A\00" |
16 | // CHECK-NEXT: [[END_STRUCT_U2:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
17 | |
18 | // CHECK: @__const.unit3.a = private unnamed_addr constant %struct.U3A { i32 12 }, align 4 |
19 | // CHECK-NEXT: [[STRUCT_STR_U3:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U3A {\0A\00" |
20 | // CHECK-NEXT: [[FIELD_U3:@[0-9]+]] = private unnamed_addr constant [9 x i8] c"int a : \00" |
21 | // CHECK-NEXT: [[FORMAT_U3:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%d\0A\00" |
22 | // CHECK-NEXT: [[END_STRUCT_U3:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
23 | |
24 | // CHECK: @__const.unit4.a = private unnamed_addr constant %struct.U4A { i32 12 }, align 4 |
25 | // CHECK-NEXT: [[STRUCT_STR_U4:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U4A {\0A\00" |
26 | // CHECK-NEXT: [[FIELD_U4:@[0-9]+]] = private unnamed_addr constant [18 x i8] c"unsigned int a : \00" |
27 | // CHECK-NEXT: [[FORMAT_U4:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%u\0A\00" |
28 | // CHECK-NEXT: [[END_STRUCT_U4:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
29 | |
30 | // CHECK: @__const.unit5.a = private unnamed_addr constant %struct.U5A { i64 12 }, align 8 |
31 | // CHECK-NEXT: [[STRUCT_STR_U5:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U5A {\0A\00" |
32 | // CHECK-NEXT: [[FIELD_U5:@[0-9]+]] = private unnamed_addr constant [10 x i8] c"long a : \00" |
33 | // CHECK-NEXT: [[FORMAT_U5:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"%ld\0A\00" |
34 | // CHECK-NEXT: [[END_STRUCT_U5:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
35 | |
36 | // CHECK: @__const.unit6.a = private unnamed_addr constant %struct.U6A { i64 12 }, align 8 |
37 | // CHECK-NEXT: [[STRUCT_STR_U6:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U6A {\0A\00" |
38 | // CHECK-NEXT: [[FIELD_U6:@[0-9]+]] = private unnamed_addr constant [19 x i8] c"unsigned long a : \00" |
39 | // CHECK-NEXT: [[FORMAT_U6:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"%lu\0A\00" |
40 | // CHECK-NEXT: [[END_STRUCT_U6:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
41 | |
42 | // CHECK: @__const.unit7.a = private unnamed_addr constant %struct.U7A { i64 12 }, align 8 |
43 | // CHECK-NEXT: [[STRUCT_STR_U7:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U7A {\0A\00" |
44 | // CHECK-NEXT: [[FIELD_U7:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"long long a : \00" |
45 | // CHECK-NEXT: [[FORMAT_U7:@[0-9]+]] = private unnamed_addr constant [6 x i8] c"%lld\0A\00" |
46 | // CHECK-NEXT: [[END_STRUCT_U7:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
47 | |
48 | // CHECK: @__const.unit8.a = private unnamed_addr constant %struct.U8A { i64 12 }, align 8 |
49 | // CHECK-NEXT: [[STRUCT_STR_U8:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U8A {\0A\00" |
50 | // CHECK-NEXT: [[FIELD_U8:@[0-9]+]] = private unnamed_addr constant [24 x i8] c"unsigned long long a : \00" |
51 | // CHECK-NEXT: [[FORMAT_U8:@[0-9]+]] = private unnamed_addr constant [6 x i8] c"%llu\0A\00" |
52 | // CHECK-NEXT: [[END_STRUCT_U8:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
53 | |
54 | // CHECK: @__const.unit9.a = private unnamed_addr constant %struct.U9A { i8 97 }, align 1 |
55 | // CHECK-NEXT: [[STRUCT_STR_U9:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"struct U9A {\0A\00" |
56 | // CHECK-NEXT: [[FIELD_U9:@[0-9]+]] = private unnamed_addr constant [10 x i8] c"char a : \00" |
57 | // CHECK-NEXT: [[FORMAT_U9:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%c\0A\00" |
58 | // CHECK-NEXT: [[END_STRUCT_U9:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
59 | |
60 | // CHECK: @.str = private unnamed_addr constant [4 x i8] c"LSE\00", align 1 |
61 | |
62 | // CHECK: @__const.unit10.a = private unnamed_addr constant %struct.U10A { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0) }, align 8 |
63 | // CHECK-NEXT: [[STRUCT_STR_U10:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U10A {\0A\00" |
64 | // CHECK-NEXT: [[FIELD_U10:@[0-9]+]] = private unnamed_addr constant [12 x i8] c"char * a : \00" |
65 | // CHECK-NEXT: [[FORMAT_U10:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%s\0A\00" |
66 | // CHECK-NEXT: [[END_STRUCT_U10:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
67 | |
68 | // CHECK: @__const.unit11.a = private unnamed_addr constant %struct.U11A { i8* inttoptr (i64 305419896 to i8*) }, align 8 |
69 | // CHECK-NEXT: [[STRUCT_STR_U11:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U11A {\0A\00" |
70 | // CHECK-NEXT: [[FIELD_U11:@[0-9]+]] = private unnamed_addr constant [12 x i8] c"void * a : \00" |
71 | // CHECK-NEXT: [[FORMAT_U11:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%p\0A\00" |
72 | // CHECK-NEXT: [[END_STRUCT_U11:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
73 | |
74 | // CHECK: @__const.unit12.a = private unnamed_addr constant %struct.U12A { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0) }, align 8 |
75 | // CHECK-NEXT: [[STRUCT_STR_U12:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U12A {\0A\00" |
76 | // CHECK-NEXT: [[FIELD_U12:@[0-9]+]] = private unnamed_addr constant [18 x i8] c"const char * a : \00" |
77 | // CHECK-NEXT: [[FORMAT_U12:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%s\0A\00" |
78 | // CHECK-NEXT: [[END_STRUCT_U12:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
79 | |
80 | // CHECK: @__const.unit13.a = private unnamed_addr constant %struct.U13A { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0) }, align 8 |
81 | // CHECK-NEXT: [[STRUCT_STR_U13:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U13A {\0A\00" |
82 | // CHECK-NEXT: [[FIELD_U13:@[0-9]+]] = private unnamed_addr constant [20 x i8] c"const charstar a : \00" |
83 | // CHECK-NEXT: [[FORMAT_U13:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%s\0A\00" |
84 | // CHECK-NEXT: [[END_STRUCT_U13:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
85 | |
86 | // CHECK: @__const.unit14.a = private unnamed_addr constant %struct.U14A { double 0x3FF1F9ACFFA7EB6C }, align 8 |
87 | // CHECK-NEXT: [[STRUCT_STR_U14:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U14A {\0A\00" |
88 | // CHECK-NEXT: [[FIELD_U14:@[0-9]+]] = private unnamed_addr constant [12 x i8] c"double a : \00" |
89 | // CHECK-NEXT: [[FORMAT_U14:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%f\0A\00" |
90 | // CHECK-NEXT: [[END_STRUCT_U14:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
91 | |
92 | // CHECK: @__const.unit15.a = private unnamed_addr constant %struct.U15A { [3 x i32] [i32 1, i32 2, i32 3] }, align 4 |
93 | // CHECK-NEXT: [[STRUCT_STR_U15:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U15A {\0A\00" |
94 | // CHECK-NEXT: [[FIELD_U15:@[0-9]+]] = private unnamed_addr constant [13 x i8] c"int [3] a : \00" |
95 | // CHECK-NEXT: [[FORMAT_U15:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%p\0A\00" |
96 | // CHECK-NEXT: [[END_STRUCT_U15:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
97 | |
98 | // CHECK: @__const.unit16.a = private unnamed_addr constant %struct.U16A { i8 12 }, align 1 |
99 | // CHECK-NEXT: [[STRUCT_STR_U16:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U16A {\0A\00" |
100 | // CHECK-NEXT: [[FIELD_U16:@[0-9]+]] = private unnamed_addr constant [13 x i8] c"uint8_t a : \00" |
101 | // CHECK-NEXT: [[FORMAT_U16:@[0-9]+]] = private unnamed_addr constant [6 x i8] c"%hhu\0A\00" |
102 | // CHECK-NEXT: [[END_STRUCT_U16:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
103 | |
104 | // CHECK: @__const.unit17.a = private unnamed_addr constant %struct.U17A { i8 12 }, align 1 |
105 | // CHECK-NEXT: [[STRUCT_STR_U17:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U17A {\0A\00" |
106 | // CHECK-NEXT: [[FIELD_U17:@[0-9]+]] = private unnamed_addr constant [12 x i8] c"int8_t a : \00" |
107 | // CHECK-NEXT: [[FORMAT_U17:@[0-9]+]] = private unnamed_addr constant [6 x i8] c"%hhd\0A\00" |
108 | // CHECK-NEXT: [[END_STRUCT_U17:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
109 | |
110 | // CHECK: @__const.unit18.a = private unnamed_addr constant %struct.U18A { x86_fp80 0xK3FFF8FCD67FD3F5B6000 }, align 16 |
111 | // CHECK-NEXT: [[STRUCT_STR_U18:@[0-9]+]] = private unnamed_addr constant [15 x i8] c"struct U18A {\0A\00" |
112 | // CHECK-NEXT: [[FIELD_U18:@[0-9]+]] = private unnamed_addr constant [17 x i8] c"long double a : \00" |
113 | // CHECK-NEXT: [[FORMAT_U18:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"%Lf\0A\00" |
114 | // CHECK-NEXT: [[END_STRUCT_U18:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"}\0A\00" |
115 | |
116 | int printf(const char *fmt, ...) { |
117 | return 0; |
118 | } |
119 | |
120 | void unit1() { |
121 | struct U1A { |
122 | short a; |
123 | }; |
124 | |
125 | struct U1A a = { |
126 | .a = 12, |
127 | }; |
128 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U1]], i32 0, i32 0)) |
129 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U1A, %struct.U1A* %a, i32 0, i32 0 |
130 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* [[FIELD_U1]], i32 0, i32 0)) |
131 | // CHECK: [[LOAD1:%[0-9]+]] = load i16, i16* [[RES1]], |
132 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U1]], i32 0, i32 0), i16 [[LOAD1]]) |
133 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U1]], i32 0, i32 0)) |
134 | __builtin_dump_struct(&a, &printf); |
135 | } |
136 | |
137 | void unit2() { |
138 | struct U2A { |
139 | unsigned short a; |
140 | }; |
141 | |
142 | struct U2A a = { |
143 | .a = 12, |
144 | }; |
145 | |
146 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U2]], i32 0, i32 0)) |
147 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U2A, %struct.U2A* %a, i32 0, i32 0 |
148 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* [[FIELD_U2]], i32 0, i32 0)) |
149 | // CHECK: [[LOAD1:%[0-9]+]] = load i16, i16* [[RES1]], |
150 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U2]], i32 0, i32 0), i16 [[LOAD1]]) |
151 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U2]], i32 0, i32 0)) |
152 | __builtin_dump_struct(&a, &printf); |
153 | } |
154 | |
155 | void unit3() { |
156 | struct U3A { |
157 | int a; |
158 | }; |
159 | |
160 | struct U3A a = { |
161 | .a = 12, |
162 | }; |
163 | |
164 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U3]], i32 0, i32 0)) |
165 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U3A, %struct.U3A* %a, i32 0, i32 0 |
166 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* [[FIELD_U3]], i32 0, i32 0)) |
167 | // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]], |
168 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U3]], i32 0, i32 0), i32 [[LOAD1]]) |
169 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U3]], i32 0, i32 0) |
170 | __builtin_dump_struct(&a, &printf); |
171 | } |
172 | |
173 | void unit4() { |
174 | struct U4A { |
175 | unsigned int a; |
176 | }; |
177 | |
178 | struct U4A a = { |
179 | .a = 12, |
180 | }; |
181 | |
182 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U4]], i32 0, i32 0)) |
183 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U4A, %struct.U4A* %a, i32 0, i32 0 |
184 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* [[FIELD_U4]], i32 0, i32 0)) |
185 | // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]], |
186 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U4]], i32 0, i32 0), i32 [[LOAD1]]) |
187 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U4]], i32 0, i32 0) |
188 | __builtin_dump_struct(&a, &printf); |
189 | } |
190 | |
191 | void unit5() { |
192 | struct U5A { |
193 | long a; |
194 | }; |
195 | |
196 | struct U5A a = { |
197 | .a = 12, |
198 | }; |
199 | |
200 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U5]], i32 0, i32 0)) |
201 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U5A, %struct.U5A* %a, i32 0, i32 0 |
202 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* [[FIELD_U5]], i32 0, i32 0)) |
203 | // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]], |
204 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U5]], i32 0, i32 0), i64 [[LOAD1]]) |
205 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U5]], i32 0, i32 0) |
206 | __builtin_dump_struct(&a, &printf); |
207 | } |
208 | |
209 | void unit6() { |
210 | struct U6A { |
211 | unsigned long a; |
212 | }; |
213 | |
214 | struct U6A a = { |
215 | .a = 12, |
216 | }; |
217 | |
218 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U6]], i32 0, i32 0)) |
219 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U6A, %struct.U6A* %a, i32 0, i32 0 |
220 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* [[FIELD_U6]], i32 0, i32 0)) |
221 | // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]], |
222 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U6]], i32 0, i32 0), i64 [[LOAD1]]) |
223 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U6]], i32 0, i32 0) |
224 | __builtin_dump_struct(&a, &printf); |
225 | } |
226 | |
227 | void unit7() { |
228 | struct U7A { |
229 | long long a; |
230 | }; |
231 | |
232 | struct U7A a = { |
233 | .a = 12, |
234 | }; |
235 | |
236 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U7]], i32 0, i32 0)) |
237 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U7A, %struct.U7A* %a, i32 0, i32 0 |
238 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[FIELD_U7]], i32 0, i32 0)) |
239 | // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]], |
240 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* [[FORMAT_U7]], i32 0, i32 0), i64 [[LOAD1]]) |
241 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U7]], i32 0, i32 0) |
242 | __builtin_dump_struct(&a, &printf); |
243 | } |
244 | |
245 | void unit8() { |
246 | struct U8A { |
247 | unsigned long long a; |
248 | }; |
249 | |
250 | struct U8A a = { |
251 | .a = 12, |
252 | }; |
253 | |
254 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U8]], i32 0, i32 0)) |
255 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U8A, %struct.U8A* %a, i32 0, i32 0 |
256 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([24 x i8], [24 x i8]* [[FIELD_U8]], i32 0, i32 0)) |
257 | // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]], |
258 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* [[FORMAT_U8]], i32 0, i32 0), i64 [[LOAD1]]) |
259 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U8]], i32 0, i32 0) |
260 | __builtin_dump_struct(&a, &printf); |
261 | } |
262 | |
263 | void unit9() { |
264 | struct U9A { |
265 | char a; |
266 | }; |
267 | |
268 | struct U9A a = { |
269 | .a = 'a', |
270 | }; |
271 | |
272 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[STRUCT_STR_U9]], i32 0, i32 0)) |
273 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U9A, %struct.U9A* %a, i32 0, i32 0 |
274 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* [[FIELD_U9]], i32 0, i32 0)) |
275 | // CHECK: [[LOAD1:%[0-9]+]] = load i8, i8* [[RES1]], |
276 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U9]], i32 0, i32 0), i8 [[LOAD1]]) |
277 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U9]], i32 0, i32 0) |
278 | __builtin_dump_struct(&a, &printf); |
279 | } |
280 | |
281 | void unit10() { |
282 | struct U10A { |
283 | char *a; |
284 | }; |
285 | |
286 | struct U10A a = { |
287 | .a = "LSE", |
288 | }; |
289 | |
290 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U10]], i32 0, i32 0)) |
291 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U10A, %struct.U10A* %a, i32 0, i32 0 |
292 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* [[FIELD_U10]], i32 0, i32 0)) |
293 | // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]], |
294 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U10]], i32 0, i32 0), i8* [[LOAD1]]) |
295 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U10]], i32 0, i32 0) |
296 | __builtin_dump_struct(&a, &printf); |
297 | } |
298 | |
299 | void unit11() { |
300 | struct U11A { |
301 | void *a; |
302 | }; |
303 | |
304 | struct U11A a = { |
305 | .a = (void *)0x12345678, |
306 | }; |
307 | |
308 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U11]], i32 0, i32 0)) |
309 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U11A, %struct.U11A* %a, i32 0, i32 0 |
310 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* [[FIELD_U11]], i32 0, i32 0)) |
311 | // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]], |
312 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U11]], i32 0, i32 0), i8* [[LOAD1]]) |
313 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U11]], i32 0, i32 0) |
314 | __builtin_dump_struct(&a, &printf); |
315 | } |
316 | |
317 | void unit12() { |
318 | struct U12A { |
319 | const char *a; |
320 | }; |
321 | |
322 | struct U12A a = { |
323 | .a = "LSE", |
324 | }; |
325 | |
326 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U12]], i32 0, i32 0)) |
327 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U12A, %struct.U12A* %a, i32 0, i32 0 |
328 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* [[FIELD_U12]], i32 0, i32 0)) |
329 | // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]], |
330 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U12]], i32 0, i32 0), i8* [[LOAD1]]) |
331 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U12]], i32 0, i32 0) |
332 | __builtin_dump_struct(&a, &printf); |
333 | } |
334 | |
335 | void unit13() { |
336 | typedef char *charstar; |
337 | struct U13A { |
338 | const charstar a; |
339 | }; |
340 | |
341 | struct U13A a = { |
342 | .a = "LSE", |
343 | }; |
344 | |
345 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U13]], i32 0, i32 0)) |
346 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U13A, %struct.U13A* %a, i32 0, i32 0 |
347 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* [[FIELD_U13]], i32 0, i32 0)) |
348 | // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]], |
349 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U13]], i32 0, i32 0), i8* [[LOAD1]]) |
350 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U13]], i32 0, i32 0) |
351 | __builtin_dump_struct(&a, &printf); |
352 | } |
353 | |
354 | void unit14() { |
355 | struct U14A { |
356 | double a; |
357 | }; |
358 | |
359 | struct U14A a = { |
360 | .a = 1.123456, |
361 | }; |
362 | |
363 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U14]], i32 0, i32 0)) |
364 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U14A, %struct.U14A* %a, i32 0, i32 0 |
365 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* [[FIELD_U14]], i32 0, i32 0)) |
366 | // CHECK: [[LOAD1:%[0-9]+]] = load double, double* [[RES1]], |
367 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U14]], i32 0, i32 0), double [[LOAD1]]) |
368 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U14]], i32 0, i32 0) |
369 | __builtin_dump_struct(&a, &printf); |
370 | } |
371 | |
372 | void unit15() { |
373 | struct U15A { |
374 | int a[3]; |
375 | }; |
376 | |
377 | struct U15A a = { |
378 | .a = {1, 2, 3}, |
379 | }; |
380 | |
381 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U15]], i32 0, i32 0)) |
382 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U15A, %struct.U15A* %a, i32 0, i32 0 |
383 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* [[FIELD_U15]], i32 0, i32 0)) |
384 | // CHECK: [[LOAD1:%[0-9]+]] = load [3 x i32], [3 x i32]* [[RES1]], |
385 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U15]], i32 0, i32 0), [3 x i32] [[LOAD1]]) |
386 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U15]], i32 0, i32 0) |
387 | __builtin_dump_struct(&a, &printf); |
388 | } |
389 | |
390 | void unit16() { |
391 | struct U16A { |
392 | uint8_t a; |
393 | }; |
394 | |
395 | struct U16A a = { |
396 | .a = 12, |
397 | }; |
398 | |
399 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U16]], i32 0, i32 0)) |
400 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U16A, %struct.U16A* %a, i32 0, i32 0 |
401 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* [[FIELD_U16]], i32 0, i32 0)) |
402 | // CHECK: [[LOAD1:%[0-9]+]] = load i8, i8* [[RES1]], |
403 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* [[FORMAT_U16]], i32 0, i32 0), i8 [[LOAD1]]) |
404 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U16]], i32 0, i32 0) |
405 | __builtin_dump_struct(&a, &printf); |
406 | } |
407 | |
408 | void unit17() { |
409 | struct U17A { |
410 | int8_t a; |
411 | }; |
412 | |
413 | struct U17A a = { |
414 | .a = 12, |
415 | }; |
416 | |
417 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U17]], i32 0, i32 0)) |
418 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U17A, %struct.U17A* %a, i32 0, i32 0 |
419 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* [[FIELD_U17]], i32 0, i32 0)) |
420 | // CHECK: [[LOAD1:%[0-9]+]] = load i8, i8* [[RES1]], |
421 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* [[FORMAT_U17]], i32 0, i32 0), i8 [[LOAD1]]) |
422 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U17]], i32 0, i32 0) |
423 | __builtin_dump_struct(&a, &printf); |
424 | } |
425 | |
426 | void unit18() { |
427 | struct U18A { |
428 | long double a; |
429 | }; |
430 | |
431 | struct U18A a = { |
432 | .a = 1.123456, |
433 | }; |
434 | |
435 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U18]], i32 0, i32 0)) |
436 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U18A, %struct.U18A* %a, i32 0, i32 0 |
437 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* [[FIELD_U18]], i32 0, i32 0)) |
438 | // CHECK: [[LOAD1:%[0-9]+]] = load x86_fp80, x86_fp80* [[RES1]], |
439 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U18]], i32 0, i32 0), x86_fp80 [[LOAD1]]) |
440 | // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U18]], i32 0, i32 0) |
441 | __builtin_dump_struct(&a, &printf); |
442 | } |
443 | |
444 | void test1() { |
445 | struct T1A { |
446 | int a; |
447 | char *b; |
448 | }; |
449 | |
450 | struct T1A a = { |
451 | .a = 12, |
452 | .b = "LSE", |
453 | }; |
454 | |
455 | // CHECK: call i32 (i8*, ...) @printf( |
456 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T1A, %struct.T1A* %a, i32 0, i32 0 |
457 | // CHECK: call i32 (i8*, ...) @printf( |
458 | // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]], |
459 | // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]]) |
460 | // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.T1A, %struct.T1A* %a, i32 0, i32 1 |
461 | // CHECK: call i32 (i8*, ...) @printf( |
462 | // CHECK: [[LOAD2:%[0-9]+]] = load i8*, i8** [[RES2]], |
463 | // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD2]]) |
464 | // CHECK: call i32 (i8*, ...) @printf( |
465 | __builtin_dump_struct(&a, &printf); |
466 | } |
467 | |
468 | void test2() { |
469 | struct T2A { |
470 | int a; |
471 | }; |
472 | |
473 | struct T2B { |
474 | int b; |
475 | struct T2A a; |
476 | }; |
477 | |
478 | struct T2B b = { |
479 | .b = 24, |
480 | .a = { |
481 | .a = 12, |
482 | } |
483 | }; |
484 | |
485 | // CHECK: call i32 (i8*, ...) @printf( |
486 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T2B, %struct.T2B* %b, i32 0, i32 0 |
487 | // CHECK: call i32 (i8*, ...) @printf( |
488 | // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]], |
489 | // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]]) |
490 | // CHECK: [[NESTED_STRUCT:%[0-9]+]] = getelementptr inbounds %struct.T2B, %struct.T2B* %b, i32 0, i32 1 |
491 | // CHECK: call i32 (i8*, ...) @printf( |
492 | // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.T2A, %struct.T2A* [[NESTED_STRUCT]], i32 0, i32 0 |
493 | // CHECK: call i32 (i8*, ...) @printf( |
494 | // CHECK: [[LOAD2:%[0-9]+]] = load i32, i32* [[RES2]], |
495 | // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD2]]) |
496 | // CHECK: call i32 (i8*, ...) @printf( |
497 | __builtin_dump_struct(&b, &printf); |
498 | } |
499 | |
500 | void test3() { |
501 | struct T3A { |
502 | union { |
503 | int a; |
504 | char b[4]; |
505 | }; |
506 | }; |
507 | |
508 | struct T3A a = { |
509 | .a = 42, |
510 | }; |
511 | |
512 | // CHECK: call i32 (i8*, ...) @printf( |
513 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T3A, %struct.T3A* %a, i32 0, i32 0 |
514 | // CHECK: call i32 (i8*, ...) @printf( |
515 | // CHECK: [[BC1:%[0-9]+]] = bitcast %union.anon* [[RES1]] to i32* |
516 | // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[BC1]], |
517 | // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]]) |
518 | // CHECK: [[BC2:%[0-9]+]] = bitcast %union.anon* [[RES1]] to [4 x i8]* |
519 | // CHECK: [[LOAD2:%[0-9]+]] = load [4 x i8], [4 x i8]* [[BC2]], |
520 | // CHECK: call i32 (i8*, ...) @printf({{.*}}, [4 x i8] [[LOAD2]]) |
521 | // CHECK: call i32 (i8*, ...) @printf( |
522 | __builtin_dump_struct(&a, &printf); |
523 | } |
524 | |
525 | void test4() { |
526 | struct T4A { |
527 | union { |
528 | struct { |
529 | void *a; |
530 | }; |
531 | struct { |
532 | unsigned long b; |
533 | }; |
534 | }; |
535 | }; |
536 | |
537 | struct T4A a = { |
538 | .a = (void *)0x12345678, |
539 | }; |
540 | |
541 | // CHECK: call i32 (i8*, ...) @printf( |
542 | // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T4A, %struct.T4A* %a, i32 0, i32 0 |
543 | // CHECK: call i32 (i8*, ...) @printf( |
544 | // CHECK: [[BC1:%[0-9]+]] = bitcast %union.anon.0* [[RES1]] to %struct.anon* |
545 | // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.anon, %struct.anon* [[BC1]], i32 0, i32 0 |
546 | // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES2]], |
547 | // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD1]]) |
548 | |
549 | // CHECK: [[BC2:%[0-9]+]] = bitcast %union.anon.0* [[RES1]] to %struct.anon.1* |
550 | // CHECK: [[RES3:%[0-9]+]] = getelementptr inbounds %struct.anon.1, %struct.anon.1* [[BC2]], i32 0, i32 0 |
551 | // CHECK: [[LOAD2:%[0-9]+]] = load i64, i64* [[RES3]], |
552 | // CHECK: call i32 (i8*, ...) @printf({{.*}}, i64 [[LOAD2]]) |
553 | // CHECK: call i32 (i8*, ...) @printf( |
554 | __builtin_dump_struct(&a, &printf); |
555 | } |
556 | |