diff options
author | Tom Tromey <tromey@adacore.com> | 2020-04-06 12:13:24 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-04-06 12:29:09 -0600 |
commit | 93689ce91271bf88580a2d035a466479c16f4e71 (patch) | |
tree | 42d0491979b19bb6e65e7b38c0363cd1bf297db2 | |
parent | 797439622361bc901ed64b398c0d689c97cd8121 (diff) | |
download | fsf-binutils-gdb-93689ce91271bf88580a2d035a466479c16f4e71.zip fsf-binutils-gdb-93689ce91271bf88580a2d035a466479c16f4e71.tar.gz fsf-binutils-gdb-93689ce91271bf88580a2d035a466479c16f4e71.tar.bz2 |
Handle complex error type in read_base_type
It turns out there was one more bug in the earlier complex series:
read_base_type could cause an assertion failure on some platforms. I
found this running the AdaCore internal test suite, but you can also
see it by running gdb's "gdb.cp" tests for x86 (not x86-64).
In particular, the DW_ATE_complex_float case calls
dwarf2_init_complex_target_type, which calls dwarf2_init_float_type,
which can return a type using TYPE_CODE_ERROR.
This patch changes the DWARF reader to handle this case, the same way
that the f-lang.c patch did. Perhaps init_complex_type really should
be changed to allow TYPE_CODE_ERROR? I was not sure.
Tested on x86-64 Fedora 30, using an x86 build. I'm checking this in.
gdb/ChangeLog
2020-04-06 Tom Tromey <tromey@adacore.com>
* dwarf2/read.c (read_base_type) <DW_ATE_complex_float>: Handle
TYPE_CODE_ERROR.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 14 |
2 files changed, 18 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b1a9653..cdf6d66 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-04-06 Tom Tromey <tromey@adacore.com> + + * dwarf2/read.c (read_base_type) <DW_ATE_complex_float>: Handle + TYPE_CODE_ERROR. + 2020-04-06 Kamil Rytarowski <n54@gmx.com> * nbsd-tdep.c: Include "gdbarch.h". diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index bcc3116..749acb3 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -16910,7 +16910,19 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu) case DW_ATE_complex_float: type = dwarf2_init_complex_target_type (cu, objfile, bits / 2, name, byte_order); - type = init_complex_type (name, type); + if (TYPE_CODE (type) == TYPE_CODE_ERROR) + { + if (name == nullptr) + { + struct obstack *obstack + = &cu->per_cu->dwarf2_per_objfile->objfile->objfile_obstack; + name = obconcat (obstack, "_Complex ", TYPE_NAME (type), + nullptr); + } + type = init_type (objfile, TYPE_CODE_ERROR, bits, name); + } + else + type = init_complex_type (name, type); break; case DW_ATE_decimal_float: type = init_decfloat_type (objfile, bits, name); |