xref: /netbsd-src/external/gpl3/gdb/dist/gdb/testsuite/gdb.base/bitfields.c (revision a2e2270fc5bff6bcbd2c81db532c53a470bd1be5)
14e98e3e1Schristos /* Test program to test bit field operations */
24e98e3e1Schristos 
34e98e3e1Schristos /* For non-ANSI compilers, use plain ints for the signed bit fields.  However,
44e98e3e1Schristos    whether they actually end up signed or not is implementation defined, so
54e98e3e1Schristos    this may cause some tests to fail.  But at least we can still compile
64e98e3e1Schristos    the test program and run the tests... */
74e98e3e1Schristos 
84e98e3e1Schristos #if !defined(__STDC__) && !defined(__cplusplus)
94e98e3e1Schristos #define signed  /**/
104e98e3e1Schristos #endif
114e98e3e1Schristos 
124e98e3e1Schristos struct fields
134e98e3e1Schristos {
144e98e3e1Schristos   unsigned char	uc    ;
154e98e3e1Schristos   signed int	s1 : 1;
164e98e3e1Schristos   unsigned int	u1 : 1;
174e98e3e1Schristos   signed int	s2 : 2;
184e98e3e1Schristos   unsigned int	u2 : 2;
194e98e3e1Schristos   signed int	s3 : 3;
204e98e3e1Schristos   unsigned int	u3 : 3;
214e98e3e1Schristos   signed int	s9 : 9;
224e98e3e1Schristos   unsigned int  u9 : 9;
234e98e3e1Schristos   signed char	sc    ;
244e98e3e1Schristos } flags;
254e98e3e1Schristos 
26*a2e2270fSchristos struct internalvartest
27*a2e2270fSchristos {
28*a2e2270fSchristos   unsigned int a : 1;
29*a2e2270fSchristos   struct
30*a2e2270fSchristos     {
31*a2e2270fSchristos       unsigned int b : 1;
32*a2e2270fSchristos       struct
33*a2e2270fSchristos 	{
34*a2e2270fSchristos 	  unsigned int c : 1;
35*a2e2270fSchristos 	  signed int   d : 1;
36*a2e2270fSchristos 	} deep;
37*a2e2270fSchristos       signed int   e : 1;
38*a2e2270fSchristos     } inner;
39*a2e2270fSchristos   signed int   f : 1;
40*a2e2270fSchristos } dummy_internalvartest;
41*a2e2270fSchristos 
break1()424e98e3e1Schristos void break1 ()
434e98e3e1Schristos {
444e98e3e1Schristos }
454e98e3e1Schristos 
break2()464e98e3e1Schristos void break2 ()
474e98e3e1Schristos {
484e98e3e1Schristos }
494e98e3e1Schristos 
break3()504e98e3e1Schristos void break3 ()
514e98e3e1Schristos {
524e98e3e1Schristos }
534e98e3e1Schristos 
break4()544e98e3e1Schristos void break4 ()
554e98e3e1Schristos {
564e98e3e1Schristos }
574e98e3e1Schristos 
break5()584e98e3e1Schristos void break5 ()
594e98e3e1Schristos {
604e98e3e1Schristos }
614e98e3e1Schristos 
break6()624e98e3e1Schristos void break6 ()
634e98e3e1Schristos {
644e98e3e1Schristos }
654e98e3e1Schristos 
break7()664e98e3e1Schristos void break7 ()
674e98e3e1Schristos {
684e98e3e1Schristos }
694e98e3e1Schristos 
break8()704e98e3e1Schristos void break8 ()
714e98e3e1Schristos {
724e98e3e1Schristos }
734e98e3e1Schristos 
break9()744e98e3e1Schristos void break9 ()
754e98e3e1Schristos {
764e98e3e1Schristos }
774e98e3e1Schristos 
break10()784e98e3e1Schristos void break10 ()
794e98e3e1Schristos {
804e98e3e1Schristos }
814e98e3e1Schristos 
824e98e3e1Schristos struct container
834e98e3e1Schristos {
844e98e3e1Schristos   struct fields one;
854e98e3e1Schristos   struct fields two;
864e98e3e1Schristos } container;
874e98e3e1Schristos 
884e98e3e1Schristos /* This is used by bitfields.exp to determine if the target understands
894e98e3e1Schristos    signed bitfields.  */
904e98e3e1Schristos int i;
914e98e3e1Schristos 
main()924e98e3e1Schristos int main ()
934e98e3e1Schristos {
944e98e3e1Schristos   /* For each member, set that member to 1, allow gdb to verify that the
954e98e3e1Schristos      member (and only that member) is 1, and then reset it back to 0. */
964e98e3e1Schristos 
974e98e3e1Schristos   flags.uc = 1;
984e98e3e1Schristos   break1 ();
994e98e3e1Schristos   flags.uc = 0;
1004e98e3e1Schristos 
1014e98e3e1Schristos   flags.s1 = -1;
1024e98e3e1Schristos   break1 ();
1034e98e3e1Schristos   flags.s1 = 0;
1044e98e3e1Schristos 
1054e98e3e1Schristos   flags.u1 = 1;
1064e98e3e1Schristos   break1 ();
1074e98e3e1Schristos   flags.u1 = 0;
1084e98e3e1Schristos 
1094e98e3e1Schristos   flags.s2  = 1;
1104e98e3e1Schristos   break1 ();
1114e98e3e1Schristos   flags.s2 = 0;
1124e98e3e1Schristos 
1134e98e3e1Schristos   flags.u2 = 1;
1144e98e3e1Schristos   break1 ();
1154e98e3e1Schristos   flags.u2 = 0;
1164e98e3e1Schristos 
1174e98e3e1Schristos   flags.s3  = 1;
1184e98e3e1Schristos   break1 ();
1194e98e3e1Schristos   flags.s3 = 0;
1204e98e3e1Schristos 
1214e98e3e1Schristos   flags.u3 = 1;
1224e98e3e1Schristos   break1 ();
1234e98e3e1Schristos   flags.u3 = 0;
1244e98e3e1Schristos 
1254e98e3e1Schristos   flags.s9 = 1;
1264e98e3e1Schristos   break1 ();
1274e98e3e1Schristos   flags.s9 = 0;
1284e98e3e1Schristos 
1294e98e3e1Schristos   flags.u9 = 1;
1304e98e3e1Schristos   break1 ();
1314e98e3e1Schristos   flags.u9 = 0;
1324e98e3e1Schristos 
1334e98e3e1Schristos   flags.sc = 1;
1344e98e3e1Schristos   break1 ();
1354e98e3e1Schristos   flags.sc = 0;
1364e98e3e1Schristos 
1374e98e3e1Schristos   /* Fill alternating fields with all 1's and verify that none of the bits
1384e98e3e1Schristos      "bleed over" to the other fields. */
1394e98e3e1Schristos 
1404e98e3e1Schristos   flags.uc = 0xFF;
1414e98e3e1Schristos   flags.u1 = 0x1;
1424e98e3e1Schristos   flags.u2 = 0x3;
1434e98e3e1Schristos   flags.u3 = 0x7;
1444e98e3e1Schristos   flags.u9 = 0x1FF;
1454e98e3e1Schristos   break2 ();
1464e98e3e1Schristos   flags.uc = 0;
1474e98e3e1Schristos   flags.u1 = 0;
1484e98e3e1Schristos   flags.u2 = 0;
1494e98e3e1Schristos   flags.u3 = 0;
1504e98e3e1Schristos   flags.u9 = 0;
1514e98e3e1Schristos 
1524e98e3e1Schristos   flags.s1 = -1;
1534e98e3e1Schristos   flags.s2 = -1;
1544e98e3e1Schristos   flags.s3 = -1;
1554e98e3e1Schristos   flags.s9 = -1;
1564e98e3e1Schristos   flags.sc = 0xFF;
1574e98e3e1Schristos   break2 ();
1584e98e3e1Schristos   flags.s1 = 0;
1594e98e3e1Schristos   flags.s2 = 0;
1604e98e3e1Schristos   flags.s3 = 0;
1614e98e3e1Schristos   flags.s9 = 0;
1624e98e3e1Schristos   flags.sc = 0;
1634e98e3e1Schristos 
1644e98e3e1Schristos   /* Fill the unsigned fields with the maximum positive value and verify
1654e98e3e1Schristos      that the values are printed correctly. */
1664e98e3e1Schristos 
1674e98e3e1Schristos   /* Maximum positive values */
1684e98e3e1Schristos   flags.u1 = 0x1;
1694e98e3e1Schristos   flags.u2 = 0x3;
1704e98e3e1Schristos   flags.u3 = 0x7;
1714e98e3e1Schristos   flags.u9 = 0x1FF;
1724e98e3e1Schristos   break3 ();
1734e98e3e1Schristos   flags.u1 = 0;
1744e98e3e1Schristos   flags.u2 = 0;
1754e98e3e1Schristos   flags.u3 = 0;
1764e98e3e1Schristos   flags.u9 = 0;
1774e98e3e1Schristos 
1784e98e3e1Schristos   /* Fill the signed fields with the maximum positive value, then the maximally
1794e98e3e1Schristos      negative value, then -1, and verify in each case that the values are
1804e98e3e1Schristos      printed correctly. */
1814e98e3e1Schristos 
1824e98e3e1Schristos   /* Maximum positive values */
1834e98e3e1Schristos   flags.s1 = 0x0;
1844e98e3e1Schristos   flags.s2 = 0x1;
1854e98e3e1Schristos   flags.s3 = 0x3;
1864e98e3e1Schristos   flags.s9 = 0xFF;
1874e98e3e1Schristos   break4 ();
1884e98e3e1Schristos 
1894e98e3e1Schristos   /* Maximally negative values */
1904e98e3e1Schristos   flags.s1 = -0x1;
1914e98e3e1Schristos   flags.s2 = -0x2;
1924e98e3e1Schristos   flags.s3 = -0x4;
1934e98e3e1Schristos   flags.s9 = -0x100;
1944e98e3e1Schristos   /* Extract bitfield value so that bitfield.exp can check if the target
1954e98e3e1Schristos      understands signed bitfields.  */
1964e98e3e1Schristos   i = flags.s9;
1974e98e3e1Schristos   break4 ();
1984e98e3e1Schristos 
1994e98e3e1Schristos   /* -1 */
2004e98e3e1Schristos   flags.s1 = -1;
2014e98e3e1Schristos   flags.s2 = -1;
2024e98e3e1Schristos   flags.s3 = -1;
2034e98e3e1Schristos   flags.s9 = -1;
2044e98e3e1Schristos   break4 ();
2054e98e3e1Schristos 
2064e98e3e1Schristos   flags.s1 = 0;
2074e98e3e1Schristos   flags.s2 = 0;
2084e98e3e1Schristos   flags.s3 = 0;
2094e98e3e1Schristos   flags.s9 = 0;
2104e98e3e1Schristos 
2114e98e3e1Schristos   /* Bitfields at a non-zero offset in a containing structure.  */
2124e98e3e1Schristos   container.one.u3 = 5;
2134e98e3e1Schristos   container.two.u3 = 3;
2144e98e3e1Schristos   break5 ();
2154e98e3e1Schristos 
2164e98e3e1Schristos   return 0;
2174e98e3e1Schristos }
218