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()424e98e3e1Schristosvoid break1 () 434e98e3e1Schristos { 444e98e3e1Schristos } 454e98e3e1Schristos break2()464e98e3e1Schristosvoid break2 () 474e98e3e1Schristos { 484e98e3e1Schristos } 494e98e3e1Schristos break3()504e98e3e1Schristosvoid break3 () 514e98e3e1Schristos { 524e98e3e1Schristos } 534e98e3e1Schristos break4()544e98e3e1Schristosvoid break4 () 554e98e3e1Schristos { 564e98e3e1Schristos } 574e98e3e1Schristos break5()584e98e3e1Schristosvoid break5 () 594e98e3e1Schristos { 604e98e3e1Schristos } 614e98e3e1Schristos break6()624e98e3e1Schristosvoid break6 () 634e98e3e1Schristos { 644e98e3e1Schristos } 654e98e3e1Schristos break7()664e98e3e1Schristosvoid break7 () 674e98e3e1Schristos { 684e98e3e1Schristos } 694e98e3e1Schristos break8()704e98e3e1Schristosvoid break8 () 714e98e3e1Schristos { 724e98e3e1Schristos } 734e98e3e1Schristos break9()744e98e3e1Schristosvoid break9 () 754e98e3e1Schristos { 764e98e3e1Schristos } 774e98e3e1Schristos break10()784e98e3e1Schristosvoid 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()924e98e3e1Schristosint 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