diff options
author | Mark Kettenis <kettenis@gnu.org> | 2011-06-12 20:46:11 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@gnu.org> | 2011-06-12 20:46:11 +0000 |
commit | 0d6c213503188564f72d657dbe44aa2200ce6dfc (patch) | |
tree | 6ebac27079087c27b6b600d7b897271d7150a35c | |
parent | 8bbdd3f4631f74565ffa27111d5c19c56cd87926 (diff) | |
download | gdb-0d6c213503188564f72d657dbe44aa2200ce6dfc.zip gdb-0d6c213503188564f72d657dbe44aa2200ce6dfc.tar.gz gdb-0d6c213503188564f72d657dbe44aa2200ce6dfc.tar.bz2 |
* i386-tdep.c (i386_epilogue_frame_cache): Simplify code. Call
get_frame_func instead of get_frame_pc to determine the code
address used to construct the frame ID.
(i386_epilogue_frame_unwind_stop_reason): Fix coding style.
(i386_epilogue_frame_this_id): Likewise.
(i386_epilogue_frame_prev_register): New function.
(i386_epilogue_frame_unwind): Use i386_epilogue_frame_prev_register.
(i386_stack_tramp_frame_sniffer): Fix coding style.
(i386_stack_tramp_frame_unwind): Use i386_epilogue_frame_prev_register.
(i386_gdbarch_init): Fix comments.
-rw-r--r-- | gdb/ChangeLog | 13 | ||||
-rw-r--r-- | gdb/i386-tdep.c | 52 |
2 files changed, 41 insertions, 24 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ab49a3f..134012c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,18 @@ 2011-06-12 Mark Kettenis <kettenis@gnu.org> + * i386-tdep.c (i386_epilogue_frame_cache): Simplify code. Call + get_frame_func instead of get_frame_pc to determine the code + address used to construct the frame ID. + (i386_epilogue_frame_unwind_stop_reason): Fix coding style. + (i386_epilogue_frame_this_id): Likewise. + (i386_epilogue_frame_prev_register): New function. + (i386_epilogue_frame_unwind): Use i386_epilogue_frame_prev_register. + (i386_stack_tramp_frame_sniffer): Fix coding style. + (i386_stack_tramp_frame_unwind): Use i386_epilogue_frame_prev_register. + (i386_gdbarch_init): Fix comments. + +2011-06-12 Mark Kettenis <kettenis@gnu.org> + * i386-tdep.c (i386_match_insn_block): Use length of the proper instruction when walking back through the instruction stream. diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 8355508..ab266ef 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -1910,11 +1910,9 @@ i386_epilogue_frame_sniffer (const struct frame_unwind *self, static struct i386_frame_cache * i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache) { - struct gdbarch *gdbarch = get_frame_arch (this_frame); - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); volatile struct gdb_exception ex; struct i386_frame_cache *cache; - gdb_byte buf[4]; + CORE_ADDR sp; if (*this_cache) return *this_cache; @@ -1924,18 +1922,14 @@ i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache) TRY_CATCH (ex, RETURN_MASK_ERROR) { - /* Cache base will be %esp plus cache->sp_offset (-4). */ - get_frame_register (this_frame, I386_ESP_REGNUM, buf); - cache->base = extract_unsigned_integer (buf, 4, - byte_order) + cache->sp_offset; - - /* Cache pc will be the frame func. */ - cache->pc = get_frame_pc (this_frame); + cache->pc = get_frame_func (this_frame); - /* The saved %esp will be at cache->base plus 8. */ + /* At this point the stack looks as if we just entered the + function, with the return address at the top of the + stack. */ + sp = get_frame_register_unsigned (this_frame, I386_ESP_REGNUM); + cache->base = sp + cache->sp_offset; cache->saved_sp = cache->base + 8; - - /* The saved %eip will be at cache->base plus 4. */ cache->saved_regs[I386_EIP_REGNUM] = cache->base + 4; cache->base_p = 1; @@ -1950,8 +1944,8 @@ static enum unwind_stop_reason i386_epilogue_frame_unwind_stop_reason (struct frame_info *this_frame, void **this_cache) { - struct i386_frame_cache *cache - = i386_epilogue_frame_cache (this_frame, this_cache); + struct i386_frame_cache *cache = + i386_epilogue_frame_cache (this_frame, this_cache); if (!cache->base_p) return UNWIND_UNAVAILABLE; @@ -1964,8 +1958,8 @@ i386_epilogue_frame_this_id (struct frame_info *this_frame, void **this_cache, struct frame_id *this_id) { - struct i386_frame_cache *cache = i386_epilogue_frame_cache (this_frame, - this_cache); + struct i386_frame_cache *cache = + i386_epilogue_frame_cache (this_frame, this_cache); if (!cache->base_p) return; @@ -1973,12 +1967,22 @@ i386_epilogue_frame_this_id (struct frame_info *this_frame, (*this_id) = frame_id_build (cache->base + 8, cache->pc); } +static struct value * +i386_epilogue_frame_prev_register (struct frame_info *this_frame, + void **this_cache, int regnum) +{ + /* Make sure we've initialized the cache. */ + i386_epilogue_frame_cache (this_frame, this_cache); + + return i386_frame_prev_register (this_frame, this_cache, regnum); +} + static const struct frame_unwind i386_epilogue_frame_unwind = { NORMAL_FRAME, i386_epilogue_frame_unwind_stop_reason, i386_epilogue_frame_this_id, - i386_frame_prev_register, + i386_epilogue_frame_prev_register, NULL, i386_epilogue_frame_sniffer }; @@ -2045,8 +2049,8 @@ i386_in_stack_tramp_p (struct gdbarch *gdbarch, CORE_ADDR pc) static int i386_stack_tramp_frame_sniffer (const struct frame_unwind *self, - struct frame_info *this_frame, - void **this_prologue_cache) + struct frame_info *this_frame, + void **this_cache) { if (frame_relative_level (this_frame) == 0) return i386_in_stack_tramp_p (get_frame_arch (this_frame), @@ -2060,7 +2064,7 @@ static const struct frame_unwind i386_stack_tramp_frame_unwind = NORMAL_FRAME, i386_epilogue_frame_unwind_stop_reason, i386_epilogue_frame_this_id, - i386_frame_prev_register, + i386_epilogue_frame_prev_register, NULL, i386_stack_tramp_frame_sniffer }; @@ -7311,13 +7315,13 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_fetch_pointer_argument (gdbarch, i386_fetch_pointer_argument); /* Hook the function epilogue frame unwinder. This unwinder is - appended to the list first, so that it supercedes the Dwarf - unwinder in function epilogues (where the Dwarf unwinder + appended to the list first, so that it supercedes the DWARF + unwinder in function epilogues (where the DWARF unwinder currently fails). */ frame_unwind_append_unwinder (gdbarch, &i386_epilogue_frame_unwind); /* Hook in the DWARF CFI frame unwinder. This unwinder is appended - to the list before the prologue-based unwinders, so that Dwarf + to the list before the prologue-based unwinders, so that DWARF CFI info will be used if it is available. */ dwarf2_append_unwinders (gdbarch); |