diff options
author | Daniel Jacobowitz <drow@false.org> | 2007-09-19 14:45:39 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2007-09-19 14:45:39 +0000 |
commit | aa6c981f95f49601089a4355a5e907eadd0dbaa9 (patch) | |
tree | 93373c8a4bb9b20389ba9163fd236447bf5297fc /gdb/mips-tdep.c | |
parent | fd462a61890aa2795a14d98339a4094f97ea7bdb (diff) | |
download | gdb-aa6c981f95f49601089a4355a5e907eadd0dbaa9.zip gdb-aa6c981f95f49601089a4355a5e907eadd0dbaa9.tar.gz gdb-aa6c981f95f49601089a4355a5e907eadd0dbaa9.tar.bz2 |
* mips-tdep.c (mips_stub_frame_cache): Correct the saved return
address register. Correct the call to frame_id_build.
(mips_stub_frame_sniffer): Use the stub unwinder when the PC
is invalid.
Diffstat (limited to 'gdb/mips-tdep.c')
-rw-r--r-- | gdb/mips-tdep.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index acd4991..ff81651 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -2174,14 +2174,15 @@ mips_stub_frame_cache (struct frame_info *next_frame, void **this_cache) /* The return address is in the link register. */ trad_frame_set_reg_realreg (this_trad_cache, gdbarch_pc_regnum (current_gdbarch), - MIPS_RA_REGNUM); + (gdbarch_num_regs (current_gdbarch) + + MIPS_RA_REGNUM)); /* Frame ID, since it's a frameless / stackless function, no stack space is allocated and SP on entry is the current SP. */ pc = frame_pc_unwind (next_frame); find_pc_partial_function (pc, NULL, &start_addr, NULL); stack_addr = frame_unwind_register_signed (next_frame, MIPS_SP_REGNUM); - trad_frame_set_id (this_trad_cache, frame_id_build (start_addr, stack_addr)); + trad_frame_set_id (this_trad_cache, frame_id_build (stack_addr, start_addr)); /* Assume that the frame's base is the same as the stack-pointer. */ @@ -2222,9 +2223,14 @@ static const struct frame_unwind mips_stub_frame_unwind = static const struct frame_unwind * mips_stub_frame_sniffer (struct frame_info *next_frame) { + gdb_byte dummy[4]; struct obj_section *s; CORE_ADDR pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME); + /* Use the stub unwinder for unreadable code. */ + if (target_read_memory (frame_pc_unwind (next_frame), dummy, 4) != 0) + return &mips_stub_frame_unwind; + if (in_plt_section (pc, NULL)) return &mips_stub_frame_unwind; |