xref: /llvm-project/clang/test/CodeGen/ms_struct-bitfield.c (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
1 // RUN: %clang_cc1 -emit-llvm -o - -triple x86_64-apple-darwin9 %s | FileCheck %s
2 // RUN: %clang_cc1 -emit-llvm -o - -triple thumbv7-apple-ios -target-abi apcs-gnu %s | FileCheck %s -check-prefix=CHECK-ARM
3 
4 // Note that we're declaring global variables with these types,
5 // triggering both Sema and IRGen struct layout.
6 
7 #define ATTR __attribute__((__ms_struct__))
8 
9 struct
10 {
11    char foo;
12    long : 0;
13    char bar;
14 } ATTR t1;
15 int s1 = sizeof(t1);
16 // CHECK: @s1 ={{.*}} global i32 2
17 // CHECK-ARM: @s1 ={{.*}} global i32 2
18 
19 struct
20 {
21    char foo;
22    long : 0;
23    char : 0;
24    int : 0;
25    char bar;
26 } ATTR t2;
27 int s2 = sizeof(t2);
28 // CHECK: @s2 ={{.*}} global i32 2
29 // CHECK-ARM: @s2 ={{.*}} global i32 2
30 
31 struct
32 {
33    char foo;
34    long : 0;
35    char : 0;
36    int : 0;
37    char bar;
38    long : 0;
39    char : 0;
40 } ATTR t3;
41 int s3 = sizeof(t3);
42 // CHECK: @s3 ={{.*}} global i32 2
43 // CHECK-ARM: @s3 ={{.*}} global i32 2
44 
45 struct
46 {
47    long : 0;
48    char bar;
49 } ATTR t4;
50 int s4 = sizeof(t4);
51 // CHECK: @s4 ={{.*}} global i32 1
52 // CHECK-ARM: @s4 ={{.*}} global i32 1
53 
54 struct
55 {
56    long : 0;
57    long : 0;
58    char : 0;
59    char bar;
60 } ATTR t5;
61 int s5 = sizeof(t5);
62 // CHECK: @s5 ={{.*}} global i32 1
63 // CHECK-ARM: @s5 ={{.*}} global i32 1
64 
65 struct
66 {
67    long : 0;
68    long : 0;
69    char : 0;
70    char bar;
71 } ATTR t6;
72 int s6 = sizeof(t6);
73 // CHECK: @s6 ={{.*}} global i32 1
74 // CHECK-ARM: @s6 ={{.*}} global i32 1
75 
76 struct
77 {
78    char foo;
79    long : 0;
80    int : 0;
81    char bar;
82    char bar1;
83    long : 0;
84    char bar2;
85    char bar3;
86    char : 0;
87    char bar4;
88    char bar5;
89    char : 0;
90    char bar6;
91    char bar7;
92 } ATTR t7;
93 int s7 = sizeof(t7);
94 // CHECK: @s7 ={{.*}} global i32 9
95 // CHECK-ARM: @s7 ={{.*}} global i32 9
96 
97 struct
98 {
99    long : 0;
100    long : 0;
101    char : 0;
102 } ATTR t8;
103 int s8 = sizeof(t8);
104 // CHECK: @s8 ={{.*}} global i32 0
105 // CHECK-ARM: @s8 ={{.*}} global i32 0
106 
107 struct
108 {
109    char foo;
110    long : 0;
111    int : 0;
112    char bar;
113    char bar1;
114    long : 0;
115    char bar2;
116    char bar3;
117    char : 0;
118    char bar4;
119    char bar5;
120    char : 0;
121    char bar6;
122    char bar7;
123    int  i1;
124    char : 0;
125    long : 0;
126    char :4;
127    char bar8;
128    char : 0;
129    char bar9;
130    char bar10;
131    int  i2;
132    char : 0;
133    long : 0;
134    char :4;
135 } ATTR t9;
136 int s9 = sizeof(t9);
137 // CHECK: @s9 ={{.*}} global i32 28
138 // CHECK-ARM: @s9 ={{.*}} global i32 28
139 
140 struct
141 {
142    char foo: 8;
143    long : 0;
144    char bar;
145 } ATTR t10;
146 int s10 = sizeof(t10);
147 // CHECK: @s10 ={{.*}} global i32 16
148 // CHECK-ARM: @s10 ={{.*}} global i32 8
149 
150 // ensure that ms_structs work correctly on a !useBitFieldTypeAlignment() target
151 struct {
152   unsigned int a : 31;
153   unsigned int b : 2;
154   unsigned int c;
155 } ATTR t11;
156 int s11 = sizeof(t11);
157 // CHECK: @s11 ={{.*}} global i32 12
158 // CHECK-ARM: @s11 ={{.*}} global i32 12
159 
160 struct {
161   unsigned char a : 3;
162   unsigned char b : 4;
163   unsigned short c : 6;
164 } ATTR t12;
165 int s12 = sizeof(t12);
166 // CHECK: @s12 ={{.*}} global i32 4
167 // CHECK-ARM: @s12 ={{.*}} global i32 4
168 
169 struct {
170   unsigned char a : 3;
171   unsigned char b : 4;
172   __attribute__((packed)) unsigned short c : 6;
173 } ATTR t13;
174 int s13 = sizeof(t13);
175 // CHECK: @s13 ={{.*}} global i32 4
176 // CHECK-ARM: @s13 ={{.*}} global i32 4
177