Submitter | Simon Marchi (Code Review) |
---|---|
Date | Nov. 27, 2019, 6:48 p.m. |
Message ID | <gerrit.1574880479000.I9e07d1b3e08e7c3384832b68ef286afe1d11479a@gnutoolchain-gerrit.osci.io> |
Download | mbox | patch |
Permalink | /patch/36313/ |
State | New |
Headers | show |
Comments
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.
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.
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.
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 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"