Skip to content

Commit d175e2f

Browse files
committed
[clang][NFC] Bitfield access unit tests
These new tests verify clang's choice of types to access bitfields. This is in preparation for the next patch, which changes that algorithm. With these tests already in place it'll be easier to see what has changed.
1 parent e77f5fe commit d175e2f

11 files changed

+1720
-23
lines changed
Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,266 @@
1+
// RUN: %clang_cc1 -triple armv8-none-linux-eabi -fno-aapcs-bitfield-width -fdump-record-layouts-simple -emit-llvm -o /dev/null %s | FileCheck %s -check-prefixes=LAYOUT,LAYOUT_LE
2+
// RUN: %clang_cc1 -triple armebv8-none-linux-eabi -fno-aapcs-bitfield-width -fdump-record-layouts-simple -emit-llvm -o /dev/null %s | FileCheck %s -check-prefixes=LAYOUT,LAYOUT_BE
3+
4+
// RUN: %clang_cc1 -triple armv8-none-linux-eabi -faapcs-bitfield-width -fdump-record-layouts-simple -emit-llvm -o /dev/null %s | FileCheck %s -check-prefixes=LAYOUT,LAYOUT_LE
5+
// RUN: %clang_cc1 -triple armebv8-none-linux-eabi -faapcs-bitfield-width -fdump-record-layouts-simple -emit-llvm -o /dev/null %s | FileCheck %s -check-prefixes=LAYOUT,LAYOUT_BE
6+
7+
struct st0 {
8+
short c : 7;
9+
} st0;
10+
// LAYOUT-LABEL: LLVMType:%struct.st0 =
11+
// LAYOUT-SAME: type { i8, i8 }
12+
// LAYOUT: BitFields:[
13+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:7 IsSigned:1 StorageSize:8 StorageOffset:0
14+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:1 Size:7 IsSigned:1 StorageSize:8 StorageOffset:0
15+
// LAYOUT-NEXT: ]>
16+
17+
struct st1 {
18+
int a : 10;
19+
short c : 6;
20+
} st1;
21+
// LAYOUT-LABEL: LLVMType:%struct.st1 =
22+
// LAYOUT-SAME: type { i16, [2 x i8] }
23+
// LAYOUT: BitFields:[
24+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:10 IsSigned:1 StorageSize:16 StorageOffset:0
25+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:10 Size:6 IsSigned:1 StorageSize:16 StorageOffset:0
26+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:6 Size:10 IsSigned:1 StorageSize:16 StorageOffset:0
27+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:0 Size:6 IsSigned:1 StorageSize:16 StorageOffset:0
28+
// LAYOUT-NEXT: ]>
29+
30+
struct st2 {
31+
int a : 10;
32+
short c : 7;
33+
} st2;
34+
// LAYOUT-LABEL: LLVMType:%struct.st2 =
35+
// LAYOUT-SAME: type { i16, i8 }
36+
// LAYOUT: BitFields:[
37+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:10 IsSigned:1 StorageSize:16 StorageOffset:0
38+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:7 IsSigned:1 StorageSize:8 StorageOffset:2
39+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:6 Size:10 IsSigned:1 StorageSize:16 StorageOffset:0
40+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:1 Size:7 IsSigned:1 StorageSize:8 StorageOffset:2
41+
// LAYOUT-NEXT: ]>
42+
43+
struct st3 {
44+
volatile short c : 7;
45+
} st3;
46+
// LAYOUT-LABEL: LLVMType:%struct.st3 =
47+
// LAYOUT-SAME: type { i8, i8 }
48+
// LAYOUT: BitFields:[
49+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:7 IsSigned:1 StorageSize:8 StorageOffset:0
50+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:1 Size:7 IsSigned:1 StorageSize:8 StorageOffset:0
51+
// LAYOUT-NEXT: ]>
52+
53+
struct st4 {
54+
int b : 9;
55+
volatile char c : 5;
56+
} st4;
57+
// LAYOUT-LABEL: LLVMType:%struct.st4 =
58+
// LAYOUT-SAME: type { i16, [2 x i8] }
59+
// LAYOUT: BitFields:[
60+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:9 IsSigned:1 StorageSize:16 StorageOffset:0
61+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:9 Size:5 IsSigned:1 StorageSize:16 StorageOffset:0
62+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:7 Size:9 IsSigned:1 StorageSize:16 StorageOffset:0
63+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:2 Size:5 IsSigned:1 StorageSize:16 StorageOffset:0
64+
// LAYOUT-NEXT: ]>
65+
66+
struct st5 {
67+
int a : 12;
68+
volatile char c : 5;
69+
} st5;
70+
// LAYOUT-LABEL: LLVMType:%struct.st5 =
71+
// LAYOUT-SAME: type { i16, i8 }
72+
// LAYOUT: BitFields:[
73+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:12 IsSigned:1 StorageSize:16 StorageOffset:0
74+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:5 IsSigned:1 StorageSize:8 StorageOffset:2
75+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:4 Size:12 IsSigned:1 StorageSize:16 StorageOffset:0
76+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:3 Size:5 IsSigned:1 StorageSize:8 StorageOffset:2
77+
// LAYOUT-NEXT: ]>
78+
79+
struct st6 {
80+
int a : 12;
81+
char b;
82+
int c : 5;
83+
} st6;
84+
// LAYOUT-LABEL: LLVMType:%struct.st6 =
85+
// LAYOUT-SAME: type { i16, i8, i8 }
86+
// LAYOUT: BitFields:[
87+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:12 IsSigned:1 StorageSize:16 StorageOffset:0
88+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:5 IsSigned:1 StorageSize:8 StorageOffset:3
89+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:4 Size:12 IsSigned:1 StorageSize:16 StorageOffset:0
90+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:3 Size:5 IsSigned:1 StorageSize:8 StorageOffset:3
91+
// LAYOUT-NEXT: ]>
92+
93+
struct st7a {
94+
char a;
95+
int b : 5;
96+
} st7a;
97+
// LAYOUT-LABEL: LLVMType:%struct.st7a =
98+
// LAYOUT-SAME: type { i8, i8, [2 x i8] }
99+
// LAYOUT: BitFields:[
100+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:5 IsSigned:1 StorageSize:8 StorageOffset:1
101+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:3 Size:5 IsSigned:1 StorageSize:8 StorageOffset:1
102+
// LAYOUT-NEXT: ]>
103+
104+
struct st7b {
105+
char x;
106+
volatile struct st7a y;
107+
} st7b;
108+
// LAYOUT-LABEL: LLVMType:%struct.st7b =
109+
// LAYOUT-SAME: type { i8, [3 x i8], %struct.st7a }
110+
// LAYOUT: BitFields:[
111+
// LAYOUT-NEXT: ]>
112+
113+
struct st8 {
114+
unsigned f : 16;
115+
} st8;
116+
// LAYOUT-LABEL: LLVMType:%struct.st8 =
117+
// LAYOUT-SAME: type { i16, [2 x i8] }
118+
// LAYOUT: BitFields:[
119+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:16 IsSigned:0 StorageSize:16 StorageOffset:0
120+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:0 Size:16 IsSigned:0 StorageSize:16 StorageOffset:0
121+
// LAYOUT-NEXT: ]>
122+
123+
struct st9{
124+
int f : 8;
125+
} st9;
126+
// LAYOUT-LABEL: LLVMType:%struct.st9 =
127+
// LAYOUT-SAME: type { i8, [3 x i8] }
128+
// LAYOUT: BitFields:[
129+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
130+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
131+
// LAYOUT-NEXT: ]>
132+
133+
struct st10{
134+
int e : 1;
135+
int f : 8;
136+
} st10;
137+
// LAYOUT-LABEL: LLVMType:%struct.st10 =
138+
// LAYOUT-SAME: type { i16, [2 x i8] }
139+
// LAYOUT: BitFields:[
140+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:1 IsSigned:1 StorageSize:16 StorageOffset:0
141+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:1 Size:8 IsSigned:1 StorageSize:16 StorageOffset:0
142+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:15 Size:1 IsSigned:1 StorageSize:16 StorageOffset:0
143+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:7 Size:8 IsSigned:1 StorageSize:16 StorageOffset:0
144+
// LAYOUT-NEXT: ]>
145+
146+
struct st11{
147+
char e;
148+
int f : 16;
149+
} st11;
150+
// LAYOUT-LABEL: LLVMType:%struct.st11 =
151+
// LAYOUT-SAME: type <{ i8, i16, i8 }>
152+
// LAYOUT: BitFields:[
153+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:16 IsSigned:1 StorageSize:16 StorageOffset:1
154+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:0 Size:16 IsSigned:1 StorageSize:16 StorageOffset:1
155+
// LAYOUT-NEXT: ]>
156+
157+
struct st12{
158+
int e : 8;
159+
int f : 16;
160+
} st12;
161+
// LAYOUT-LABEL: LLVMType:%struct.st12 =
162+
// LAYOUT-SAME: type { i24 }
163+
// LAYOUT: BitFields:[
164+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:32 StorageOffset:0
165+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:8 Size:16 IsSigned:1 StorageSize:32 StorageOffset:0
166+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:24 Size:8 IsSigned:1 StorageSize:32 StorageOffset:0
167+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:8 Size:16 IsSigned:1 StorageSize:32 StorageOffset:0
168+
// LAYOUT-NEXT: ]>
169+
170+
struct st13 {
171+
char a : 8;
172+
int b : 32;
173+
} __attribute__((packed)) st13;
174+
// LAYOUT-LABEL: LLVMType:%struct.st13 =
175+
// LAYOUT-SAME: type { [5 x i8] }
176+
// LAYOUT: BitFields:[
177+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:40 StorageOffset:0
178+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:8 Size:32 IsSigned:1 StorageSize:40 StorageOffset:0
179+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:32 Size:8 IsSigned:1 StorageSize:40 StorageOffset:0
180+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:0 Size:32 IsSigned:1 StorageSize:40 StorageOffset:0
181+
// LAYOUT-NEXT: ]>
182+
183+
struct st14 {
184+
char a : 8;
185+
} __attribute__((packed)) st14;
186+
// LAYOUT-LABEL: LLVMType:%struct.st14 =
187+
// LAYOUT-SAME: type { i8 }
188+
// LAYOUT: BitFields:[
189+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
190+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
191+
// LAYOUT-NEXT: ]>
192+
193+
struct st15 {
194+
short a : 8;
195+
} __attribute__((packed)) st15;
196+
// LAYOUT-LABEL: LLVMType:%struct.st15 =
197+
// LAYOUT-SAME: type { i8 }
198+
// LAYOUT: BitFields:[
199+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
200+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
201+
// LAYOUT-NEXT: ]>
202+
203+
struct st16 {
204+
int a : 32;
205+
int b : 16;
206+
int c : 32;
207+
int d : 16;
208+
} st16;
209+
// LAYOUT-LABEL: LLVMType:%struct.st16 =
210+
// LAYOUT-SAME: type { i48, i48 }
211+
// LAYOUT: BitFields:[
212+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:32 IsSigned:1 StorageSize:64 StorageOffset:0
213+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:32 Size:16 IsSigned:1 StorageSize:64 StorageOffset:0
214+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:32 IsSigned:1 StorageSize:64 StorageOffset:8
215+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:32 Size:16 IsSigned:1 StorageSize:64 StorageOffset:8
216+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:32 Size:32 IsSigned:1 StorageSize:64 StorageOffset:0
217+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:16 Size:16 IsSigned:1 StorageSize:64 StorageOffset:0
218+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:32 Size:32 IsSigned:1 StorageSize:64 StorageOffset:8
219+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:16 Size:16 IsSigned:1 StorageSize:64 StorageOffset:8
220+
// LAYOUT-NEXT: ]>
221+
222+
struct st17 {
223+
int b : 32;
224+
char c : 8;
225+
} __attribute__((packed)) st17;
226+
// LAYOUT-LABEL: LLVMType:%struct.st17 =
227+
// LAYOUT-SAME: type { [5 x i8] }
228+
// LAYOUT: BitFields:[
229+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:32 IsSigned:1 StorageSize:40 StorageOffset:0
230+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:32 Size:8 IsSigned:1 StorageSize:40 StorageOffset:0
231+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:8 Size:32 IsSigned:1 StorageSize:40 StorageOffset:0
232+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:40 StorageOffset:0
233+
// LAYOUT-NEXT: ]>
234+
235+
struct zero_bitfield {
236+
int a : 8;
237+
char : 0;
238+
int b : 8;
239+
} st18;
240+
// LAYOUT-LABEL: LLVMType:%struct.zero_bitfield =
241+
// LAYOUT-SAME: type { i8, i8, [2 x i8] }
242+
// LAYOUT: BitFields:[
243+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
244+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:8 StorageOffset:1
245+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
246+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:8 StorageOffset:1
247+
// LAYOUT-NEXT: ]>
248+
249+
struct zero_bitfield_ok {
250+
short a : 8;
251+
char a1 : 8;
252+
long : 0;
253+
int b : 24;
254+
} st19;
255+
// LAYOUT-LABEL: LLVMType:%struct.zero_bitfield_ok =
256+
// LAYOUT-SAME: type { i16, i24 }
257+
// LAYOUT: BitFields:[
258+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:16 StorageOffset:0
259+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:8 Size:8 IsSigned:1 StorageSize:16 StorageOffset:0
260+
// LAYOUT_LE-NEXT: <CGBitFieldInfo Offset:0 Size:24 IsSigned:1 StorageSize:32 StorageOffset:4
261+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:8 Size:8 IsSigned:1 StorageSize:16 StorageOffset:0
262+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:16 StorageOffset:0
263+
// LAYOUT_BE-NEXT: <CGBitFieldInfo Offset:8 Size:24 IsSigned:1 StorageSize:32 StorageOffset:4
264+
// LAYOUT-NEXT: ]>
265+
266+
Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
// RUN: %clang_cc1 -triple arm-none-eabi -ffreestanding -emit-llvm -o - %s | FileCheck %s
2-
// RUN: %clang_cc1 -triple aarch64 -ffreestanding -emit-llvm -o - %s | FileCheck %s
1+
// RUN: %clang_cc1 -triple arm-none-eabi -fdump-record-layouts-simple -ffreestanding -emit-llvm -o %t %s | FileCheck %s -check-prefix=LAYOUT
2+
// RUN: FileCheck %s -check-prefix=IR <%t
3+
// RUN: %clang_cc1 -triple aarch64 -fdump-record-layouts-simple -ffreestanding -emit-llvm -o %t %s | FileCheck %s -check-prefix=LAYOUT
4+
// RUN: FileCheck %s -check-prefix=IR <%t
35

