blob: cd8540960205c929747615d97b1ad00fbf3bc91c [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
Paul Semel80daae22018-04-25 10:09:20 +0000110// CHECK: @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
Aaron Ballman06525342018-04-10 21:58:13 +0000116int printf(const char *fmt, ...) {
117 return 0;
118}
119
120void unit1() {
121 struct U1A {
122 short a;
123 };
124
125 struct U1A a = {
126 .a = 12,
127 };
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000128 // 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 +0000129 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U1A, %struct.U1A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000130 // 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 +0000131 // CHECK: [[LOAD1:%[0-9]+]] = load i16, i16* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000132 // 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))
Aaron Ballman06525342018-04-10 21:58:13 +0000134 __builtin_dump_struct(&a, &printf);
135}
136
137void unit2() {
138 struct U2A {
139 unsigned short a;
140 };
141
142 struct U2A a = {
143 .a = 12,
144 };
145
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000146 // 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 +0000147 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U2A, %struct.U2A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000148 // 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 +0000149 // CHECK: [[LOAD1:%[0-9]+]] = load i16, i16* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000150 // 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))
Aaron Ballman06525342018-04-10 21:58:13 +0000152 __builtin_dump_struct(&a, &printf);
153}
154
155void unit3() {
156 struct U3A {
157 int a;
158 };
159
160 struct U3A a = {
161 .a = 12,
162 };
163
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000164 // 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 +0000165 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U3A, %struct.U3A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000166 // 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 +0000167 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000168 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000170 __builtin_dump_struct(&a, &printf);
171}
172
173void unit4() {
174 struct U4A {
175 unsigned int a;
176 };
177
178 struct U4A a = {
179 .a = 12,
180 };
181
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000182 // 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 +0000183 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U4A, %struct.U4A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000184 // 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 +0000185 // CHECK: [[LOAD1:%[0-9]+]] = load i32, i32* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000186 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000188 __builtin_dump_struct(&a, &printf);
189}
190
191void unit5() {
192 struct U5A {
193 long a;
194 };
195
196 struct U5A a = {
197 .a = 12,
198 };
199
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000200 // 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 +0000201 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U5A, %struct.U5A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000202 // 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 +0000203 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000204 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000206 __builtin_dump_struct(&a, &printf);
207}
208
209void unit6() {
210 struct U6A {
211 unsigned long a;
212 };
213
214 struct U6A a = {
215 .a = 12,
216 };
217
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000218 // 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 +0000219 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U6A, %struct.U6A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000220 // 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 +0000221 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000222 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000224 __builtin_dump_struct(&a, &printf);
225}
226
227void unit7() {
228 struct U7A {
229 long long a;
230 };
231
232 struct U7A a = {
233 .a = 12,
234 };
235
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000236 // 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 +0000237 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U7A, %struct.U7A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000238 // 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 +0000239 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000240 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000242 __builtin_dump_struct(&a, &printf);
243}
244
245void unit8() {
246 struct U8A {
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000247 unsigned long long a;
Aaron Ballman06525342018-04-10 21:58:13 +0000248 };
249
250 struct U8A a = {
251 .a = 12,
252 };
253
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000254 // 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 +0000255 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U8A, %struct.U8A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000256 // 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 +0000257 // CHECK: [[LOAD1:%[0-9]+]] = load i64, i64* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000258 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000260 __builtin_dump_struct(&a, &printf);
261}
262
263void unit9() {
264 struct U9A {
265 char a;
266 };
267
268 struct U9A a = {
269 .a = 'a',
270 };
271
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000272 // 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 +0000273 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U9A, %struct.U9A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000274 // 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 +0000275 // CHECK: [[LOAD1:%[0-9]+]] = load i8, i8* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000276 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000278 __builtin_dump_struct(&a, &printf);
279}
280
281void unit10() {
282 struct U10A {
283 char *a;
284 };
285
286 struct U10A a = {
287 .a = "LSE",
288 };
289
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000290 // 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 +0000291 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U10A, %struct.U10A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000292 // 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 +0000293 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000294 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000296 __builtin_dump_struct(&a, &printf);
297}
298
299void unit11() {
300 struct U11A {
301 void *a;
302 };
303
304 struct U11A a = {
305 .a = (void *)0x12345678,
306 };
307
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000308 // 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 +0000309 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U11A, %struct.U11A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000310 // 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 +0000311 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000312 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000314 __builtin_dump_struct(&a, &printf);
315}
316
317void unit12() {
318 struct U12A {
319 const char *a;
320 };
321
322 struct U12A 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_U12]], i32 0, i32 0))
Aaron Ballman06525342018-04-10 21:58:13 +0000327 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U12A, %struct.U12A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000328 // 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 +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_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)
Aaron Ballman06525342018-04-10 21:58:13 +0000332 __builtin_dump_struct(&a, &printf);
333}
334
335void unit13() {
336 typedef char *charstar;
337 struct U13A {
338 const charstar a;
339 };
340
341 struct U13A a = {
342 .a = "LSE",
343 };
344
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000345 // 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 +0000346 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U13A, %struct.U13A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000347 // 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 +0000348 // CHECK: [[LOAD1:%[0-9]+]] = load i8*, i8** [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000349 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000351 __builtin_dump_struct(&a, &printf);
352}
353
354void unit14() {
355 struct U14A {
356 double a;
357 };
358
359 struct U14A a = {
360 .a = 1.123456,
361 };
362
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000363 // 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 +0000364 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U14A, %struct.U14A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000365 // 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 +0000366 // CHECK: [[LOAD1:%[0-9]+]] = load double, double* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000367 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000369 __builtin_dump_struct(&a, &printf);
370}
371
372void unit15() {
373 struct U15A {
374 int a[3];
375 };
376
377 struct U15A a = {
378 .a = {1, 2, 3},
379 };
380
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000381 // 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 +0000382 // CHECK: [[RES1:%[0-9]+]] = getelementptr inbounds %struct.U15A, %struct.U15A* %a, i32 0, i32 0
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000383 // 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 +0000384 // CHECK: [[LOAD1:%[0-9]+]] = load [3 x i32], [3 x i32]* [[RES1]],
Aaron Ballmanb6a77022018-04-17 11:57:47 +0000385 // 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)
Aaron Ballman06525342018-04-10 21:58:13 +0000387 __builtin_dump_struct(&a, &printf);
388}
389
Aaron Ballmanfe935462018-04-17 14:00:06 +0000390void 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
408void 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
Paul Semel80daae22018-04-25 10:09:20 +0000426void 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
Aaron Ballman06525342018-04-10 21:58:13 +0000444void 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
468void 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
500void 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
525void 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}