binutils-gdb/gdb/dwarf2
Tom de Vries 4cf88725da [gdb/symtab] Fix infinite recursion in dwarf2_cu::get_builder()
With the test-case attached in PR26327, gdb aborts:
...
$ gdb -q -batch 447.dealII -ex "b main"
Aborted (core dumped)
...
when running out of stack due to infinite recursion:
...
 #8  0x00000000006aaba6 in dwarf2_cu::get_builder (this=0x35e4b40)
     at src/gdb/dwarf2/read.c:700
 #9  0x00000000006aaba6 in dwarf2_cu::get_builder (this=0x22ee2c0)
     at src/gdb/dwarf2/read.c:700
 #10 0x00000000006aaba6 in dwarf2_cu::get_builder (this=0x35e4b40)
     at src/gdb/dwarf2/read.c:700
 #11 0x00000000006aaba6 in dwarf2_cu::get_builder (this=0x22ee2c0)
     at src/gdb/dwarf2/read.c:700
...

We're recursing in this code in dwarf2_cu::get_builder():
...
     /* Otherwise, search ancestors for a valid builder.  */
     if (ancestor != nullptr)
       return ancestor->get_builder ();
...
due to the fact that the ancestor chain is a cycle.

Higher up in the call stack, we find some code that is responsible for
triggering this, in new_symbol:
...
       case DW_TAG_formal_parameter:
         {
           /* If we are inside a function, mark this as an argument.  If
              not, we might be looking at an argument to an inlined function
              when we do not have enough information to show inlined frames;
              pretend it's a local variable in that case so that the user can
              still see it.  */
           struct context_stack *curr
             = cu->get_builder ()->get_current_context_stack ();
           if (curr != nullptr && curr->name != nullptr)
             SYMBOL_IS_ARGUMENT (sym) = 1;
...

This is code that was added to support pre-4.1 gcc, to be able to show
arguments of inlined functions as locals, in the absense of sufficiently
correct debug information.

Removing this code (that is, doing SYMBOL_IS_ARGUMENT (sym) = 1
unconditially), fixes the crash.  The ancestor variable also seems to have
been added specifically to deal with fallout from this code, so remove that as
well.

Tested on x86_64-linux:
- openSUSE Leap 15.2 with gcc 7.5.0, and
- openSUSE Tumbleweed with gcc 10.3.0.

gdb/ChangeLog:

2021-05-07  Tom de Vries  <tdevries@suse.de>

	PR symtab/26327
	* dwarf2/read.c (struct dwarf2_cu): Remove ancestor.
	(dwarf2_cu::get_builder): Remove ancestor-related code.
	(new_symbol): Remove code supporting pre-4.1 gcc that show arguments
	of inlined functions as locals.
	(follow_die_offset, follow_die_sig_1): Remove setting of ancestor.

gdb/doc/ChangeLog:

2021-05-07  Tom de Vries  <tdevries@suse.de>

	PR symtab/26327
	* gdb.texinfo (Inline Functions): Update.
2021-05-07 12:13:05 +02:00
..
abbrev.c Remove Irix 6 workaround from DWARF abbrev reader 2021-03-13 09:41:05 -07:00
abbrev.h Constify abbrev_table::lookup_abbrev 2021-03-13 09:41:05 -07:00
attribute.c [gdb/symtab] Handle DW_AT_decl_file with form DW_FORM_implicit_const 2021-02-24 23:58:42 +01:00
attribute.h [gdb/symtab] Handle DW_AT_decl_file with form DW_FORM_implicit_const 2021-02-24 23:58:42 +01:00
comp-unit.c Shrink size of dwarf2_per_cu_data 2021-04-21 16:57:31 -06:00
comp-unit.h Shrink size of dwarf2_per_cu_data 2021-04-21 16:57:31 -06:00
die.h gdb/dwarf: split dwarf2_cu::ranges_base in two 2021-02-02 10:42:11 -05:00
dwz.c Move dwarf2_get_dwz_file to dwarf2/dwz.h 2021-03-06 09:26:40 -07:00
dwz.h Move dwarf2_get_dwz_file to dwarf2/dwz.h 2021-03-06 09:26:40 -07:00
expr.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
expr.h Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
frame-tailcall.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
frame-tailcall.h Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
frame.c Introduce dwarf2/public.h 2021-03-20 17:23:40 -06:00
frame.h Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
index-cache.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
index-cache.h Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
index-common.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
index-common.h Handle unaligned mapping of .gdb_index 2021-04-17 13:56:36 -06:00
index-write.c Remove dwarf2_per_bfd::all_type_units 2021-04-30 14:07:58 -06:00
index-write.h Introduce dwarf2/public.h 2021-03-20 17:23:40 -06:00
leb.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
leb.h Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
line-header.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
line-header.h Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
loc.c Use std::vector for "registers_used" in compile feature 2021-01-23 20:33:25 -07:00
loc.h Use std::vector for "registers_used" in compile feature 2021-01-23 20:33:25 -07:00
macro.c Avoid crash on missing dwz file 2021-03-06 09:26:39 -07:00
macro.h Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
public.h Simplify DWARF reader initialization 2021-03-28 10:43:15 -06:00
read.c [gdb/symtab] Fix infinite recursion in dwarf2_cu::get_builder() 2021-05-07 12:13:05 +02:00
read.h Remove dwarf2_per_bfd::all_type_units 2021-04-30 14:07:58 -06:00
sect-names.h Move dwarf2_get_dwz_file to dwarf2/dwz.h 2021-03-06 09:26:40 -07:00
section.c gdb: Handle missing .debug_str section 2021-04-07 11:31:30 +01:00
section.h Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
stringify.c Reimplement dwarf_unit_type_name 2021-03-18 12:08:41 -06:00
stringify.h Fix typo in dwarf2/stringify.h 2021-03-31 09:48:56 -06:00