aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2019-04-16 11:11:10 -0600
committerTom Tromey <tromey@adacore.com>2019-04-24 12:01:03 -0600
commita59240a41ac34d91e4ef5dd8b484763639388364 (patch)
tree8543a94201f810ff63de79fcf095c68bb84f2eb1 /gdb/testsuite
parent1b8dd6432644c256ab294d205a8e00f6c6dc5073 (diff)
downloadgdb-a59240a41ac34d91e4ef5dd8b484763639388364.zip
gdb-a59240a41ac34d91e4ef5dd8b484763639388364.tar.gz
gdb-a59240a41ac34d91e4ef5dd8b484763639388364.tar.bz2
Fix passing of struct with bitfields on x86-64
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.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r--gdb/testsuite/ChangeLog7
-rw-r--r--gdb/testsuite/gdb.arch/amd64-eval.cc18
-rw-r--r--gdb/testsuite/gdb.arch/amd64-eval.exp2
3 files changed, 27 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 04fecfa..23ff7bc 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -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.
diff --git a/gdb/testsuite/gdb.arch/amd64-eval.cc b/gdb/testsuite/gdb.arch/amd64-eval.cc
index a986a49..907233f 100644
--- a/gdb/testsuite/gdb.arch/amd64-eval.cc
+++ b/gdb/testsuite/gdb.arch/amd64-eval.cc
@@ -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
}
diff --git a/gdb/testsuite/gdb.arch/amd64-eval.exp b/gdb/testsuite/gdb.arch/amd64-eval.exp
index c33777d..beef46a 100644
--- a/gdb/testsuite/gdb.arch/amd64-eval.exp
+++ b/gdb/testsuite/gdb.arch/amd64-eval.exp
@@ -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}"