From 7618e12bcb8f15e83c8c6abc5216f520f09bdbf9 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Mon, 1 Feb 2010 19:46:46 +0000 Subject: * i386-tdep.c (i386_frame_cache): Assume valid anonymous functions use a frame pointer. --- gdb/i386-tdep.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'gdb/i386-tdep.c') diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index eea4ff4..83aa81f 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -1395,12 +1395,24 @@ i386_frame_cache (struct frame_info *this_frame, void **this_cache) /* This will be added back below. */ cache->saved_regs[I386_EIP_REGNUM] -= cache->base; } - else + else if (cache->pc != 0 + || target_read_memory (get_frame_pc (this_frame), buf, 1)) { + /* We're in a known function, but did not find a frame + setup. Assume that the function does not use %ebp. + Alternatively, we may have jumped to an invalid + address; in that case there is definitely no new + frame in %ebp. */ get_frame_register (this_frame, I386_ESP_REGNUM, buf); cache->base = extract_unsigned_integer (buf, 4, byte_order) + cache->sp_offset; } + else + /* We're in an unknown function. We could not find the start + of the function to analyze the prologue; our best option is + to assume a typical frame layout with the caller's %ebp + saved. */ + cache->saved_regs[I386_EBP_REGNUM] = 0; } /* Now that we have the base address for the stack frame we can -- cgit v1.1