Allow for the possibility that the local labels won't be in the objdump output.
[deliverable/binutils-gdb.git] / gdb / sh-tdep.c
index 0c04b1ee689bf4e12157a7877a485617a0751c45..b414e7793a90411d5d329bf8272a0fe3e9f89e50 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for Hitachi Super-H, for GDB.
-   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 2000 Free Software
-   Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -38,6 +38,9 @@
 #include "gdb_string.h"
 #include "arch-utils.h"
 #include "floatformat.h"
+#include "regcache.h"
+
+#include "solib-svr4.h"
 
 #undef XMALLOC
 #define XMALLOC(TYPE) ((TYPE*) xmalloc (sizeof (TYPE)))
@@ -54,11 +57,10 @@ static gdbarch_frame_init_saved_regs_ftype sh_fp_frame_init_saved_regs;
 static gdbarch_init_extra_frame_info_ftype sh_init_extra_frame_info;
 static gdbarch_pop_frame_ftype sh_pop_frame;
 static gdbarch_saved_pc_after_call_ftype sh_saved_pc_after_call;
-static gdbarch_frame_args_address_ftype sh_frame_args_address;
-static gdbarch_frame_locals_address_ftype sh_frame_locals_address;
 
 /* Function call related functions. */
 static gdbarch_extract_return_value_ftype sh_extract_return_value;
+static gdbarch_extract_return_value_ftype sh3e_sh4_extract_return_value;
 static gdbarch_extract_struct_value_address_ftype sh_extract_struct_value_address;
 static gdbarch_use_struct_convention_ftype sh_use_struct_convention;
 static gdbarch_store_struct_return_ftype sh_store_struct_return;
@@ -102,6 +104,7 @@ static gdbarch_fetch_pseudo_register_ftype sh_fetch_pseudo_register;
 static gdbarch_store_pseudo_register_ftype sh_store_pseudo_register;
 static int fv_reg_base_num (int);
 static int dr_reg_base_num (int);
+static gdbarch_do_registers_info_ftype sh_do_registers_info;
 static void do_fv_register_info (int fv_regnum);
 static void do_dr_register_info (int dr_regnum);
 static void sh_do_pseudo_register (int regnum);
@@ -110,7 +113,7 @@ static void sh_do_register (int regnum);
 static void sh_print_register (int regnum);
 
 void (*sh_show_regs) (void);
-
+int (*print_sh_insn) (bfd_vma, disassemble_info*);
 
 /* Define other aspects of the stack frame.
    we keep a copy of the worked out return pc lying around, since it
@@ -269,17 +272,28 @@ sh_sh4_register_name (int reg_nr)
 {
   static char *register_names[] =
   {
+    /* general registers 0-15 */
     "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
     "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
+    /* 16 - 22 */
     "pc",   "pr",   "gbr",  "vbr",  "mach", "macl", "sr",
+    /* 23, 24 */
     "fpul", "fpscr",
+    /* floating point registers 25 - 40 */
     "fr0",  "fr1",  "fr2",  "fr3",  "fr4",  "fr5",  "fr6",  "fr7",
     "fr8",  "fr9",  "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
+    /* 41, 42 */
     "ssr",  "spc",
+    /* bank 0 43 - 50 */
     "r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0",
+    /* bank 1 51 - 58 */
     "r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1",
+    /* double precision (pseudo) 59 - 66 */
     "dr0",  "dr2",  "dr4",  "dr6",  "dr8",  "dr10", "dr12", "dr14",
+    /* vectors (pseudo) 67 - 70 */
     "fv0",  "fv4",  "fv8",  "fv12",
+    /* FIXME: missing XF 71 - 86 */
+    /* FIXME: missing XD 87 - 94 */
   };
   if (reg_nr < 0)
     return NULL;
@@ -289,9 +303,7 @@ sh_sh4_register_name (int reg_nr)
 }
 
 static unsigned char *
