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*a5a4af3bSchristosvoid break1 () 43*a5a4af3bSchristos { 44*a5a4af3bSchristos } 45*a5a4af3bSchristos break2()46*a5a4af3bSchristosvoid break2 () 47*a5a4af3bSchristos { 48*a5a4af3bSchristos } 49*a5a4af3bSchristos break3()50*a5a4af3bSchristosvoid break3 () 51*a5a4af3bSchristos { 52*a5a4af3bSchristos } 53*a5a4af3bSchristos break4()54*a5a4af3bSchristosvoid break4 () 55*a5a4af3bSchristos { 56*a5a4af3bSchristos } 57*a5a4af3bSchristos break5()58*a5a4af3bSchristosvoid break5 () 59*a5a4af3bSchristos { 60*a5a4af3bSchristos } 61*a5a4af3bSchristos break6()62*a5a4af3bSchristosvoid break6 () 63*a5a4af3bSchristos { 64*a5a4af3bSchristos } 65*a5a4af3bSchristos break7()66*a5a4af3bSchristosvoid break7 () 67*a5a4af3bSchristos { 68*a5a4af3bSchristos } 69*a5a4af3bSchristos break8()70*a5a4af3bSchristosvoid break8 () 71*a5a4af3bSchristos { 72*a5a4af3bSchristos } 73*a5a4af3bSchristos break9()74*a5a4af3bSchristosvoid break9 () 75*a5a4af3bSchristos { 76*a5a4af3bSchristos } 77*a5a4af3bSchristos break10()78*a5a4af3bSchristosvoid 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*a5a4af3bSchristosint 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