Don't update target_dcache if it is not initialized
[deliverable/binutils-gdb.git] / gdb / frv-tdep.c
index cf48dc66f7fed2978ba8c7b1ac857e9c9585108b..9819d42a361e9c3d5c1b7d9b0d320f9304f16de5 100644 (file)
@@ -1,7 +1,6 @@
 /* Target-dependent code for the Fujitsu FR-V, for GDB, the GNU Debugger.
 
-   Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009
-   Free Software Foundation, Inc.
+   Copyright (C) 2002-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -19,7 +18,7 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
-#include "gdb_string.h"
+#include <string.h>
 #include "inferior.h"
 #include "gdbcore.h"
 #include "arch-utils.h"
@@ -137,7 +136,6 @@ new_variant (void)
 {
   struct gdbarch_tdep *var;
   int r;
-  char buf[20];
 
   var = xmalloc (sizeof (*var));
   memset (var, 0, sizeof (*var));
@@ -235,7 +233,7 @@ set_variant_num_gprs (struct gdbarch_tdep *var, int num_gprs)
     {
       char buf[20];
 
-      sprintf (buf, "gr%d", r);
+      xsnprintf (buf, sizeof (buf), "gr%d", r);
       var->register_names[first_gpr_regnum + r] = xstrdup (buf);
     }
 }
@@ -254,7 +252,7 @@ set_variant_num_fprs (struct gdbarch_tdep *var, int num_fprs)
     {
       char buf[20];
 
-      sprintf (buf, "fr%d", r);
+      xsnprintf (buf, sizeof (buf), "fr%d", r);
       var->register_names[first_fpr_regnum + r] = xstrdup (buf);
     }
 }
@@ -264,7 +262,8 @@ set_variant_abi_fdpic (struct gdbarch_tdep *var)
 {
   var->frv_abi = FRV_ABI_FDPIC;
   var->register_names[fdpic_loadmap_exec_regnum] = xstrdup ("loadmap_exec");
-  var->register_names[fdpic_loadmap_interp_regnum] = xstrdup ("loadmap_interp");
+  var->register_names[fdpic_loadmap_interp_regnum]
+    = xstrdup ("loadmap_interp");
 }
 
 static void
@@ -294,19 +293,22 @@ frv_register_type (struct gdbarch *gdbarch, int reg)
   if (reg >= first_fpr_regnum && reg <= last_fpr_regnum)
     return builtin_type (gdbarch)->builtin_float;
   else if (reg == iacc0_regnum)
-    return builtin_type_int64;
+    return builtin_type (gdbarch)->builtin_int64;
   else
-    return builtin_type_int32;
+    return builtin_type (gdbarch)->builtin_int32;
 }
 
-static void
+static enum register_status
 frv_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
                           int reg, gdb_byte *buffer)
 {
+  enum register_status status;
+
   if (reg == iacc0_regnum)
     {
-      regcache_raw_read (regcache, iacc0h_regnum, buffer);
-      regcache_raw_read (regcache, iacc0l_regnum, (bfd_byte *) buffer + 4);
+      status = regcache_raw_read (regcache, iacc0h_regnum, buffer);
+      if (status == REG_VALID)
+       status = regcache_raw_read (regcache, iacc0l_regnum, (bfd_byte *) buffer + 4);
     }
   else if (accg0_regnum <= reg && reg <= accg7_regnum)
     {
@@ -315,14 +317,22 @@ frv_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
 
       int raw_regnum = accg0123_regnum + (reg - accg0_regnum) / 4;
       int byte_num = (reg - accg0_regnum) % 4;
-      bfd_byte buf[4];
+      gdb_byte buf[4];
 
-      regcache_raw_read (regcache, raw_regnum, buf);
-      memset (buffer, 0, 4);
-      /* FR-V is big endian, so put the requested byte in the first byte
-         of the buffer allocated to hold the pseudo-register.  */
-      ((bfd_byte *) buffer)[0] = buf[byte_num];
+      status = regcache_raw_read (regcache, raw_regnum, buf);
+      if (status == REG_VALID)
+       {
+         memset (buffer, 0, 4);
+         /* FR-V is big endian, so put the requested byte in the
+            first byte of the buffer allocated to hold the
+            pseudo-register.  */
+         buffer[0] = buf[byte_num];
+       }
     }
+  else
+    gdb_assert_not_reached ("invalid pseudo register number");
+
+  return status;
 }
 
 static void
@@ -341,7 +351,7 @@ frv_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
 
       int raw_regnum = accg0123_regnum + (reg - accg0_regnum) / 4;
       int byte_num = (reg - accg0_regnum) % 4;