-sh_breakpoint_from_pc (pcptr, lenptr)
-     CORE_ADDR *pcptr;
-     int *lenptr;
+sh_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
 {
   /* 0xc3c3 is trapa #c3, and it works in big and little endian modes */
   static unsigned char breakpoint[] =  {0xc3, 0xc3};
@@ -375,8 +387,7 @@ sh_breakpoint_from_pc (pcptr, lenptr)
 /* Skip the prologue using the debug information. If this fails we'll
    fall back on the 'guess' method below. */
 static CORE_ADDR
-after_prologue (pc)
-     CORE_ADDR pc;
+after_prologue (CORE_ADDR pc)
 {
   struct symtab_and_line sal;
   CORE_ADDR func_addr, func_end;
@@ -405,8 +416,7 @@ after_prologue (pc)
    where the prologue ends. Unfortunately this is not always 
    accurate. */
 static CORE_ADDR
-skip_prologue_hard_way (start_pc)
-     CORE_ADDR start_pc;
+skip_prologue_hard_way (CORE_ADDR start_pc)
 {
   CORE_ADDR here, end;
   int updated_fp = 0;
@@ -439,8 +449,7 @@ skip_prologue_hard_way (start_pc)
 }
 
 static CORE_ADDR
-sh_skip_prologue (pc)
-     CORE_ADDR pc;
+sh_skip_prologue (CORE_ADDR pc)
 {
   CORE_ADDR post_prologue_pc;
 
@@ -465,17 +474,14 @@ sh_skip_prologue (pc)
 
    The return address is the value saved in the PR register + 4  */
 static CORE_ADDR
-sh_saved_pc_after_call (frame)
-     struct frame_info *frame;
+sh_saved_pc_after_call (struct frame_info *frame)
 {
   return (ADDR_BITS_REMOVE(read_register(PR_REGNUM)));
 }
 
 /* Should call_function allocate stack space for a struct return?  */
 static int
-sh_use_struct_convention (gcc_p, type)
-     int gcc_p;
-     struct type *type;
+sh_use_struct_convention (int gcc_p, struct type *type)
 {
   return (TYPE_LENGTH (type) > 1);
 }
@@ -485,18 +491,14 @@ sh_use_struct_convention (gcc_p, type)
 
    We store structs through a pointer passed in R0 */
 static void
-sh_store_struct_return (addr, sp)
-     CORE_ADDR addr;
-     CORE_ADDR sp;
+sh_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
 {
   write_register (STRUCT_RETURN_REGNUM, (addr));
 }
 
 /* Disassemble an instruction.  */
 static int
-gdb_print_insn_sh (memaddr, info)
-     bfd_vma memaddr;
-     disassemble_info *info;
+gdb_print_insn_sh (bfd_vma memaddr, disassemble_info *info)
 {
   if (TARGET_BYTE_ORDER == BIG_ENDIAN)
     return print_insn_sh (memaddr, info);
@@ -511,8 +513,7 @@ gdb_print_insn_sh (memaddr, info)
    For us, the frame address is its stack pointer value, so we look up
    the function prologue to determine the caller's sp value, and return it.  */
 static CORE_ADDR
-sh_frame_chain (frame)
-     struct frame_info *frame;
+sh_frame_chain (struct frame_info *frame)
 {
   if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
     return frame->frame;       /* dummy frame same as caller's frame */
@@ -529,9 +530,7 @@ sh_frame_chain (frame)
    caller-saves registers for an inner frame.  */
 
 static CORE_ADDR
-sh_find_callers_reg (fi, regnum)
-     struct frame_info *fi;
-     int regnum;
+sh_find_callers_reg (struct frame_info *fi, int regnum)
 {
   for (; fi; fi = fi->next)
     if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
@@ -556,8 +555,7 @@ sh_find_callers_reg (fi, regnum)
    ways in the stack frame.  sp is even more special: the address we
    return for it IS the sp for the next frame. */
 static void
-sh_nofp_frame_init_saved_regs (fi)
-     struct frame_info *fi;
+sh_nofp_frame_init_saved_regs (struct frame_info *fi)
 {
   int where[NUM_REGS];
   int rn;
@@ -677,8 +675,7 @@ sh_nofp_frame_init_saved_regs (fi)
 }
 
 static void
-sh_fp_frame_init_saved_regs (fi)
-     struct frame_info *fi;
+sh_fp_frame_init_saved_regs (struct frame_info *fi)
 {
   int where[NUM_REGS];
   int rn;
@@ -810,9 +807,7 @@ sh_fp_frame_init_saved_regs (fi)
 
 /* Initialize the extra info saved in a FRAME */
 static void
-sh_init_extra_frame_info (fromleaf, fi)
-     int fromleaf;
-     struct frame_info *fi;
+sh_init_extra_frame_info (int fromleaf, struct frame_info *fi)
 {
 
   fi->extra_info = (struct frame_extra_info *)
@@ -843,38 +838,22 @@ sh_init_extra_frame_info (fromleaf, fi)
 /* Extract from an array REGBUF containing the (raw) register state
    the address in which a function should return its structure value,
    as a CORE_ADDR (or an expression that can be used as one).  */
-CORE_ADDR
-static sh_extract_struct_value_address (regbuf)
-     char *regbuf;
+static CORE_ADDR
+sh_extract_struct_value_address (char *regbuf)
 {
   return (extract_address ((regbuf), REGISTER_RAW_SIZE (0)));
 }
 
 static CORE_ADDR
-sh_frame_saved_pc (frame)
-     struct frame_info *frame;
+sh_frame_saved_pc (struct frame_info *frame)
 {
   return ((frame)->extra_info->return_pc);
 }
 
-static CORE_ADDR
-sh_frame_args_address (fi)
-     struct frame_info *fi;
-{
-  return (fi)->frame;
-}
-
-static CORE_ADDR
-sh_frame_locals_address (fi)
-     struct frame_info *fi;
-{
-  return (fi)->frame;
-}
-
 /* Discard from the stack the innermost frame,
    restoring all saved registers.  */
 static void
-sh_pop_frame ()
+sh_pop_frame (void)
 {
   register struct frame_info *frame = get_current_frame ();
   register CORE_ADDR fp;
@@ -942,12 +921,8 @@ sh_pop_frame ()
    to R7.   */
 
 static CORE_ADDR
-sh_push_arguments (nargs, args, sp, struct_return, struct_addr)
-     int nargs;
-     value_ptr *args;
-     CORE_ADDR sp;
-     unsigned char struct_return;
-     CORE_ADDR struct_addr;
+sh_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
+                  int struct_return, CORE_ADDR struct_addr)
 {
   int stack_offset, stack_alloc;
   int argreg;
@@ -1026,9 +1001,7 @@ sh_push_arguments (nargs, args, sp, struct_return, struct_addr)
    Needed for targets where we don't actually execute a JSR/BSR instruction */
 
 static CORE_ADDR
-sh_push_return_address (pc, sp)
-     CORE_ADDR pc;
-     CORE_ADDR sp;
+sh_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
 {
   write_register (PR_REGNUM, CALL_DUMMY_ADDRESS ());
   return sp;
@@ -1050,14 +1023,8 @@ sh_push_return_address (pc, sp)
 
 #if 0
 void
-sh_fix_call_dummy (dummy, pc, fun, nargs, args, type, gcc_p)
-     char *dummy;
-     CORE_ADDR pc;
-     CORE_ADDR fun;
-     int nargs;
-     value_ptr *args;
-     struct type *type;
-     int gcc_p;
+sh_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
+                  value_ptr *args, struct type *type, int gcc_p)
 {
   *(unsigned long *) (dummy + 8) = fun;
 }
@@ -1074,17 +1041,73 @@ sh_coerce_float_to_double (struct type *formal, struct type *actual)
    containing the (raw) register state a function return value of type
    TYPE, and copy that, in virtual format, into VALBUF.  */
 static void
-sh_extract_return_value (type, regbuf, valbuf)
-     struct type *type;
-     char *regbuf;
-     char *valbuf;
+sh_extract_return_value (struct type *type, char *regbuf, char *valbuf)
 {
   int len = TYPE_LENGTH (type);
-
+  int return_register = R0_REGNUM;
+  int offset;
+  
   if (len <= 4)
-    memcpy (valbuf, ((char *) regbuf) + 4 - len, len);
+    {
+      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+       offset = REGISTER_BYTE (return_register) + 4 - len;
+      else
+       offset = REGISTER_BYTE (return_register);
+      memcpy (valbuf, regbuf + offset, len);
+    }
   else if (len <= 8)
-    memcpy (valbuf, ((char *) regbuf) + 8 - len, len);
+    {
+      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+       offset = REGISTER_BYTE (return_register) + 8 - len;
+      else
+       offset = REGISTER_BYTE (return_register);
+      memcpy (valbuf, regbuf + offset, len);
+    }
+  else
+    error ("bad size for return value");
+}
+
+static void
+sh3e_sh4_extract_return_value (struct type *type, char *regbuf, char *valbuf)
+{
+  int return_register;
+  int offset;
+  int len = TYPE_LENGTH (type);
+
+  if (TYPE_CODE (type) == TYPE_CODE_FLT)
+    return_register = FP0_REGNUM;
+  else
+    return_register = R0_REGNUM;
+  
+  if (len == 8 && TYPE_CODE (type) == TYPE_CODE_FLT)
+    {
+      DOUBLEST val;
+      if (TARGET_BYTE_ORDER == LITTLE_ENDIAN)
+       floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
+                                (char *) regbuf + REGISTER_BYTE (return_register),
+                                &val);
+      else
+       floatformat_to_doublest (&floatformat_ieee_double_big,
+                                (char *) regbuf + REGISTER_BYTE (return_register),
+                                &val);
+      store_floating (valbuf, len, val);
+    }
+  else if (len <= 4)
+    {
+      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+       offset = REGISTER_BYTE (return_register) + 4 - len;
+      else
+       offset = REGISTER_BYTE (return_register);
+      memcpy (valbuf, regbuf + offset, len);
+    }
+  else if (len <= 8)
+    {
+      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+       offset = REGISTER_BYTE (return_register) + 8 - len;
+      else
+       offset = REGISTER_BYTE (return_register);
+      memcpy (valbuf, regbuf + offset, len);
+    }
   else
     error ("bad size for return value");
 }
@@ -1098,8 +1121,20 @@ sh_extract_return_value (type, regbuf, valbuf)
 static void
 sh_default_store_return_value (struct type *type, char *valbuf)
 {
-  write_register_bytes (REGISTER_BYTE (0), 
-                       valbuf, TYPE_LENGTH (type));
+  char buf[32];        /* more than enough... */
+
+  if (TYPE_LENGTH (type) < REGISTER_RAW_SIZE (R0_REGNUM))
+    {
+      /* Add leading zeros to the value. */
+      memset (buf, 0, REGISTER_RAW_SIZE (R0_REGNUM));
+      memcpy (buf + REGISTER_RAW_SIZE (R0_REGNUM) - TYPE_LENGTH (type),
+             valbuf, TYPE_LENGTH (type));
+      write_register_bytes (REGISTER_BYTE (R0_REGNUM), buf, 
+                           REGISTER_RAW_SIZE (R0_REGNUM));
+    }
+  else
+    write_register_bytes (REGISTER_BYTE (R0_REGNUM), valbuf, 
+                         TYPE_LENGTH (type));
 }
 
 static void
@@ -1109,19 +1144,18 @@ sh3e_sh4_store_return_value (struct type *type, char *valbuf)
     write_register_bytes (REGISTER_BYTE (FP0_REGNUM), 
                          valbuf, TYPE_LENGTH (type));
   else
-    write_register_bytes (REGISTER_BYTE (0), 
-                         valbuf, TYPE_LENGTH (type));
+    sh_default_store_return_value (type, valbuf);
 }
 
 
 /* Print the registers in a form similar to the E7000 */
 
 static void
-sh_generic_show_regs ()
+sh_generic_show_regs (void)
 {
   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
                   paddr (read_register (PC_REGNUM)),
-                  (long) read_register (SR_REGNUM),
+                  (long) read_register (gdbarch_tdep (current_gdbarch)->SR_REGNUM),
                   (long) read_register (PR_REGNUM),
                   (long) read_register (MACH_REGNUM),
                   (long) read_register (MACL_REGNUM));
@@ -1151,11 +1185,11 @@ sh_generic_show_regs ()
 }
 
 static void
-sh3_show_regs ()
+sh3_show_regs (void)
 {
   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
                   paddr (read_register (PC_REGNUM)),
-                  (long) read_register (SR_REGNUM),
+                  (long) read_register (gdbarch_tdep (current_gdbarch)->SR_REGNUM),
                   (long) read_register (PR_REGNUM),
                   (long) read_register (MACH_REGNUM),
                   (long) read_register (MACL_REGNUM));
@@ -1189,11 +1223,11 @@ sh3_show_regs ()
 
 
 static void
-sh3e_show_regs ()
+sh3e_show_regs (void)
 {
   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
                   paddr (read_register (PC_REGNUM)),
-                  (long) read_register (SR_REGNUM),
+                  (long) read_register (gdbarch_tdep (current_gdbarch)->SR_REGNUM),
                   (long) read_register (PR_REGNUM),
                   (long) read_register (MACH_REGNUM),
                   (long) read_register (MACL_REGNUM));
@@ -1248,11 +1282,11 @@ sh3e_show_regs ()
 }
 
 static void
-sh3_dsp_show_regs ()
+sh3_dsp_show_regs (void)
 {
   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
                   paddr (read_register (PC_REGNUM)),
-                  (long) read_register (SR_REGNUM),
+                  (long) read_register (gdbarch_tdep (current_gdbarch)->SR_REGNUM),
                   (long) read_register (PR_REGNUM),
                   (long) read_register (MACH_REGNUM),
                   (long) read_register (MACL_REGNUM));
@@ -1305,12 +1339,12 @@ sh3_dsp_show_regs ()
 }
 
 static void
-sh4_show_regs ()
+sh4_show_regs (void)
 {
   int pr = read_register (gdbarch_tdep (current_gdbarch)->FPSCR_REGNUM) & 0x80000;
   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
                   paddr (read_register (PC_REGNUM)),
-                  (long) read_register (SR_REGNUM),
+                  (long) read_register (gdbarch_tdep (current_gdbarch)->SR_REGNUM),
                   (long) read_register (PR_REGNUM),
                   (long) read_register (MACH_REGNUM),
                   (long) read_register (MACL_REGNUM));
@@ -1369,11 +1403,11 @@ sh4_show_regs ()
 }
 
 static void
-sh_dsp_show_regs ()
+sh_dsp_show_regs (void)
 {
   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
                   paddr (read_register (PC_REGNUM)),
-                  (long) read_register (SR_REGNUM),
+                  (long) read_register (gdbarch_tdep (current_gdbarch)->SR_REGNUM),
                   (long) read_register (PR_REGNUM),
                   (long) read_register (MACH_REGNUM),
                   (long) read_register (MACL_REGNUM));
@@ -1430,21 +1464,19 @@ void sh_show_regs_command (char *args, int from_tty)
 /* Index within `registers' of the first byte of the space for
    register N.  */
 static int
-sh_default_register_byte (reg_nr)
-     int reg_nr;
+sh_default_register_byte (int reg_nr)
 {
   return (reg_nr * 4);
 }
 
 static int
-sh_sh4_register_byte (reg_nr)
-     int reg_nr;
+sh_sh4_register_byte (int reg_nr)
 {
   if (reg_nr >= gdbarch_tdep (current_gdbarch)->DR0_REGNUM 
-      && reg_nr <= gdbarch_tdep (current_gdbarch)->DR14_REGNUM)
+      && reg_nr <= gdbarch_tdep (current_gdbarch)->DR_LAST_REGNUM)
     return (dr_reg_base_num (reg_nr) * 4);
   else if  (reg_nr >= gdbarch_tdep (current_gdbarch)->FV0_REGNUM 
-           && reg_nr <= gdbarch_tdep (current_gdbarch)->FV12_REGNUM)
+           && reg_nr <= gdbarch_tdep (current_gdbarch)->FV_LAST_REGNUM)
     return (fv_reg_base_num (reg_nr) * 4);
   else
     return (reg_nr * 4);
@@ -1453,21 +1485,19 @@ sh_sh4_register_byte (reg_nr)
 /* Number of bytes of storage in the actual machine representation for
    register REG_NR.  */
 static int
-sh_default_register_raw_size (reg_nr)
-     int reg_nr;
+sh_default_register_raw_size (int reg_nr)
 {
   return 4;
 }
 
 static int
-sh_sh4_register_raw_size (reg_nr)
-     int reg_nr;
+sh_sh4_register_raw_size (int reg_nr)
 {
   if (reg_nr >= gdbarch_tdep (current_gdbarch)->DR0_REGNUM 
-      && reg_nr <= gdbarch_tdep (current_gdbarch)->DR14_REGNUM)
+      && reg_nr <= gdbarch_tdep (current_gdbarch)->DR_LAST_REGNUM)
     return 8;
   else if  (reg_nr >= gdbarch_tdep (current_gdbarch)->FV0_REGNUM 
-           && reg_nr <= gdbarch_tdep (current_gdbarch)->FV12_REGNUM)
+           && reg_nr <= gdbarch_tdep (current_gdbarch)->FV_LAST_REGNUM)
     return 16;
   else
     return 4;
@@ -1476,8 +1506,7 @@ sh_sh4_register_raw_size (reg_nr)
 /* Number of bytes of storage in the program's representation
    for register N.  */
 static int
-sh_register_virtual_size (reg_nr)
-     int reg_nr;
+sh_register_virtual_size (int reg_nr)
 {
   return 4;
 }
@@ -1486,11 +1515,10 @@ sh_register_virtual_size (reg_nr)
    of data in register N.  */
 
 static struct type *
-sh_sh3e_register_virtual_type (reg_nr)
-     int reg_nr;
+sh_sh3e_register_virtual_type (int reg_nr)
 {
   if ((reg_nr >= FP0_REGNUM
-       && (reg_nr <= gdbarch_tdep (current_gdbarch)->FP15_REGNUM)) 
+       && (reg_nr <= gdbarch_tdep (current_gdbarch)->FP_LAST_REGNUM)) 
       || (reg_nr == gdbarch_tdep (current_gdbarch)->FPUL_REGNUM))
     return builtin_type_float;
   else
@@ -1498,18 +1526,17 @@ sh_sh3e_register_virtual_type (reg_nr)
 }
 
 static struct type *
