aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2018-03-02 15:48:23 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2018-03-06 09:59:08 +0000
commit5dc4391345f6e86906a57af1434025cfb47b4100 (patch)
treea9080df418b124274748016acf17f7895970c236
parent52bc7e85d938e7a6582d31eca071e43429d6fb00 (diff)
downloadgdb-5dc4391345f6e86906a57af1434025cfb47b4100.zip
gdb-5dc4391345f6e86906a57af1434025cfb47b4100.tar.gz
gdb-5dc4391345f6e86906a57af1434025cfb47b4100.tar.bz2
gdb/amd64: Ignore zero sized fields when calling functions
In some cases passing an argument to a function on amd64, or attempting to fetch the return value, can trigger an assertion failure within GDB. An example of a type that would trigger such an error is: struct foo_t { long double a; struct { struct { /* Empty. */ } es1; } s1; }; GCC does permit empty structures, so we should probably support this. The test that exposes this bug is in the next commit along with the RiscV support. gdb/ChangeLog: * amd64-tdep.c (amd64_classify_aggregate): Ignore zero sized fields within aggregates.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/amd64-tdep.c5
2 files changed, 8 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4a44af4..28e5e89 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2018-03-06 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * amd64-tdep.c (amd64_classify_aggregate): Ignore zero sized
+ fields within aggregates.
+
2018-03-04 Simon Marchi <simon.marchi@polymtl.ca>
* record-btrace.c (btrace_print_lines): Change type of flags to
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index 6b92c92..07eef5e 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -601,8 +601,9 @@ amd64_classify_aggregate (struct type *type, enum amd64_reg_class theclass[2])
bitsize = TYPE_LENGTH (subtype) * 8;
endpos = (TYPE_FIELD_BITPOS (type, i) + bitsize - 1) / 64;
- /* Ignore static fields. */
- if (field_is_static (&TYPE_FIELD (type, i)))
+ /* Ignore static fields, or empty fields, for example nested
+ empty structures.*/
+ if (field_is_static (&TYPE_FIELD (type, i)) || bitsize == 0)
continue;
gdb_assert (pos == 0 || pos == 1);