blob: fc5c0d6cb4cf3bd0822fddc43dbf95403abd237d [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"
Aaron Ballmanfe935462018-04-17 14:00:06 +00004#include <stdint.h>
Aaron Ballman06525342018-04-10 21:58:13 +00005
Aaron Ballmanb6a77022018-04-17 11:57:47 +00006// CHECK: @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: @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: @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: @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: @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: @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: @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: @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: @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: @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: @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: @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: @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: @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: @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
Aaron Ballmanfe935462018-04-17 14:00:06 +000098// CHECK: @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: @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
Aaron Ballman06525342018-04-10 21:58:13 +0000110int printf(const char *fmt, ...) {
111 return 0;
112}
113
114void unit1() {
115 struct U1A {
116 short a;
117 };
118
119 struct U1A a = {
120 .a = 12,
121 };
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000122 // 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 +0000123 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U1A, %struct.U1A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000124 // 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 +0000125 // CHECK: [[LOAD1:%[0-9]+]] = load i16, i16* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000126 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U1]], i32 0, i32 0), i16 [[LOAD1]])
127 // 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 +0000128 __builtin_dump_struct(&a, &printf);
129}
130
131void unit2() {
132 struct U2A {
133 unsigned short a;
134 };
135
136 struct U2A a = {
137 .a = 12,
138 };
139
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000140 // 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 +0000141 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U2A, %struct.U2A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000142 // 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 +0000143 // CHECK: [[LOAD1:%[0-9]+]] = load i16, i16* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000144 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U2]], i32 0, i32 0), i16 [[LOAD1]])
145 // 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 +0000146 __builtin_dump_struct(&a, &printf);
147}
148
149void unit3() {
150 struct U3A {
151 int a;
152 };
153
154 struct U3A a = {
155 .a = 12,
156 };
157
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000158 // 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 +0000159 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U3A, %struct.U3A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000160 // 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 +0000161 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000162 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U3]], i32 0, i32 0), i32 [[LOAD1]])
163 // 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 +0000164 __builtin_dump_struct(&a, &printf);
165}
166
167void unit4() {
168 struct U4A {
169 unsigned int a;
170 };
171
172 struct U4A a = {
173 .a = 12,
174 };
175
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000176 // 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 +0000177 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U4A, %struct.U4A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000178 // 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 +0000179 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000180 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U4]], i32 0, i32 0), i32 [[LOAD1]])
181 // 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 +0000182 __builtin_dump_struct(&a, &printf);
183}
184
185void unit5() {
186 struct U5A {
187 long a;
188 };
189
190 struct U5A a = {
191 .a = 12,
192 };
193
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000194 // 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 +0000195 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U5A, %struct.U5A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000196 // 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 +0000197 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000198 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U5]], i32 0, i32 0), i64 [[LOAD1]])
199 // 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 +0000200 __builtin_dump_struct(&a, &printf);
201}
202
203void unit6() {
204 struct U6A {
205 unsigned long a;
206 };
207
208 struct U6A a = {
209 .a = 12,
210 };
211
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000212 // 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 +0000213 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U6A, %struct.U6A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000214 // 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 +0000215 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000216 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[FORMAT_U6]], i32 0, i32 0), i64 [[LOAD1]])
217 // 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 +0000218 __builtin_dump_struct(&a, &printf);
219}
220
221void unit7() {
222 struct U7A {
223 long long a;
224 };
225
226 struct U7A a = {
227 .a = 12,
228 };
229
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000230 // 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 +0000231 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U7A, %struct.U7A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000232 // 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 +0000233 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000234 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* [[FORMAT_U7]], i32 0, i32 0), i64 [[LOAD1]])
235 // 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 +0000236 __builtin_dump_struct(&a, &printf);
237}
238
239void unit8() {
240 struct U8A {
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000241 unsigned long long a;
Aaron Ballman06525342018-04-10 21:58:13 +0000242 };
243
244 struct U8A a = {
245 .a = 12,
246 };
247
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000248 // 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 +0000249 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U8A, %struct.U8A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000250 // 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 +0000251 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000252 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* [[FORMAT_U8]], i32 0, i32 0), i64 [[LOAD1]])
253 // 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 +0000254 __builtin_dump_struct(&a, &printf);
255}
256
257void unit9() {
258 struct U9A {
259 char a;
260 };
261
262 struct U9A a = {
263 .a = 'a',
264 };
265
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000266 // 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 +0000267 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U9A, %struct.U9A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000268 // 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 +0000269 // CHECK: [[LOAD1:%[0-9]+]] = load i8, i8* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000270 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U9]], i32 0, i32 0), i8 [[LOAD1]])
271 // 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 +0000272 __builtin_dump_struct(&a, &printf);
273}
274
275void unit10() {
276 struct U10A {
277 char *a;
278 };
279
280 struct U10A a = {
281 .a = "LSE",
282 };
283
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000284 // 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 +0000285 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U10A, %struct.U10A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000286 // 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 +0000287 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000288 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U10]], i32 0, i32 0), i8* [[LOAD1]])
289 // 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 +0000290 __builtin_dump_struct(&a, &printf);
291}
292
293void unit11() {
294 struct U11A {
295 void *a;
296 };
297
298 struct U11A a = {
299 .a = (void *)0x12345678,
300 };
301
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000302 // 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 +0000303 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U11A, %struct.U11A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000304 // 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 +0000305 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000306 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U11]], i32 0, i32 0), i8* [[LOAD1]])
307 // 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 +0000308 __builtin_dump_struct(&a, &printf);
309}
310
311void unit12() {
312 struct U12A {
313 const char *a;
314 };
315
316 struct U12A a = {
317 .a = "LSE",
318 };
319
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000320 // 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 +0000321 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U12A, %struct.U12A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000322 // 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 +0000323 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000324 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U12]], i32 0, i32 0), i8* [[LOAD1]])
325 // 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 +0000326 __builtin_dump_struct(&a, &printf);
327}
328
329void unit13() {
330 typedef char *charstar;
331 struct U13A {
332 const charstar a;
333 };
334
335 struct U13A a = {
336 .a = "LSE",
337 };
338
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000339 // 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 +0000340 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U13A, %struct.U13A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000341 // 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 +0000342 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000343 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U13]], i32 0, i32 0), i8* [[LOAD1]])
344 // 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 +0000345 __builtin_dump_struct(&a, &printf);
346}
347
348void unit14() {
349 struct U14A {
350 double a;
351 };
352
353 struct U14A a = {
354 .a = 1.123456,
355 };
356
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000357 // 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 +0000358 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U14A, %struct.U14A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000359 // 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 +0000360 // CHECK: [[LOAD1:%[0-9]+]] = load double, double* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000361 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U14]], i32 0, i32 0), double [[LOAD1]])
362 // 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 +0000363 __builtin_dump_struct(&a, &printf);
364}
365
366void unit15() {
367 struct U15A {
368 int a[3];
369 };
370
371 struct U15A a = {
372 .a = {1, 2, 3},
373 };
374
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000375 // 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 +0000376 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U15A, %struct.U15A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000377 // 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 +0000378 // CHECK: [[LOAD1:%[0-9]+]] = load [3 x i32], [3 x i32]* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000379 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* [[FORMAT_U15]], i32 0, i32 0), [3 x i32] [[LOAD1]])
380 // 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 +0000381 __builtin_dump_struct(&a, &printf);
382}
383
Aaron Ballmanfe935462018-04-17 14:00:06 +0000384void unit16() {
385 struct U16A {
386 uint8_t a;
387 };
388
389 struct U16A a = {
390 .a = 12,
391 };
392
393 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U16]], i32 0, i32 0))
394 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U16A, %struct.U16A* %a, i32 0, i32 0
395 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* [[FIELD_U16]], i32 0, i32 0))
396 // CHECK: [[LOAD1:%[0-9]+]] = load i8, i8* [[RES1]],
397 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* [[FORMAT_U16]], i32 0, i32 0), i8 [[LOAD1]])
398 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U16]], i32 0, i32 0)
399 __builtin_dump_struct(&a, &printf);
400}
401
402void unit17() {
403 struct U17A {
404 int8_t a;
405 };
406
407 struct U17A a = {
408 .a = 12,
409 };
410
411 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[STRUCT_STR_U17]], i32 0, i32 0))
412 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U17A, %struct.U17A* %a, i32 0, i32 0
413 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* [[FIELD_U17]], i32 0, i32 0))
414 // CHECK: [[LOAD1:%[0-9]+]] = load i8, i8* [[RES1]],
415 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* [[FORMAT_U17]], i32 0, i32 0), i8 [[LOAD1]])
416 // CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[END_STRUCT_U17]], i32 0, i32 0)
417 __builtin_dump_struct(&a, &printf);
418}
419
Aaron Ballman06525342018-04-10 21:58:13 +0000420void test1() {
421 struct T1A {
422 int a;
423 char *b;
424 };
425
426 struct T1A a = {
427 .a = 12,
428 .b = "LSE",
429 };
430
431 // CHECK: call i32 (i8*, ...) @printf(
432 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T1A, %struct.T1A* %a, i32 0, i32 0
433 // CHECK: call i32 (i8*, ...) @printf(
434 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
435 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]])
436 // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.T1A, %struct.T1A* %a, i32 0, i32 1
437 // CHECK: call i32 (i8*, ...) @printf(
438 // CHECK: [[LOAD2:%[0-9]+]] = load i8*, i8** [[RES2]],
439 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD2]])
440 // CHECK: call i32 (i8*, ...) @printf(
441 __builtin_dump_struct(&a, &printf);
442}
443
444void test2() {
445 struct T2A {
446 int a;
447 };
448
449 struct T2B {
450 int b;
451 struct T2A a;
452 };
453
454 struct T2B b = {
455 .b = 24,
456 .a = {
457 .a = 12,
458 }
459 };
460
461 // CHECK: call i32 (i8*, ...) @printf(
462 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T2B, %struct.T2B* %b, i32 0, i32 0
463 // CHECK: call i32 (i8*, ...) @printf(
464 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
465 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]])
466 // CHECK: [[NESTED_STRUCT:%[0-9]+]] = getelementptr inbounds %struct.T2B, %struct.T2B* %b, i32 0, i32 1
467 // CHECK: call i32 (i8*, ...) @printf(
468 // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.T2A, %struct.T2A* [[NESTED_STRUCT]], i32 0, i32 0
469 // CHECK: call i32 (i8*, ...) @printf(
470 // CHECK: [[LOAD2:%[0-9]+]] = load i32, i32* [[RES2]],
471 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD2]])
472 // CHECK: call i32 (i8*, ...) @printf(
473 __builtin_dump_struct(&b, &printf);
474}
475
476void test3() {
477 struct T3A {
478 union {
479 int a;
480 char b[4];
481 };
482 };
483
484 struct T3A a = {
485 .a = 42,
486 };
487
488 // CHECK: call i32 (i8*, ...) @printf(
489 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T3A, %struct.T3A* %a, i32 0, i32 0
490 // CHECK: call i32 (i8*, ...) @printf(
491 // CHECK: [[BC1:%[0-9]+]] = bitcast %union.anon* [[RES1]] to i32*
492 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[BC1]],
493 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i32 [[LOAD1]])
494 // CHECK: [[BC2:%[0-9]+]] = bitcast %union.anon* [[RES1]] to [4 x i8]*
495 // CHECK: [[LOAD2:%[0-9]+]] = load [4 x i8], [4 x i8]* [[BC2]],
496 // CHECK: call i32 (i8*, ...) @printf({{.*}}, [4 x i8] [[LOAD2]])
497 // CHECK: call i32 (i8*, ...) @printf(
498 __builtin_dump_struct(&a, &printf);
499}
500
501void test4() {
502 struct T4A {
503 union {
504 struct {
505 void *a;
506 };
507 struct {
508 unsigned long b;
509 };
510 };
511 };
512
513 struct T4A a = {
514 .a = (void *)0x12345678,
515 };
516
517 // CHECK: call i32 (i8*, ...) @printf(
518 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.T4A, %struct.T4A* %a, i32 0, i32 0
519 // CHECK: call i32 (i8*, ...) @printf(
520 // CHECK: [[BC1:%[0-9]+]] = bitcast %union.anon.0* [[RES1]] to %struct.anon*
521 // CHECK: [[RES2:%[0-9]+]] = getelementptr inbounds %struct.anon, %struct.anon* [[BC1]], i32 0, i32 0
522 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES2]],
523 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i8* [[LOAD1]])
524
525 // CHECK: [[BC2:%[0-9]+]] = bitcast %union.anon.0* [[RES1]] to %struct.anon.1*
526 // CHECK: [[RES3:%[0-9]+]] = getelementptr inbounds %struct.anon.1, %struct.anon.1* [[BC2]], i32 0, i32 0
527 // CHECK: [[LOAD2:%[0-9]+]] = load i64, i64* [[RES3]],
528 // CHECK: call i32 (i8*, ...) @printf({{.*}}, i64 [[LOAD2]])
529 // CHECK: call i32 (i8*, ...) @printf(
530 __builtin_dump_struct(&a, &printf);
531}