diff options
author | Yao Qi <yao@codesourcery.com> | 2014-05-30 16:08:10 +0800 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2014-06-24 09:30:34 +0800 |
commit | 3343ef86879b9348bb038bc7adecb665236ca4d8 (patch) | |
tree | 444c916928f7c10019cbd436553755b2b99c8671 | |
parent | 18d18ac8105647241a4e24a3a4d0196955666e73 (diff) | |
download | gdb-3343ef86879b9348bb038bc7adecb665236ca4d8.zip gdb-3343ef86879b9348bb038bc7adecb665236ca4d8.tar.gz gdb-3343ef86879b9348bb038bc7adecb665236ca4d8.tar.bz2 |
Skip 'bx reg' on arm-linux
In arm-tdep.c, arm_skip_stub is installed to gdbarch
skip_trampoline_code, but in arm-linux-tdep.c,
find_solib_trampoline_target is installed to skip_trampoline_code.
That means gdb configured for arm-linux target doesn't recognize some
arm specific trampolines or stubs. Beside handling generic solib
trampoline, gdb for arm-linux target should be able to handle arm
specific trampolines. This patch is to skip arm specific stubs, if
any, and as a fallback, skip the generic solib trampoline.
gdb:
2014-06-24 Yao Qi <yao@codesourcery.com>
* arm-linux-tdep.c (arm_linux_skip_trampoline_code): New.
(arm_linux_init_abi): Set skip_trampoline_code with
gdbarch_skip_trampoline_code instead of
find_solib_trampoline_target.
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/arm-linux-tdep.c | 15 |
2 files changed, 21 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 19a6657..44e8575 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2014-06-24 Yao Qi <yao@codesourcery.com> + * arm-linux-tdep.c (arm_linux_skip_trampoline_code): New. + (arm_linux_init_abi): Set skip_trampoline_code with + gdbarch_skip_trampoline_code instead of + find_solib_trampoline_target. + +2014-06-24 Yao Qi <yao@codesourcery.com> + * arm-tdep.c (arm_stub_unwind_sniffer): Return 1 if arm_skip_bx_reg returns non-zero. diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c index 65d9084..a96ea3f 100644 --- a/gdb/arm-linux-tdep.c +++ b/gdb/arm-linux-tdep.c @@ -1322,6 +1322,19 @@ arm_linux_syscall_record (struct regcache *regcache, unsigned long svc_number) return 0; } +/* Implement the skip_trampoline_code gdbarch method. */ + +static CORE_ADDR +arm_linux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) +{ + CORE_ADDR target_pc = arm_skip_stub (frame, pc); + + if (target_pc != 0) + return target_pc; + + return find_solib_trampoline_target (frame, pc); +} + static void arm_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) @@ -1387,7 +1400,7 @@ arm_linux_init_abi (struct gdbarch_info info, set_gdbarch_software_single_step (gdbarch, arm_linux_software_single_step); /* Shared library handling. */ - set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); + set_gdbarch_skip_trampoline_code (gdbarch, arm_linux_skip_trampoline_code); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); /* Enable TLS support. */ |