-sh_sh4_register_virtual_type (reg_nr)
-     int reg_nr;
+sh_sh4_register_virtual_type (int reg_nr)
 {
   if ((reg_nr >= FP0_REGNUM
-       && (reg_nr <= gdbarch_tdep (current_gdbarch)->FP15_REGNUM)) 
+       && (reg_nr <= gdbarch_tdep (current_gdbarch)->FP_LAST_REGNUM)) 
       || (reg_nr == gdbarch_tdep (current_gdbarch)->FPUL_REGNUM))
     return builtin_type_float;
   else if (reg_nr >= gdbarch_tdep (current_gdbarch)->DR0_REGNUM 
-          && reg_nr <= gdbarch_tdep (current_gdbarch)->DR14_REGNUM)
+          && reg_nr <= gdbarch_tdep (current_gdbarch)->DR_LAST_REGNUM)
     return builtin_type_double;
   else if  (reg_nr >= gdbarch_tdep (current_gdbarch)->FV0_REGNUM 
-          && reg_nr <= gdbarch_tdep (current_gdbarch)->FV12_REGNUM)
+          && reg_nr <= gdbarch_tdep (current_gdbarch)->FV_LAST_REGNUM)
     return sh_sh4_build_float_register_type (3);
   else
     return builtin_type_int;
