diff options
author | Pedro Alves <palves@redhat.com> | 2013-11-22 13:46:35 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2013-11-22 13:46:35 +0000 |
commit | 1bd122facc6a755159f136024d64472e074f904c (patch) | |
tree | 05d8396e09ae91c63ddccc3d4c1079f5c9d3d1d3 /gdb/dwarf2-frame.c | |
parent | 1dc8686c48e72fc02723d44ee0fecde0d233c74e (diff) | |
download | binutils-gdb-1bd122facc6a755159f136024d64472e074f904c.tar.gz |
Revert "Eliminate dwarf2_frame_cache recursion, don't unwind from the dwarf2 sniffer (move dwarf2_tailcall_sniffer_first elsewhere)."
This reverts commit 1dc8686c48e72fc02723d44ee0fecde0d233c74e.
Diffstat (limited to 'gdb/dwarf2-frame.c')
-rw-r--r-- | gdb/dwarf2-frame.c | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index c4f87715c17..91d88024b91 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -993,22 +993,12 @@ struct dwarf2_frame_cache /* The .text offset. */ CORE_ADDR text_offset; - /* True if we already checked whether this frame is the bottom frame - of a virtual tail call frame chain. */ - int checked_tailcall_bottom; - /* If not NULL then this frame is the bottom frame of a TAILCALL_FRAME sequence. If NULL then it is a normal case with no TAILCALL_FRAME involved. Non-bottom frames of a virtual tail call frames chain use dwarf2_tailcall_frame_unwind unwinder so this field does not apply for them. */ void *tailcall_cache; - - /* The number of bytes to subtract from TAILCALL_FRAME frames frame - base to get the SP, to simulate the return address pushed on the - stack. */ - LONGEST entry_cfa_sp_offset; - int entry_cfa_sp_offset_p; }; /* A cleanup that sets a pointer to NULL. */ @@ -1033,6 +1023,8 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) struct dwarf2_fde *fde; volatile struct gdb_exception ex; CORE_ADDR entry_pc; + LONGEST entry_cfa_sp_offset; + int entry_cfa_sp_offset_p = 0; const gdb_byte *instr; if (*this_cache) @@ -1097,8 +1089,8 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) && (gdbarch_dwarf2_reg_to_regnum (gdbarch, fs->regs.cfa_reg) == gdbarch_sp_regnum (gdbarch))) { - cache->entry_cfa_sp_offset = fs->regs.cfa_offset; - cache->entry_cfa_sp_offset_p = 1; + entry_cfa_sp_offset = fs->regs.cfa_offset; + entry_cfa_sp_offset_p = 1; } } else @@ -1247,6 +1239,13 @@ incomplete CFI data; unspecified registers (e.g., %s) at %s"), cache->undefined_retaddr = 1; do_cleanups (old_chain); + + /* Try to find a virtual tail call frames chain with bottom (callee) frame + starting at THIS_FRAME. */ + dwarf2_tailcall_sniffer_first (this_frame, &cache->tailcall_cache, + (entry_cfa_sp_offset_p + ? &entry_cfa_sp_offset : NULL)); + discard_cleanups (reset_cache_cleanup); return cache; } @@ -1293,16 +1292,6 @@ dwarf2_frame_prev_register (struct frame_info *this_frame, void **this_cache, CORE_ADDR addr; int realnum; - /* Check whether THIS_FRAME is the bottom frame of a virtual tail - call frame chain. */ - if (!cache->checked_tailcall_bottom) - { - cache->checked_tailcall_bottom = 1; - dwarf2_tailcall_sniffer_first (this_frame, &cache->tailcall_cache, - (cache->entry_cfa_sp_offset_p - ? &cache->entry_cfa_sp_offset : NULL)); - } - /* Non-bottom frames of a virtual tail call frames chain use dwarf2_tailcall_frame_unwind unwinder so this code does not apply for them. If dwarf2_tailcall_prev_register_first does not have specific value @@ -1429,6 +1418,10 @@ dwarf2_frame_sniffer (const struct frame_unwind *self, if (self->type != NORMAL_FRAME) return 0; + /* Preinitializa the cache so that TAILCALL_FRAME can find the record by + dwarf2_tailcall_sniffer_first. */ + dwarf2_frame_cache (this_frame, this_cache); + return 1; } |