1 /* This is a small test to see if bitfields are working.  It is only a
2    few structs and a union and a test to see if they have the correct
3    size, if values can be read and written and a couple of argument
4    passing tests.  No alignment testing is done.  */
5 
6 #include "defines.h"
7 #include "macros.h"
8 
9 
10 /* These five bitfields are taken from the System V ABI, Intel 386
11    architecture supplement.  */
12 
13 /* Word aligned, sizeof is 4.  */
14 struct RightToLeft
15 {
16   int j:5;
17   int k:6;
18   int m:7;
19 };
20 
21 /* Word aligned, sizeof is 12.  */
22 struct BoundaryAlignment
23 {
24   short s:9;
25   int   j:9;
26   char  c;
27   short t:9;
28   short u:9;
29   char  d;
30 };
31 
32 /* Halfword aligned, sizeof is 2.  */
33 struct StorageUnitSharing
34 {
35   char  c;
36   short s:8;
37 };
38 
39 /* Halfword aligned, sizeof is 2.  */
40 union Allocation
41 {
42   char  c;
43   short s:8;
44 };
45 
46 /* Byte aligned, sizeof is 9.  */
47 struct Unnamed
48 {
49   char  c;
50   int    :0;
51   char  d;
52   short  :9;
53   char  e;
54   char   :0;
55 };
56 
57 /* Extra struct testing bitfields in larger types.
58    Doubleword aligned, sizeof is 8.  */
59 struct LargerTypes
60 {
61   long long l:33;
62   int       i:31;
63 };
64 
65 
66 void
passing1(struct RightToLeft str,int j,int k,int m)67 passing1 (struct RightToLeft str, int j, int k, int m)
68 {
69   assert (str.j == j);
70   assert (str.k == k);
71   assert (str.m == m);
72 }
73 
74 void
passing2(struct BoundaryAlignment str,short s,int j,char c,short t,short u,char d)75 passing2 (struct BoundaryAlignment str, short s, int j, char c, short t,
76 	  short u, char d)
77 {
78   assert (str.s == s);
79   assert (str.j == j);
80   assert (str.c == c);
81   assert (str.t == t);
82   assert (str.u == u);
83   assert (str.d == d);
84 }
85 
86 void
passing3(struct StorageUnitSharing str,char c,short s)87 passing3 (struct StorageUnitSharing str, char c, short s)
88 {
89   assert (str.c == c);
90   assert (str.s == s);
91 }
92 
93 void
passing4(struct Unnamed str,char c,char d,char e)94 passing4 (struct Unnamed str, char c, char d, char e)
95 {
96   assert (str.c == c);
97   assert (str.d == d);
98   assert (str.e == e);
99 }
100 
101 void
passing5(struct LargerTypes str,long long l,int i)102 passing5 (struct LargerTypes str, long long l, int i)
103 {
104   assert (str.l == l);
105   assert (str.i == i);
106 }
107 
108 
109 void
passingU(union Allocation u,char c)110 passingU (union Allocation u, char c)
111 {
112   assert (u.c == c);
113   assert (u.s == c);
114 }
115 
116 
117 int
main(void)118 main (void)
119 {
120   struct RightToLeft str1;
121   struct BoundaryAlignment str2;
122   struct StorageUnitSharing str3;
123   struct Unnamed str4;
124   struct LargerTypes str5;
125   union Allocation u;
126 
127   /* Check sizeof's.  */
128   check_size(str1, 4);
129   check_size(str2, 12);
130   check_size(str3, 2);
131   check_size(str4, 9);
132   check_size(str5, 8);
133   check_size(u, 2);
134 
135   /* Check alignof's.  */
136   check_align_lv(str1, 4);
137   check_align_lv(str2, 4);
138   check_align_lv(str3, 2);
139   check_align_lv(str4, 1);
140   check_align_lv(str5, 4);
141   check_align_lv(u, 2);
142 
143   /* Check passing.  */
144   str1.j = str2.s = str3.c = str4.c = str5.l = 4;
145   str1.k = str2.j = str3.s = str4.d = str5.i = 5;
146   str1.m = str2.c = str4.e = 6;
147   str2.t = 7;
148   str2.u = 8;
149   str2.d = 9;
150   passing1 (str1, 4, 5, 6);
151   passing2 (str2, 4, 5, 6, 7, 8, 9);
152   passing3 (str3, 4, 5);
153   passing4 (str4, 4, 5, 6);
154   passing5 (str5, 4, 5);
155 
156   u.c = 5;
157   passingU (u, 5);
158   u.s = 6;
159   passingU (u, 6);
160 
161   return 0;
162 }
163