@@ -1525,8 +1552,7 @@ sh_sh4_build_float_register_type (int high)
 }
 
 static struct type *
-sh_default_register_virtual_type (reg_nr)
-     int reg_nr;
+sh_default_register_virtual_type (int reg_nr)
 {
   return builtin_type_int;
 }
@@ -1562,7 +1588,7 @@ sh_sh4_register_convertible (int nr)
 {
   if (TARGET_BYTE_ORDER == LITTLE_ENDIAN)
     return (gdbarch_tdep (current_gdbarch)->DR0_REGNUM <= nr
-           && nr <= gdbarch_tdep (current_gdbarch)->DR14_REGNUM);
+           && nr <= gdbarch_tdep (current_gdbarch)->DR_LAST_REGNUM);
   else 
     return 0;
 }
@@ -1572,7 +1598,7 @@ sh_sh4_register_convert_to_virtual (int regnum, struct type *type,
                                   char *from, char *to)
 {
   if (regnum >= gdbarch_tdep (current_gdbarch)->DR0_REGNUM 
-      && regnum <= gdbarch_tdep (current_gdbarch)->DR14_REGNUM)
+      && regnum <= gdbarch_tdep (current_gdbarch)->DR_LAST_REGNUM)
     {
       DOUBLEST val;
       floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword, from, &val);
