[review] Add bit-field test for scalar_storage_order

Message ID gerrit.1574880479000.I9e07d1b3e08e7c3384832b68ef286afe1d11479a@gnutoolchain-gerrit.osci.io
State New, archived
Headers

Commit Message

Simon Marchi (Code Review) Nov. 27, 2019, 6:48 p.m. UTC
  Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/731
......................................................................

Add bit-field test for scalar_storage_order

This adds a bit-field test for scalar_storage_order.

gdb/testsuite/ChangeLog
2019-11-27  Tom Tromey  <tromey@adacore.com>

	* gdb.base/endianity.c (struct other) <x>: New field.
	(main): Initialize it.
	* gdb.base/endianity.exp: Update.

Change-Id: I9e07d1b3e08e7c3384832b68ef286afe1d11479a
---
M gdb/testsuite/ChangeLog
M gdb/testsuite/gdb.base/endianity.c
M gdb/testsuite/gdb.base/endianity.exp
3 files changed, 11 insertions(+), 3 deletions(-)
  

Comments

Simon Marchi (Code Review) Nov. 27, 2019, 10:22 p.m. UTC | #1
Simon Marchi has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/731
......................................................................


Patch Set 1: Code-Review+2

LGTM.

When reading this, I wondered if you could arbitrarily nest structures with big and little endianness.  I tested with:

 #include <stdio.h>
 
 struct gros
 {
         unsigned int a;
 } __attribute__((scalar_storage_order("big-endian")));
 
 struct petit
 {
         struct gros g;
         unsigned int b;
 } __attribute__((scalar_storage_order("little-endian")));
 
 struct gros2
 {
         struct petit p;
         unsigned int c;
 } __attribute__((scalar_storage_order("big-endian")));
 
 int main() {
         struct gros2 g2;
 
         g2.c = 256;
         g2.p.b = 257;
         g2.p.g.a = 258;
 
         printf("%d %d %d\n", g2.c, g2.p.b, g2.p.g.a);
 
         return 0;
 }

It correctly prints this when you run it:

 $ /tmp/a.out 
 256 257 258

But GDB prints:

 (gdb) p g2
 $1 = {p = {g = {a = 258}, b = 16842752}, c = 256}

It's not really the point of this patch though.
  
Simon Marchi (Code Review) Dec. 3, 2019, 9:34 p.m. UTC | #2
Tom Tromey has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/731
......................................................................


Patch Set 1:

[...]
> But GDB prints:
> 
>  (gdb) p g2
>  $1 = {p = {g = {a = 258}, b = 16842752}, c = 256}
> 
> It's not really the point of this patch though.

My feeling is that this has to be a GCC bug, and it should emit the DWARF
differently.  However I didn't look into this case in detail.
  
Simon Marchi (Code Review) Dec. 4, 2019, 2:34 p.m. UTC | #3
Tom Tromey has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/731
......................................................................


Patch Set 1:

> Patch Set 1: Code-Review+2
> 
> LGTM.
> 
> When reading this, I wondered if you could arbitrarily nest structures with big and little endianness.  I tested with:

I looked at the DWARF for this test case, and it seems fine, so now I'm
debugging gdb to see if there's something wrong there.
  
Simon Marchi (Code Review) Dec. 4, 2019, 2:36 p.m. UTC | #4
Tom Tromey has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/731
......................................................................


Patch Set 1:

> Patch Set 1:
> 
> > Patch Set 1: Code-Review+2
> > 
> > LGTM.
> > 
> > When reading this, I wondered if you could arbitrarily nest structures with big and little endianness.  I tested with:
> 
> I looked at the DWARF for this test case, and it seems fine, so now I'm
> debugging gdb to see if there's something wrong there.

I guess I tried the wrong version of gdb, because this test case works fine
with this series.
  
Simon Marchi (Code Review) Dec. 4, 2019, 3:46 p.m. UTC | #5
Simon Marchi has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/731
......................................................................


Patch Set 2: Code-Review+2
  

Patch

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 9931534..b92ca87 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,11 @@ 
 2019-11-27  Tom Tromey  <tromey@adacore.com>
 
+	* gdb.base/endianity.c (struct other) <x>: New field.
+	(main): Initialize it.
+	* gdb.base/endianity.exp: Update.
+
+2019-11-27  Tom Tromey  <tromey@adacore.com>
+
 	* gdb.base/endianity.c (struct otherendian) <f>: New field.
 	(main): Initialize it.
 	* gdb.base/endianity.exp: Update.
diff --git a/gdb/testsuite/gdb.base/endianity.c b/gdb/testsuite/gdb.base/endianity.c
index 57378c2..6724b22 100644
--- a/gdb/testsuite/gdb.base/endianity.c
+++ b/gdb/testsuite/gdb.base/endianity.c
@@ -21,6 +21,7 @@ 
 {
   int v;
   short w;
+  unsigned x : 3;
   float f;
   __complex__ float cplx;
 }
@@ -41,7 +42,7 @@ 
 int
 main (void)
 {
-  struct otherendian o = {3, 2, 23.5, 1.25 + 7.25i};
+  struct otherendian o = {3, 2, 7, 23.5, 1.25 + 7.25i};
 
   do_nothing (&o); /* START */
 }
diff --git a/gdb/testsuite/gdb.base/endianity.exp b/gdb/testsuite/gdb.base/endianity.exp
index a6ddea3..85d6f2c 100644
--- a/gdb/testsuite/gdb.base/endianity.exp
+++ b/gdb/testsuite/gdb.base/endianity.exp
@@ -25,11 +25,12 @@ 
   return -1
 }
 
-gdb_test "print o" "= {v = 3, w = 2, f = 23.5, cplx = 1.25 \\+ 7.25 \\* I}" \
+gdb_test "print o" "= {v = 3, w = 2, x = 7, f = 23.5, cplx = 1.25 \\+ 7.25 \\* I}" \
     "print o before assignment"
 
 gdb_test "print o.v = 4" "= 4"
 gdb_test "print o.w = 3" "= 3"
+gdb_test "print o.x = 2" "= 2"
 gdb_test "print o.f = 1.5" "= 1.5"
 
 # scalar_storage_order requires gcc >= 6
@@ -39,5 +40,5 @@ 
 gdb_test "x/x &o.v" "0x04000000"
 gdb_test "x/xh &o.w" "0x0300"
 
-gdb_test "print o" "= {v = 4, w = 3, f = 1.5, cplx = 1.25 \\+ 7.25 \\* I}" \
+gdb_test "print o" "= {v = 4, w = 3, x = 2, f = 1.5, cplx = 1.25 \\+ 7.25 \\* I}" \
     "print o after assignment"