-      char buf[4];
+      gdb_byte buf[4];
 
       regcache_raw_read (regcache, raw_regnum, buf);
       buf[byte_num] = ((bfd_byte *) buffer)[0];
@@ -443,10 +453,10 @@ frv_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
 
   /* Find the end of the previous packing sequence.  This will be indicated
      by either attempting to access some inaccessible memory or by finding
-     an instruction word whose packing bit is set to one. */
+     an instruction word whose packing bit is set to one.  */
   while (count-- > 0 && addr >= func_start)
     {
-      char instr[frv_instr_size];
+      gdb_byte instr[frv_instr_size];
       int status;
 
       status = target_read_memory (addr, instr, sizeof instr);
@@ -514,6 +524,8 @@ frv_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
                      struct frame_info *this_frame,
                       struct frv_unwind_cache *info)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+
   /* When writing out instruction bitpatterns, we use the following
      letters to label instruction fields:
      P - The parallel bit.  We don't use this.
@@ -534,7 +546,7 @@ frv_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
      the stack pointer to frame pointer: fp = sp + fp_offset.  */
   int fp_offset = 0;
 
-  /* Total size of frame prior to any alloca operations. */
+  /* Total size of frame prior to any alloca operations.  */
   int framesize = 0;
 
   /* Flag indicating if lr has been saved on the stack.  */
@@ -557,7 +569,7 @@ frv_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
   /* The address of the most recently scanned prologue instruction.  */
   CORE_ADDR last_prologue_pc;
 
-  /* The address of the next instruction. */
+  /* The address of the next instruction.  */
   CORE_ADDR next_pc;
 
   /* The upper bound to of the pc values to scan.  */
