[3/3] Skip 'bx reg' on arm-linux

Message ID 1402279983-1907-4-git-send-email-yao@codesourcery.com
State Committed
Headers

Commit Message

Yao Qi June 9, 2014, 2:13 a.m. UTC
  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-09  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.
---
 gdb/arm-linux-tdep.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)
  

Comments

Joel Brobecker June 23, 2014, 1:19 p.m. UTC | #1
> 2014-06-09  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.

OK.
  

Patch

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.  */