diff options
author | qiyao <qiyao> | 2011-09-18 14:18:06 +0000 |
---|---|---|
committer | qiyao <qiyao> | 2011-09-18 14:18:06 +0000 |
commit | 3c0bdf709f6d676fc135f3d48c9407f3e1b46d4a (patch) | |
tree | 64bfeb594f892095c3f27c38699ca92d7bb0dd47 /gdb/arm-tdep.c | |
parent | f750e1f08b5ed753ac455d20b20c76048082dd9e (diff) | |
download | gdb-3c0bdf709f6d676fc135f3d48c9407f3e1b46d4a.tar.gz |
gdb/
* arm-tdep.c (install_copro_load_store): PC is set 4-byte aligned.
(install_b_bl_blx): Likewise.
Diffstat (limited to 'gdb/arm-tdep.c')
-rw-r--r-- | gdb/arm-tdep.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index d5e5dacbebf..fc321cbb565 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -5475,6 +5475,8 @@ install_copro_load_store (struct gdbarch *gdbarch, struct regcache *regs, dsc->tmp[0] = displaced_read_reg (regs, dsc, 0); rn_val = displaced_read_reg (regs, dsc, rn); + /* PC should be 4-byte aligned. */ + rn_val = rn_val & 0xfffffffc; displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC); dsc->u.ldst.writeback = writeback; @@ -5555,10 +5557,15 @@ install_b_bl_blx (struct gdbarch *gdbarch, struct regcache *regs, dsc->u.branch.link = link; dsc->u.branch.exchange = exchange; + dsc->u.branch.dest = dsc->insn_addr; + if (link && exchange) + /* For BLX, offset is computed from the Align (PC, 4). */ + dsc->u.branch.dest = dsc->u.branch.dest & 0xfffffffc; + if (dsc->is_thumb) - dsc->u.branch.dest = dsc->insn_addr + 4 + offset; + dsc->u.branch.dest += 4 + offset; else - dsc->u.branch.dest = dsc->insn_addr + 8 + offset; + dsc->u.branch.dest += 8 + offset; dsc->cleanup = &cleanup_branch; } |