Skip to content

Commit a8ca4ab

Browse files
committed
[clang][NFC] Bitfield access unit tests (#65742)
Verify bitfield access units.
1 parent 7344e99 commit a8ca4ab

11 files changed

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