Clang Project

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