Fix passing of struct with bitfields on x86-64
authorTom Tromey <tromey@adacore.com>
Tue, 16 Apr 2019 17:11:10 +0000 (11:11 -0600)
committerTom Tromey <tromey@adacore.com>
Wed, 24 Apr 2019 18:01:03 +0000 (12:01 -0600)
Commit 4aa866af ("Fix AMD64 return value ABI in expression
evaluation") introduced a regression when calling a function with a
structure that contains bitfields.

Because the caller of amd64_has_unaligned_fields handles bitfields
already, it seemed to me that the simplest fix was to ignore bitfields
here.

gdb/ChangeLog
2019-04-24  Tom Tromey  <tromey@adacore.com>

* amd64-tdep.c (amd64_has_unaligned_fields): Ignore bitfields.

gdb/testsuite/ChangeLog
2019-04-24  Tom Tromey  <tromey@adacore.com>

* gdb.arch/amd64-eval.exp: Test bitfield return.
* gdb.arch/amd64-eval.cc (struct Bitfields): New.
(class Foo) <return_bitfields>: New method.
(main): Call it.

gdb/ChangeLog
gdb/amd64-tdep.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.arch/amd64-eval.cc
gdb/testsuite/gdb.arch/amd64-eval.exp

index 5c40683d3f69474743345943010a37e401241a4b..490c1817626f6224dd294d555cae4724b0860e13 100644 (file)
@@ -1,3 +1,7 @@
+2019-04-24  Tom Tromey  <tromey@adacore.com>
+
+       * amd64-tdep.c (amd64_has_unaligned_fields): Ignore bitfields.
+
 2019-04-23  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * s12z-tdep.c (s12z_unwind_pc): Delete.
index d4c96de571648258365819fe8b780179f590e77d..31791f9a9f19b30eb229c1e8b6b94d539985d769 100644 (file)
@@ -555,11 +555,13 @@ amd64_has_unaligned_fields (struct type *type)
          int bitpos = TYPE_FIELD_BITPOS (type, i);
          int align = type_align(subtype);
 
-         /* Ignore static fields, or empty fields, for example nested
-            empty structures.  */
+         /* Ignore static fields, empty fields (for example nested
+            empty structures), and bitfields (these are handled by
+            the caller).  */
          if (field_is_static (&TYPE_FIELD (type, i))
              || (TYPE_FIELD_BITSIZE (type, i) == 0
-                 && TYPE_LENGTH (subtype) == 0))
+                 && TYPE_LENGTH (subtype) == 0)
+             || TYPE_FIELD_PACKED (type, i))
            continue;
 
          if (bitpos % 8 != 0)
@@ -569,7 +571,7 @@ amd64_has_unaligned_fields (struct type *type)
          if (bytepos % align != 0)
            return true;
 
-         if (amd64_has_unaligned_fields(subtype))
+         if (amd64_has_unaligned_fields (subtype))
            return true;
        }
     }
index 04fecfa10a0502b8fd754c3368ecd6eba594725c..23ff7bc433d1e5074785080dfb919044b05c9692 100644 (file)
@@ -1,3 +1,10 @@
+2019-04-24  Tom Tromey  <tromey@adacore.com>
+
+       * gdb.arch/amd64-eval.exp: Test bitfield return.
+       * gdb.arch/amd64-eval.cc (struct Bitfields): New.
+       (class Foo) <return_bitfields>: New method.
+       (main): Call it.
+
 2019-04-23  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * gdb.cp/many-args.cc: New file.
index a986a49db34fcbcc99e157b6d196f846f2ac296b..907233ff04ab2ff7d9a7411ed53946a60adf1bc0 100644 (file)
@@ -63,6 +63,16 @@ struct UnalignedFieldsInBase : public UnalignedFields
   int32_t x2;
 };
 
+struct Bitfields
+{
+  Bitfields(unsigned int x, unsigned int y)
+    : fld(x), fld2(y)
+  {}
+
+  unsigned fld : 7;
+  unsigned fld2 : 7;
+};
+
 class Foo
 {
 public:
@@ -101,6 +111,13 @@ public:
     return UnalignedFieldsInBase (x, y, x2);
   }
 
+  Bitfields
+  return_bitfields (unsigned int x, unsigned int y)
+  {
+    assert (this->tag == EXPECTED_TAG);
+    return Bitfields(x, y);
+  }
+
 private:
   /* Use a tag to detect if the "this" value is correct.  */
   static const int EXPECTED_TAG = 0xF00F00F0;
@@ -116,5 +133,6 @@ main (int argc, char *argv[])
   foo.return_non_trivial_destructor(3);
   foo.return_unaligned(4, 5);
   foo.return_unaligned_in_base(6, 7, 8);
+  foo.return_bitfields(23, 74);
   return 0;  // break-here
 }
index c33777d2b41501968cd183fff2e46fed1ad28b96..beef46ad133d4e899225b9e59eccbd86274745d7 100644 (file)
@@ -41,3 +41,5 @@ gdb_test "call foo.return_unaligned(78, 9.25)" \
     " = {x = 78, y = 9.25}"
 gdb_test "call foo.return_unaligned_in_base(23, 4.5, 67)" \
     " = {<UnalignedFields> = {x = 23, y = 4.5}, x2 = 67}"
+gdb_test "call foo.return_bitfields(23, 74)" \
+    " = {fld = 23, fld2 = 74}"
This page took 0.03614 seconds and 4 git commands to generate.