@@ -1587,7 +1613,7 @@ sh_sh4_register_convert_to_raw (struct type *type, int regnum,
                               char *from, char *to)
 {
   if (regnum >= gdbarch_tdep (current_gdbarch)->DR0_REGNUM 
-      && regnum <= gdbarch_tdep (current_gdbarch)->DR14_REGNUM)
+      && regnum <= gdbarch_tdep (current_gdbarch)->DR_LAST_REGNUM)
     {
       DOUBLEST val = extract_floating (from, TYPE_LENGTH(type));
       floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword, &val, to);
@@ -1604,7 +1630,7 @@ sh_fetch_pseudo_register (int reg_nr)
   if (!register_cached (reg_nr))
     {
       if (reg_nr >= gdbarch_tdep (current_gdbarch)->DR0_REGNUM 
-         && reg_nr <= gdbarch_tdep (current_gdbarch)->DR14_REGNUM)
+         && reg_nr <= gdbarch_tdep (current_gdbarch)->DR_LAST_REGNUM)
         {
          base_regnum = dr_reg_base_num (reg_nr);
 
@@ -1614,7 +1640,7 @@ sh_fetch_pseudo_register (int reg_nr)
               target_fetch_registers (base_regnum + portion);
         }
       else if (reg_nr >= gdbarch_tdep (current_gdbarch)->FV0_REGNUM 
-              && reg_nr <= gdbarch_tdep (current_gdbarch)->FV12_REGNUM)
+              && reg_nr <= gdbarch_tdep (current_gdbarch)->FV_LAST_REGNUM)
         {
          base_regnum = fv_reg_base_num (reg_nr);
 
@@ -1634,7 +1660,7 @@ sh_store_pseudo_register (int reg_nr)
   int base_regnum, portion;
 
   if (reg_nr >= gdbarch_tdep (current_gdbarch)->DR0_REGNUM
-      && reg_nr <= gdbarch_tdep (current_gdbarch)->DR14_REGNUM)
+      && reg_nr <= gdbarch_tdep (current_gdbarch)->DR_LAST_REGNUM)
     {
       base_regnum = dr_reg_base_num (reg_nr);
 
@@ -1646,7 +1672,7 @@ sh_store_pseudo_register (int reg_nr)
        }
     }
   else if (reg_nr >= gdbarch_tdep (current_gdbarch)->FV0_REGNUM
-          && reg_nr <= gdbarch_tdep (current_gdbarch)->FV12_REGNUM)
+          && reg_nr <= gdbarch_tdep (current_gdbarch)->FV_LAST_REGNUM)
     {
       base_regnum = fv_reg_base_num (reg_nr);
 
@@ -1706,12 +1732,13 @@ static void
 sh_do_pseudo_register (int regnum)
 {
   if (regnum < NUM_REGS || regnum >= NUM_REGS + NUM_PSEUDO_REGS)
-    internal_error ("Invalid pasudo register number %d\n", regnum);
-  else if (regnum >= NUM_REGS && 
-          regnum < gdbarch_tdep (current_gdbarch)->FV0_REGNUM)
+    internal_error (__FILE__, __LINE__,
+                   "Invalid pseudo register number %d\n", regnum);
+  else if (regnum >= gdbarch_tdep (current_gdbarch)->DR0_REGNUM
+          && regnum < gdbarch_tdep (current_gdbarch)->DR_LAST_REGNUM)
     do_dr_register_info (regnum);
-  else if (regnum >= gdbarch_tdep (current_gdbarch)->FV0_REGNUM &&
-          regnum <= gdbarch_tdep (current_gdbarch)->FV12_REGNUM)
+  else if (regnum >= gdbarch_tdep (current_gdbarch)->FV0_REGNUM
+          && regnum <= gdbarch_tdep (current_gdbarch)->FV_LAST_REGNUM)
     do_fv_register_info (regnum);
 }
 
@@ -1777,9 +1804,10 @@ static void
 sh_print_register (int regnum)
 {
   if (regnum < 0 || regnum >= NUM_REGS + NUM_PSEUDO_REGS)
-    internal_error ("Invalid register number %d\n", regnum);
+    internal_error (__FILE__, __LINE__,
+                   "Invalid register number %d\n", regnum);
 
-  else if (regnum > 0 && regnum < NUM_REGS)
+  else if (regnum >= 0 && regnum < NUM_REGS)
     {
       if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT)
        sh_do_fp_register (regnum);     /* FP regs */
@@ -1825,7 +1853,7 @@ sh_do_registers_info (int regnum, int fpregs)
                  regnum ++;
                }
              else
-               regnum += (gdbarch_tdep (current_gdbarch)->FP15_REGNUM - FP0_REGNUM);   /* skip FP regs */
+               regnum += (gdbarch_tdep (current_gdbarch)->FP_LAST_REGNUM - FP0_REGNUM);        /* skip FP regs */
            }
          else
            {
@@ -1843,12 +1871,54 @@ sh_do_registers_info (int regnum, int fpregs)
     }
 }
 