46
extern struct T {
57
int b0 : 8;
@@ -11,5 +13,13 @@ int func(void) {
1113
return g.b1;
1214
}
1315

14-
// CHECK: @g = external global %struct.T, align 4
15-
// CHECK: %{{.*}} = load i64, ptr @g, align 4
16+
// IR: @g = external global %struct.T, align 4
17+
// IR: %{{.*}} = load i64, ptr @g, align 4
18+
19+
// LAYOUT-LABEL: LLVMType:%struct.T =
20+
// LAYOUT-SAME: type { i40 }
21+
// LAYOUT: BitFields:[
22+
// LAYOUT-NEXT: <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:64 StorageOffset:0
23+
// LAYOUT-NEXT: <CGBitFieldInfo Offset:8 Size:24 IsSigned:1 StorageSize:64 StorageOffset:0
24+
// LAYOUT-NEXT: <CGBitFieldInfo Offset:32 Size:1 IsSigned:1 StorageSize:64 StorageOffset:0
25+
// LAYOUT-NEXT: ]>
Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
1-
// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -ffreestanding -emit-llvm -O0 -o - %s | FileCheck --check-prefix IR %s
1+
// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -ffreestanding -emit-llvm -O0 -o %t -fdump-record-layouts-simple %s | FileCheck %s --check-prefix=LAYOUT
2+
// RUN: FileCheck %s --check-prefix=IR <%t
23

34
struct bt3 { signed b2:10; signed b3:10; } b16;
45

56
// Get the high 32-bits and then shift appropriately for big-endian.
67
signed callee_b0f(struct bt3 bp11) {
78
// IR: callee_b0f(i64 [[ARG:%.*]])
9+
// IR: [[BP11:%.*]] = alloca %struct.bt3, align 4
810
// IR: store i64 [[ARG]], ptr [[PTR:%.*]], align 8
9-
// IR: call void @llvm.memcpy.p0.p0.i64(ptr {{.*}}, ptr align 8 [[PTR]], i64 4
11+
// IR: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[BP11]], ptr align 8 [[PTR]], i64 4
12+
// IR: [[BF_LOAD:%.*]] = load i32, ptr [[BP11]], align 4
13+
// IR: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 22
14+
// IR: ret i32 [[BF_ASHR]]
1015
return bp11.b2;
1116
}
17+
18+
// LAYOUT-LABEL: LLVMType:%struct.bt3 =
19+
// LAYOUT-SAME: type { i24 }
20+
// LAYOUT: BitFields:[
21+
// LAYOUT-NEXT: <CGBitFieldInfo Offset:22 Size:10 IsSigned:1 StorageSize:32 StorageOffset:0
22+
// LAYOUT-NEXT: <CGBitFieldInfo Offset:12 Size:10 IsSigned:1 StorageSize:32 StorageOffset:0
23+
// LAYOUT-NEXT: ]>

0 commit comments

Comments
 (0)