Revert "[gdb/symtab] Fix infinite recursion in dwarf2_cu::get_builder()"
authorTom de Vries <tdevries@suse.de>
Wed, 12 May 2021 14:03:02 +0000 (16:03 +0200)
committerTom de Vries <tdevries@suse.de>
Wed, 12 May 2021 14:03:02 +0000 (16:03 +0200)
This reverts commit 4cf88725da1cb503be04d3237354105ec170bc86.

It causes the following regression:
...
$ cat shadow.cc
namespace A {}

int
main()
{
  using namespace A;
  return 0;
}
$ g++-10 -g shadow.cc -flto -o shadow
$ ./gdb -q -batch ./shadow  -ex "b main"
Aborted (core dumped)
...

gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/dwarf2/read.c

index 8ef5eb6c833b73e6618891e8a4acb2127a7c56fd..d564621f4c64784f92656c9a3d79a5ded42406c3 100644 (file)
 
        * Re-format all Python files using black.
 
-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.
-
 2021-05-07  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * guile/guile-internal.h (gdbscm_safe_source_script): Change
index 290ad485521a09142e46e8a8c83a8d5b830efe2c..9990cd904852a694b66ecdff37f95e49bc213284 100644 (file)
        * python.texinfo (Python Commands): Document 'set debug
        py-breakpoint' and 'show debug py-breakpoint'.
 
-2021-05-07  Tom de Vries  <tdevries@suse.de>
-
-       PR symtab/26327
-       * gdb.texinfo (Inline Functions): Update.
-
 2021-05-06  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
 
        * gdb.texinfo (GDB/MI Breakpoint Commands): Mention the
index f4d7085da584107242ce23d360bdebf42e18061c..56f37eb22886a4a309bbdb128b325e7449ca7147 100644 (file)
@@ -13842,8 +13842,8 @@ when using @sc{dwarf 2}.  Versions of @value{NGCC} before 4.1
 do not emit two required attributes (@samp{DW_AT_call_file} and
 @samp{DW_AT_call_line}); @value{GDBN} does not display inlined
 function calls with earlier versions of @value{NGCC}.  It instead
-displays local variables of inlined functions as local variables in
-the caller.
+displays the arguments and local variables of inlined functions as
+local variables in the caller.
 
 The body of an inlined function is directly included at its call site;
 unlike a non-inlined function, there are no instructions devoted to
index 280f56c31e0db860802804cff054623152e9390a..ac786abf6d2363be7836b8e8ef095f40777fbe63 100644 (file)
@@ -684,6 +684,10 @@ public:
 
   struct partial_die_info *find_partial_die (sect_offset sect_off);
 
+  /* If this CU was inherited by another CU (via specification,
+     abstract_origin, etc), this is the ancestor CU.  */
+  dwarf2_cu *ancestor;
+
   /* Get the buildsym_compunit for this CU.  */
   buildsym_compunit *get_builder ()
   {
@@ -691,6 +695,10 @@ public:
     if (m_builder != nullptr)
       return m_builder.get ();
 
+    /* Otherwise, search ancestors for a valid builder.  */
+    if (ancestor != nullptr)
+      return ancestor->get_builder ();
+
     return nullptr;
   }
 };
@@ -22037,7 +22045,15 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
          break;
        case DW_TAG_formal_parameter:
          {
-           SYMBOL_IS_ARGUMENT (sym) = 1;
+           /* 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;
            attr = dwarf2_attr (die, DW_AT_location, cu);
            if (attr != nullptr)
              {
@@ -23373,6 +23389,9 @@ follow_die_offset (sect_offset sect_off, int offset_in_dwz,
   *ref_cu = target_cu;
   temp_die.sect_off = sect_off;
 
+  if (target_cu != cu)
+    target_cu->ancestor = cu;
+
   return (struct die_info *) htab_find_with_hash (target_cu->die_hash,
                                                  &temp_die,
                                                  to_underlying (sect_off));
@@ -23722,7 +23741,7 @@ follow_die_sig_1 (struct die_info *src_die, struct signatured_type *sig_type,
                  struct dwarf2_cu **ref_cu)
 {
   struct die_info temp_die;
-  struct dwarf2_cu *sig_cu;
+  struct dwarf2_cu *sig_cu, *cu = *ref_cu;
   struct die_info *die;
   dwarf2_per_objfile *per_objfile = (*ref_cu)->per_objfile;
 
@@ -23758,6 +23777,8 @@ follow_die_sig_1 (struct die_info *src_die, struct signatured_type *sig_type,
        }
 
       *ref_cu = sig_cu;
+      if (sig_cu != cu)
+       sig_cu->ancestor = cu;
 
       return die;
     }