Add assembler and disassembler support for the new Armv8.4-a registers for AArch64.
[deliverable/binutils-gdb.git] / gdb / rx-tdep.c
index 8442c765f89ea5a938c8a0354bf3a7b97fa3e001..7d0436c33f37ba209a8887f478fecbb3f51fb22b 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for the Renesas RX for GDB, the GNU debugger.
 
-   Copyright (C) 2008-2015 Free Software Foundation, Inc.
+   Copyright (C) 2008-2017 Free Software Foundation, Inc.
 
    Contributed by Red Hat, Inc.
 
@@ -36,6 +36,7 @@
 
 #include "elf/rx.h"
 #include "elf-bfd.h"
+#include <algorithm>
 
 /* Certain important register numbers.  */
 enum
@@ -149,6 +150,66 @@ rx_register_name (struct gdbarch *gdbarch, int regnr)
   return reg_names[regnr];
 }
 
+/* Construct the flags type for PSW and BPSW.  */
+
+static struct type *
+rx_psw_type (struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  if (tdep->rx_psw_type == NULL)
+    {
+      tdep->rx_psw_type = arch_flags_type (gdbarch, "rx_psw_type", 32);
+      append_flags_type_flag (tdep->rx_psw_type, 0, "C");
+      append_flags_type_flag (tdep->rx_psw_type, 1, "Z");
+      append_flags_type_flag (tdep->rx_psw_type, 2, "S");
+      append_flags_type_flag (tdep->rx_psw_type, 3, "O");
+      append_flags_type_flag (tdep->rx_psw_type, 16, "I");
+      append_flags_type_flag (tdep->rx_psw_type, 17, "U");
+      append_flags_type_flag (tdep->rx_psw_type, 20, "PM");
+      append_flags_type_flag (tdep->rx_psw_type, 24, "IPL0");
+      append_flags_type_flag (tdep->rx_psw_type, 25, "IPL1");
+      append_flags_type_flag (tdep->rx_psw_type, 26, "IPL2");
+      append_flags_type_flag (tdep->rx_psw_type, 27, "IPL3");
+    }
+  return tdep->rx_psw_type;
+}
+
+/* Construct flags type for FPSW.  */
+
+static struct type *
+rx_fpsw_type (struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  if (tdep->rx_fpsw_type == NULL)
+    {
+      tdep->rx_fpsw_type = arch_flags_type (gdbarch, "rx_fpsw_type", 32);
+      append_flags_type_flag (tdep->rx_fpsw_type, 0, "RM0");
+      append_flags_type_flag (tdep->rx_fpsw_type, 1, "RM1");
+      append_flags_type_flag (tdep->rx_fpsw_type, 2, "CV");
+      append_flags_type_flag (tdep->rx_fpsw_type, 3, "CO");
+      append_flags_type_flag (tdep->rx_fpsw_type, 4, "CZ");
+      append_flags_type_flag (tdep->rx_fpsw_type, 5, "CU");
+      append_flags_type_flag (tdep->rx_fpsw_type, 6, "CX");
+      append_flags_type_flag (tdep->rx_fpsw_type, 7, "CE");
+      append_flags_type_flag (tdep->rx_fpsw_type, 8, "DN");
+      append_flags_type_flag (tdep->rx_fpsw_type, 10, "EV");
+      append_flags_type_flag (tdep->rx_fpsw_type, 11, "EO");
+      append_flags_type_flag (tdep->rx_fpsw_type, 12, "EZ");
+      append_flags_type_flag (tdep->rx_fpsw_type, 13, "EU");
+      append_flags_type_flag (tdep->rx_fpsw_type, 14, "EX");
+      append_flags_type_flag (tdep->rx_fpsw_type, 26, "FV");
+      append_flags_type_flag (tdep->rx_fpsw_type, 27, "FO");
+      append_flags_type_flag (tdep->rx_fpsw_type, 28, "FZ");
+      append_flags_type_flag (tdep->rx_fpsw_type, 29, "FU");
+      append_flags_type_flag (tdep->rx_fpsw_type, 30, "FX");
+      append_flags_type_flag (tdep->rx_fpsw_type, 31, "FS");
+    }
+
+  return tdep->rx_fpsw_type;
+}
+
 /* Implement the "register_type" gdbarch method.  */
 static struct type *
 rx_register_type (struct gdbarch *gdbarch, int reg_nr)
