xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.base/bitfields.c (revision a5a4af3bd380a7b58b758d9b311cef9f7c34aeb4)
1*a5a4af3bSchristos /* Test program to test bit field operations */
2*a5a4af3bSchristos 
3*a5a4af3bSchristos /* For non-ANSI compilers, use plain ints for the signed bit fields.  However,
4*a5a4af3bSchristos    whether they actually end up signed or not is implementation defined, so
5*a5a4af3bSchristos    this may cause some tests to fail.  But at least we can still compile
6*a5a4af3bSchristos    the test program and run the tests... */
7*a5a4af3bSchristos 
8*a5a4af3bSchristos #if !defined(__STDC__) && !defined(__cplusplus)
9*a5a4af3bSchristos #define signed  /**/
10*a5a4af3bSchristos #endif
11*a5a4af3bSchristos 
12*a5a4af3bSchristos struct fields
13*a5a4af3bSchristos {
14*a5a4af3bSchristos   unsigned char	uc    ;
15*a5a4af3bSchristos   signed int	s1 : 1;
16*a5a4af3bSchristos   unsigned int	u1 : 1;
17*a5a4af3bSchristos   signed int	s2 : 2;
18*a5a4af3bSchristos   unsigned int	u2 : 2;
19*a5a4af3bSchristos   signed int	s3 : 3;
20*a5a4af3bSchristos   unsigned int	u3 : 3;
21*a5a4af3bSchristos   signed int	s9 : 9;
22*a5a4af3bSchristos   unsigned int  u9 : 9;
23*a5a4af3bSchristos   signed char	sc    ;
24*a5a4af3bSchristos } flags;
25*a5a4af3bSchristos 
26*a5a4af3bSchristos struct internalvartest
27*a5a4af3bSchristos {
28*a5a4af3bSchristos   unsigned int a : 1;
29*a5a4af3bSchristos   struct
30*a5a4af3bSchristos     {
31*a5a4af3bSchristos       unsigned int b : 1;
32*a5a4af3bSchristos       struct
33*a5a4af3bSchristos 	{
34*a5a4af3bSchristos 	  unsigned int c : 1;
35*a5a4af3bSchristos 	  signed int   d : 1;
36*a5a4af3bSchristos 	} deep;
37*a5a4af3bSchristos       signed int   e : 1;
38*a5a4af3bSchristos     } inner;
39*a5a4af3bSchristos   signed int   f : 1;
40*a5a4af3bSchristos } dummy_internalvartest;
41*a5a4af3bSchristos 
break1()42*a5a4af3bSchristos void break1 ()
43*a5a4af3bSchristos {
44*a5a4af3bSchristos }
45*a5a4af3bSchristos 
break2()46*a5a4af3bSchristos void break2 ()
47*a5a4af3bSchristos {
48*a5a4af3bSchristos }
49*a5a4af3bSchristos 
break3()50*a5a4af3bSchristos void break3 ()
51*a5a4af3bSchristos {
52*a5a4af3bSchristos }
53*a5a4af3bSchristos 
break4()54*a5a4af3bSchristos void break4 ()
55*a5a4af3bSchristos {
56*a5a4af3bSchristos }
57*a5a4af3bSchristos 
break5()58*a5a4af3bSchristos void break5 ()
59*a5a4af3bSchristos {
60*a5a4af3bSchristos }
61*a5a4af3bSchristos 
break6()62*a5a4af3bSchristos void break6 ()
63*a5a4af3bSchristos {
64*a5a4af3bSchristos }
65*a5a4af3bSchristos 
break7()66*a5a4af3bSchristos void break7 ()
67*a5a4af3bSchristos {
68*a5a4af3bSchristos }
69*a5a4af3bSchristos 
break8()70*a5a4af3bSchristos void break8 ()
71*a5a4af3bSchristos {
72*a5a4af3bSchristos }
73*a5a4af3bSchristos 
break9()74*a5a4af3bSchristos void break9 ()
75*a5a4af3bSchristos {
76*a5a4af3bSchristos }
77*a5a4af3bSchristos 
break10()78*a5a4af3bSchristos void break10 ()
79*a5a4af3bSchristos {
80*a5a4af3bSchristos }
81*a5a4af3bSchristos 
82*a5a4af3bSchristos struct container
83*a5a4af3bSchristos {
84*a5a4af3bSchristos   struct fields one;
85*a5a4af3bSchristos   struct fields two;
86*a5a4af3bSchristos } container;
87*a5a4af3bSchristos 
88*a5a4af3bSchristos /* This is used by bitfields.exp to determine if the target understands
89*a5a4af3bSchristos    signed bitfields.  */
90*a5a4af3bSchristos int i;
91*a5a4af3bSchristos 
main()92*a5a4af3bSchristos int main ()
93*a5a4af3bSchristos {
94*a5a4af3bSchristos   /* For each member, set that member to 1, allow gdb to verify that the
95*a5a4af3bSchristos      member (and only that member) is 1, and then reset it back to 0. */
96*a5a4af3bSchristos 
97*a5a4af3bSchristos   flags.uc = 1;
98*a5a4af3bSchristos   break1 ();
99*a5a4af3bSchristos   flags.uc = 0;
100*a5a4af3bSchristos 
101*a5a4af3bSchristos   flags.s1 = -1;
102*a5a4af3bSchristos   break1 ();
103*a5a4af3bSchristos   flags.s1 = 0;
104*a5a4af3bSchristos 
105*a5a4af3bSchristos   flags.u1 = 1;
106*a5a4af3bSchristos   break1 ();
107*a5a4af3bSchristos   flags.u1 = 0;
108*a5a4af3bSchristos 
109*a5a4af3bSchristos   flags.s2  = 1;
110*a5a4af3bSchristos   break1 ();
111*a5a4af3bSchristos   flags.s2 = 0;
112*a5a4af3bSchristos 
113*a5a4af3bSchristos   flags.u2 = 1;
114*a5a4af3bSchristos   break1 ();
115*a5a4af3bSchristos   flags.u2 = 0;
116*a5a4af3bSchristos 
117*a5a4af3bSchristos   flags.s3  = 1;
118*a5a4af3bSchristos   break1 ();
119*a5a4af3bSchristos   flags.s3 = 0;
120*a5a4af3bSchristos 
121*a5a4af3bSchristos   flags.u3 = 1;
122*a5a4af3bSchristos   break1 ();
123*a5a4af3bSchristos   flags.u3 = 0;
124*a5a4af3bSchristos 
125*a5a4af3bSchristos   flags.s9 = 1;
126*a5a4af3bSchristos   break1 ();
127*a5a4af3bSchristos   flags.s9 = 0;
128*a5a4af3bSchristos 
129*a5a4af3bSchristos   flags.u9 = 1;
130*a5a4af3bSchristos   break1 ();
131*a5a4af3bSchristos   flags.u9 = 0;
132*a5a4af3bSchristos 
133*a5a4af3bSchristos   flags.sc = 1;
134*a5a4af3bSchristos   break1 ();
135*a5a4af3bSchristos   flags.sc = 0;
136*a5a4af3bSchristos 
137*a5a4af3bSchristos   /* Fill alternating fields with all 1's and verify that none of the bits
138*a5a4af3bSchristos      "bleed over" to the other fields. */
139*a5a4af3bSchristos 
140*a5a4af3bSchristos   flags.uc = 0xFF;
141*a5a4af3bSchristos   flags.u1 = 0x1;
142*a5a4af3bSchristos   flags.u2 = 0x3;
143*a5a4af3bSchristos   flags.u3 = 0x7;
144*a5a4af3bSchristos   flags.u9 = 0x1FF;
145*a5a4af3bSchristos   break2 ();
146*a5a4af3bSchristos   flags.uc = 0;
147*a5a4af3bSchristos   flags.u1 = 0;
148*a5a4af3bSchristos   flags.u2 = 0;
149*a5a4af3bSchristos   flags.u3 = 0;
150*a5a4af3bSchristos   flags.u9 = 0;
151*a5a4af3bSchristos 
152*a5a4af3bSchristos   flags.s1 = -1;
153*a5a4af3bSchristos   flags.s2 = -1;
154*a5a4af3bSchristos   flags.s3 = -1;
155*a5a4af3bSchristos   flags.s9 = -1;
156*a5a4af3bSchristos   flags.sc = 0xFF;
157*a5a4af3bSchristos   break2 ();
158*a5a4af3bSchristos   flags.s1 = 0;
159*a5a4af3bSchristos   flags.s2 = 0;
160*a5a4af3bSchristos   flags.s3 = 0;
161*a5a4af3bSchristos   flags.s9 = 0;
162*a5a4af3bSchristos   flags.sc = 0;
163*a5a4af3bSchristos 
164*a5a4af3bSchristos   /* Fill the unsigned fields with the maximum positive value and verify
165*a5a4af3bSchristos      that the values are printed correctly. */
166*a5a4af3bSchristos 
167*a5a4af3bSchristos   /* Maximum positive values */
168*a5a4af3bSchristos   flags.u1 = 0x1;
169*a5a4af3bSchristos   flags.u2 = 0x3;
170*a5a4af3bSchristos   flags.u3 = 0x7;
171*a5a4af3bSchristos   flags.u9 = 0x1FF;
172*a5a4af3bSchristos   break3 ();
173*a5a4af3bSchristos   flags.u1 = 0;
174*a5a4af3bSchristos   flags.u2 = 0;
175*a5a4af3bSchristos   flags.u3 = 0;
176*a5a4af3bSchristos   flags.u9 = 0;
177*a5a4af3bSchristos 
178*a5a4af3bSchristos   /* Fill the signed fields with the maximum positive value, then the maximally
179*a5a4af3bSchristos      negative value, then -1, and verify in each case that the values are
180*a5a4af3bSchristos      printed correctly. */
181*a5a4af3bSchristos 
182*a5a4af3bSchristos   /* Maximum positive values */
183*a5a4af3bSchristos   flags.s1 = 0x0;
184*a5a4af3bSchristos   flags.s2 = 0x1;
185*a5a4af3bSchristos   flags.s3 = 0x3;
186*a5a4af3bSchristos   flags.s9 = 0xFF;
187*a5a4af3bSchristos   break4 ();
188*a5a4af3bSchristos 
189*a5a4af3bSchristos   /* Maximally negative values */
190*a5a4af3bSchristos   flags.s1 = -0x1;
191*a5a4af3bSchristos   flags.s2 = -0x2;
192*a5a4af3bSchristos   flags.s3 = -0x4;
193*a5a4af3bSchristos   flags.s9 = -0x100;
194*a5a4af3bSchristos   /* Extract bitfield value so that bitfield.exp can check if the target
195*a5a4af3bSchristos      understands signed bitfields.  */
196*a5a4af3bSchristos   i = flags.s9;
197*a5a4af3bSchristos   break4 ();
198*a5a4af3bSchristos 
199*a5a4af3bSchristos   /* -1 */
200*a5a4af3bSchristos   flags.s1 = -1;
201*a5a4af3bSchristos   flags.s2 = -1;
202*a5a4af3bSchristos   flags.s3 = -1;
203*a5a4af3bSchristos   flags.s9 = -1;
204*a5a4af3bSchristos   break4 ();
205*a5a4af3bSchristos 
206*a5a4af3bSchristos   flags.s1 = 0;
207*a5a4af3bSchristos   flags.s2 = 0;
208*a5a4af3bSchristos   flags.s3 = 0;
209*a5a4af3bSchristos   flags.s9 = 0;
210*a5a4af3bSchristos 
211*a5a4af3bSchristos   /* Bitfields at a non-zero offset in a containing structure.  */
212*a5a4af3bSchristos   container.one.u3 = 5;
213*a5a4af3bSchristos   container.two.u3 = 3;
214*a5a4af3bSchristos   break5 ();
215*a5a4af3bSchristos 
216*a5a4af3bSchristos   return 0;
217*a5a4af3bSchristos }
218