* configure.host: Add arm*-*-openbsd*.
[deliverable/binutils-gdb.git] / gdb / cris-tdep.c
index 5a31b8ba2b8d042bf4a99b97eb8900b356138b45..206fe178f5d2f0f198d36fd2494c832d879768ea 100644 (file)
@@ -146,19 +146,32 @@ enum cris_regnums
 extern const struct cris_spec_reg cris_spec_regs[];
 
 /* CRIS version, set via the user command 'set cris-version'.  Affects
-   register names and sizes.*/
-static unsigned int usr_cmd_cris_version;
+   register names and sizes.  */
+static int usr_cmd_cris_version;
 
 /* Indicates whether to trust the above variable.  */
 static int usr_cmd_cris_version_valid = 0;
 
+static const char cris_mode_normal[] = "CRIS_MODE_NORMAL";
+static const char cris_mode_guru[] = "CRIS_MODE_GURU";
+static const char *cris_modes[] = {
+  cris_mode_normal,
+  cris_mode_guru,
+  0
+};
+
+/* CRIS mode, set via the user command 'set cris-mode'.  Affects
+   type of break instruction among other things.  */
+static const char *usr_cmd_cris_mode = cris_mode_normal;
+
 /* Whether to make use of Dwarf-2 CFI (default on).  */
 static int usr_cmd_cris_dwarf2_cfi = 1;
 
 /* CRIS architecture specific information.  */
 struct gdbarch_tdep
 {
-  unsigned int cris_version;
+  int cris_version;
+  const char *cris_mode;
   int cris_dwarf2_cfi;
 };
 
@@ -170,6 +183,12 @@ cris_version (void)
   return (gdbarch_tdep (current_gdbarch)->cris_version);
 }
 
+static const char *
+cris_mode (void)
+{
+  return (gdbarch_tdep (current_gdbarch)->cris_mode);
+}
+
 /* Sigtramp identification code copied from i386-linux-tdep.c.  */
 
 #define SIGTRAMP_INSN0    0x9c5f  /* movu.w 0xXX, $r9 */
@@ -283,7 +302,7 @@ cris_sigcontext_addr (struct frame_info *next_frame)
       return (sp + 156);
     }
 
-  error ("Couldn't recognize signal trampoline.");
+  error (_("Couldn't recognize signal trampoline."));
   return 0;
 }
 
@@ -456,7 +475,15 @@ crisv32_single_step_through_delay (struct gdbarch *gdbarch,
   int ret = 0;
   char buf[4];
 
-  frame_unwind_register (this_frame, ERP_REGNUM, buf);
+  if (cris_mode () == cris_mode_guru)
+    {
+      frame_unwind_register (this_frame, NRP_REGNUM, buf);
+    }
+  else
+    {
+      frame_unwind_register (this_frame, ERP_REGNUM, buf);
+    }
+
   erp = extract_unsigned_integer (buf, 4);
 
   if (erp & 0x1)
@@ -687,6 +714,9 @@ static void cris_dump_tdep (struct gdbarch *, struct ui_file *);
 static void set_cris_version (char *ignore_args, int from_tty, 
                              struct cmd_list_element *c);
 
+static void set_cris_mode (char *ignore_args, int from_tty, 
+                          struct cmd_list_element *c);
+
 static void set_cris_dwarf2_cfi (char *ignore_args, int from_tty, 
                                 struct cmd_list_element *c);
 
@@ -934,7 +964,7 @@ cris_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
       else if (len > (2 * 4))
         {
          /* FIXME */
-         internal_error (__FILE__, __LINE__, "We don't do this");
+         internal_error (__FILE__, __LINE__, _("We don't do this"));
         }
       else
         {
@@ -1394,10 +1424,14 @@ cris_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
 static const unsigned char *
 cris_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
 {
-  static unsigned char break_insn[] = {0x38, 0xe9};
+  static unsigned char break8_insn[] = {0x38, 0xe9};
+  static unsigned char break15_insn[] = {0x3f, 0xe9};
   *lenptr = 2;
 
-  return break_insn;
+  if (cris_mode () == cris_mode_guru)
+    return break15_insn;
+  else
+    return break8_insn;
 }
 
 /* Returns 1 if spec_reg is applicable to the current gdbarch's CRIS version,
@@ -1607,7 +1641,7 @@ crisv32_register_type (struct gdbarch *gdbarch, int regno)
     {
       /* Invalid (unimplemented) register.  Should not happen as there are
         no unimplemented CRISv32 registers.  */
-      warning ("crisv32_register_type: unknown regno %d", regno);
+      warning (_("crisv32_register_type: unknown regno %d"), regno);
       return builtin_type_int0;
     }
 }
