1 /* ----------------------------------------------------------------------- */
12 TEST_STRUCT(0x333,0x44,0x555555,6,7);
15 /* ----------------------------------------------------------------------- */
27 TEST_STRUCT(3,30,0x123456789abcdef0LL
,5,2);
30 /* ----------------------------------------------------------------------- */
35 unsigned x
:5, y
:5, :0, z
:5; char a
:5; A
short b
:5;
37 TEST_STRUCT(21,23,25,6,14);
40 /* ----------------------------------------------------------------------- */
52 TEST_STRUCT(3,1,15,120,120);
55 /* ----------------------------------------------------------------------- */
62 unsigned long long z
: 38;
65 TEST_STRUCT(0x123456789ULL
, 120<<25, 120, 0x44, 0x77);
68 /* ----------------------------------------------------------------------- */
74 int x
: 12, y
: 4, : 0, : 4, z
: 3;
77 TEST_STRUCT(1,2,3,4,-3);
80 /* ----------------------------------------------------------------------- */
90 printf("\n\n" + 2*top
);
112 /* ----------------------------------------------------------------------- */
129 /* ----------------------------------------------------------------------- */
134 # pragma comment(option, "-mms-bitfields")
135 # elif defined __GNUC__
136 # define M __attribute__((ms_struct))
140 # pragma comment(option, "-mno-ms-bitfields")
141 # elif defined __GNUC__
142 # define M __attribute__((gcc_struct))
157 /* ----------------------------------------------------------------------- */
162 /* some gcc headers #define __attribute__ to empty if it's not gcc */
165 void dump(void *p
, int s
)
168 for (i
= s
; --i
>= 0;)
169 printf("%02X", ((unsigned char*)p
)[i
]);
174 printf(sizeof (s->m + 0) == 8 ? " %016llx" : " %02x", s->m)
176 #define TEST_STRUCT(v1,v2,v3,v4,v5) { \
177 struct __s _s, *s = & _s; \
178 printf("\n---- TEST %d%s%s%s ----\n" + top, \
179 TEST, MS_BF?" - MS-BITFIELDS":"", \
180 PACK?" - PACKED":"", \
181 ALIGN?" - WITH ALIGN":""); \
182 memset(s, 0, sizeof *s); \
183 s->x = -1, s->y = -1, s->z = -1, s->a = -1, s->b = -1; \
184 printf("bits in use : "), dump(s, sizeof *s); \
185 s->x = v1, s->y = v2, s->z = v3, s->a += v4, ++s->a, s->b = v5; \
186 printf("bits as set : "), dump(s, sizeof *s); \
187 printf("values :"), pv(x), pv(y), pv(z), pv(a), pv(b), printf("\n"); \
188 printf("align/size : %d %d\n", alignof(struct __s),sizeof(struct __s)); \
192 # define _A(n) __declspec(align(n))
194 # define alignof(x) __alignof(x)
196 # define _A(n) __attribute__((aligned(n)))
197 # define _P __attribute__((packed))
198 # define alignof(x) __alignof__(x)
202 # define MS_BITFIELDS 0
205 #define SELF "95_bitfields.c"
211 #define MS_BF MS_BITFIELDS
216 /* ----------------------------------------------------------------------- */