[ARM] Remove field syscall_next_pc in struct gdbarch_tdep
authorYao Qi <yao.qi@linaro.org>
Thu, 14 Jan 2016 14:54:24 +0000 (14:54 +0000)
committerYao Qi <yao.qi@linaro.org>
Thu, 14 Jan 2016 14:54:24 +0000 (14:54 +0000)
Field syscall_next_pc in struct gdbarch_tdep was to calculate the
next pc of syscall instruction.  On linux target, syscall_next_pc
is set to arm_linux_syscall_next_pc, to do linux specific things.
However, after we have struct arm_get_next_pcs_ops, we can do the
same thing in struct arm_get_next_pcs_ops field syscall_next_pc,
so syscall_next_pc in struct gdbarch_tdep is not needed any more.

gdb:

2016-01-14  Yao Qi  <yao.qi@linaro.org>

* arm-linux-tdep.c (arm_linux_get_next_pcs_syscall_next_pc):
Declare.
(arm_linux_get_next_pcs_ops): Install
arm_linux_get_next_pcs_syscall_next_pc.
(arm_linux_syscall_next_pc): Change to ...
(arm_linux_get_next_pcs_syscall_next_pc): ... it.
(arm_linux_init_abi): Don't set tdep->syscall_next_pc.
* arm-tdep.c (arm_get_next_pcs_syscall_next_pc): Declare.
(arm_get_next_pcs_syscall_next_pc): Make it static.  Don't
call tdep->syscall_next_pc.
* arm-tdep.h (struct gdbarch_tdep) <syscall_next_pc>: Remove.
(arm_get_next_pcs_syscall_next_pc): Remove.

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

index 15dbdf4d7d75356486cc8d92872283d9f13d9e12..ad4049ca4185900464e90190e708932aa69c958e 100644 (file)
@@ -1,3 +1,18 @@
+2016-01-14  Yao Qi  <yao.qi@linaro.org>
+
+       * arm-linux-tdep.c (arm_linux_get_next_pcs_syscall_next_pc):
+       Declare.
+       (arm_linux_get_next_pcs_ops): Install
+       arm_linux_get_next_pcs_syscall_next_pc.
+       (arm_linux_syscall_next_pc): Change to ...
+       (arm_linux_get_next_pcs_syscall_next_pc): ... it.
+       (arm_linux_init_abi): Don't set tdep->syscall_next_pc.
+       * arm-tdep.c (arm_get_next_pcs_syscall_next_pc): Declare.
+       (arm_get_next_pcs_syscall_next_pc): Make it static.  Don't
+       call tdep->syscall_next_pc.
+       * arm-tdep.h (struct gdbarch_tdep) <syscall_next_pc>: Remove.
+       (arm_get_next_pcs_syscall_next_pc): Remove.
+
 2016-01-14  Yao Qi  <yao.qi@linaro.org>
 
        * remote.c (remote_set_syscall_catchpoint): Cast to char *.
index 6050bdf9531de502f776f7374fd6e651244351c4..2306bda1a9c9ab3460c15d3885fe4cc61b6479e1 100644 (file)
@@ -265,10 +265,14 @@ static const gdb_byte arm_linux_thumb2_le_breakpoint[] = { 0xf0, 0xf7, 0x00, 0xa
 /* Syscall number for rt_sigreturn.  */
 #define ARM_RT_SIGRETURN 173
 
+static CORE_ADDR
+  arm_linux_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self,
+                                         CORE_ADDR pc);
+
 /* Operation function pointers for get_next_pcs.  */
 static struct arm_get_next_pcs_ops arm_linux_get_next_pcs_ops = {
   arm_get_next_pcs_read_memory_unsigned_integer,
-  arm_get_next_pcs_syscall_next_pc,
+  arm_linux_get_next_pcs_syscall_next_pc,
   arm_get_next_pcs_addr_bits_remove,
   arm_get_next_pcs_is_thumb
 };
@@ -859,26 +863,23 @@ arm_linux_get_syscall_number (struct gdbarch *gdbarch,
   return svc_number;
 }
 
-/* When the processor is at a syscall instruction, return the PC of the
-   next instruction to be executed.  */
-
 static CORE_ADDR