@@ -590,12 +602,12 @@ frv_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
   /* Scan the prologue.  */
   while (pc < lim_pc)
     {
-      char buf[frv_instr_size];
+      gdb_byte buf[frv_instr_size];
       LONGEST op;
 
       if (target_read_memory (pc, buf, sizeof buf) != 0)
        break;
-      op = extract_signed_integer (buf, sizeof buf);
+      op = extract_signed_integer (buf, sizeof buf, byte_order);
 
       next_pc = pc + 4;
 
@@ -952,7 +964,8 @@ frv_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
 
       /* If LR was saved on the stack, record its location.  */
       if (lr_saved_on_stack)
-       info->saved_regs[lr_regnum].addr = this_base - fp_offset + lr_sp_offset;
+       info->saved_regs[lr_regnum].addr
+         = this_base - fp_offset + lr_sp_offset;
 
       /* The call instruction moves the caller's PC in the callee's LR.
         Since this is an unwind, do the reverse.  Copy the location of LR
@@ -1007,19 +1020,20 @@ frv_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 static CORE_ADDR
 frv_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   gdb_byte buf[4];
   unsigned long op;
   CORE_ADDR orig_pc = pc;
 
   if (target_read_memory (pc, buf, 4))
     return pc;
-  op = extract_unsigned_integer (buf, 4);
+  op = extract_unsigned_integer (buf, 4, byte_order);
 
   /* In PIC code, GR15 may be loaded from some offset off of FP prior
      to the call instruction.
      
      Skip over this instruction if present.  It won't be present in
-     non-PIC code, and even in PIC code, it might not be present. 
+     non-PIC code, and even in PIC code, it might not be present.
      (This is due to the fact that GR15, the FDPIC register, already
      contains the correct value.)
 
@@ -1041,7 +1055,7 @@ frv_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
       pc += 4;
       if (target_read_memory (pc, buf, 4))
        return orig_pc;
-      op = extract_unsigned_integer (buf, 4);
+      op = extract_unsigned_integer (buf, 4, byte_order);
     }
 
   /* The format of an FRV CALL instruction is as follows:
@@ -1058,7 +1072,7 @@ frv_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
     {
       LONGEST displ;
       CORE_ADDR call_dest;
-      struct minimal_symbol *s;
+      struct bound_minimal_symbol s;
 
       displ = ((op & 0xfe000000) >> 7) | (op & 0x0003ffff);
       if ((displ & 0x00800000) != 0)
@@ -1067,9 +1081,9 @@ frv_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
       call_dest = pc + 4 * displ;
       s = lookup_minimal_symbol_by_pc (call_dest);
 
-      if (s != NULL
-          && SYMBOL_LINKAGE_NAME (s) != NULL
-         && strcmp (SYMBOL_LINKAGE_NAME (s), "__main") == 0)
+      if (s.minsym != NULL
+          && SYMBOL_LINKAGE_NAME (s.minsym) != NULL
+         && strcmp (SYMBOL_LINKAGE_NAME (s.minsym), "__main") == 0)
        {
          pc += 4;
          return pc;
@@ -1084,8 +1098,6 @@ frv_frame_unwind_cache (struct frame_info *this_frame,
                         void **this_prologue_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  CORE_ADDR pc;
-  ULONGEST this_base;
   struct frv_unwind_cache *info;
 
   if ((*this_prologue_cache))
@@ -1106,24 +1118,28 @@ static void
 frv_extract_return_value (struct type *type, struct regcache *regcache,
                           gdb_byte *valbuf)
 {
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int len = TYPE_LENGTH (type);
 
   if (len <= 4)
     {
       ULONGEST gpr8_val;
       regcache_cooked_read_unsigned (regcache, 8, &gpr8_val);
-      store_unsigned_integer (valbuf, len, gpr8_val);
+      store_unsigned_integer (valbuf, len, byte_order, gpr8_val);
     }
   else if (len == 8)
     {
       ULONGEST regval;
+
       regcache_cooked_read_unsigned (regcache, 8, &regval);
-      store_unsigned_integer (valbuf, 4, regval);
+      store_unsigned_integer (valbuf, 4, byte_order, regval);
       regcache_cooked_read_unsigned (regcache, 9, &regval);
-      store_unsigned_integer ((bfd_byte *) valbuf + 4, 4, regval);
+      store_unsigned_integer ((bfd_byte *) valbuf + 4, 4, byte_order, regval);
     }
   else
-    internal_error (__FILE__, __LINE__, _("Illegal return value length: %d"), len);
+    internal_error (__FILE__, __LINE__,
+                   _("Illegal return value length: %d"), len);
 }
 
 static CORE_ADDR
@@ -1136,8 +1152,9 @@ frv_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
 static CORE_ADDR
 find_func_descr (struct gdbarch *gdbarch, CORE_ADDR entry_point)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR descr;
-  char valbuf[4];
+  gdb_byte valbuf[4];
   CORE_ADDR start_addr;
 
   /* If we can't find the function in the symbol table, then we assume
@@ -1155,9 +1172,9 @@ find_func_descr (struct gdbarch *gdbarch, CORE_ADDR entry_point)
      the stack.  */
 
   descr = value_as_long (value_allocate_space_in_inferior (8));
-  store_unsigned_integer (valbuf, 4, entry_point);
+  store_unsigned_integer (valbuf, 4, byte_order, entry_point);
   write_memory (descr, valbuf, 4);
-  store_unsigned_integer (valbuf, 4,
+  store_unsigned_integer (valbuf, 4, byte_order,
                           frv_fdpic_find_global_pointer (entry_point));
   write_memory (descr + 4, valbuf, 4);
   return descr;
@@ -1167,11 +1184,12 @@ static CORE_ADDR
 frv_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr,
                                 struct target_ops *targ)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR entry_point;
   CORE_ADDR got_address;
 
-  entry_point = get_target_memory_unsigned (targ, addr, 4);
-  got_address = get_target_memory_unsigned (targ, addr + 4, 4);
+  entry_point = get_target_memory_unsigned (targ, addr, 4, byte_order);
+  got_address = get_target_memory_unsigned (targ, addr + 4, 4, byte_order);
 
   if (got_address == frv_fdpic_find_global_pointer (entry_point))
     return entry_point;
@@ -1185,10 +1203,11 @@ frv_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                      int nargs, struct value **args, CORE_ADDR sp,
                     int struct_return, CORE_ADDR struct_addr)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int argreg;
   int argnum;
-  char *val;
-  char valbuf[4];
+  const gdb_byte *val;
+  gdb_byte valbuf[4];
   struct value *arg;
   struct type *arg_type;
   int len;
@@ -1212,7 +1231,7 @@ frv_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   if (stack_space > 0)
     sp -= stack_space;
 
-  /* Make sure stack is dword aligned. */
+  /* Make sure stack is dword aligned.  */
   sp = align_down (sp, 8);
 
   stack_offset = 0;