+#ifdef SVR4_SHARED_LIBS
+
+/* Fetch (and possibly build) an appropriate link_map_offsets structure
+   for native i386 linux targets using the struct offsets defined in
+   link.h (but without actual reference to that file).
+
+   This makes it possible to access i386-linux shared libraries from
+   a gdb that was not built on an i386-linux host (for cross debugging).
+   */
+
+struct link_map_offsets *
+sh_linux_svr4_fetch_link_map_offsets (void)
+{
+  static struct link_map_offsets lmo;
+  static struct link_map_offsets *lmp = 0;
+
+  if (lmp == 0)
+    {
+      lmp = &lmo;
+
+      lmo.r_debug_size = 8;    /* 20 not actual size but all we need */
+
+      lmo.r_map_offset = 4;
+      lmo.r_map_size   = 4;
+
+      lmo.link_map_size = 20;  /* 552 not actual size but all we need */
+
+      lmo.l_addr_offset = 0;
+      lmo.l_addr_size   = 4;
+
+      lmo.l_name_offset = 4;
+      lmo.l_name_size   = 4;
+
+      lmo.l_next_offset = 12;
+      lmo.l_next_size   = 4;
+
+      lmo.l_prev_offset = 16;
+      lmo.l_prev_size   = 4;
+    }
+
+    return lmp;
+}
+#endif /* SVR4_SHARED_LIBS */
+
 static gdbarch_init_ftype sh_gdbarch_init;
 
 static struct gdbarch *
