summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/bitfields.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/testsuite/gdb.base/bitfields.c')
-rw-r--r--gdb/testsuite/gdb.base/bitfields.c194
1 files changed, 194 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/bitfields.c b/gdb/testsuite/gdb.base/bitfields.c
new file mode 100644
index 00000000000..930b244fcd1
--- /dev/null
+++ b/gdb/testsuite/gdb.base/bitfields.c
@@ -0,0 +1,194 @@
+/* Test program to test bit field operations */
+
+/* For non-ANSI compilers, use plain ints for the signed bit fields. However,
+ whether they actually end up signed or not is implementation defined, so
+ this may cause some tests to fail. But at least we can still compile
+ the test program and run the tests... */
+
+#ifndef __STDC__
+#define signed /**/
+#endif
+
+struct fields
+{
+ unsigned char uc ;
+ signed int s1 : 1;
+ unsigned int u1 : 1;
+ signed int s2 : 2;
+ unsigned int u2 : 2;
+ signed int s3 : 3;
+ unsigned int u3 : 3;
+ signed int s9 : 9;
+ unsigned int u9 : 9;
+ signed char sc ;
+} 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;
+
+int main ()
+{
+ /* 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. */
+
+#ifdef usestubs
+ set_debug_traps();
+ breakpoint();
+#endif
+ flags.uc = 1;
+ break1 ();
+ flags.uc = 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;
+
+ flags.s9 = 1;
+ break1 ();
+ flags.s9 = 0;
+
+ flags.u9 = 1;
+ break1 ();
+ flags.u9 = 0;
+
+ flags.sc = 1;
+ break1 ();
+ flags.sc = 0;
+
+ /* Fill alternating fields with all 1's and verify that none of the bits
+ "bleed over" to the other fields. */
+
+ flags.uc = 0xFF;
+ flags.u1 = 0x1;
+ flags.u2 = 0x3;
+ flags.u3 = 0x7;
+ flags.u9 = 0x1FF;
+ break2 ();
+ flags.uc = 0;
+ flags.u1 = 0;
+ flags.u2 = 0;
+ flags.u3 = 0;
+ flags.u9 = 0;
+
+ flags.s1 = 0x1;
+ flags.s2 = 0x3;
+ flags.s3 = 0x7;
+ flags.s9 = 0x1FF;
+ flags.sc = 0xFF;
+ break2 ();
+ flags.s1 = 0;
+ flags.s2 = 0;
+ flags.s3 = 0;
+ flags.s9 = 0;
+ flags.sc = 0;
+
+ /* Fill the unsigned fields with the maximum positive value and verify
+ that the values are printed correctly. */
+
+ /* Maximum positive values */
+ flags.u1 = 0x1;
+ flags.u2 = 0x3;
+ flags.u3 = 0x7;
+ flags.u9 = 0x1FF;
+ break3 ();
+ flags.u1 = 0;
+ flags.u2 = 0;
+ flags.u3 = 0;
+ flags.u9 = 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 = 0x0;
+ flags.s2 = 0x1;
+ flags.s3 = 0x3;
+ flags.s9 = 0xFF;
+ break4 ();
+
+ /* Maximally negative values */
+ flags.s1 = 0x1;
+ flags.s2 = 0x2;
+ flags.s3 = 0x4;
+ flags.s9 = 0x100;
+ /* Extract bitfield value so that bitfield.exp can check if the target
+ understands signed bitfields. */
+ i = flags.s9;
+ break4 ();
+
+ /* -1 */
+ flags.s1 = 0x1;
+ flags.s2 = 0x3;
+ flags.s3 = 0x7;
+ flags.s9 = 0x1FF;
+ break4 ();
+
+ flags.s1 = 0;
+ flags.s2 = 0;
+ flags.s3 = 0;
+ flags.s9 = 0;
+
+ return 0;
+}