@@ -158,9 +219,9 @@ rx_register_type (struct gdbarch *gdbarch, int reg_nr)
   if (reg_nr == RX_PC_REGNUM)
     return builtin_type (gdbarch)->builtin_func_ptr;
   else if (reg_nr == RX_PSW_REGNUM || reg_nr == RX_BPSW_REGNUM)
-    return tdep->rx_psw_type;
+    return rx_psw_type (gdbarch);
   else if (reg_nr == RX_FPSW_REGNUM)
-    return tdep->rx_fpsw_type;
+    return rx_fpsw_type (gdbarch);
   else if (reg_nr == RX_ACC_REGNUM)
     return builtin_type (gdbarch)->builtin_unsigned_long_long;
   else
@@ -169,7 +230,7 @@ rx_register_type (struct gdbarch *gdbarch, int reg_nr)
 
 
 /* Function for finding saved registers in a 'struct pv_area'; this
-   function is passed to pv_area_scan.
+   function is passed to pv_area::scan.
 
    If VALUE is a saved register, ADDR says it was saved at a constant
    offset from the frame base, and SIZE indicates that the whole
@@ -200,11 +261,12 @@ struct rx_get_opcode_byte_handle
 static int
 rx_get_opcode_byte (void *handle)
 {
-  struct rx_get_opcode_byte_handle *opcdata = handle;
+  struct rx_get_opcode_byte_handle *opcdata
+    = (struct rx_get_opcode_byte_handle *) handle;
   int status;
   gdb_byte byte;
 
-  status = target_read_memory (opcdata->pc, &byte, 1);
+  status = target_read_code (opcdata->pc, &byte, 1);
   if (status == 0)
     {
       opcdata->pc += 1;
@@ -225,8 +287,6 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
   CORE_ADDR pc, next_pc;
   int rn;
   pv_t reg[RX_NUM_REGS];
-  struct pv_area *stack;
-  struct cleanup *back_to;
   CORE_ADDR after_last_frame_setup_insn = start_pc;
 
   memset (result, 0, sizeof (*result));
@@ -239,8 +299,7 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
       result->reg_offset[rn] = 1;
     }
 
-  stack = make_pv_area (RX_SP_REGNUM, gdbarch_addr_bit (target_gdbarch ()));
-  back_to = make_cleanup_free_pv_area (stack);
+  pv_area stack (RX_SP_REGNUM, gdbarch_addr_bit (target_gdbarch ()));
 
   if (frame_type == RX_FRAME_TYPE_FAST_INTERRUPT)
     {
@@ -256,13 +315,13 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
       if (frame_type == RX_FRAME_TYPE_EXCEPTION)
        {
          reg[RX_SP_REGNUM] = pv_add_constant (reg[RX_SP_REGNUM], -4);
-         pv_area_store (stack, reg[RX_SP_REGNUM], 4, reg[RX_PSW_REGNUM]);
+         stack.store (reg[RX_SP_REGNUM], 4, reg[RX_PSW_REGNUM]);
        }
 
       /* The call instruction (or an exception/interrupt) has saved the return
           address on the stack.  */
       reg[RX_SP_REGNUM] = pv_add_constant (reg[RX_SP_REGNUM], -4);
-      pv_area_store (stack, reg[RX_SP_REGNUM], 4, reg[RX_PC_REGNUM]);
+      stack.store (reg[RX_SP_REGNUM], 4, reg[RX_PC_REGNUM]);
 
     }
 
@@ -291,7 +350,7 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
          for (r = r2; r >= r1; r--)
            {
              reg[RX_SP_REGNUM] = pv_add_constant (reg[RX_SP_REGNUM], -4);
-             pv_area_store (stack, reg[RX_SP_REGNUM], 4, reg[r]);
+             stack.store (reg[RX_SP_REGNUM], 4, reg[r]);
            }
          after_last_frame_setup_insn = next_pc;
        }
@@ -318,7 +377,7 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
 
          rsrc = opc.op[1].reg;
          reg[RX_SP_REGNUM] = pv_add_constant (reg[RX_SP_REGNUM], -4);
-         pv_area_store (stack, reg[RX_SP_REGNUM], 4, reg[rsrc]);
+         stack.store (reg[RX_SP_REGNUM], 4, reg[rsrc]);
          after_last_frame_setup_insn = next_pc;
        }
       else if (opc.id == RXO_add       /* add #const, rsrc, rdst */
@@ -394,11 +453,9 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
     }
 
   /* Record where all the registers were saved.  */