@@ -1232,7 +1251,8 @@ frv_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
       if (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)
        {
-         store_unsigned_integer (valbuf, 4, value_address (arg));
+         store_unsigned_integer (valbuf, 4, byte_order,
+                                 value_address (arg));
          typecode = TYPE_CODE_PTR;
          len = 4;
          val = valbuf;
@@ -1244,18 +1264,17 @@ frv_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
        {
          /* The FDPIC ABI requires function descriptors to be passed instead
             of entry points.  */
-         store_unsigned_integer
-           (valbuf, 4,
-            find_func_descr (gdbarch,
-                             extract_unsigned_integer (value_contents (arg),
-                                                       4)));
+         CORE_ADDR addr = extract_unsigned_integer
+                            (value_contents (arg), 4, byte_order);
+         addr = find_func_descr (gdbarch, addr);
+         store_unsigned_integer (valbuf, 4, byte_order, addr);
          typecode = TYPE_CODE_PTR;
          len = 4;
          val = valbuf;
        }
       else
        {
-         val = (char *) value_contents (arg);
+         val = value_contents (arg);
        }
 
       while (len > 0)
@@ -1264,7 +1283,7 @@ frv_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
          if (argreg < 14)
            {
-             regval = extract_unsigned_integer (val, partial_len);
+             regval = extract_unsigned_integer (val, partial_len, byte_order);
 #if 0
              printf("  Argnum %d data %x -> reg %d\n",
                     argnum, (int) regval, argreg);
@@ -1276,7 +1295,8 @@ frv_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
            {
 #if 0
              printf("  Argnum %d data %x -> offset %d (%x)\n",
-                    argnum, *((int *)val), stack_offset, (int) (sp + stack_offset));
+                    argnum, *((int *)val), stack_offset,
+                    (int) (sp + stack_offset));
 #endif
              write_memory (sp + stack_offset, val, partial_len);
              stack_offset += align_up (partial_len, 4);
@@ -1328,7 +1348,7 @@ frv_store_return_value (struct type *type, struct regcache *regcache,
 }
 
 static enum return_value_convention
-frv_return_value (struct gdbarch *gdbarch, struct type *func_type,
+frv_return_value (struct gdbarch *gdbarch, struct value *function,
                  struct type *valtype, struct regcache *regcache,
                  gdb_byte *readbuf, const gdb_byte *writebuf)
 {
@@ -1354,72 +1374,6 @@ frv_return_value (struct gdbarch *gdbarch, struct type *func_type,
     return RETURN_VALUE_REGISTER_CONVENTION;
 }
 
-
-/* Hardware watchpoint / breakpoint support for the FR500
-   and FR400.  */
-
-int
-frv_check_watch_resources (struct gdbarch *gdbarch, int type, int cnt, int ot)
-{
-  struct gdbarch_tdep *var = gdbarch_tdep (gdbarch);
-
-  /* Watchpoints not supported on simulator.  */
-  if (strcmp (target_shortname, "sim") == 0)
-    return 0;
-
-  if (type == bp_hardware_breakpoint)
-    {
-      if (var->num_hw_breakpoints == 0)
-       return 0;
-      else if (cnt <= var->num_hw_breakpoints)
-       return 1;
-    }
-  else
-    {
-      if (var->num_hw_watchpoints == 0)
-       return 0;
-      else if (ot)
-       return -1;
-      else if (cnt <= var->num_hw_watchpoints)
-       return 1;
-    }
-  return -1;
-}
-
-
-int
-frv_stopped_data_address (CORE_ADDR *addr_p)
-{
-  struct frame_info *frame = get_current_frame ();
-  CORE_ADDR brr, dbar0, dbar1, dbar2, dbar3;
-
-  brr = get_frame_register_unsigned (frame, brr_regnum);
-  dbar0 = get_frame_register_unsigned (frame, dbar0_regnum);
-  dbar1 = get_frame_register_unsigned (frame, dbar1_regnum);
-  dbar2 = get_frame_register_unsigned (frame, dbar2_regnum);
-  dbar3 = get_frame_register_unsigned (frame, dbar3_regnum);
-
-  if (brr & (1<<11))
-    *addr_p = dbar0;
-  else if (brr & (1<<10))
-    *addr_p = dbar1;
-  else if (brr & (1<<9))
-    *addr_p = dbar2;
-  else if (brr & (1<<8))
-    *addr_p = dbar3;
-  else
-    return 0;
-
-  return 1;
-}
-
-int
-frv_have_stopped_data_address (void)
-{
-  CORE_ADDR addr = 0;
-  return frv_stopped_data_address (&addr);
-}
-
 static CORE_ADDR
 frv_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
 {
@@ -1470,6 +1424,7 @@ frv_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind frv_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   frv_frame_this_id,
   frv_frame_prev_register,
   NULL,
This page took 0.031013 seconds and 4 git commands to generate.