diff options
author | Paul N. Hilfinger <hilfinger@adacore.com> | 2004-11-29 09:11:20 +0000 |
---|---|---|
committer | Paul N. Hilfinger <hilfinger@adacore.com> | 2004-11-29 09:11:20 +0000 |
commit | c8170782319c10cf5f35644a508da9be24f943fc (patch) | |
tree | 29a9edf46e11c06550fdc6de61a78c5a5a62d035 /gdb/testsuite/gdb.base/bitfields2.c | |
parent | cbfc58d1256ae92102a3b1e10e0698db095eea5c (diff) | |
download | gdb-c8170782319c10cf5f35644a508da9be24f943fc.zip gdb-c8170782319c10cf5f35644a508da9be24f943fc.tar.gz gdb-c8170782319c10cf5f35644a508da9be24f943fc.tar.bz2 |
* gdb.base/bitfields2.exp: New test.
* gdb.base/bitfields2.c: New file.
Diffstat (limited to 'gdb/testsuite/gdb.base/bitfields2.c')
-rw-r--r-- | gdb/testsuite/gdb.base/bitfields2.c | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/bitfields2.c b/gdb/testsuite/gdb.base/bitfields2.c new file mode 100644 index 0000000..1958ef0 --- /dev/null +++ b/gdb/testsuite/gdb.base/bitfields2.c @@ -0,0 +1,172 @@ +/* Test program to test bit field operations on bit fields of large + integer types. */ + +/* This file is expected to fail to compile if the type long long int + is not supported, but in that case it is irrelevant. */ + +#include <stdlib.h> +#include <string.h> + +#if !defined(__STDC__) && !defined(__cplusplus) +#define signed /**/ +#endif + +struct fields +{ + unsigned long long u1 : 15; + unsigned long long u2 : 33; + unsigned long long u3 : 16; + signed long long s1 : 15; + signed long long s2 : 33; + signed long long s3 : 16; +} flags; + +void break1 () +{ +} + +void break2 () +{ +} + +void break3 () +{ +} + +void break4 () +{ +} + +void break5 () +{ +} + +void break6 () +{ +} + +void break7 () +{ +} + +void break8 () +{ +} + +void break9 () +{ +} + +void break10 () +{ +} + +/* This is used by bitfields.exp to determine if the target understands + signed bitfields. */ +int i; + +void tester () +{ + memset ((char *) &flags, 0, sizeof (flags)); + + /* For each member, set that member to 1, allow gdb to verify that the + member (and only that member) is 1, and then reset it back to 0. */ + flags.s1 = 1; + break1 (); + flags.s1 = 0; + + flags.u1 = 1; + break1 (); + flags.u1 = 0; + + flags.s2 = 1; + break1 (); + flags.s2 = 0; + + flags.u2 = 1; + break1 (); + flags.u2 = 0; + + flags.s3 = 1; + break1 (); + flags.s3 = 0; + + flags.u3 = 1; + break1 (); + flags.u3 = 0; + + /* Fill alternating fields with all 1's and verify that none of the bits + "bleed over" to the other fields. */ + + flags.u1 = 0x7FFF; + flags.u3 = 0xFFFF; + flags.s2 = -1LL; + break2 (); + flags.u1 = 0; + flags.u3 = 0; + flags.s2 = 0; + + flags.u2 = 0x1FFFFFFFFLL; + flags.s1 = -1; + flags.s3 = -1; + break2 (); + + flags.u2 = 0; + flags.s1 = 0; + flags.s3 = 0; + + /* Fill the unsigned fields with the maximum positive value and verify + that the values are printed correctly. */ + + flags.u1 = 0x7FFF; + flags.u2 = 0x1FFFFFFFFLL; + flags.u3 = 0xFFFF; + break3 (); + flags.u1 = 0; + flags.u2 = 0; + flags.u3 = 0; + + /* Fill the signed fields with the maximum positive value, then the maximally + negative value, then -1, and verify in each case that the values are + printed correctly. */ + + /* Maximum positive values */ + flags.s1 = 0x3FFF; + flags.s2 = 0xFFFFFFFFLL; + flags.s3 = 0x7FFF; + break4 (); + + /* Maximally negative values */ + flags.s1 = -0x4000; + flags.s2 = -0x100000000LL; + flags.s3 = -0x8000; + + /* Extract bitfield value so that bitfield.exp can check if the target + understands signed bitfields. */ + i = flags.s3; + break4 (); + + /* -1 */ + flags.s1 = -1; + flags.s2 = -1; + flags.s3 = -1; + break4 (); + + flags.s1 = 0; + flags.s2 = 0; + flags.s3 = 0; + + break5 (); +} + +int main () +{ + int i; +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + for (i = 0; i < 5; i += 1) + tester (); + return 0; +} |