aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2-frame.c
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2005-04-08 12:10:21 +0000
committerDaniel Jacobowitz <drow@false.org>2005-04-08 12:10:21 +0000
commit0228dfb97d58a54af8758840101975bf92903133 (patch)
tree7d80619b9fdd8281ba055c3635617484a007eb16 /gdb/dwarf2-frame.c
parent8f6277f5c0ba5af896745b5da1674493da61aa0d (diff)
downloadfsf-binutils-gdb-0228dfb97d58a54af8758840101975bf92903133.zip
fsf-binutils-gdb-0228dfb97d58a54af8758840101975bf92903133.tar.gz
fsf-binutils-gdb-0228dfb97d58a54af8758840101975bf92903133.tar.bz2
* dwarf2-frame.c (struct dwarf2_frame_cache): New field
undefined_retaddr. (dwarf2_frame_cache): Initialize undefined_retaddr. (dwarf2_frame_this_id): Return an invalid frame ID if undefined_retaddr.
Diffstat (limited to 'gdb/dwarf2-frame.c')
-rw-r--r--gdb/dwarf2-frame.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c
index 1ac1859..22b8ae6 100644
--- a/gdb/dwarf2-frame.c
+++ b/gdb/dwarf2-frame.c
@@ -610,6 +610,9 @@ struct dwarf2_frame_cache
/* DWARF Call Frame Address. */
CORE_ADDR cfa;
+ /* Set if the return address column was marked as undefined. */
+ int undefined_retaddr;
+
/* Saved registers, indexed by GDB register number, not by DWARF
register number. */
struct dwarf2_frame_state_reg *reg;
@@ -791,6 +794,10 @@ incomplete CFI data; unspecified registers (e.g., %s) at 0x%s"),
}
}
+ if (fs->retaddr_column < fs->regs.num_regs
+ && fs->regs.reg[fs->retaddr_column].how == DWARF2_FRAME_REG_UNDEFINED)
+ cache->undefined_retaddr = 1;
+
do_cleanups (old_chain);
*this_cache = cache;
@@ -804,6 +811,9 @@ dwarf2_frame_this_id (struct frame_info *next_frame, void **this_cache,
struct dwarf2_frame_cache *cache =
dwarf2_frame_cache (next_frame, this_cache);
+ if (cache->undefined_retaddr)
+ return;
+
(*this_id) = frame_id_build (cache->cfa, frame_func_unwind (next_frame));
}