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