-  pv_area_scan (stack, check_for_saved, (void *) result);
+  stack.scan (check_for_saved, (void *) result);
 
   result->prologue_end = after_last_frame_setup_insn;
-
-  do_cleanups (back_to);
 }
 
 
@@ -445,10 +502,10 @@ rx_analyze_frame_prologue (struct frame_info *this_frame,
        stop_addr = func_start;
 
       rx_analyze_prologue (func_start, stop_addr, frame_type,
-                           *this_prologue_cache);
+                          (struct rx_prologue *) *this_prologue_cache);
     }
 
-  return *this_prologue_cache;
+  return (struct rx_prologue *) *this_prologue_cache;
 }
 
 /* Determine type of frame by scanning the function for a return
@@ -469,7 +526,7 @@ rx_frame_type (struct frame_info *this_frame, void **this_cache)
 
   if (*this_cache != NULL)
     {
-      struct rx_prologue *p = *this_cache;
+      struct rx_prologue *p = (struct rx_prologue *) *this_cache;
 
       return p->frame_type;
     }
@@ -643,7 +700,7 @@ rx_frame_sniffer_common (const struct frame_unwind *self,
     }
   else
     {
-      struct rx_prologue *p = *this_cache;
+      struct rx_prologue *p = (struct rx_prologue *) *this_cache;
 
       return sniff_p (p->frame_type);
     }
@@ -812,7 +869,8 @@ rx_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                                                struct_addr);
            }
          else if (TYPE_CODE (arg_type) != TYPE_CODE_STRUCT
-                  && TYPE_CODE (arg_type) != TYPE_CODE_UNION)
+                  && TYPE_CODE (arg_type) != TYPE_CODE_UNION
+                  && arg_size <= 8)
            {
              /* Argument is a scalar.  */
              if (arg_size == 8)