-sh_gdbarch_init (info, arches)
-     struct gdbarch_info info;
-     struct gdbarch_list *arches;
+sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   static LONGEST sh_call_dummy_words[] = {0};
   struct gdbarch *gdbarch;
@@ -1872,8 +1942,9 @@ sh_gdbarch_init (info, arches)
      statement below. */
   tdep->FPUL_REGNUM = -1;
   tdep->FPSCR_REGNUM = -1;
+  tdep->SR_REGNUM = 22;
   tdep->DSR_REGNUM = -1;
-  tdep->FP15_REGNUM = -1;
+  tdep->FP_LAST_REGNUM = -1;
   tdep->A0G_REGNUM = -1;
   tdep->A0_REGNUM = -1;
   tdep->A1G_REGNUM = -1;
@@ -1890,21 +1961,27 @@ sh_gdbarch_init (info, arches)
   tdep->SSR_REGNUM = -1;
   tdep->SPC_REGNUM = -1;
   tdep->DR0_REGNUM = -1;
-  tdep->DR2_REGNUM = -1;
-  tdep->DR4_REGNUM = -1;
-  tdep->DR6_REGNUM = -1;
-  tdep->DR8_REGNUM = -1;
-  tdep->DR10_REGNUM = -1;
-  tdep->DR12_REGNUM = -1;
-  tdep->DR14_REGNUM = -1;
+  tdep->DR_LAST_REGNUM = -1;
   tdep->FV0_REGNUM = -1;
-  tdep->FV4_REGNUM = -1;
-  tdep->FV8_REGNUM = -1;
-  tdep->FV12_REGNUM = -1;
+  tdep->FV_LAST_REGNUM = -1;
+
   set_gdbarch_fp0_regnum (gdbarch, -1);
   set_gdbarch_num_pseudo_regs (gdbarch, 0);
   set_gdbarch_max_register_raw_size (gdbarch, 4);
   set_gdbarch_max_register_virtual_size (gdbarch, 4);
