Change call_site_find_chain_1 to work recursively
authorTom Tromey <tromey@adacore.com>
Fri, 19 Nov 2021 16:23:09 +0000 (09:23 -0700)
committerTom Tromey <tromey@adacore.com>
Mon, 28 Mar 2022 19:25:04 +0000 (13:25 -0600)
commit206bedc2aa113eb3f7cb58668944eb7df82b8894
tree791e4514e5e7ce2697d720931588d0470bcb8391
parent394d8c59ea961e1dcf89ec6c8b6d6606b361590a
Change call_site_find_chain_1 to work recursively

call_site_find_chain_1 has a comment claiming that recursive calls
would be too expensive.  However, I doubt this is so expensive; and
furthermore the explicit state management approach here is difficult
both to understand and to modify.  This patch changes this code to use
explicit recursion, so that a subsequent patch can generalize this
code without undue trauma.

Additionally, I think this patch detects a latent bug in the recursion
code.  (It's hard for me to be completely certain.)  The bug is that
when a new target_call_site is entered, the code does:

  if (target_call_site)
    {
      if (addr_hash.insert (target_call_site->pc ()).second)
{
  /* Successfully entered TARGET_CALL_SITE.  */

  chain.push_back (target_call_site);
  break;
}
    }

Here, if entering the target_call_site fails, then any tail_call_next
elements in this call site are not visited.  However, if this code
does happen to enter a call site, then the tail_call_next elements
will be visited during backtracking.  This applies when doing the
backtracking as well -- it will only continue through a given chain as
long as each element in the chain can successfully be visited.

I'd appreciate some review of this.  If this behavior is intentional,
it can be added to the new implementation.
gdb/dwarf2/loc.c
gdb/testsuite/gdb.arch/amd64-entry-value.exp