@@ -895,7 +953,7 @@ rx_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                      && arg_size <= 4 * (RX_R4_REGNUM - arg_reg + 1)
                      && arg_size % 4 == 0)
                    {
-                     int len = min (arg_size, 4);
+                     int len = std::min (arg_size, (ULONGEST) 4);
 
                      if (write_pass)
                        regcache_cooked_write_unsigned (regcache, arg_reg,
@@ -958,7 +1016,7 @@ rx_return_value (struct gdbarch *gdbarch,
 
       while (valtype_len > 0)
        {
-         int len = min (valtype_len, 4);
+         int len = std::min (valtype_len, (ULONGEST) 4);
 
          regcache_cooked_read_unsigned (regcache, argreg, &u);
          store_unsigned_integer (readbuf + offset, len, byte_order, u);
@@ -976,7 +1034,7 @@ rx_return_value (struct gdbarch *gdbarch,
 
       while (valtype_len > 0)
        {
-         int len = min (valtype_len, 4);
+         int len = std::min (valtype_len, (ULONGEST) 4);
 
          u = extract_unsigned_integer (writebuf + offset, len, byte_order);
          regcache_cooked_write_unsigned (regcache, argreg, u);
@@ -989,14 +1047,9 @@ rx_return_value (struct gdbarch *gdbarch,
   return RETURN_VALUE_REGISTER_CONVENTION;
 }
 
-/* Implement the "breakpoint_from_pc" gdbarch method.  */
-static const gdb_byte *
-rx_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
-{
-  static gdb_byte breakpoint[] = { 0x00 };
-  *lenptr = sizeof breakpoint;
-  return breakpoint;
-}
+constexpr gdb_byte rx_break_insn[] = { 0x00 };
+
+typedef BP_MANIPULATION (rx_break_insn) rx_breakpoint;
 
 /* Implement the dwarf_reg_to_regnum" gdbarch method.  */
 
@@ -1010,9 +1063,7 @@ rx_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
   else if (reg == 17)
     return RX_PC_REGNUM;
   else
-    internal_error (__FILE__, __LINE__,
-                    _("Undefined dwarf2 register mapping of reg %d"),
-                   reg);
+    return -1;
 }
 
 /* Allocate and initialize a gdbarch object.  */
@@ -1045,49 +1096,10 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* None found, create a new architecture from the information
      provided.  */
-  tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
+  tdep = XCNEW (struct gdbarch_tdep);
   gdbarch = gdbarch_alloc (&info, tdep);
   tdep->elf_flags = elf_flags;
 
-  /* Initialize the flags type for PSW and BPSW.  */
-
-  tdep->rx_psw_type = arch_flags_type (gdbarch, "rx_psw_type", 4);
-  append_flags_type_flag (tdep->rx_psw_type, 0, "C");
-  append_flags_type_flag (tdep->rx_psw_type, 1, "Z");
-  append_flags_type_flag (tdep->rx_psw_type, 2, "S");
-  append_flags_type_flag (tdep->rx_psw_type, 3, "O");
-  append_flags_type_flag (tdep->rx_psw_type, 16, "I");
-  append_flags_type_flag (tdep->rx_psw_type, 17, "U");
-  append_flags_type_flag (tdep->rx_psw_type, 20, "PM");
-  append_flags_type_flag (tdep->rx_psw_type, 24, "IPL0");
-  append_flags_type_flag (tdep->rx_psw_type, 25, "IPL1");
-  append_flags_type_flag (tdep->rx_psw_type, 26, "IPL2");
-  append_flags_type_flag (tdep->rx_psw_type, 27, "IPL3");
-
-  /* Initialize flags type for FPSW.  */
-
-  tdep->rx_fpsw_type = arch_flags_type (gdbarch, "rx_fpsw_type", 4);
-  append_flags_type_flag (tdep->rx_fpsw_type, 0, "RM0");
-  append_flags_type_flag (tdep->rx_fpsw_type, 1, "RM1");
-  append_flags_type_flag (tdep->rx_fpsw_type, 2, "CV");
-  append_flags_type_flag (tdep->rx_fpsw_type, 3, "CO");
-  append_flags_type_flag (tdep->rx_fpsw_type, 4, "CZ");
-  append_flags_type_flag (tdep->rx_fpsw_type, 5, "CU");
-  append_flags_type_flag (tdep->rx_fpsw_type, 6, "CX");
-  append_flags_type_flag (tdep->rx_fpsw_type, 7, "CE");
-  append_flags_type_flag (tdep->rx_fpsw_type, 8, "DN");
-  append_flags_type_flag (tdep->rx_fpsw_type, 10, "EV");
-  append_flags_type_flag (tdep->rx_fpsw_type, 11, "EO");
-  append_flags_type_flag (tdep->rx_fpsw_type, 12, "EZ");
-  append_flags_type_flag (tdep->rx_fpsw_type, 13, "EU");
-  append_flags_type_flag (tdep->rx_fpsw_type, 14, "EX");
-  append_flags_type_flag (tdep->rx_fpsw_type, 26, "FV");
-  append_flags_type_flag (tdep->rx_fpsw_type, 27, "FO");
-  append_flags_type_flag (tdep->rx_fpsw_type, 28, "FZ");
-  append_flags_type_flag (tdep->rx_fpsw_type, 29, "FU");
-  append_flags_type_flag (tdep->rx_fpsw_type, 30, "FX");
-  append_flags_type_flag (tdep->rx_fpsw_type, 31, "FS");
-
   set_gdbarch_num_regs (gdbarch, RX_NUM_REGS);
   set_gdbarch_num_pseudo_regs (gdbarch, 0);
   set_gdbarch_register_name (gdbarch, rx_register_name);
@@ -1096,11 +1108,10 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_sp_regnum (gdbarch, RX_SP_REGNUM);
   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
   set_gdbarch_decr_pc_after_break (gdbarch, 1);
-  set_gdbarch_breakpoint_from_pc (gdbarch, rx_breakpoint_from_pc);
+  set_gdbarch_breakpoint_kind_from_pc (gdbarch, rx_breakpoint::kind_from_pc);
+  set_gdbarch_sw_breakpoint_from_kind (gdbarch, rx_breakpoint::bp_from_kind);
   set_gdbarch_skip_prologue (gdbarch, rx_skip_prologue);
 
-  set_gdbarch_print_insn (gdbarch, print_insn_rx);
-
   set_gdbarch_unwind_pc (gdbarch, rx_unwind_pc);
   set_gdbarch_unwind_sp (gdbarch, rx_unwind_sp);
 
@@ -1149,9 +1160,6 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   return gdbarch;
 }
 
-/* -Wmissing-prototypes */
-extern initialize_file_ftype _initialize_rx_tdep;
-
 /* Register the above initialization routine.  */
 
 void
This page took 0.033839 seconds and 4 git commands to generate.