xref: /llvm-project/clang/test/CodeGen/aapcs-bitfield-access-unit.c (revision 49839f97d2951e0b95d33aee00f00022952dab78)
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 { i32 }
33 // LAYOUT: BitFields:[
34 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:10 IsSigned:1 StorageSize:32 StorageOffset:0
35 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:7 IsSigned:1 StorageSize:32 StorageOffset:0
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 { i32 }
64 // LAYOUT: BitFields:[
65 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:12 IsSigned:1 StorageSize:32 StorageOffset:0
66 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:5 IsSigned:1 StorageSize:32 StorageOffset:0
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 { i32 }
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 <{ i8, i32 }>
156 // LAYOUT: BitFields:[
157 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
158 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:1
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 { i32, i16, i32, i16 }
187 // LAYOUT: BitFields:[
188 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:0
189 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:4
190 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:8
191 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:12
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 <{ i32, i8 }>
200 // LAYOUT: BitFields:[
201 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:0
202 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:4
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, i32 }
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 
232