Skip 'bx reg' on arm-linux
authorYao Qi <yao@codesourcery.com>
Fri, 30 May 2014 08:08:10 +0000 (16:08 +0800)
committerYao Qi <yao@codesourcery.com>
Tue, 24 Jun 2014 01:30:34 +0000 (09:30 +0800)
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.

gdb/ChangeLog
gdb/arm-linux-tdep.c

index 19a6657..44e8575 100644 (file)
@@ -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.
 
index 65d9084..a96ea3f 100644 (file)
@@ -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.  */