[AArch64] Use int64_t for address offset
authorYao Qi <yao.qi@linaro.org>
Tue, 28 Jun 2016 16:24:25 +0000 (17:24 +0100)
committerYao Qi <yao.qi@linaro.org>
Tue, 28 Jun 2016 16:24:25 +0000 (17:24 +0100)
commit2ac09a5bbbff78d363ede2f038c31a9b1cb0887b
tree8bc62d6e02445ca60084b892aca12d6df93dc83c
parentbb95c51a232dffb46067c402ac62f1f3303b6bbd
[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.
gdb/ChangeLog
gdb/aarch64-tdep.c
gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-aarch64-low.c