diff options
author | Walter Lee <walt@tilera.com> | 2013-02-19 16:22:42 +0000 |
---|---|---|
committer | Walter Lee <walt@tilera.com> | 2013-02-19 16:22:42 +0000 |
commit | 3361b059eb46d2dfd9ed9119935faf3516c5e997 (patch) | |
tree | d3d665d123c33c55aab5731cf685532aec82d437 /gdb/tilegx-tdep.c | |
parent | bb1bcd865b70b25c093bc9069b75748e3cb46ae0 (diff) | |
download | gdb-3361b059eb46d2dfd9ed9119935faf3516c5e997.zip gdb-3361b059eb46d2dfd9ed9119935faf3516c5e997.tar.gz gdb-3361b059eb46d2dfd9ed9119935faf3516c5e997.tar.bz2 |
* tilegx-tdep.c (tilegx_analyze_prologue): add check for
for return address, "lr" register, saved on stack.
* tilegx-tdep.c (tilegx_frame_cache): update "PC" reg
after we invoke tilegx_analyze_prologue.
Diffstat (limited to 'gdb/tilegx-tdep.c')
-rw-r--r-- | gdb/tilegx-tdep.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/gdb/tilegx-tdep.c b/gdb/tilegx-tdep.c index bc0bbe6..2c4e349 100644 --- a/gdb/tilegx-tdep.c +++ b/gdb/tilegx-tdep.c @@ -393,7 +393,7 @@ tilegx_analyze_prologue (struct gdbarch* gdbarch, struct tilegx_reverse_regs new_reverse_frame[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE]; int dest_regs[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE]; - int reverse_frame_valid, prolog_done, branch_seen; + int reverse_frame_valid, prolog_done, branch_seen, lr_saved_on_stack_p; LONGEST prev_sp_value; int i, j; @@ -409,6 +409,7 @@ tilegx_analyze_prologue (struct gdbarch* gdbarch, prolog_done = 0; branch_seen = 0; prev_sp_value = 0; + lr_saved_on_stack_p = 0; /* To cut down on round-trip overhead, we fetch multiple bundles at once. These variables describe the range of memory we have @@ -472,7 +473,11 @@ tilegx_analyze_prologue (struct gdbarch* gdbarch, See trad-frame.h. */ cache->saved_regs[saved_register].realreg = saved_register; cache->saved_regs[saved_register].addr = saved_address; - } + } + else if (cache + && (operands[0] == TILEGX_SP_REGNUM) + && (operands[1] == TILEGX_LR_REGNUM)) + lr_saved_on_stack_p = 1; break; case TILEGX_OPC_ADDI: case TILEGX_OPC_ADDLI: @@ -725,6 +730,13 @@ tilegx_analyze_prologue (struct gdbarch* gdbarch, } } + if (lr_saved_on_stack_p) + { + cache->saved_regs[TILEGX_LR_REGNUM].realreg = TILEGX_LR_REGNUM; + cache->saved_regs[TILEGX_LR_REGNUM].addr = + cache->saved_regs[TILEGX_SP_REGNUM].addr; + } + return prolog_end; } @@ -840,11 +852,12 @@ tilegx_frame_cache (struct frame_info *this_frame, void **this_cache) cache->base = get_frame_register_unsigned (this_frame, TILEGX_SP_REGNUM); trad_frame_set_value (cache->saved_regs, TILEGX_SP_REGNUM, cache->base); - cache->saved_regs[TILEGX_PC_REGNUM] = cache->saved_regs[TILEGX_LR_REGNUM]; if (cache->start_pc) tilegx_analyze_prologue (gdbarch, cache->start_pc, current_pc, cache, this_frame); + cache->saved_regs[TILEGX_PC_REGNUM] = cache->saved_regs[TILEGX_LR_REGNUM]; + return cache; } |