[Ada] Better handling of dynamic types in ada_value_primitive_packed_val
[deliverable/binutils-gdb.git] / gdb / arm-linux-tdep.c
index f58da846e65250599e428e977102e4802cd9d0ec..dc0a8a9dbc498466f6aceae49f9f5bdfbe876fef 100644 (file)
@@ -506,7 +506,7 @@ arm_linux_supply_gregset (const struct regset *regset,
 {
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  const gdb_byte *gregs = gregs_buf;
+  const gdb_byte *gregs = (const gdb_byte *) gregs_buf;
   int regno;
   CORE_ADDR reg_pc;
   gdb_byte pc_buf[INT_REGISTER_SIZE];
@@ -542,7 +542,7 @@ arm_linux_collect_gregset (const struct regset *regset,
                           const struct regcache *regcache,
                           int regnum, void *gregs_buf, size_t len)
 {
-  gdb_byte *gregs = gregs_buf;
+  gdb_byte *gregs = (gdb_byte *) gregs_buf;
   int regno;
 
   for (regno = ARM_A1_REGNUM; regno < ARM_PC_REGNUM; regno++)
@@ -649,7 +649,7 @@ arm_linux_supply_nwfpe (const struct regset *regset,
                        struct regcache *regcache,
                        int regnum, const void *regs_buf, size_t len)
 {
-  const gdb_byte *regs = regs_buf;
+  const gdb_byte *regs = (const gdb_byte *) regs_buf;
   int regno;
 
   if (regnum == ARM_FPS_REGNUM || regnum == -1)
@@ -666,7 +666,7 @@ arm_linux_collect_nwfpe (const struct regset *regset,
                         const struct regcache *regcache,
                         int regnum, void *regs_buf, size_t len)
 {
-  gdb_byte *regs = regs_buf;
+  gdb_byte *regs = (gdb_byte *) regs_buf;
   int regno;
 
   for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
@@ -687,7 +687,7 @@ arm_linux_supply_vfp (const struct regset *regset,
                      struct regcache *regcache,
                      int regnum, const void *regs_buf, size_t len)
 {
-  const gdb_byte *regs = regs_buf;
+  const gdb_byte *regs = (const gdb_byte *) regs_buf;
   int regno;
 
   if (regnum == ARM_FPSCR_REGNUM || regnum == -1)
@@ -704,7 +704,7 @@ arm_linux_collect_vfp (const struct regset *regset,
                         const struct regcache *regcache,
                         int regnum, void *regs_buf, size_t len)
 {
-  gdb_byte *regs = regs_buf;
+  gdb_byte *regs = (gdb_byte *) regs_buf;
   int regno;
 
   if (regnum == ARM_FPSCR_REGNUM || regnum == -1)
@@ -743,7 +743,7 @@ arm_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
 
   cb (".reg", ARM_LINUX_SIZEOF_GREGSET, &arm_linux_gregset, NULL, cb_data);
 
-  if (tdep->have_vfp_registers)
+  if (tdep->vfp_register_count > 0)
     cb (".reg-arm-vfp", ARM_LINUX_SIZEOF_VFP, &arm_linux_vfpregset,
        "VFP floating-point", cb_data);
   else if (tdep->have_fpa_registers)
@@ -917,6 +917,11 @@ arm_linux_software_single_step (struct frame_info *frame)
   if (arm_deal_with_atomic_sequence (frame))
     return 1;
 
+  /* If the target does have hardware single step, GDB doesn't have
+     to bother software single step.  */
+  if (target_can_do_single_step () == 1)
+    return 0;
+
   next_pc = arm_get_next_pc (frame, get_frame_pc (frame));
 
   /* The Linux kernel offers some user-mode helpers in a high page.  We can
@@ -939,7 +944,6 @@ arm_linux_cleanup_svc (struct gdbarch *gdbarch,
                       struct regcache *regs,
                       struct displaced_step_closure *dsc)
 {
-  CORE_ADDR from = dsc->insn_addr;
   ULONGEST apparent_pc;
   int within_scratch;
 
@@ -960,7 +964,8 @@ arm_linux_cleanup_svc (struct gdbarch *gdbarch,
     }
 
   if (within_scratch)
-    displaced_write_reg (regs, dsc, ARM_PC_REGNUM, from + 4, BRANCH_WRITE_PC);
+    displaced_write_reg (regs, dsc, ARM_PC_REGNUM,
+                        dsc->insn_addr + dsc->insn_size, BRANCH_WRITE_PC);
 }
 
 static int
@@ -980,54 +985,54 @@ arm_linux_copy_svc (struct gdbarch *gdbarch, struct regcache *regs,
                                                 &return_to, &is_thumb);
   if (is_sigreturn)
     {
-         struct symtab_and_line sal;
-
-         if (debug_displaced)
-           fprintf_unfiltered (gdb_stdlog, "displaced: found "
-             "sigreturn/rt_sigreturn SVC call.  PC in frame = %lx\n",
-             (unsigned long) get_frame_pc (frame));
-
-         if (debug_displaced)
-           fprintf_unfiltered (gdb_stdlog, "displaced: unwind pc = %lx.  "
-             "Setting momentary breakpoint.\n", (unsigned long) return_to);
-
-         gdb_assert (inferior_thread ()->control.step_resume_breakpoint
-                     == NULL);
-
-         sal = find_pc_line (return_to, 0);
-         sal.pc = return_to;
-         sal.section = find_pc_overlay (return_to);
-         sal.explicit_pc = 1;
-
-         frame = get_prev_frame (frame);
-
-         if (frame)
-           {
-             inferior_thread ()->control.step_resume_breakpoint
-               = set_momentary_breakpoint (gdbarch, sal, get_frame_id (frame),
-                                           bp_step_resume);
-
-             /* set_momentary_breakpoint invalidates FRAME.  */
-             frame = NULL;
-
-             /* We need to make sure we actually insert the momentary
-                breakpoint set above.  */
-             insert_breakpoints ();
-           }
-         else if (debug_displaced)
-           fprintf_unfiltered (gdb_stderr, "displaced: couldn't find previous "
-                               "frame to set momentary breakpoint for "
-                               "sigreturn/rt_sigreturn\n");
+      struct symtab_and_line sal;
+
+      if (debug_displaced)
+       fprintf_unfiltered (gdb_stdlog, "displaced: found "
+                           "sigreturn/rt_sigreturn SVC call.  PC in "
+                           "frame = %lx\n",
+                           (unsigned long) get_frame_pc (frame));
+
+      if (debug_displaced)
+       fprintf_unfiltered (gdb_stdlog, "displaced: unwind pc = %lx.  "
+                           "Setting momentary breakpoint.\n",
+                           (unsigned long) return_to);
+
+      gdb_assert (inferior_thread ()->control.step_resume_breakpoint
+                 == NULL);
+
+      sal = find_pc_line (return_to, 0);
+      sal.pc = return_to;
+      sal.section = find_pc_overlay (return_to);
+      sal.explicit_pc = 1;
+
+      frame = get_prev_frame (frame);
+
+      if (frame)
+       {
+         inferior_thread ()->control.step_resume_breakpoint
+           = set_momentary_breakpoint (gdbarch, sal, get_frame_id (frame),
+                                       bp_step_resume);
+
+         /* set_momentary_breakpoint invalidates FRAME.  */
+         frame = NULL;
+
+         /* We need to make sure we actually insert the momentary
+            breakpoint set above.  */
+         insert_breakpoints ();
        }
       else if (debug_displaced)
-       fprintf_unfiltered (gdb_stdlog, "displaced: sigreturn/rt_sigreturn "
-                           "SVC call not in signal trampoline frame\n");
-    
+       fprintf_unfiltered (gdb_stderr, "displaced: couldn't find previous "
+                           "frame to set momentary breakpoint for "
+                           "sigreturn/rt_sigreturn\n");
+    }
+  else if (debug_displaced)
+    fprintf_unfiltered (gdb_stdlog, "displaced: found SVC call\n");
 
   /* Preparation: If we detect sigreturn, set momentary breakpoint at resume
                  location, else nothing.
      Insn: unmodified svc.
-     Cleanup: if pc lands in scratch space, pc <- insn_addr + 4
+     Cleanup: if pc lands in scratch space, pc <- insn_addr + insn_size
               else leave pc alone.  */
 
 
@@ -1100,8 +1105,7 @@ arm_linux_displaced_step_copy_insn (struct gdbarch *gdbarch,
                                    CORE_ADDR from, CORE_ADDR to,
                                    struct regcache *regs)
 {
-  struct displaced_step_closure *dsc
-    = xmalloc (sizeof (struct displaced_step_closure));
+  struct displaced_step_closure *dsc = XNEW (struct displaced_step_closure);
 
   /* Detect when we enter an (inaccessible by GDB) Linux kernel helper, and
      stop at the return location.  */
@@ -1175,7 +1179,7 @@ arm_stap_parse_special_token (struct gdbarch *gdbarch,
        return 0;
 
       len = tmp - start;
-      regname = alloca (len + 2);
+      regname = (char *) alloca (len + 2);
 
       offset = 0;
       if (isdigit (*start))
@@ -1261,13 +1265,13 @@ arm_canonicalize_syscall (int syscall)
   enum { sys_process_vm_writev = 377 };
 
   if (syscall <= gdb_sys_sched_getaffinity)
-    return syscall;
+    return (enum gdb_syscall) syscall;
   else if (syscall >= 243 && syscall <= 247)
-    return syscall + 2;
+    return (enum gdb_syscall) (syscall + 2);
   else if (syscall >= 248 && syscall <= 253)
-    return syscall + 4;
+    return (enum gdb_syscall) (syscall + 4);
 
-  return -1;
+  return gdb_sys_no_syscall;
 }
 
 /* Record all registers but PC register for process-record.  */
@@ -1299,7 +1303,7 @@ arm_linux_syscall_record (struct regcache *regcache, unsigned long svc_number)
 
   syscall_gdb = arm_canonicalize_syscall (svc_number);
 
-  if (syscall_gdb < 0)
+  if (syscall_gdb == gdb_sys_no_syscall)
     {
       printf_unfiltered (_("Process record and replay target doesn't "
                            "support syscall number %s\n"),
@@ -1440,8 +1444,6 @@ arm_linux_init_abi (struct gdbarch_info info,
     (gdbarch, arm_linux_iterate_over_regset_sections);
   set_gdbarch_core_read_description (gdbarch, arm_linux_core_read_description);
 
-  set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type);
-
   /* Displaced stepping.  */
   set_gdbarch_displaced_step_copy_insn (gdbarch,
                                        arm_linux_displaced_step_copy_insn);
This page took 0.027952 seconds and 4 git commands to generate.