@@ -1639,7 +1673,7 @@ cris_store_return_value (struct type *type, struct regcache *regcache,
       regcache_cooked_write_unsigned (regcache, ARG2_REGNUM, val);
     }
   else
-    error ("cris_store_return_value: type length too large.");
+    error (_("cris_store_return_value: type length too large."));
 }
 
 /* Return the name of register regno as a string. Return NULL for an invalid or
@@ -1759,7 +1793,7 @@ cris_dwarf2_reg_to_regnum (int reg)
     regnum = cris_dwarf_regmap[reg];
 
   if (regnum == -1)
-    warning ("Unmapped DWARF Register #%d encountered\n", reg);
+    warning (_("Unmapped DWARF Register #%d encountered."), reg);
 
   return regnum;
 }
@@ -1807,7 +1841,7 @@ cris_extract_return_value (struct type *type, struct regcache *regcache,
       store_unsigned_integer ((char *)valbuf + 4, len - 4, val);
     }
   else
-    error ("cris_extract_return_value: type length too large");
+    error (_("cris_extract_return_value: type length too large"));
 }
 
 /* Handle the CRIS return value convention.  */
@@ -2055,7 +2089,7 @@ cris_software_single_step (enum target_signal ignore, int insert_breakpoints)
         {
           /* Could not find a target.  Things are likely to go downhill 
             from here.  */
-         warning ("CRIS software single step could not find a step target.");
+         warning (_("CRIS software single step could not find a step target."));
         }
       else
         {
@@ -3832,7 +3866,7 @@ fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
       if (core_reg_size != sizeof (elf_gregset_t) 
          && core_reg_size != sizeof (crisv32_elf_gregset_t))
         {
-          warning ("wrong size gregset struct in core file");
+          warning (_("wrong size gregset struct in core file"));
         }
       else
         {
@@ -3916,20 +3950,33 @@ _initialize_cris_tdep (void)
   /* CRIS-specific user-commands.  */
   add_setshow_uinteger_cmd ("cris-version", class_support, 
                            &usr_cmd_cris_version, 
-                           "Set the current CRIS version.",
-                           "Show the current CRIS version.",
-                           "Set if autodetection fails.",
-                           "Current CRIS version is %s.",
-                           set_cris_version, NULL,
+                           _("Set the current CRIS version."),
+                           _("Show the current CRIS version."),
+                           _("\
+Set to 10 for CRISv10 or 32 for CRISv32 if autodetection fails.\n\
+Defaults to 10. "),
+                           set_cris_version,
+                           NULL, /* FIXME: i18n: Current CRIS version is %s.  */
                            &setlist, &showlist);
+
+  add_setshow_enum_cmd ("cris-mode", class_support, 
+                       cris_modes, &usr_cmd_cris_mode, 
+                       _("Set the current CRIS mode."),
+                       _("Show the current CRIS mode."),
+                       _("\
+Set to CRIS_MODE_GURU when debugging in guru mode.\n\
+Makes GDB use the NRP register instead of the ERP register in certain cases."),
+                       set_cris_mode,
+                       NULL, /* FIXME: i18n: Current CRIS version is %s.  */
+                       &setlist, &showlist);
   
   add_setshow_boolean_cmd ("cris-dwarf2-cfi", class_support,
                           &usr_cmd_cris_dwarf2_cfi,
-                          "Set the usage of Dwarf-2 CFI for CRIS.",
-                          "Show the usage of Dwarf-2 CFI for CRIS.",
-                          "Set to \"off\" if using gcc-cris < R59.",
-                          "Usage of Dwarf-2 CFI for CRIS is %d.",
-                          set_cris_dwarf2_cfi, NULL,
+                          _("Set the usage of Dwarf-2 CFI for CRIS."),
+                          _("Show the usage of Dwarf-2 CFI for CRIS."),
+                          _("Set this to \"off\" if using gcc-cris < R59."),
+                          set_cris_dwarf2_cfi,
+                          NULL, /* FIXME: i18n: Usage of Dwarf-2 CFI for CRIS is %d.  */
                           &setlist, &showlist);
 
   deprecated_add_core_fns (&cris_elf_core_fns);
@@ -3945,6 +3992,8 @@ cris_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
     {
       fprintf_unfiltered (file, "cris_dump_tdep: tdep->cris_version = %i\n",
                           tdep->cris_version);
+      fprintf_unfiltered (file, "cris_dump_tdep: tdep->cris_mode = %s\n",
+                          tdep->cris_mode);
       fprintf_unfiltered (file, "cris_dump_tdep: tdep->cris_dwarf2_cfi = %i\n",
                           tdep->cris_dwarf2_cfi);
     }
@@ -3958,6 +4007,19 @@ set_cris_version (char *ignore_args, int from_tty,
 
   usr_cmd_cris_version_valid = 1;
   
+  /* Update the current architecture, if needed.  */
+  gdbarch_info_init (&info);
+  if (!gdbarch_update_p (info))
+    internal_error (__FILE__, __LINE__, 
+                   _("cris_gdbarch_update: failed to update architecture."));
+}
+
+static void
+set_cris_mode (char *ignore_args, int from_tty, 
+              struct cmd_list_element *c)
+{
+  struct gdbarch_info info;
+
   /* Update the current architecture, if needed.  */
   gdbarch_info_init (&info);
   if (!gdbarch_update_p (info))
@@ -3975,7 +4037,7 @@ set_cris_dwarf2_cfi (char *ignore_args, int from_tty,
   gdbarch_info_init (&info);
   if (!gdbarch_update_p (info))
     internal_error (__FILE__, __LINE__, 
-                   "cris_gdbarch_update: failed to update architecture.");
+                   _("cris_gdbarch_update: failed to update architecture."));
 }
 
 static struct gdbarch *
@@ -4003,14 +4065,15 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Make the current settings visible to the user.  */
   usr_cmd_cris_version = cris_version;
   
-  /* Find a candidate among the list of pre-declared architectures.  Both
-     CRIS version and ABI must match.  */
+  /* Find a candidate among the list of pre-declared architectures.  */
   for (arches = gdbarch_list_lookup_by_info (arches, &info); 
        arches != NULL;
        arches = gdbarch_list_lookup_by_info (arches->next, &info))
     {
       if ((gdbarch_tdep (arches->gdbarch)->cris_version 
           == usr_cmd_cris_version)
+         && (gdbarch_tdep (arches->gdbarch)->cris_mode 
+          == usr_cmd_cris_mode)
          && (gdbarch_tdep (arches->gdbarch)->cris_dwarf2_cfi 
              == usr_cmd_cris_dwarf2_cfi))
         return arches->gdbarch;
@@ -4021,6 +4084,7 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   gdbarch = gdbarch_alloc (&info, tdep);
 
   tdep->cris_version = usr_cmd_cris_version;
+  tdep->cris_mode = usr_cmd_cris_mode;
   tdep->cris_dwarf2_cfi = usr_cmd_cris_dwarf2_cfi;
 
   /* INIT shall ensure that the INFO.BYTE_ORDER is non-zero.  */
@@ -4031,11 +4095,11 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       break;
 
     case BFD_ENDIAN_BIG:
-      internal_error (__FILE__, __LINE__, "cris_gdbarch_init: big endian byte order in info");
+      internal_error (__FILE__, __LINE__, _("cris_gdbarch_init: big endian byte order in info"));
       break;
     
     default:
-      internal_error (__FILE__, __LINE__, "cris_gdbarch_init: unknown byte order in info");
+      internal_error (__FILE__, __LINE__, _("cris_gdbarch_init: unknown byte order in info"));
     }
 
   set_gdbarch_return_value (gdbarch, cris_return_value);
@@ -4068,7 +4132,7 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     case 9:
       /* Old versions; not supported.  */
       internal_error (__FILE__, __LINE__, 
-                     "cris_gdbarch_init: unsupported CRIS version");
+                     _("cris_gdbarch_init: unsupported CRIS version"));
       break;
 
     case 10:
@@ -4110,7 +4174,7 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
     default:
       internal_error (__FILE__, __LINE__, 
-                     "cris_gdbarch_init: unknown CRIS version");
+                     _("cris_gdbarch_init: unknown CRIS version"));
     }
 
   /* Dummy frame functions (shared between CRISv10 and CRISv32 since they
@@ -4137,7 +4201,10 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
     }
 
-  frame_unwind_append_sniffer (gdbarch, cris_sigtramp_frame_sniffer);
+  if (tdep->cris_mode != cris_mode_guru)
+    {
+      frame_unwind_append_sniffer (gdbarch, cris_sigtramp_frame_sniffer);
+    }
 
   frame_unwind_append_sniffer (gdbarch, cris_frame_sniffer);
   frame_base_set_default (gdbarch, &cris_frame_base);
This page took 0.028301 seconds and 4 git commands to generate.