diff options
author | Yao Qi <yao.qi@linaro.org> | 2016-06-28 17:24:25 +0100 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2016-06-28 17:24:25 +0100 |
commit | 2ac09a5bbbff78d363ede2f038c31a9b1cb0887b (patch) | |
tree | 8bc62d6e02445ca60084b892aca12d6df93dc83c /gdb/aarch64-tdep.c | |
parent | bb95c51a232dffb46067c402ac62f1f3303b6bbd (diff) | |
download | binutils-gdb-2ac09a5bbbff78d363ede2f038c31a9b1cb0887b.tar.gz |
[AArch64] Use int64_t for address offset
In AArch64 displaced stepping and fast tracepoint, GDB/GDBserver needs
to check whether the offset can fit in the range. We are using int32_t
for offset, it is sufficient to get an offset from an instruction, but
it is not enough to get an offset from two addresses. For example,
we have a BL in shared lib which is at 0x0000002000040774, and the
scratch pad for displaced stepping is at 0x400698. The offset can't
fit in 28 bit imm. However, since we are using int32_t for offset, GDB
thinks the offset can fit it, and generate the B instruction with wrong
offset.
It fixes the following fail,
-FAIL: gdb.base/dso2dso.exp: next over call to sub2
gdb:
2016-06-28 Yao Qi <yao.qi@linaro.org>
* aarch64-tdep.c (aarch64_displaced_step_b): Use int64_t for
variable new_offset.
gdb/gdbserver:
2016-06-28 Yao Qi <yao.qi@linaro.org>
* linux-aarch64-low.c (aarch64_ftrace_insn_reloc_b): Use int64_t
for variable new_offset.
(aarch64_ftrace_insn_reloc_b_cond): Likewise.
(aarch64_ftrace_insn_reloc_cb): Likewise.
(aarch64_ftrace_insn_reloc_tb): Likewise.
(aarch64_install_fast_tracepoint_jump_pad): Likewise. Use
PRIx64 instead of PRIx32.
Diffstat (limited to 'gdb/aarch64-tdep.c')
-rw-r--r-- | gdb/aarch64-tdep.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 88fcf4bb55a..e5ce13e01d8 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -2322,7 +2322,7 @@ aarch64_displaced_step_b (const int is_bl, const int32_t offset, { struct aarch64_displaced_step_data *dsd = (struct aarch64_displaced_step_data *) data; - int32_t new_offset = data->insn_addr - dsd->new_addr + offset; + int64_t new_offset = data->insn_addr - dsd->new_addr + offset; if (can_encode_int32 (new_offset, 28)) { |