1/* Test program to test bit field operations on bit fields of large 2 integer types. */ 3 4/* This file is expected to fail to compile if the type long long int 5 is not supported, but in that case it is irrelevant. */ 6 7#include <stdlib.h> 8#include <string.h> 9 10#if !defined(__STDC__) && !defined(__cplusplus) 11#define signed /**/ 12#endif 13 14struct fields 15{ 16 unsigned long long u1 : 15; 17 unsigned long long u2 : 33; 18 unsigned long long u3 : 16; 19 signed long long s1 : 15; 20 signed long long s2 : 33; 21 signed long long s3 : 16; 22} flags; 23 24void break1 () 25{ 26} 27 28void break2 () 29{ 30} 31 32void break3 () 33{ 34} 35 36void break4 () 37{ 38} 39 40void break5 () 41{ 42} 43 44void break6 () 45{ 46} 47 48void break7 () 49{ 50} 51 52void break8 () 53{ 54} 55 56void break9 () 57{ 58} 59 60void break10 () 61{ 62} 63 64/* This is used by bitfields.exp to determine if the target understands 65 signed bitfields. */ 66int i; 67 68void tester () 69{ 70 memset ((char *) &flags, 0, sizeof (flags)); 71 72 /* For each member, set that member to 1, allow gdb to verify that the 73 member (and only that member) is 1, and then reset it back to 0. */ 74 flags.s1 = 1; 75 break1 (); 76 flags.s1 = 0; 77 78 flags.u1 = 1; 79 break1 (); 80 flags.u1 = 0; 81 82 flags.s2 = 1; 83 break1 (); 84 flags.s2 = 0; 85 86 flags.u2 = 1; 87 break1 (); 88 flags.u2 = 0; 89 90 flags.s3 = 1; 91 break1 (); 92 flags.s3 = 0; 93 94 flags.u3 = 1; 95 break1 (); 96 flags.u3 = 0; 97 98 /* Fill alternating fields with all 1's and verify that none of the bits 99 "bleed over" to the other fields. */ 100 101 flags.u1 = 0x7FFF; 102 flags.u3 = 0xFFFF; 103 flags.s2 = -1LL; 104 break2 (); 105 flags.u1 = 0; 106 flags.u3 = 0; 107 flags.s2 = 0; 108 109 flags.u2 = 0x1FFFFFFFFLL; 110 flags.s1 = -1; 111 flags.s3 = -1; 112 break2 (); 113 114 flags.u2 = 0; 115 flags.s1 = 0; 116 flags.s3 = 0; 117 118 /* Fill the unsigned fields with the maximum positive value and verify 119 that the values are printed correctly. */ 120 121 flags.u1 = 0x7FFF; 122 flags.u2 = 0x1FFFFFFFFLL; 123 flags.u3 = 0xFFFF; 124 break3 (); 125 flags.u1 = 0; 126 flags.u2 = 0; 127 flags.u3 = 0; 128 129 /* Fill the signed fields with the maximum positive value, then the maximally 130 negative value, then -1, and verify in each case that the values are 131 printed correctly. */ 132 133 /* Maximum positive values */ 134 flags.s1 = 0x3FFF; 135 flags.s2 = 0xFFFFFFFFLL; 136 flags.s3 = 0x7FFF; 137 break4 (); 138 139 /* Maximally negative values */ 140 flags.s1 = -0x4000; 141 flags.s2 = -0x100000000LL; 142 flags.s3 = -0x8000; 143 144 /* Extract bitfield value so that bitfield.exp can check if the target 145 understands signed bitfields. */ 146 i = flags.s3; 147 break4 (); 148 149 /* -1 */ 150 flags.s1 = -1; 151 flags.s2 = -1; 152 flags.s3 = -1; 153 break4 (); 154 155 flags.s1 = 0; 156 flags.s2 = 0; 157 flags.s3 = 0; 158 159 break5 (); 160} 161 162int main () 163{ 164 int i; 165#ifdef usestubs 166 set_debug_traps(); 167 breakpoint(); 168#endif 169 for (i = 0; i < 5; i += 1) 170 tester (); 171 return 0; 172} 173