From 7618e12bcb8f15e83c8c6abc5216f520f09bdbf9 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Mon, 1 Feb 2010 19:46:46 +0000 Subject: [PATCH] * i386-tdep.c (i386_frame_cache): Assume valid anonymous functions use a frame pointer. --- gdb/ChangeLog | 6 ++++++ gdb/i386-tdep.c | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 991d3a6d09..b00c9a7286 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2010-02-01 Michael Matz + Daniel Jacobowitz + + * i386-tdep.c (i386_frame_cache): Assume valid anonymous + functions use a frame pointer. + 2010-02-01 Jan Kratochvil * solib-svr4.c (scan_dyntag): New variable dyn_addr. Replace gdb_assert diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index eea4ff4dd9..83aa81fa94 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