163 lines
2.8 KiB
C
163 lines
2.8 KiB
C
/* This is a small test to see if bitfields are working. It is only a
|
|
few structs and a union and a test to see if they have the correct
|
|
size, if values can be read and written and a couple of argument
|
|
passing tests. No alignment testing is done. */
|
|
|
|
#include "defines.h"
|
|
#include "macros.h"
|
|
|
|
|
|
/* These five bitfields are taken from the System V ABI, Intel 386
|
|
architecture supplement. */
|
|
|
|
/* Word aligned, sizeof is 4. */
|
|
struct RightToLeft
|
|
{
|
|
int j:5;
|
|
int k:6;
|
|
int m:7;
|
|
};
|
|
|
|
/* Word aligned, sizeof is 12. */
|
|
struct BoundaryAlignment
|
|
{
|
|
short s:9;
|
|
int j:9;
|
|
char c;
|
|
short t:9;
|
|
short u:9;
|
|
char d;
|
|
};
|
|
|
|
/* Halfword aligned, sizeof is 2. */
|
|
struct StorageUnitSharing
|
|
{
|
|
char c;
|
|
short s:8;
|
|
};
|
|
|
|
/* Halfword aligned, sizeof is 2. */
|
|
union Allocation
|
|
{
|
|
char c;
|
|
short s:8;
|
|
};
|
|
|
|
/* Byte aligned, sizeof is 9. */
|
|
struct Unnamed
|
|
{
|
|
char c;
|
|
int :0;
|
|
char d;
|
|
short :9;
|
|
char e;
|
|
char :0;
|
|
};
|
|
|
|
/* Extra struct testing bitfields in larger types.
|
|
Doubleword aligned, sizeof is 8. */
|
|
struct LargerTypes
|
|
{
|
|
long long l:33;
|
|
int i:31;
|
|
};
|
|
|
|
|
|
void
|
|
passing1 (struct RightToLeft str, int j, int k, int m)
|
|
{
|
|
assert (str.j == j);
|
|
assert (str.k == k);
|
|
assert (str.m == m);
|
|
}
|
|
|
|
void
|
|
passing2 (struct BoundaryAlignment str, short s, int j, char c, short t,
|
|
short u, char d)
|
|
{
|
|
assert (str.s == s);
|
|
assert (str.j == j);
|
|
assert (str.c == c);
|
|
assert (str.t == t);
|
|
assert (str.u == u);
|
|
assert (str.d == d);
|
|
}
|
|
|
|
void
|
|
passing3 (struct StorageUnitSharing str, char c, short s)
|
|
{
|
|
assert (str.c == c);
|
|
assert (str.s == s);
|
|
}
|
|
|
|
void
|
|
passing4 (struct Unnamed str, char c, char d, char e)
|
|
{
|
|
assert (str.c == c);
|
|
assert (str.d == d);
|
|
assert (str.e == e);
|
|
}
|
|
|
|
void
|
|
passing5 (struct LargerTypes str, long long l, int i)
|
|
{
|
|
assert (str.l == l);
|
|
assert (str.i == i);
|
|
}
|
|
|
|
|
|
void
|
|
passingU (union Allocation u, char c)
|
|
{
|
|
assert (u.c == c);
|
|
assert (u.s == c);
|
|
}
|
|
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
struct RightToLeft str1;
|
|
struct BoundaryAlignment str2;
|
|
struct StorageUnitSharing str3;
|
|
struct Unnamed str4;
|
|
struct LargerTypes str5;
|
|
union Allocation u;
|
|
|
|
/* Check sizeof's. */
|
|
check_size(str1, 4);
|
|
check_size(str2, 12);
|
|
check_size(str3, 2);
|
|
check_size(str4, 9);
|
|
check_size(str5, 8);
|
|
check_size(u, 2);
|
|
|
|
/* Check alignof's. */
|
|
check_align_lv(str1, 4);
|
|
check_align_lv(str2, 4);
|
|
check_align_lv(str3, 2);
|
|
check_align_lv(str4, 1);
|
|
check_align_lv(str5, 8);
|
|
check_align_lv(u, 2);
|
|
|
|
/* Check passing. */
|
|
str1.j = str2.s = str3.c = str4.c = str5.l = 4;
|
|
str1.k = str2.j = str3.s = str4.d = str5.i = 5;
|
|
str1.m = str2.c = str4.e = 6;
|
|
str2.t = 7;
|
|
str2.u = 8;
|
|
str2.d = 9;
|
|
passing1 (str1, 4, 5, 6);
|
|
passing2 (str2, 4, 5, 6, 7, 8, 9);
|
|
passing3 (str3, 4, 5);
|
|
passing4 (str4, 4, 5, 6);
|
|
passing5 (str5, 4, 5);
|
|
|
|
u.c = 5;
|
|
passingU (u, 5);
|
|
u.s = 6;
|
|
passingU (u, 6);
|
|
|
|
return 0;
|
|
}
|