Initial x32 support in gold
[deliverable/binutils-gdb.git] / gdb / h8300-tdep.c
index d68c5ed42c513f83b8529e394da16439e9aa6024..aa056f9548c8f56481d750ddc8ed41967515a951 100644 (file)
@@ -1,8 +1,7 @@
 /* Target-machine dependent code for Renesas H8/300, for GDB.
 
-   Copyright (C) 1988, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
-   2000, 2001, 2002, 2003, 2005, 2007, 2008, 2009
-   Free Software Foundation, Inc.
+   Copyright (C) 1988, 1990-1996, 1998-2003, 2005, 2007-2012 Free
+   Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -71,7 +70,7 @@ struct h8300_frame_cache
   CORE_ADDR sp_offset;
   CORE_ADDR pc;
 
-  /* Flag showing that a frame has been created in the prologue code. */
+  /* Flag showing that a frame has been created in the prologue code.  */
   int uses_fp;
 
   /* Saved registers.  */
@@ -147,7 +146,7 @@ h8300_init_frame_cache (struct gdbarch *gdbarch,
 #define IS_MOVW_Rn16_SP(x)     (((x) & 0xfff0) == 0x6fe0)
 #define IS_MOVW_EXT(x)         ((x) == 0x78e0)
 #define IS_MOVW_Rn24_SP(x)     (((x) & 0xfff0) == 0x6ba0)
-/* Same instructions as mov.w, just prefixed with 0x0100 */
+/* Same instructions as mov.w, just prefixed with 0x0100 */
 #define IS_MOVL_PRE(x)         ((x) == 0x0100)
 #define IS_MOVL_Rn16_SP(x)     (((x) & 0xfff0) == 0x6fe0)
 #define IS_MOVL_EXT(x)         ((x) == 0x78e0)
@@ -178,9 +177,10 @@ h8300_init_frame_cache (struct gdbarch *gdbarch,
    is used, it could be a byte, word or long move to registers r3-r5.  */
 
 static int
-h8300_is_argument_spill (CORE_ADDR pc)
+h8300_is_argument_spill (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  int w = read_memory_unsigned_integer (pc, 2);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  int w = read_memory_unsigned_integer (pc, 2, byte_order);
 
   if ((IS_MOVB_RnRm (w) || IS_MOVW_RnRm (w) || IS_MOVL_RnRm (w))
       && (w & 0x70) <= 0x20    /* Rs is R0, R1 or R2 */
@@ -190,14 +190,16 @@ h8300_is_argument_spill (CORE_ADDR pc)
   if (IS_MOVB_Rn16_SP (w)
       && 8 <= (w & 0xf) && (w & 0xf) <= 10)    /* Rs is R0L, R1L, or R2L  */
     {
-      if (read_memory_integer (pc + 2, 2) < 0) /* ... and d:16 is negative.  */
+      /* ... and d:16 is negative.  */
+      if (read_memory_integer (pc + 2, 2, byte_order) < 0)
        return 4;
     }
   else if (IS_MOVB_EXT (w))
     {
-      if (IS_MOVB_Rn24_SP (read_memory_unsigned_integer (pc + 2, 2)))
+      if (IS_MOVB_Rn24_SP (read_memory_unsigned_integer (pc + 2,
+                                                        2, byte_order)))
        {
-         LONGEST disp = read_memory_integer (pc + 4, 4);
+         LONGEST disp = read_memory_integer (pc + 4, 4, byte_order);
 
          /* ... and d:24 is negative.  */
          if (disp < 0 && disp > 0xffffff)
@@ -208,14 +210,15 @@ h8300_is_argument_spill (CORE_ADDR pc)
           && (w & 0xf) <= 2)   /* Rs is R0, R1, or R2 */
     {
       /* ... and d:16 is negative.  */
-      if (read_memory_integer (pc + 2, 2) < 0)
+      if (read_memory_integer (pc + 2, 2, byte_order) < 0)
        return 4;
     }
   else if (IS_MOVW_EXT (w))
     {
-      if (IS_MOVW_Rn24_SP (read_memory_unsigned_integer (pc + 2, 2)))
+      if (IS_MOVW_Rn24_SP (read_memory_unsigned_integer (pc + 2,
+                                                        2, byte_order)))
        {
-         LONGEST disp = read_memory_integer (pc + 4, 4);
+         LONGEST disp = read_memory_integer (pc + 4, 4, byte_order);
 
          /* ... and d:24 is negative.  */
          if (disp < 0 && disp > 0xffffff)
@@ -224,22 +227,22 @@ h8300_is_argument_spill (CORE_ADDR pc)
     }
   else if (IS_MOVL_PRE (w))
     {
-      int w2 = read_memory_integer (pc + 2, 2);
+      int w2 = read_memory_integer (pc + 2, 2, byte_order);
 
       if (IS_MOVL_Rn16_SP (w2)
          && (w2 & 0xf) <= 2)   /* Rs is ER0, ER1, or ER2 */
        {
          /* ... and d:16 is negative.  */
-         if (read_memory_integer (pc + 4, 2) < 0)
+         if (read_memory_integer (pc + 4, 2, byte_order) < 0)
            return 6;
        }
       else if (IS_MOVL_EXT (w2))
        {
-         int w3 = read_memory_integer (pc + 4, 2);
+         int w3 = read_memory_integer (pc + 4, 2, byte_order);
 
-         if (IS_MOVL_Rn24_SP (read_memory_integer (pc + 4, 2)))
+         if (IS_MOVL_Rn24_SP (read_memory_integer (pc + 4, 2, byte_order)))
            {
-             LONGEST disp = read_memory_integer (pc + 6, 4);
+             LONGEST disp = read_memory_integer (pc + 6, 4, byte_order);
 
              /* ... and d:24 is negative.  */
              if (disp < 0 && disp > 0xffffff)
@@ -287,9 +290,11 @@ h8300_is_argument_spill (CORE_ADDR pc)
    */
 
 static CORE_ADDR
-h8300_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
+h8300_analyze_prologue (struct gdbarch *gdbarch,
+                       CORE_ADDR pc, CORE_ADDR current_pc,
                        struct h8300_frame_cache *cache)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   unsigned int op;
   int regno, i, spill_size;
 
@@ -298,7 +303,7 @@ h8300_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
   if (pc >= current_pc)
     return current_pc;
 
-  op = read_memory_unsigned_integer (pc, 4);
+  op = read_memory_unsigned_integer (pc, 4, byte_order);
 
   if (IS_PUSHFP_MOVESPFP (op))
     {
@@ -312,7 +317,7 @@ h8300_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
       pc += 4;
       if (pc >= current_pc)
         return current_pc;
-      op = read_memory_unsigned_integer (pc, 2);
+      op = read_memory_unsigned_integer (pc, 2, byte_order);
       if (IS_MOV_SP_FP (op))
        {
          cache->uses_fp = 1;
@@ -322,7 +327,7 @@ h8300_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
 
   while (pc < current_pc)
     {
-      op = read_memory_unsigned_integer (pc, 2);
+      op = read_memory_unsigned_integer (pc, 2, byte_order);
       if (IS_SUB2_SP (op))
        {
          cache->sp_offset += 2;
@@ -335,12 +340,12 @@ h8300_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
        }
       else if (IS_ADD_IMM_SP (op))
        {
-         cache->sp_offset += -read_memory_integer (pc + 2, 2);
+         cache->sp_offset += -read_memory_integer (pc + 2, 2, byte_order);
          pc += 4;
        }
       else if (IS_SUB_IMM_SP (op))
        {
-         cache->sp_offset += read_memory_integer (pc + 2, 2);
+         cache->sp_offset += read_memory_integer (pc + 2, 2, byte_order);
          pc += 4;
        }
       else if (IS_SUBL4_SP (op))
@@ -350,9 +355,9 @@ h8300_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
        }
       else if (IS_MOV_IMM_Rn (op))
         {
-         int offset = read_memory_integer (pc + 2, 2);
+         int offset = read_memory_integer (pc + 2, 2, byte_order);
          regno = op & 0x000f;
-         op = read_memory_unsigned_integer (pc + 4, 2);
+         op = read_memory_unsigned_integer (pc + 4, 2, byte_order);
          if (IS_ADD_RnSP (op) && (op & 0x00f0) == regno)
            {
              cache->sp_offset -= offset;
@@ -375,7 +380,7 @@ h8300_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
        }
       else if (op == 0x0100)
        {
-         op = read_memory_unsigned_integer (pc + 2, 2);
+         op = read_memory_unsigned_integer (pc + 2, 2, byte_order);
          if (IS_PUSH (op))
            {
              regno = op & 0x000f;
@@ -389,7 +394,7 @@ h8300_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
       else if ((op & 0xffcf) == 0x0100)
        {
          int op1;
-         op1 = read_memory_unsigned_integer (pc + 2, 2);
+         op1 = read_memory_unsigned_integer (pc + 2, 2, byte_order);
          if (IS_PUSH (op1))
            {
              /* Since the prefix is 0x01x0, this is not a simple pushm but a
@@ -413,7 +418,7 @@ h8300_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
   /* Check for spilling an argument register to the stack frame.
      This could also be an initializing store from non-prologue code,
      but I don't think there's any harm in skipping that.  */
-  while ((spill_size = h8300_is_argument_spill (pc)) > 0
+  while ((spill_size = h8300_is_argument_spill (gdbarch, pc)) > 0
          && pc + spill_size <= current_pc)
     pc += spill_size;
 
@@ -451,7 +456,7 @@ h8300_frame_cache (struct frame_info *this_frame, void **this_cache)
   cache->pc = get_frame_func (this_frame);
   current_pc = get_frame_pc (this_frame);
   if (cache->pc != 0)
-    h8300_analyze_prologue (cache->pc, current_pc, cache);
+    h8300_analyze_prologue (gdbarch, cache->pc, current_pc, cache);
 
   if (!cache->uses_fp)
     {
@@ -520,6 +525,7 @@ h8300_frame_prev_register (struct frame_info *this_frame, void **this_cache,
 
 static const struct frame_unwind h8300_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   h8300_frame_this_id,
   h8300_frame_prev_register,
   NULL,
@@ -558,7 +564,7 @@ h8300_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 
       /* No useable line symbol.  Use prologue parsing method.  */
       h8300_init_frame_cache (gdbarch, &cache);
-      return h8300_analyze_prologue (func_addr, func_end, &cache);
+      return h8300_analyze_prologue (gdbarch, func_addr, func_end, &cache);
     }
 
   /* No function symbol -- just return the PC.  */
@@ -635,6 +641,7 @@ h8300_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 stack_alloc = 0, stack_offset = 0;
   int wordsize = BINWORD (gdbarch);
   int reg = E_ARG0_REGNUM;
@@ -691,15 +698,15 @@ h8300_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
          else
            {
              /* Heavens to Betsy --- it's really going in registers!
-                It would be nice if we could use write_register_bytes
-                here, but on the h8/300s, there are gaps between
-                the registers in the register file.  */
+                Note that on the h8/300s, there are gaps between the
+                registers in the register file.  */
              int offset;
 
              for (offset = 0; offset < padded_len; offset += wordsize)
                {
-                 ULONGEST word = extract_unsigned_integer (padded + offset,
-                                                           wordsize);
+                 ULONGEST word
+                   = extract_unsigned_integer (padded + offset,
+                                               wordsize, byte_order);
                  regcache_cooked_write_unsigned (regcache, reg++, word);
                }
            }
@@ -718,7 +725,7 @@ h8300_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
   /* Store return address.  */
   sp -= wordsize;
-  write_memory_unsigned_integer (sp, wordsize, bp_addr);
+  write_memory_unsigned_integer (sp, wordsize, byte_order, bp_addr);
 
   /* Update stack pointer.  */
   regcache_cooked_write_unsigned (regcache, E_SP_REGNUM, sp);
@@ -736,6 +743,8 @@ static void
 h8300_extract_return_value (struct type *type, struct regcache *regcache,
                            void *valbuf)
 {
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int len = TYPE_LENGTH (type);
   ULONGEST c, addr;
 
@@ -744,24 +753,24 @@ h8300_extract_return_value (struct type *type, struct regcache *regcache,
     case 1:
     case 2:
       regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &c);
-      store_unsigned_integer (valbuf, len, c);
+      store_unsigned_integer (valbuf, len, byte_order, c);
       break;
     case 4:                    /* Needs two registers on plain H8/300 */
       regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &c);
-      store_unsigned_integer (valbuf, 2, c);
+      store_unsigned_integer (valbuf, 2, byte_order, c);
       regcache_cooked_read_unsigned (regcache, E_RET1_REGNUM, &c);
-      store_unsigned_integer ((void *) ((char *) valbuf + 2), 2, c);
+      store_unsigned_integer ((void *)((char *) valbuf + 2), 2, byte_order, c);
       break;
     case 8:                    /* long long is now 8 bytes.  */
       if (TYPE_CODE (type) == TYPE_CODE_INT)
        {
          regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &addr);
-         c = read_memory_unsigned_integer ((CORE_ADDR) addr, len);
-         store_unsigned_integer (valbuf, len, c);
+         c = read_memory_unsigned_integer ((CORE_ADDR) addr, len, byte_order);
+         store_unsigned_integer (valbuf, len, byte_order, c);
        }
       else
        {
-         error ("I don't know how this 8 byte value is returned.");
+         error (_("I don't know how this 8 byte value is returned."));
        }
       break;
     }
@@ -771,6 +780,8 @@ static void
 h8300h_extract_return_value (struct type *type, struct regcache *regcache,
                             void *valbuf)
 {
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int len = TYPE_LENGTH (type);
   ULONGEST c, addr;
 
@@ -780,29 +791,30 @@ h8300h_extract_return_value (struct type *type, struct regcache *regcache,
     case 2:
     case 4:
       regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &c);
-      store_unsigned_integer (valbuf, len, c);
+      store_unsigned_integer (valbuf, len, byte_order, c);
       break;
     case 8:                    /* long long is now 8 bytes.  */
       if (TYPE_CODE (type) == TYPE_CODE_INT)
        {
          regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &c);
-         store_unsigned_integer (valbuf, 4, c);
+         store_unsigned_integer (valbuf, 4, byte_order, c);
          regcache_cooked_read_unsigned (regcache, E_RET1_REGNUM, &c);
-         store_unsigned_integer ((void *) ((char *) valbuf + 4), 4, c);
+         store_unsigned_integer ((void *) ((char *) valbuf + 4), 4,
+                                 byte_order, c);
        }
       else
        {
-         error ("I don't know how this 8 byte value is returned.");
+         error (_("I don't know how this 8 byte value is returned."));
        }
       break;
     }
 }
 
-int
+static int
 h8300_use_struct_convention (struct type *value_type)
 {
   /* Types of 1, 2 or 4 bytes are returned in R0/R1, everything else on the
-     stack. */
+     stack.  */
 
   if (TYPE_CODE (value_type) == TYPE_CODE_STRUCT
       || TYPE_CODE (value_type) == TYPE_CODE_UNION)
@@ -812,11 +824,11 @@ h8300_use_struct_convention (struct type *value_type)
           || TYPE_LENGTH (value_type) == 4);
 }
 
-int
+static int
 h8300h_use_struct_convention (struct type *value_type)
 {
   /* Types of 1, 2 or 4 bytes are returned in R0, INT types of 8 bytes are
-     returned in R0/R1, everything else on the stack. */
+     returned in R0/R1, everything else on the stack.  */
   if (TYPE_CODE (value_type) == TYPE_CODE_STRUCT
       || TYPE_CODE (value_type) == TYPE_CODE_UNION)
     return 1;
@@ -835,25 +847,28 @@ static void
 h8300_store_return_value (struct type *type, struct regcache *regcache,
                          const void *valbuf)
 {
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int len = TYPE_LENGTH (type);
   ULONGEST val;
 
   switch (len)
     {
     case 1:
-    case 2:                    /* short... */
-      val = extract_unsigned_integer (valbuf, len);
+    case 2:                    /* short...  */
+      val = extract_unsigned_integer (valbuf, len, byte_order);
       regcache_cooked_write_unsigned (regcache, E_RET0_REGNUM, val);
       break;
     case 4:                    /* long, float */
-      val = extract_unsigned_integer (valbuf, len);
+      val = extract_unsigned_integer (valbuf, len, byte_order);
       regcache_cooked_write_unsigned (regcache, E_RET0_REGNUM,
                                      (val >> 16) & 0xffff);
       regcache_cooked_write_unsigned (regcache, E_RET1_REGNUM, val & 0xffff);
       break;
-    case 8:                    /* long long, double and long double are all defined
-                                  as 4 byte types so far so this shouldn't happen.  */
-      error ("I don't know how to return an 8 byte value.");
+    case 8:                    /* long long, double and long double
+                                  are all defined as 4 byte types so
+                                  far so this shouldn't happen.  */
+      error (_("I don't know how to return an 8 byte value."));
       break;
     }
 }
@@ -862,6 +877,8 @@ static void
 h8300h_store_return_value (struct type *type, struct regcache *regcache,
                           const void *valbuf)
 {
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int len = TYPE_LENGTH (type);
   ULONGEST val;
 
@@ -870,11 +887,11 @@ h8300h_store_return_value (struct type *type, struct regcache *regcache,
     case 1:
     case 2:
     case 4:                    /* long, float */
-      val = extract_unsigned_integer (valbuf, len);
+      val = extract_unsigned_integer (valbuf, len, byte_order);
       regcache_cooked_write_unsigned (regcache, E_RET0_REGNUM, val);
       break;
     case 8:
-      val = extract_unsigned_integer (valbuf, len);
+      val = extract_unsigned_integer (valbuf, len, byte_order);
       regcache_cooked_write_unsigned (regcache, E_RET0_REGNUM,
                                      (val >> 32) & 0xffffffff);
       regcache_cooked_write_unsigned (regcache, E_RET1_REGNUM,
@@ -927,7 +944,7 @@ static const char *
 h8300_register_name (struct gdbarch *gdbarch, int regno)
 {
   /* The register names change depending on which h8300 processor
-     type is selected. */
+     type is selected.  */
   static char *register_names[] = {
     "r0", "r1", "r2", "r3", "r4", "r5", "r6",
     "sp", "", "pc", "cycles", "tick", "inst",
@@ -936,7 +953,8 @@ h8300_register_name (struct gdbarch *gdbarch, int regno)
   if (regno < 0
       || regno >= (sizeof (register_names) / sizeof (*register_names)))
     internal_error (__FILE__, __LINE__,
-                   "h8300_register_name: illegal register number %d", regno);
+                   _("h8300_register_name: illegal register number %d"),
+                   regno);
   else
     return register_names[regno];
 }
@@ -953,7 +971,7 @@ h8300s_register_name (struct gdbarch *gdbarch, int regno)
   if (regno < 0
       || regno >= (sizeof (register_names) / sizeof (*register_names)))
     internal_error (__FILE__, __LINE__,
-                   "h8300s_register_name: illegal register number %d",
+                   _("h8300s_register_name: illegal register number %d"),
                    regno);
   else
     return register_names[regno];
@@ -971,7 +989,7 @@ h8300sx_register_name (struct gdbarch *gdbarch, int regno)
   if (regno < 0
       || regno >= (sizeof (register_names) / sizeof (*register_names)))
     internal_error (__FILE__, __LINE__,
-                   "h8300sx_register_name: illegal register number %d",
+                   _("h8300sx_register_name: illegal register number %d"),
                    regno);
   else
     return register_names[regno];
@@ -1107,7 +1125,8 @@ h8300_register_type (struct gdbarch *gdbarch, int regno)
   if (regno < 0 || regno >= gdbarch_num_regs (gdbarch)
                            + gdbarch_num_pseudo_regs (gdbarch))
     internal_error (__FILE__, __LINE__,
-                   "h8300_register_type: illegal register number %d", regno);
+                   _("h8300_register_type: illegal register number %d"),
+                   regno);
   else
     {
       switch (regno)
@@ -1119,28 +1138,28 @@ h8300_register_type (struct gdbarch *gdbarch, int regno)
          return builtin_type (gdbarch)->builtin_data_ptr;
        default:
          if (regno == E_PSEUDO_CCR_REGNUM (gdbarch))
-           return builtin_type_uint8;
+           return builtin_type (gdbarch)->builtin_uint8;
          else if (regno == E_PSEUDO_EXR_REGNUM (gdbarch))
-           return builtin_type_uint8;
+           return builtin_type (gdbarch)->builtin_uint8;
          else if (is_h8300hmode (gdbarch))
-           return builtin_type_int32;
+           return builtin_type (gdbarch)->builtin_int32;
          else
-           return builtin_type_int16;
+           return builtin_type (gdbarch)->builtin_int16;
        }
     }
 }
 
-static void
+static enum register_status
 h8300_pseudo_register_read (struct gdbarch *gdbarch,
                            struct regcache *regcache, int regno,
                            gdb_byte *buf)
 {
   if (regno == E_PSEUDO_CCR_REGNUM (gdbarch))
-    regcache_raw_read (regcache, E_CCR_REGNUM, buf);
+    return regcache_raw_read (regcache, E_CCR_REGNUM, buf);
   else if (regno == E_PSEUDO_EXR_REGNUM (gdbarch))
-    regcache_raw_read (regcache, E_EXR_REGNUM, buf);
+    return regcache_raw_read (regcache, E_EXR_REGNUM, buf);
   else
-    regcache_raw_read (regcache, regno, buf);
+    return regcache_raw_read (regcache, regno, buf);
 }
 
 static void
@@ -1318,7 +1337,7 @@ h8300_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* 
    * Miscelany
    */
-  /* Stack grows up. */
+  /* Stack grows up.  */
   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
 
   set_gdbarch_breakpoint_from_pc (gdbarch, h8300_breakpoint_from_pc);
@@ -1341,7 +1360,7 @@ h8300_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
 }
 
-extern initialize_file_ftype _initialize_h8300_tdep;   /* -Wmissing-prototypes */
+extern initialize_file_ftype _initialize_h8300_tdep; /* -Wmissing-prototypes */
 
 void
 _initialize_h8300_tdep (void)
This page took 0.031232 seconds and 4 git commands to generate.