-arm_linux_syscall_next_pc (struct regcache *regcache)
+arm_linux_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self,
+                                       CORE_ADDR pc)
 {
-  CORE_ADDR pc = regcache_read_pc (regcache);
   CORE_ADDR next_pc = 0;
-  int is_thumb = arm_is_thumb (regcache);
+  int is_thumb = arm_is_thumb (self->regcache);
   ULONGEST svc_number = 0;
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  struct gdbarch *gdbarch = get_regcache_arch (self->regcache);
 
   if (is_thumb)
     {
-      svc_number = regcache_raw_get_unsigned (regcache, 7);
+      svc_number = regcache_raw_get_unsigned (self->regcache, 7);
       next_pc = pc + 2;
     }
   else
     {
-      struct gdbarch *gdbarch = get_regcache_arch (regcache);
+      struct gdbarch *gdbarch = get_regcache_arch (self->regcache);
       enum bfd_endian byte_order_for_code = 
        gdbarch_byte_order_for_code (gdbarch);
       unsigned long this_instr = 
@@ -891,14 +892,14 @@ arm_linux_syscall_next_pc (struct regcache *regcache)
        }
       else /* EABI.  */
        {
-         svc_number = regcache_raw_get_unsigned (regcache, 7);
+         svc_number = regcache_raw_get_unsigned (self->regcache, 7);
        }
 
       next_pc = pc + 4;
     }
 
   if (svc_number == ARM_SIGRETURN || svc_number == ARM_RT_SIGRETURN)
-    next_pc = arm_linux_sigreturn_next_pc (regcache, svc_number);
+    next_pc = arm_linux_sigreturn_next_pc (self->regcache, svc_number);
 
   /* Addresses for calling Thumb functions have the bit 0 set.  */
   if (is_thumb)
@@ -1485,8 +1486,6 @@ arm_linux_init_abi (struct gdbarch_info info,
   set_gdbarch_stap_parse_special_token (gdbarch,
                                        arm_stap_parse_special_token);
 
-  tdep->syscall_next_pc = arm_linux_syscall_next_pc;
-
   /* `catch syscall' */
   set_xml_syscall_file_name (gdbarch, "syscalls/arm-linux.xml");
   set_gdbarch_get_syscall_number (gdbarch, arm_linux_get_syscall_number);
index 8874ec85cbb38d52b014ee4d54b0a7da45fd82f3..ccc2a038a094eadad9a7930e4f18353d4e39dc95 100644 (file)
@@ -237,6 +237,11 @@ static void arm_neon_quad_write (struct gdbarch *gdbarch,
                                 struct regcache *regcache,
                                 int regnum, const gdb_byte *buf);
 
+static CORE_ADDR
+  arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self,
+                                   CORE_ADDR pc);
+
+
 /* get_next_pcs operations.  */
 static struct arm_get_next_pcs_ops arm_get_next_pcs_ops = {
   arm_get_next_pcs_read_memory_unsigned_integer,
@@ -6142,15 +6147,10 @@ arm_get_next_pcs_addr_bits_remove (struct arm_get_next_pcs *self,
 
 /* Wrapper over syscall_next_pc for use in get_next_pcs.  */
 
-CORE_ADDR
-arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self, CORE_ADDR pc)
+static CORE_ADDR
+arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self,
+                                 CORE_ADDR pc)
 {
-  struct gdbarch_tdep *tdep;
-
-  tdep = gdbarch_tdep (get_regcache_arch (self->regcache));
-  if (tdep->syscall_next_pc != NULL)
-    return tdep->syscall_next_pc (self->regcache);
-
   return 0;
 }
 
index faa543e1c4f1ce13b4f9c9060ddfdbb13a5e71fe..1306cbb4332ee5e6e07fdd003fce911ec47b2185 100644 (file)
@@ -138,10 +138,6 @@ struct gdbarch_tdep
   struct type *neon_double_type;
   struct type *neon_quad_type;
 
-  /* Return the expected next PC if the program is stopped at a syscall
-     instruction.  */
-  CORE_ADDR (*syscall_next_pc) (struct regcache *regcache);
-
    /* syscall record.  */
   int (*arm_syscall_record) (struct regcache *regcache, unsigned long svc_number);
 };
@@ -261,9 +257,6 @@ ULONGEST arm_get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr,
 CORE_ADDR arm_get_next_pcs_addr_bits_remove (struct arm_get_next_pcs *self,
                                             CORE_ADDR val);
 
-CORE_ADDR arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self,
-                                           CORE_ADDR pc);
-
 int arm_get_next_pcs_is_thumb (struct arm_get_next_pcs *self);
 
 void arm_insert_single_step_breakpoint (struct gdbarch *,