+  set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
+  set_gdbarch_num_regs (gdbarch, 59);
+  set_gdbarch_sp_regnum (gdbarch, 15);
+  set_gdbarch_fp_regnum (gdbarch, 14);
+  set_gdbarch_pc_regnum (gdbarch, 16);
+  set_gdbarch_register_size (gdbarch, 4);
+  set_gdbarch_register_bytes (gdbarch, NUM_REGS * 4);
+  set_gdbarch_fetch_pseudo_register (gdbarch, sh_fetch_pseudo_register);
+  set_gdbarch_store_pseudo_register (gdbarch, sh_store_pseudo_register);
+  set_gdbarch_do_registers_info (gdbarch, sh_do_registers_info);
+  set_gdbarch_breakpoint_from_pc (gdbarch, sh_breakpoint_from_pc);
+  set_gdbarch_extract_return_value (gdbarch, sh_extract_return_value);
+  print_sh_insn = gdb_print_insn_sh;
 
   switch (info.bfd_arch_info->mach)
     {
@@ -1969,6 +2046,7 @@ sh_gdbarch_init (info, arches)
       sh_show_regs = sh3e_show_regs;
       sh_store_return_value = sh3e_sh4_store_return_value;
       sh_register_virtual_type = sh_sh3e_register_virtual_type;
+      set_gdbarch_extract_return_value (gdbarch, sh3e_sh4_extract_return_value);
       set_gdbarch_frame_init_saved_regs (gdbarch, sh_fp_frame_init_saved_regs);
       set_gdbarch_register_raw_size (gdbarch, sh_default_register_raw_size);
       set_gdbarch_register_virtual_size (gdbarch, sh_default_register_raw_size);
@@ -1976,7 +2054,7 @@ sh_gdbarch_init (info, arches)
       set_gdbarch_fp0_regnum (gdbarch, 25);
       tdep->FPUL_REGNUM = 23;
       tdep->FPSCR_REGNUM = 24;
-      tdep->FP15_REGNUM = 40;
+      tdep->FP_LAST_REGNUM = 40;
       tdep->SSR_REGNUM = 41;
       tdep->SPC_REGNUM = 42;
       break;
@@ -2011,6 +2089,7 @@ sh_gdbarch_init (info, arches)
       sh_show_regs = sh4_show_regs;
       sh_store_return_value = sh3e_sh4_store_return_value;
       sh_register_virtual_type = sh_sh4_register_virtual_type;
+      set_gdbarch_extract_return_value (gdbarch, sh3e_sh4_extract_return_value);
       set_gdbarch_frame_init_saved_regs (gdbarch, sh_fp_frame_init_saved_regs);
       set_gdbarch_fp0_regnum (gdbarch, 25);
       set_gdbarch_register_raw_size (gdbarch, sh_sh4_register_raw_size);
@@ -2024,21 +2103,13 @@ sh_gdbarch_init (info, arches)
       set_gdbarch_register_convertible (gdbarch, sh_sh4_register_convertible);
       tdep->FPUL_REGNUM = 23;
       tdep->FPSCR_REGNUM = 24;
-      tdep->FP15_REGNUM = 40;
+      tdep->FP_LAST_REGNUM = 40;
       tdep->SSR_REGNUM = 41;
       tdep->SPC_REGNUM = 42;
       tdep->DR0_REGNUM = 59;
-      tdep->DR2_REGNUM = 60;
-      tdep->DR4_REGNUM = 61;
-      tdep->DR6_REGNUM = 62;
-      tdep->DR8_REGNUM = 63;
-      tdep->DR10_REGNUM = 64;
-      tdep->DR12_REGNUM = 65;
-      tdep->DR14_REGNUM = 66;
+      tdep->DR_LAST_REGNUM = 66;
       tdep->FV0_REGNUM = 67;
-      tdep->FV4_REGNUM = 68;
-      tdep->FV8_REGNUM = 69;
-      tdep->FV12_REGNUM = 70;
+      tdep->FV_LAST_REGNUM = 70;
       break;
     default:
       sh_register_name = sh_generic_register_name;
@@ -2059,23 +2130,16 @@ sh_gdbarch_init (info, arches)
   set_gdbarch_read_sp (gdbarch, generic_target_read_sp);
   set_gdbarch_write_sp (gdbarch, generic_target_write_sp);
 
-  set_gdbarch_num_regs (gdbarch, 59);
-  set_gdbarch_sp_regnum (gdbarch, 15);
-  set_gdbarch_fp_regnum (gdbarch, 14);
-  set_gdbarch_pc_regnum (gdbarch, 16);
   set_gdbarch_register_name (gdbarch, sh_register_name);
-  set_gdbarch_register_size (gdbarch, 4);
-  set_gdbarch_register_bytes (gdbarch, NUM_REGS * 4);
   set_gdbarch_register_virtual_type (gdbarch, sh_register_virtual_type);
 
-  set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
   set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
   set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
   set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
   set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
   set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
   set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
-  set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
+  set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);/*??should be 8?*/
 
   set_gdbarch_use_generic_dummy_frames (gdbarch, 1);
   set_gdbarch_call_dummy_length (gdbarch, 0);
@@ -2094,7 +2158,6 @@ sh_gdbarch_init (info, arches)
   set_gdbarch_coerce_float_to_double (gdbarch, 
                                      sh_coerce_float_to_double);
 
-  set_gdbarch_extract_return_value (gdbarch, sh_extract_return_value);
   set_gdbarch_push_arguments (gdbarch, sh_push_arguments);
   set_gdbarch_push_dummy_frame (gdbarch, generic_push_dummy_frame);
   set_gdbarch_push_return_address (gdbarch, sh_push_return_address);
@@ -2109,32 +2172,29 @@ sh_gdbarch_init (info, arches)
   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
   set_gdbarch_decr_pc_after_break (gdbarch, 0);
   set_gdbarch_function_start_offset (gdbarch, 0);
-  set_gdbarch_breakpoint_from_pc (gdbarch, sh_breakpoint_from_pc);
 
-  set_gdbarch_fetch_pseudo_register (gdbarch, sh_fetch_pseudo_register);
-  set_gdbarch_store_pseudo_register (gdbarch, sh_store_pseudo_register);
   set_gdbarch_frame_args_skip (gdbarch, 0);
   set_gdbarch_frameless_function_invocation (gdbarch, frameless_look_for_prologue);
   set_gdbarch_frame_chain (gdbarch, sh_frame_chain);
   set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid);
   set_gdbarch_frame_saved_pc (gdbarch, sh_frame_saved_pc);
-  set_gdbarch_frame_args_address (gdbarch, sh_frame_args_address);
-  set_gdbarch_frame_locals_address (gdbarch, sh_frame_locals_address);
+  set_gdbarch_frame_args_address (gdbarch, default_frame_address);
+  set_gdbarch_frame_locals_address (gdbarch, default_frame_address);
   set_gdbarch_saved_pc_after_call (gdbarch, sh_saved_pc_after_call);
   set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
   set_gdbarch_believe_pcc_promotion (gdbarch, 1);
   set_gdbarch_ieee_float (gdbarch, 1);
+  tm_print_insn = print_sh_insn;
 
   return gdbarch;
 }
 
 void
-_initialize_sh_tdep ()
+_initialize_sh_tdep (void)
 {
   struct cmd_list_element *c;
   
   register_gdbarch_init (bfd_arch_sh, sh_gdbarch_init);
-  tm_print_insn = gdb_print_insn_sh;
 
   add_com ("regs", class_vars, sh_show_regs_command, "Print all registers");
 }
This page took 0.035216 seconds and 4 git commands to generate.