* remote.c (minitelnet): Don't redeclare escape_count, echo_check.
[binutils-gdb.git] / gdb / sparc-tdep.c
index 1b7c5941590d536c109677477bf5581eb1b54608..e1a0089f3c00a334ca79c6452e24fe6ad767165b 100644 (file)
@@ -1,6 +1,8 @@
 /* Target-dependent code for the SPARC for GDB, the GNU debugger.
-   Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997
-   Free Software Foundation, Inc.
+
+   Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation,
+   Inc.
 
    This file is part of GDB.
 
 #include "arch-utils.h"
 #include "frame.h"
 #include "inferior.h"
-#include "obstack.h"
 #include "target.h"
 #include "value.h"
 #include "bfd.h"
 #include "gdb_string.h"
+#include "regcache.h"
+#include "osabi.h"
 
 #ifdef USE_PROC_FS
 #include <sys/procfs.h>
@@ -38,6 +41,7 @@
 #endif
 
 #include "gdbcore.h"
+#include "gdb_assert.h"
 
 #include "symfile.h"   /* for 'entry_point_address' */
 
 
 
 /* Does the target have Floating Point registers?  */
-#if defined(TARGET_SPARCLET) || defined(TARGET_SPARCLITE)
-#define SPARC_HAS_FPU 0
-#else
-#define SPARC_HAS_FPU 1
+#if 0
+// OBSOLETE #if defined(TARGET_SPARCLET) || defined(TARGET_SPARCLITE)
+// OBSOLETE #define SPARC_HAS_FPU 0
+// OBSOLETE #else
+// OBSOLETE #define SPARC_HAS_FPU 1
+// OBSOLETE #endif
 #endif
+#define SPARC_HAS_FPU 1
 
 /* Number of bytes devoted to Floating Point registers: */
 #if (GDB_TARGET_IS_SPARC64)
 
 struct gdbarch_tdep
   {
-    int has_fpu;
+#if 0
+    // OBSOLETE     int has_fpu;
+#endif
     int fp_register_bytes;
     int y_regnum;
     int fp_max_regnum;
@@ -130,11 +139,13 @@ extern int stop_after_trap;
 int deferred_stores = 0;    /* Accumulated stores we want to do eventually. */
 
 
-/* Some machines, such as Fujitsu SPARClite 86x, have a bi-endian mode
-   where instructions are big-endian and data are little-endian.
-   This flag is set when we detect that the target is of this type. */
-
-int bi_endian = 0;
+#if 0
+// OBSOLETE /* Some machines, such as Fujitsu SPARClite 86x, have a bi-endian mode
+// OBSOLETE    where instructions are big-endian and data are little-endian.
+// OBSOLETE    This flag is set when we detect that the target is of this type. */
+// OBSOLETE 
+// OBSOLETE int bi_endian = 0;
+#endif
 
 
 /* Fetch a single instruction.  Even on bi-endian machines
@@ -289,18 +300,19 @@ sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
   CORE_ADDR prologue_start, prologue_end;
   int insn;
 
-  fi->extra_info = (struct frame_extra_info *)
-    frame_obstack_alloc (sizeof (struct frame_extra_info));
+  frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
   frame_saved_regs_zalloc (fi);
 
-  fi->extra_info->bottom =
-    (fi->next ?
-     (fi->frame == fi->next->frame ? fi->next->extra_info->bottom : 
-      fi->next->frame) : read_sp ());
+  get_frame_extra_info (fi)->bottom =
+    (get_next_frame (fi)
+     ? (get_frame_base (fi) == get_frame_base (get_next_frame (fi))
+       ? get_frame_extra_info (get_next_frame (fi))->bottom
+       : get_frame_base (get_next_frame (fi)))
+     : read_sp ());
 
   /* If fi->next is NULL, then we already set ->frame by passing read_fp()
      to create_new_frame.  */
-  if (fi->next)
+  if (get_next_frame (fi))
     {
       char *buf;
 
@@ -308,32 +320,33 @@ sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
 
       /* Compute ->frame as if not flat.  If it is flat, we'll change
          it later.  */
-      if (fi->next->next != NULL
-         && (fi->next->next->signal_handler_caller
-             || frame_in_dummy (fi->next->next))
-         && frameless_look_for_prologue (fi->next))
+      if (get_next_frame (get_next_frame (fi)) != NULL
+         && ((get_frame_type (get_next_frame (get_next_frame (fi))) == SIGTRAMP_FRAME)
+             || deprecated_frame_in_dummy (get_next_frame (get_next_frame (fi))))
+         && frameless_look_for_prologue (get_next_frame (fi)))
        {
          /* A frameless function interrupted by a signal did not change
             the frame pointer, fix up frame pointer accordingly.  */
-         fi->frame = FRAME_FP (fi->next);
-         fi->extra_info->bottom = fi->next->extra_info->bottom;
+         deprecated_update_frame_base_hack (fi, get_frame_base (get_next_frame (fi)));
+         get_frame_extra_info (fi)->bottom =
+           get_frame_extra_info (get_next_frame (fi))->bottom;
        }
       else
        {
          /* Should we adjust for stack bias here? */
-         get_saved_register (buf, 0, 0, fi, FP_REGNUM, 0);
-         fi->frame = extract_address (buf, REGISTER_RAW_SIZE (FP_REGNUM));
-
-         if (GDB_TARGET_IS_SPARC64 && (fi->frame & 1))
-           fi->frame += 2047;
+         ULONGEST tmp;
+         frame_read_unsigned_register (fi, FP_REGNUM, &tmp);
+         deprecated_update_frame_base_hack (fi, tmp);
+         if (GDB_TARGET_IS_SPARC64 && (get_frame_base (fi) & 1))
+           deprecated_update_frame_base_hack (fi, get_frame_base (fi) + 2047);
        }
     }
 
   /* Decide whether this is a function with a ``flat register window''
      frame.  For such functions, the frame pointer is actually in %i7.  */
-  fi->extra_info->flat = 0;
-  fi->extra_info->in_prologue = 0;
-  if (find_pc_partial_function (fi->pc, &name, &prologue_start, &prologue_end))
+  get_frame_extra_info (fi)->flat = 0;
+  get_frame_extra_info (fi)->in_prologue = 0;
+  if (find_pc_partial_function (get_frame_pc (fi), &name, &prologue_start, &prologue_end))
     {
       /* See if the function starts with an add (which will be of a
          negative number if a flat frame) to the sp.  FIXME: Does not
@@ -357,30 +370,33 @@ sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
              buf = alloca (MAX_REGISTER_RAW_SIZE);
 
              /* We definitely have a flat frame now.  */
-             fi->extra_info->flat = 1;
+             get_frame_extra_info (fi)->flat = 1;
 
-             fi->extra_info->sp_offset = offset;
+             get_frame_extra_info (fi)->sp_offset = offset;
 
              /* Overwrite the frame's address with the value in %i7.  */
-             get_saved_register (buf, 0, 0, fi, I7_REGNUM, 0);
-             fi->frame = extract_address (buf, REGISTER_RAW_SIZE (I7_REGNUM));
+             {
+               ULONGEST tmp;
+               frame_read_unsigned_register (fi, I7_REGNUM, &tmp);
+               deprecated_update_frame_base_hack (fi, tmp);
+             }
 
-             if (GDB_TARGET_IS_SPARC64 && (fi->frame & 1))
-               fi->frame += 2047;
+             if (GDB_TARGET_IS_SPARC64 && (get_frame_base (fi) & 1))
+               deprecated_update_frame_base_hack (fi, get_frame_base (fi) + 2047);
 
              /* Record where the fp got saved.  */
-             fi->extra_info->fp_addr = 
-               fi->frame + fi->extra_info->sp_offset + X_SIMM13 (insn);
+             get_frame_extra_info (fi)->fp_addr = 
+               get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
 
              /* Also try to collect where the pc got saved to.  */
-             fi->extra_info->pc_addr = 0;
+             get_frame_extra_info (fi)->pc_addr = 0;
              insn = fetch_instruction (prologue_start + 12);
              if (X_OP (insn) == 3
                  && X_RD (insn) == 15
                  && X_OP3 (insn) == 4
                  && X_RS1 (insn) == 14)
-               fi->extra_info->pc_addr = 
-                 fi->frame + fi->extra_info->sp_offset + X_SIMM13 (insn);
+               get_frame_extra_info (fi)->pc_addr = 
+                 get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
            }
        }
       else
@@ -394,40 +410,53 @@ sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
 
          sal = find_pc_line (prologue_start, 0);
          if (sal.line == 0)    /* no line info, use PC */
-           prologue_end = fi->pc;
+           prologue_end = get_frame_pc (fi);
          else if (sal.end < prologue_end)
            prologue_end = sal.end;
-         if (fi->pc < prologue_end)
+         if (get_frame_pc (fi) < prologue_end)
            {
-             for (addr = prologue_start; addr < fi->pc; addr += 4)
+             for (addr = prologue_start; addr < get_frame_pc (fi); addr += 4)
                {
                  insn = read_memory_integer (addr, 4);
                  if (X_OP (insn) == 2 && X_OP3 (insn) == 0x3c)
                    break;      /* SAVE seen, stop searching */
                }
-             if (addr >= fi->pc)
+             if (addr >= get_frame_pc (fi))
                {
-                 fi->extra_info->in_prologue = 1;
-                 fi->frame = read_register (SP_REGNUM);
+                 get_frame_extra_info (fi)->in_prologue = 1;
+                 deprecated_update_frame_base_hack (fi, read_register (SP_REGNUM));
                }
            }
        }
     }
-  if (fi->next && fi->frame == 0)
+  if (get_next_frame (fi) && get_frame_base (fi) == 0)
     {
       /* Kludge to cause init_prev_frame_info to destroy the new frame.  */
-      fi->frame = fi->next->frame;
-      fi->pc = fi->next->pc;
+      deprecated_update_frame_base_hack (fi, get_frame_base (get_next_frame (fi)));
+      deprecated_update_frame_pc_hack (fi, get_frame_pc (get_next_frame (fi)));
     }
 }
 
 CORE_ADDR
 sparc_frame_chain (struct frame_info *frame)
 {
-  /* Value that will cause FRAME_CHAIN_VALID to not worry about the chain
-     value.  If it realy is zero, we detect it later in
-     sparc_init_prev_frame.  */
-  return (CORE_ADDR) 1;
+  /* Value that will cause DEPRECATED_FRAME_CHAIN_VALID to not worry
+     about the chain value.  If it really is zero, we detect it later
+     in sparc_init_prev_frame.
+     
+     Note: kevinb/2003-02-18: The constant 1 used to be returned here,
+     but, after some recent changes to legacy_frame_chain_valid(),
+     this value is no longer suitable for causing
+     legacy_frame_chain_valid() to "not worry about the chain value."
+     The constant ~0 (i.e, 0xfff...) causes the failing test in
+     legacy_frame_chain_valid() to succeed thus preserving the "not
+     worry" property.  I had considered using something like
+     ``get_frame_base (frame) + 1''.  However, I think a constant
+     value is better, because when debugging this problem, I knew that
+     something funny was going on as soon as I saw the constant 1
+     being used as the frame chain elsewhere in GDB.  */
+
+  return ~ (CORE_ADDR) 0;
 }
 
 CORE_ADDR
@@ -446,7 +475,7 @@ sparc_frame_saved_pc (struct frame_info *frame)
   CORE_ADDR addr;
 
   buf = alloca (MAX_REGISTER_RAW_SIZE);
-  if (frame->signal_handler_caller)
+  if ((get_frame_type (frame) == SIGTRAMP_FRAME))
     {
       /* This is the signal trampoline frame.
          Get the saved PC from the sigcontext structure.  */
@@ -464,15 +493,17 @@ sparc_frame_saved_pc (struct frame_info *frame)
 
       /* Solaris2 ucbsigvechandler passes a pointer to a sigcontext
          as the third parameter.  The offset to the saved pc is 12.  */
-      find_pc_partial_function (frame->pc, &name,
+      find_pc_partial_function (get_frame_pc (frame), &name,
                                (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
       if (name && STREQ (name, "ucbsigvechandler"))
        saved_pc_offset = 12;
 
       /* The sigcontext address is contained in register O2.  */
-      get_saved_register (buf, (int *) NULL, (CORE_ADDR *) NULL,
-                         frame, O0_REGNUM + 2, (enum lval_type *) NULL);
-      sigcontext_addr = extract_address (buf, REGISTER_RAW_SIZE (O0_REGNUM + 2));
+      {
+       ULONGEST tmp;
+       frame_read_unsigned_register (frame, O0_REGNUM + 2, &tmp);
+       sigcontext_addr = tmp;
+      }
 
       /* Don't cause a memory_error when accessing sigcontext in case the
          stack layout has changed or the stack is corrupt.  */
@@ -480,22 +511,22 @@ sparc_frame_saved_pc (struct frame_info *frame)
                          scbuf, sizeof (scbuf));
       return extract_address (scbuf, sizeof (scbuf));
     }
-  else if (frame->extra_info->in_prologue ||
-          (frame->next != NULL &&
-           (frame->next->signal_handler_caller ||
-            frame_in_dummy (frame->next)) &&
+  else if (get_frame_extra_info (frame)->in_prologue ||
+          (get_next_frame (frame) != NULL &&
+           ((get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME) ||
+            deprecated_frame_in_dummy (get_next_frame (frame))) &&
            frameless_look_for_prologue (frame)))
     {
       /* A frameless function interrupted by a signal did not save
          the PC, it is still in %o7.  */
-      get_saved_register (buf, (int *) NULL, (CORE_ADDR *) NULL,
-                         frame, O7_REGNUM, (enum lval_type *) NULL);
-      return PC_ADJUST (extract_address (buf, SPARC_INTREG_SIZE));
+      ULONGEST tmp;
+      frame_read_unsigned_register (frame, O7_REGNUM, &tmp);
+      return PC_ADJUST (tmp);
     }
-  if (frame->extra_info->flat)
-    addr = frame->extra_info->pc_addr;
+  if (get_frame_extra_info (frame)->flat)
+    addr = get_frame_extra_info (frame)->pc_addr;
   else
-    addr = frame->extra_info->bottom + FRAME_SAVED_I0 +
+    addr = get_frame_extra_info (frame)->bottom + FRAME_SAVED_I0 +
       SPARC_INTREG_SIZE * (I7_REGNUM - I0_REGNUM);
 
   if (addr == 0)
@@ -526,10 +557,11 @@ setup_arbitrary_frame (int argc, CORE_ADDR *argv)
   frame = create_new_frame (argv[0], 0);
 
   if (!frame)
-    internal_error ("create_new_frame returned invalid frame");
+    internal_error (__FILE__, __LINE__,
+                   "create_new_frame returned invalid frame");
 
-  frame->extra_info->bottom = argv[1];
-  frame->pc = FRAME_SAVED_PC (frame);
+  get_frame_extra_info (frame)->bottom = argv[1];
+  deprecated_update_frame_pc_hack (frame, DEPRECATED_FRAME_SAVED_PC (frame));
   return frame;
 }
 
@@ -670,7 +702,7 @@ examine_prologue (CORE_ADDR start_pc, int frameless_p, struct frame_info *fi,
        {
          if (saved_regs && X_I (insn))
            saved_regs[X_RD (insn)] =
-             fi->frame + fi->extra_info->sp_offset + X_SIMM13 (insn);
+             get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
        }
       else
        break;
@@ -681,10 +713,36 @@ examine_prologue (CORE_ADDR start_pc, int frameless_p, struct frame_info *fi,
   return pc;
 }
 
+/* Advance PC across any function entry prologue instructions to reach
+   some "real" code.  */
+
 CORE_ADDR
-sparc_skip_prologue (CORE_ADDR start_pc, int frameless_p)
+sparc_skip_prologue (CORE_ADDR start_pc)
+{
+  struct symtab_and_line sal;
+  CORE_ADDR func_start, func_end;
+
+  /* This is the preferred method, find the end of the prologue by
+     using the debugging information.  */
+  if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
+    {
+      sal = find_pc_line (func_start, 0);
+
+      if (sal.end < func_end
+         && start_pc <= sal.end)
+       return sal.end;
+    }
+
+  /* Oh well, examine the code by hand.  */
+  return examine_prologue (start_pc, 0, NULL, NULL);
+}
+
+/* Is the prologue at IP frameless?  */
+
+int
+sparc_prologue_frameless_p (CORE_ADDR ip)
 {
-  return examine_prologue (start_pc, frameless_p, NULL, NULL);
+  return ip == examine_prologue (ip, 1, NULL, NULL);
 }
 
 /* Check instruction at ADDR to see if it is a branch.
@@ -784,16 +842,16 @@ sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
       /* error ("No selected frame."); */
       if (!target_has_registers)
        error ("The program has no registers now.");
-      if (selected_frame == NULL)
+      if (deprecated_selected_frame == NULL)
        error ("No selected frame.");
       /* Try to use selected frame */
-      frame = get_prev_frame (selected_frame);
+      frame = get_prev_frame (deprecated_selected_frame);
       if (frame == 0)
        error ("Cmd not meaningful in the outermost frame.");
     }
 
 
-  frame1 = frame->next;
+  frame1 = get_next_frame (frame);
 
   /* Get saved PC from the frame info if not in innermost frame.  */
   if (regnum == PC_REGNUM && frame1 != NULL)
@@ -803,7 +861,7 @@ sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
       if (raw_buffer != NULL)
        {
          /* Put it back in target format.  */
-         store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), frame->pc);
+         store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), get_frame_pc (frame));
        }
       if (addrp != NULL)
        *addrp = 0;
@@ -814,46 +872,57 @@ sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
     {
       /* FIXME MVS: wrong test for dummy frame at entry.  */
 
-      if (frame1->pc >= (frame1->extra_info->bottom ? 
-                        frame1->extra_info->bottom : read_sp ())
-         && frame1->pc <= FRAME_FP (frame1))
+      if (get_frame_pc (frame1) >= (get_frame_extra_info (frame1)->bottom
+                                   ? get_frame_extra_info (frame1)->bottom
+                                   : read_sp ())
+         && get_frame_pc (frame1) <= get_frame_base (frame1))
        {
          /* Dummy frame.  All but the window regs are in there somewhere.
             The window registers are saved on the stack, just like in a
             normal frame.  */
          if (regnum >= G1_REGNUM && regnum < G1_REGNUM + 7)
-           addr = frame1->frame + (regnum - G0_REGNUM) * SPARC_INTREG_SIZE
+           addr = get_frame_base (frame1) + (regnum - G0_REGNUM) * SPARC_INTREG_SIZE
              - (FP_REGISTER_BYTES + 8 * SPARC_INTREG_SIZE);
          else if (regnum >= I0_REGNUM && regnum < I0_REGNUM + 8)
-           addr = (frame1->prev->extra_info->bottom
+           /* NOTE: cagney/2002-05-04: The call to get_prev_frame()
+               is safe/cheap - there will always be a prev frame.
+               This is because frame1 is initialized to frame->next
+               (frame1->prev == frame) and is then advanced towards
+               the innermost (next) frame.  */
+           addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
                    + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
                    + FRAME_SAVED_I0);
          else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
-           addr = (frame1->prev->extra_info->bottom
+           /* NOTE: cagney/2002-05-04: The call to get_prev_frame()
+               is safe/cheap - there will always be a prev frame.
+               This is because frame1 is initialized to frame->next
+               (frame1->prev == frame) and is then advanced towards
+               the innermost (next) frame.  */
+           addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
                    + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
                    + FRAME_SAVED_L0);
          else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
-           addr = frame1->frame + (regnum - O0_REGNUM) * SPARC_INTREG_SIZE
+           addr = get_frame_base (frame1) + (regnum - O0_REGNUM) * SPARC_INTREG_SIZE
              - (FP_REGISTER_BYTES + 16 * SPARC_INTREG_SIZE);
          else if (SPARC_HAS_FPU &&
                   regnum >= FP0_REGNUM && regnum < FP0_REGNUM + 32)
-           addr = frame1->frame + (regnum - FP0_REGNUM) * 4
+           addr = get_frame_base (frame1) + (regnum - FP0_REGNUM) * 4
              - (FP_REGISTER_BYTES);
          else if (GDB_TARGET_IS_SPARC64 && SPARC_HAS_FPU && 
                   regnum >= FP0_REGNUM + 32 && regnum < FP_MAX_REGNUM)
-           addr = frame1->frame + 32 * 4 + (regnum - FP0_REGNUM - 32) * 8
+           addr = get_frame_base (frame1) + 32 * 4 + (regnum - FP0_REGNUM - 32) * 8
              - (FP_REGISTER_BYTES);
          else if (regnum >= Y_REGNUM && regnum < NUM_REGS)
-           addr = frame1->frame + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
+           addr = get_frame_base (frame1) + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
              - (FP_REGISTER_BYTES + 24 * SPARC_INTREG_SIZE);
        }
-      else if (frame1->extra_info->flat)
+      else if (get_frame_extra_info (frame1)->flat)
        {
 
          if (regnum == RP_REGNUM)
-           addr = frame1->extra_info->pc_addr;
+           addr = get_frame_extra_info (frame1)->pc_addr;
          else if (regnum == I7_REGNUM)
-           addr = frame1->extra_info->fp_addr;
+           addr = get_frame_extra_info (frame1)->fp_addr;
          else
            {
              CORE_ADDR func_start;
@@ -862,7 +931,7 @@ sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
              regs = alloca (NUM_REGS * sizeof (CORE_ADDR)); 
              memset (regs, 0, NUM_REGS * sizeof (CORE_ADDR));
 
-             find_pc_partial_function (frame1->pc, NULL, &func_start, NULL);
+             find_pc_partial_function (get_frame_pc (frame1), NULL, &func_start, NULL);
              examine_prologue (func_start, 0, frame1, regs);
              addr = regs[regnum];
            }
@@ -871,24 +940,25 @@ sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
        {
          /* Normal frame.  Local and In registers are saved on stack.  */
          if (regnum >= I0_REGNUM && regnum < I0_REGNUM + 8)
-           addr = (frame1->prev->extra_info->bottom
+           addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
                    + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
                    + FRAME_SAVED_I0);
          else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
-           addr = (frame1->prev->extra_info->bottom
+           addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
                    + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
                    + FRAME_SAVED_L0);
          else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
            {
              /* Outs become ins.  */
-             get_saved_register (raw_buffer, optimized, addrp, frame1,
-                                 (regnum - O0_REGNUM + I0_REGNUM), lval);
+             int realnum;
+             frame_register (frame1, (regnum - O0_REGNUM + I0_REGNUM),
+                             optimized, lval, addrp, &realnum, raw_buffer);
              return;
            }
        }
       if (addr != 0)
        break;
-      frame1 = frame1->next;
+      frame1 = get_next_frame (frame1);
     }
   if (addr != 0)
     {
@@ -914,7 +984,7 @@ sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
        *lval = lval_register;
       addr = REGISTER_BYTE (regnum);
       if (raw_buffer != NULL)
-       read_register_gen (regnum, raw_buffer);
+       deprecated_read_register_gen (regnum, raw_buffer);
     }
   if (addrp != NULL)
     *addrp = addr;
@@ -948,44 +1018,64 @@ sparc_push_dummy_frame (void)
   if (GDB_TARGET_IS_SPARC64)
     {
       /* PC, NPC, CCR, FSR, FPRS, Y, ASI */
-      read_register_bytes (REGISTER_BYTE (PC_REGNUM), &register_temp[0],
-                          REGISTER_RAW_SIZE (PC_REGNUM) * 7);
-      read_register_bytes (REGISTER_BYTE (PSTATE_REGNUM), 
-                          &register_temp[7 * SPARC_INTREG_SIZE],
-                          REGISTER_RAW_SIZE (PSTATE_REGNUM));
+      deprecated_read_register_bytes (REGISTER_BYTE (PC_REGNUM),
+                                     &register_temp[0],
+                                     REGISTER_RAW_SIZE (PC_REGNUM) * 7);
+      deprecated_read_register_bytes (REGISTER_BYTE (PSTATE_REGNUM), 
+                                     &register_temp[7 * SPARC_INTREG_SIZE],
+                                     REGISTER_RAW_SIZE (PSTATE_REGNUM));
       /* FIXME: not sure what needs to be saved here.  */
     }
   else
     {
       /* Y, PS, WIM, TBR, PC, NPC, FPS, CPS regs */
-      read_register_bytes (REGISTER_BYTE (Y_REGNUM), &register_temp[0],
-                          REGISTER_RAW_SIZE (Y_REGNUM) * 8);
+      deprecated_read_register_bytes (REGISTER_BYTE (Y_REGNUM),
+                                     &register_temp[0],
+                                     REGISTER_RAW_SIZE (Y_REGNUM) * 8);
     }
 
-  read_register_bytes (REGISTER_BYTE (O0_REGNUM),
-                      &register_temp[8 * SPARC_INTREG_SIZE],
-                      SPARC_INTREG_SIZE * 8);
+  deprecated_read_register_bytes (REGISTER_BYTE (O0_REGNUM),
+                                 &register_temp[8 * SPARC_INTREG_SIZE],
+                                 SPARC_INTREG_SIZE * 8);
 
-  read_register_bytes (REGISTER_BYTE (G0_REGNUM),
-                      &register_temp[16 * SPARC_INTREG_SIZE],
-                      SPARC_INTREG_SIZE * 8);
+  deprecated_read_register_bytes (REGISTER_BYTE (G0_REGNUM),
+                                 &register_temp[16 * SPARC_INTREG_SIZE],
+                                 SPARC_INTREG_SIZE * 8);
 
   if (SPARC_HAS_FPU)
-    read_register_bytes (REGISTER_BYTE (FP0_REGNUM),
-                        &register_temp[24 * SPARC_INTREG_SIZE],
-                        FP_REGISTER_BYTES);
+    deprecated_read_register_bytes (REGISTER_BYTE (FP0_REGNUM),
+                                   &register_temp[24 * SPARC_INTREG_SIZE],
+                                   FP_REGISTER_BYTES);
 
   sp -= DUMMY_STACK_SIZE;
 
-  write_sp (sp);
+  DEPRECATED_DUMMY_WRITE_SP (sp);
 
   write_memory (sp + DUMMY_REG_SAVE_OFFSET, &register_temp[0],
                DUMMY_STACK_REG_BUF_SIZE);
 
   if (strcmp (target_shortname, "sim") != 0)
     {
-      write_fp (old_sp);
-
+      /* NOTE: cagney/2002-04-04: The code below originally contained
+         GDB's _only_ call to write_fp().  That call was eliminated by
+         inlining the corresponding code.  For the 64 bit case, the
+         old function (sparc64_write_fp) did the below although I'm
+         not clear why.  The same goes for why this is only done when
+         the underlying target is a simulator.  */
+      if (GDB_TARGET_IS_SPARC64)
+       {
+         /* Target is a 64 bit SPARC.  */
+         CORE_ADDR oldfp = read_register (FP_REGNUM);
+         if (oldfp & 1)
+           write_register (FP_REGNUM, old_sp - 2047);
+         else
+           write_register (FP_REGNUM, old_sp);
+       }
+      else
+       {
+         /* Target is a 32 bit SPARC.  */
+         write_register (FP_REGNUM, old_sp);
+       }
       /* Set return address register for the call dummy to the current PC.  */
       write_register (I7_REGNUM, read_pc () - 8);
     }
@@ -1015,10 +1105,10 @@ sparc_push_dummy_frame (void)
    I think few ports of GDB get right--if you are popping a frame
    which does not save some register that *is* saved by a more inner
    frame (such a frame will never be a dummy frame because dummy
-   frames save all registers).  Rewriting pop_frame to use
-   get_saved_register would solve this problem and also get rid of the
-   ugly duplication between sparc_frame_find_saved_regs and
-   get_saved_register.
+   frames save all registers).
+
+   NOTE: cagney/2003-03-12: Since pop_frame has been rewritten to use
+   frame_unwind_register() the need for this function is questionable.
 
    Stores, into an array of CORE_ADDR, 
    the addresses of the saved registers of frame described by FRAME_INFO.
@@ -1050,16 +1140,16 @@ static void
 sparc_frame_find_saved_regs (struct frame_info *fi, CORE_ADDR *saved_regs_addr)
 {
   register int regnum;
-  CORE_ADDR frame_addr = FRAME_FP (fi);
+  CORE_ADDR frame_addr = get_frame_base (fi);
 
-  if (!fi)
-    internal_error ("Bad frame info struct in FRAME_FIND_SAVED_REGS");
+  gdb_assert (fi != NULL);
 
   memset (saved_regs_addr, 0, NUM_REGS * sizeof (CORE_ADDR));
 
-  if (fi->pc >= (fi->extra_info->bottom ? 
-                fi->extra_info->bottom : read_sp ())
-      && fi->pc <= FRAME_FP (fi))
+  if (get_frame_pc (fi) >= (get_frame_extra_info (fi)->bottom
+                           ? get_frame_extra_info (fi)->bottom
+                           : read_sp ())
+      && get_frame_pc (fi) <= get_frame_base (fi))
     {
       /* Dummy frame.  All but the window regs are in there somewhere. */
       for (regnum = G1_REGNUM; regnum < G1_REGNUM + 7; regnum++)
@@ -1094,24 +1184,26 @@ sparc_frame_find_saved_regs (struct frame_info *fi, CORE_ADDR *saved_regs_addr)
            frame_addr + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
            - DUMMY_STACK_REG_BUF_SIZE;
 
-      frame_addr = fi->extra_info->bottom ?
-       fi->extra_info->bottom : read_sp ();
+      frame_addr = (get_frame_extra_info (fi)->bottom
+                   ? get_frame_extra_info (fi)->bottom
+                   : read_sp ());
     }
-  else if (fi->extra_info->flat)
+  else if (get_frame_extra_info (fi)->flat)
     {
       CORE_ADDR func_start;
-      find_pc_partial_function (fi->pc, NULL, &func_start, NULL);
+      find_pc_partial_function (get_frame_pc (fi), NULL, &func_start, NULL);
       examine_prologue (func_start, 0, fi, saved_regs_addr);
 
       /* Flat register window frame.  */
-      saved_regs_addr[RP_REGNUM] = fi->extra_info->pc_addr;
-      saved_regs_addr[I7_REGNUM] = fi->extra_info->fp_addr;
+      saved_regs_addr[RP_REGNUM] = get_frame_extra_info (fi)->pc_addr;
+      saved_regs_addr[I7_REGNUM] = get_frame_extra_info (fi)->fp_addr;
     }
   else
     {
       /* Normal frame.  Just Local and In registers */
-      frame_addr = fi->extra_info->bottom ?
-       fi->extra_info->bottom : read_sp ();
+      frame_addr = (get_frame_extra_info (fi)->bottom
+                   ? get_frame_extra_info (fi)->bottom
+                   : read_sp ());
       for (regnum = L0_REGNUM; regnum < L0_REGNUM + 8; regnum++)
        saved_regs_addr[regnum] =
          (frame_addr + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
@@ -1121,18 +1213,19 @@ sparc_frame_find_saved_regs (struct frame_info *fi, CORE_ADDR *saved_regs_addr)
          (frame_addr + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
           + FRAME_SAVED_I0);
     }
-  if (fi->next)
+  if (get_next_frame (fi))
     {
-      if (fi->extra_info->flat)
+      if (get_frame_extra_info (fi)->flat)
        {
-         saved_regs_addr[O7_REGNUM] = fi->extra_info->pc_addr;
+         saved_regs_addr[O7_REGNUM] = get_frame_extra_info (fi)->pc_addr;
        }
       else
        {
          /* Pull off either the next frame pointer or the stack pointer */
          CORE_ADDR next_next_frame_addr =
-         (fi->next->extra_info->bottom ?
-          fi->next->extra_info->bottom : read_sp ());
+         (get_frame_extra_info (get_next_frame (fi))->bottom
+          ? get_frame_extra_info (get_next_frame (fi))->bottom
+          : read_sp ());
          for (regnum = O0_REGNUM; regnum < O0_REGNUM + 8; regnum++)
            saved_regs_addr[regnum] =
              (next_next_frame_addr
@@ -1142,16 +1235,17 @@ sparc_frame_find_saved_regs (struct frame_info *fi, CORE_ADDR *saved_regs_addr)
     }
   /* Otherwise, whatever we would get from ptrace(GETREGS) is accurate */
   /* FIXME -- should this adjust for the sparc64 offset? */
-  saved_regs_addr[SP_REGNUM] = FRAME_FP (fi);
+  saved_regs_addr[SP_REGNUM] = get_frame_base (fi);
 }
 
 /* Discard from the stack the innermost frame, restoring all saved registers.
 
-   Note that the values stored in fsr by get_frame_saved_regs are *in
-   the context of the called frame*.  What this means is that the i
-   regs of fsr must be restored into the o regs of the (calling) frame that
-   we pop into.  We don't care about the output regs of the calling frame,
-   since unless it's a dummy frame, it won't have any output regs in it.
+   Note that the values stored in fsr by
+   deprecated_get_frame_saved_regs are *in the context of the called
+   frame*.  What this means is that the i regs of fsr must be restored
+   into the o regs of the (calling) frame that we pop into.  We don't
+   care about the output regs of the calling frame, since unless it's
+   a dummy frame, it won't have any output regs in it.
 
    We never have to bother with %l (local) regs, since the called routine's
    locals get tossed, and the calling routine's locals are already saved
@@ -1176,31 +1270,31 @@ sparc_pop_frame (void)
       if (fsr[FP0_REGNUM])
        {
          read_memory (fsr[FP0_REGNUM], raw_buffer, FP_REGISTER_BYTES);
-         write_register_bytes (REGISTER_BYTE (FP0_REGNUM),
-                               raw_buffer, FP_REGISTER_BYTES);
+         deprecated_write_register_bytes (REGISTER_BYTE (FP0_REGNUM),
+                                          raw_buffer, FP_REGISTER_BYTES);
        }
       if (!(GDB_TARGET_IS_SPARC64))
        {
          if (fsr[FPS_REGNUM])
            {
              read_memory (fsr[FPS_REGNUM], raw_buffer, SPARC_INTREG_SIZE);
-             write_register_gen (FPS_REGNUM, raw_buffer);
+             deprecated_write_register_gen (FPS_REGNUM, raw_buffer);
            }
          if (fsr[CPS_REGNUM])
            {
              read_memory (fsr[CPS_REGNUM], raw_buffer, SPARC_INTREG_SIZE);
-             write_register_gen (CPS_REGNUM, raw_buffer);
+             deprecated_write_register_gen (CPS_REGNUM, raw_buffer);
            }
        }
     }
   if (fsr[G1_REGNUM])
     {
       read_memory (fsr[G1_REGNUM], raw_buffer, 7 * SPARC_INTREG_SIZE);
-      write_register_bytes (REGISTER_BYTE (G1_REGNUM), raw_buffer,
-                           7 * SPARC_INTREG_SIZE);
+      deprecated_write_register_bytes (REGISTER_BYTE (G1_REGNUM), raw_buffer,
+                                      7 * SPARC_INTREG_SIZE);
     }
 
-  if (frame->extra_info->flat)
+  if (get_frame_extra_info (frame)->flat)
     {
       /* Each register might or might not have been saved, need to test
          individually.  */
@@ -1223,7 +1317,7 @@ sparc_pop_frame (void)
                        read_memory_integer (fsr[O0_REGNUM + 7],
                                             SPARC_INTREG_SIZE));
 
-      write_sp (frame->frame);
+      DEPRECATED_DUMMY_WRITE_SP (get_frame_base (frame));
     }
   else if (fsr[I0_REGNUM])
     {
@@ -1231,7 +1325,7 @@ sparc_pop_frame (void)
 
       char *reg_temp;
 
-      reg_temp = alloca (REGISTER_BYTES);
+      reg_temp = alloca (SPARC_INTREG_SIZE * 16);
 
       read_memory (fsr[I0_REGNUM], raw_buffer, 8 * SPARC_INTREG_SIZE);
 
@@ -1249,11 +1343,11 @@ sparc_pop_frame (void)
 
       /* Restore the out registers.
          Among other things this writes the new stack pointer.  */
-      write_register_bytes (REGISTER_BYTE (O0_REGNUM), raw_buffer,
-                           SPARC_INTREG_SIZE * 8);
+      deprecated_write_register_bytes (REGISTER_BYTE (O0_REGNUM), raw_buffer,
+                                      SPARC_INTREG_SIZE * 8);
 
-      write_register_bytes (REGISTER_BYTE (L0_REGNUM), reg_temp,
-                           SPARC_INTREG_SIZE * 16);
+      deprecated_write_register_bytes (REGISTER_BYTE (L0_REGNUM), reg_temp,
+                                      SPARC_INTREG_SIZE * 16);
     }
 
   if (!(GDB_TARGET_IS_SPARC64))
@@ -1277,23 +1371,20 @@ sparc_pop_frame (void)
                        read_memory_integer (fsr[NPC_REGNUM],
                                             REGISTER_RAW_SIZE (NPC_REGNUM)));
     }
-  else if (frame->extra_info->flat)
+  else if (get_frame_extra_info (frame)->flat)
     {
-      if (frame->extra_info->pc_addr)
+      if (get_frame_extra_info (frame)->pc_addr)
        pc = PC_ADJUST ((CORE_ADDR)
-                       read_memory_integer (frame->extra_info->pc_addr,
+                       read_memory_integer (get_frame_extra_info (frame)->pc_addr,
                                             REGISTER_RAW_SIZE (PC_REGNUM)));
       else
        {
          /* I think this happens only in the innermost frame, if so then
             it is a complicated way of saying
             "pc = read_register (O7_REGNUM);".  */
-         char *buf;
-
-         buf = alloca (MAX_REGISTER_RAW_SIZE);
-         get_saved_register (buf, 0, 0, frame, O7_REGNUM, 0);
-         pc = PC_ADJUST (extract_address
-                         (buf, REGISTER_RAW_SIZE (O7_REGNUM)));
+         ULONGEST tmp;
+         frame_read_unsigned_register (frame, O7_REGNUM, &tmp);
+         pc = PC_ADJUST (tmp);
        }
 
       write_register (PC_REGNUM, pc);
@@ -1548,37 +1639,37 @@ fill_gregset (gdb_gregset_t *gregsetp, int regno)
 
   for (regi = 0; regi <= R_I7; regi++)
     if ((regno == -1) || (regno == regi))
-      read_register_gen (regi, (char *) (regp + regi) + offset);
+      deprecated_read_register_gen (regi, (char *) (regp + regi) + offset);
 
   if ((regno == -1) || (regno == PC_REGNUM))
-    read_register_gen (PC_REGNUM, (char *) (regp + R_PC) + offset);
+    deprecated_read_register_gen (PC_REGNUM, (char *) (regp + R_PC) + offset);
 
   if ((regno == -1) || (regno == NPC_REGNUM))
-    read_register_gen (NPC_REGNUM, (char *) (regp + R_nPC) + offset);
+    deprecated_read_register_gen (NPC_REGNUM, (char *) (regp + R_nPC) + offset);
 
   if ((regno == -1) || (regno == Y_REGNUM))
-    read_register_gen (Y_REGNUM, (char *) (regp + R_Y) + offset);
+    deprecated_read_register_gen (Y_REGNUM, (char *) (regp + R_Y) + offset);
 
   if (GDB_TARGET_IS_SPARC64)
     {
 #ifdef R_CCR
       if (regno == -1 || regno == CCR_REGNUM)
-       read_register_gen (CCR_REGNUM, ((char *) (regp + R_CCR)) + offset);
+       deprecated_read_register_gen (CCR_REGNUM, ((char *) (regp + R_CCR)) + offset);
 #endif
 #ifdef R_FPRS
       if (regno == -1 || regno == FPRS_REGNUM)
-       read_register_gen (FPRS_REGNUM, ((char *) (regp + R_FPRS)) + offset);
+       deprecated_read_register_gen (FPRS_REGNUM, ((char *) (regp + R_FPRS)) + offset);
 #endif
 #ifdef R_ASI
       if (regno == -1 || regno == ASI_REGNUM)
-       read_register_gen (ASI_REGNUM, ((char *) (regp + R_ASI)) + offset);
+       deprecated_read_register_gen (ASI_REGNUM, ((char *) (regp + R_ASI)) + offset);
 #endif
     }
   else /* sparc32 */
     {
 #ifdef R_PS
       if (regno == -1 || regno == PS_REGNUM)
-       read_register_gen (PS_REGNUM, ((char *) (regp + R_PS)) + offset);
+       deprecated_read_register_gen (PS_REGNUM, ((char *) (regp + R_PS)) + offset);
 #endif
 
       /* For 64-bit hosts, R_WIM and R_TBR may not be defined.
@@ -1594,18 +1685,18 @@ fill_gregset (gdb_gregset_t *gregsetp, int regno)
 
 #if defined (R_WIM)
       if (regno == -1 || regno == WIM_REGNUM)
-       read_register_gen (WIM_REGNUM, ((char *) (regp + R_WIM)) + offset);
+       deprecated_read_register_gen (WIM_REGNUM, ((char *) (regp + R_WIM)) + offset);
 #else
       if (regno == -1 || regno == WIM_REGNUM)
-       read_register_gen (WIM_REGNUM, NULL);
+       deprecated_read_register_gen (WIM_REGNUM, NULL);
 #endif
 
 #if defined (R_TBR)
       if (regno == -1 || regno == TBR_REGNUM)
-       read_register_gen (TBR_REGNUM, ((char *) (regp + R_TBR)) + offset);
+       deprecated_read_register_gen (TBR_REGNUM, ((char *) (regp + R_TBR)) + offset);
 #else
       if (regno == -1 || regno == TBR_REGNUM)
-       read_register_gen (TBR_REGNUM, NULL);
+       deprecated_read_register_gen (TBR_REGNUM, NULL);
 #endif
     }
 }
@@ -1666,7 +1757,7 @@ fill_fpregset (gdb_fpregset_t *fpregsetp, int regno)
     {
       if ((regno == -1) || (regno == regi))
        {
-         from = (char *) &registers[REGISTER_BYTE (regi)];
+         from = (char *) &deprecated_registers[REGISTER_BYTE (regi)];
          to = (char *) &fpregsetp->pr_fr.pr_regs[regi - FP0_REGNUM];
          memcpy (to, from, REGISTER_RAW_SIZE (regi));
        }
@@ -1675,7 +1766,7 @@ fill_fpregset (gdb_fpregset_t *fpregsetp, int regno)
   if (!(GDB_TARGET_IS_SPARC64)) /* FIXME: does Sparc64 have this register? */
     if ((regno == -1) || (regno == FPS_REGNUM))
       {
-       from = (char *)&registers[REGISTER_BYTE (FPS_REGNUM)];
+       from = (char *)&deprecated_registers[REGISTER_BYTE (FPS_REGNUM)];
        to = (char *) &fpregsetp->pr_fsr;
        memcpy (to, from, REGISTER_RAW_SIZE (FPS_REGNUM));
       }
@@ -1683,8 +1774,9 @@ fill_fpregset (gdb_fpregset_t *fpregsetp, int regno)
 
 #endif /* USE_PROC_FS */
 
-
-#ifdef GET_LONGJMP_TARGET
+/* Because of Multi-arch, GET_LONGJMP_TARGET is always defined.  So test
+   for a definition of JB_PC.  */
+#ifdef JB_PC
 
 /* Figure out where the longjmp will land.  We expect that we have just entered
    longjmp and haven't yet setup the stack frame, so the args are still in the
@@ -1792,11 +1884,10 @@ decode_asi (int val)
     }
 }
 
-/* PRINT_REGISTER_HOOK routine.
-   Pretty print various registers.  */
+/* Pretty print various registers.  */
 /* FIXME: Would be nice if this did some fancy things for 32 bit sparc.  */
 
-void
+static void
 sparc_print_register_hook (int regno)
 {
   ULONGEST val;
@@ -1807,8 +1898,8 @@ sparc_print_register_hook (int regno)
     {
       char value[16];
 
-      if (!read_relative_register_raw_bytes (regno, value)
-         && !read_relative_register_raw_bytes (regno + 1, value + 4))
+      if (frame_register_read (deprecated_selected_frame, regno, value)
+         && frame_register_read (deprecated_selected_frame, regno + 1, value + 4))
        {
          printf_unfiltered ("\t");
          print_floating (value, builtin_type_double, gdb_stdout);
@@ -1816,8 +1907,8 @@ sparc_print_register_hook (int regno)
 #if 0                          /* FIXME: gdb doesn't handle long doubles */
       if ((regno & 3) == 0)
        {
-         if (!read_relative_register_raw_bytes (regno + 2, value + 8)
-             && !read_relative_register_raw_bytes (regno + 3, value + 12))
+         if (frame_register_read (deprecated_selected_frame, regno + 2, value + 8)
+             && frame_register_read (deprecated_selected_frame, regno + 3, value + 12))
            {
              printf_unfiltered ("\t");
              print_floating (value, builtin_type_long_double, gdb_stdout);
@@ -1836,8 +1927,8 @@ sparc_print_register_hook (int regno)
     {
       char value[16];
 
-      if (!read_relative_register_raw_bytes (regno, value)
-         && !read_relative_register_raw_bytes (regno + 1, value + 8))
+      if (frame_register_read (deprecated_selected_frame, regno, value)
+         && frame_register_read (deprecated_selected_frame, regno + 1, value + 8))
        {
          printf_unfiltered ("\t");
          print_floating (value, builtin_type_long_double, gdb_stdout);
@@ -1966,6 +2057,148 @@ sparc_print_register_hook (int regno)
 
 #undef BITS
 }
+
+static void
+sparc_print_registers (struct gdbarch *gdbarch,
+                      struct ui_file *file,
+                      struct frame_info *frame,
+                      int regnum, int print_all,
+                      void (*print_register_hook) (int))
+{
+  int i;
+  const int numregs = NUM_REGS + NUM_PSEUDO_REGS;
+  char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
+  char *virtual_buffer = alloca (MAX_REGISTER_VIRTUAL_SIZE);
+
+  for (i = 0; i < numregs; i++)
+    {
+      /* Decide between printing all regs, non-float / vector regs, or
+         specific reg.  */
+      if (regnum == -1)
+       {
+         if (!print_all)
+           {
+             if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
+               continue;
+             if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)))
+               continue;
+           }
+       }
+      else
+       {
+         if (i != regnum)
+           continue;
+       }
+
+      /* If the register name is empty, it is undefined for this
+         processor, so don't display anything.  */
+      if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0')
+       continue;
+
+      fputs_filtered (REGISTER_NAME (i), file);
+      print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), file);
+
+      /* Get the data in raw format.  */
+      if (! frame_register_read (frame, i, raw_buffer))
+       {
+         fprintf_filtered (file, "*value not available*\n");
+         continue;
+       }
+
+      /* FIXME: cagney/2002-08-03: This code shouldn't be necessary.
+         The function frame_register_read() should have returned the
+         pre-cooked register so no conversion is necessary.  */
+      /* Convert raw data to virtual format if necessary.  */
+      if (REGISTER_CONVERTIBLE (i))
+       {
+         REGISTER_CONVERT_TO_VIRTUAL (i, REGISTER_VIRTUAL_TYPE (i),
+                                      raw_buffer, virtual_buffer);
+       }
+      else
+       {
+         memcpy (virtual_buffer, raw_buffer,
+                 REGISTER_VIRTUAL_SIZE (i));
+       }
+
+      /* If virtual format is floating, print it that way, and in raw
+         hex.  */
+      if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
+       {
+         int j;
+
+         val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+                    file, 0, 1, 0, Val_pretty_default);
+
+         fprintf_filtered (file, "\t(raw 0x");
+         for (j = 0; j < REGISTER_RAW_SIZE (i); j++)
+           {
+             int idx;
+             if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+               idx = j;
+             else
+               idx = REGISTER_RAW_SIZE (i) - 1 - j;
+             fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]);
+           }
+         fprintf_filtered (file, ")");
+       }
+      else
+       {
+         /* Print the register in hex.  */
+         val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+                    file, 'x', 1, 0, Val_pretty_default);
+          /* If not a vector register, print it also according to its
+             natural format.  */
+         if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)) == 0)
+           {
+             fprintf_filtered (file, "\t");
+             val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+                        file, 0, 1, 0, Val_pretty_default);
+           }
+       }
+
+      /* Some sparc specific info.  */
+      if (print_register_hook != NULL)
+       print_register_hook (i);
+
+      fprintf_filtered (file, "\n");
+    }
+}
+
+static void
+sparc_print_registers_info (struct gdbarch *gdbarch,
+                           struct ui_file *file,
+                           struct frame_info *frame,
+                           int regnum, int print_all)
+{
+  sparc_print_registers (gdbarch, file, frame, regnum, print_all,
+                        sparc_print_register_hook);
+}
+
+void
+sparc_do_registers_info (int regnum, int all)
+{
+  sparc_print_registers_info (current_gdbarch, gdb_stdout, deprecated_selected_frame,
+                             regnum, all);
+}
+
+#if 0
+// OBSOLETE static void
+// OBSOLETE sparclet_print_registers_info (struct gdbarch *gdbarch,
+// OBSOLETE                           struct ui_file *file,
+// OBSOLETE                           struct frame_info *frame,
+// OBSOLETE                           int regnum, int print_all)
+// OBSOLETE {
+// OBSOLETE   sparc_print_registers (gdbarch, file, frame, regnum, print_all, NULL);
+// OBSOLETE }
+// OBSOLETE 
+// OBSOLETE void
+// OBSOLETE sparclet_do_registers_info (int regnum, int all)
+// OBSOLETE {
+// OBSOLETE   sparclet_print_registers_info (current_gdbarch, gdb_stdout,
+// OBSOLETE                             deprecated_selected_frame, regnum, all);
+// OBSOLETE }
+#endif
+
 \f
 int
 gdb_print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
@@ -1980,7 +2213,7 @@ gdb_print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
    args are also passed in registers o0 - o5.  */
 
 CORE_ADDR
-sparc32_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
+sparc32_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
                        int struct_return, CORE_ADDR struct_addr)
 {
   int i, j, oregnum;
@@ -1999,7 +2232,7 @@ sparc32_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
      and sizes. */
   for (i = 0, m_arg = sparc_args; i < nargs; i++, m_arg++)
     {
-      value_ptr arg = args[i];
+      struct value *arg = args[i];
       struct type *arg_type = check_typedef (VALUE_TYPE (arg));
       /* Cast argument to long if necessary as the compiler does it too.  */
       switch (TYPE_CODE (arg_type))
@@ -2025,8 +2258,8 @@ sparc32_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
     }
 
   /* Make room for the arguments on the stack.  */
-  accumulate_size += CALL_DUMMY_STACK_ADJUST;
-  sp = ((sp - accumulate_size) & ~7) + CALL_DUMMY_STACK_ADJUST;
+  accumulate_size += DEPRECATED_CALL_DUMMY_STACK_ADJUST;
+  sp = ((sp - accumulate_size) & ~7) + DEPRECATED_CALL_DUMMY_STACK_ADJUST;
 
   /* `Push' arguments on the stack.  */
   for (i = 0, oregnum = 0, m_arg = sparc_args; 
@@ -2037,7 +2270,7 @@ sparc32_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
       for (j = 0; 
           j < m_arg->len && oregnum < 6; 
           j += SPARC_INTREG_SIZE, oregnum++)
-       write_register_gen (O0_REGNUM + oregnum, m_arg->contents + j);
+       deprecated_write_register_gen (O0_REGNUM + oregnum, m_arg->contents + j);
     }
 
   return sp;
@@ -2060,7 +2293,7 @@ sparc32_extract_return_value (struct type *type, char *regbuf, char *valbuf)
     memcpy (valbuf,
            &regbuf[O0_REGNUM * regsize +
                    (typelen >= regsize
-                    || TARGET_BYTE_ORDER == LITTLE_ENDIAN ? 0
+                    || TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE ? 0
                     : regsize - typelen)],
            typelen);
 }
@@ -2077,7 +2310,7 @@ sparc_store_return_value (struct type *type, char *valbuf)
   int regno;
   char *buffer;
 
-  buffer = alloca(MAX_REGISTER_RAW_SIZE);
+  buffer = alloca (MAX_REGISTER_RAW_SIZE);
 
   if (TYPE_CODE (type) == TYPE_CODE_FLT && SPARC_HAS_FPU)
     /* Floating-point values are returned in the register pair */
@@ -2093,19 +2326,22 @@ sparc_store_return_value (struct type *type, char *valbuf)
       memset (buffer, 0, REGISTER_RAW_SIZE (regno));
       memcpy (buffer + REGISTER_RAW_SIZE (regno) - TYPE_LENGTH (type), valbuf,
              TYPE_LENGTH (type));
-      write_register_gen (regno, buffer);
+      deprecated_write_register_gen (regno, buffer);
     }
   else
-    write_register_bytes (REGISTER_BYTE (regno), valbuf, TYPE_LENGTH (type));
+    deprecated_write_register_bytes (REGISTER_BYTE (regno), valbuf,
+                                    TYPE_LENGTH (type));
 }
 
-extern void
-sparclet_store_return_value (struct type *type, char *valbuf)
-{
-  /* Other values are returned in register %o0.  */
-  write_register_bytes (REGISTER_BYTE (O0_REGNUM), valbuf,
-                       TYPE_LENGTH (type));
-}
+#if 0
+// OBSOLETE extern void
+// OBSOLETE sparclet_store_return_value (struct type *type, char *valbuf)
+// OBSOLETE {
+// OBSOLETE   /* Other values are returned in register %o0.  */
+// OBSOLETE   deprecated_write_register_bytes (REGISTER_BYTE (O0_REGNUM), valbuf,
+// OBSOLETE                               TYPE_LENGTH (type));
+// OBSOLETE }
+#endif
 
 
 #ifndef CALL_DUMMY_CALL_OFFSET
@@ -2171,47 +2407,43 @@ sparc_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun,
        }
     }
 
-  /* If this is a bi-endian target, GDB has written the call dummy
-     in little-endian order.  We must byte-swap it back to big-endian. */
-  if (bi_endian)
-    {
-      for (i = 0; i < CALL_DUMMY_LENGTH; i += 4)
-       {
-         char tmp = dummy[i];
-         dummy[i] = dummy[i + 3];
-         dummy[i + 3] = tmp;
-         tmp = dummy[i + 1];
-         dummy[i + 1] = dummy[i + 2];
-         dummy[i + 2] = tmp;
-       }
-    }
+#if 0
+// OBSOLETE   /* If this is a bi-endian target, GDB has written the call dummy
+// OBSOLETE      in little-endian order.  We must byte-swap it back to big-endian. */
+// OBSOLETE   if (bi_endian)
+// OBSOLETE     {
+// OBSOLETE       for (i = 0; i < CALL_DUMMY_LENGTH; i += 4)
+// OBSOLETE    {
+// OBSOLETE      char tmp = dummy[i];
+// OBSOLETE      dummy[i] = dummy[i + 3];
+// OBSOLETE      dummy[i + 3] = tmp;
+// OBSOLETE      tmp = dummy[i + 1];
+// OBSOLETE      dummy[i + 1] = dummy[i + 2];
+// OBSOLETE      dummy[i + 2] = tmp;
+// OBSOLETE    }
+// OBSOLETE     }
+#endif
 }
 
 
-/* Set target byte order based on machine type. */
-
-static int
-sparc_target_architecture_hook (const bfd_arch_info_type *ap)
-{
-  int i, j;
-
-  if (ap->mach == bfd_mach_sparc_sparclite_le)
-    {
-      if (TARGET_BYTE_ORDER_SELECTABLE_P)
-       {
-         target_byte_order = LITTLE_ENDIAN;
-         bi_endian = 1;
-       }
-      else
-       {
-         warning ("This GDB does not support little endian sparclite.");
-       }
-    }
-  else
-    bi_endian = 0;
-  return 1;
-}
-\f
+#if 0
+// OBSOLETE /* Set target byte order based on machine type. */
+// OBSOLETE 
+// OBSOLETE static int
+// OBSOLETE sparc_target_architecture_hook (const bfd_arch_info_type *ap)
+// OBSOLETE {
+// OBSOLETE   int i, j;
+// OBSOLETE 
+// OBSOLETE   if (ap->mach == bfd_mach_sparc_sparclite_le)
+// OBSOLETE     {
+// OBSOLETE       target_byte_order = BFD_ENDIAN_LITTLE;
+// OBSOLETE       bi_endian = 1;
+// OBSOLETE     }
+// OBSOLETE   else
+// OBSOLETE     bi_endian = 0;
+// OBSOLETE   return 1;
+// OBSOLETE }
+#endif
 
 /*
  * Module "constructor" function. 
@@ -2219,16 +2451,17 @@ sparc_target_architecture_hook (const bfd_arch_info_type *ap)
 
 static struct gdbarch * sparc_gdbarch_init (struct gdbarch_info info,
                                            struct gdbarch_list *arches);
+static void sparc_dump_tdep (struct gdbarch *, struct ui_file *);
 
 void
 _initialize_sparc_tdep (void)
 {
   /* Hook us into the gdbarch mechanism.  */
-  register_gdbarch_init (bfd_arch_sparc, sparc_gdbarch_init);
+  gdbarch_register (bfd_arch_sparc, sparc_gdbarch_init, sparc_dump_tdep);
 
   tm_print_insn = gdb_print_insn_sparc;
   tm_print_insn_info.mach = TM_PRINT_INSN_MACH;                /* Selects sparc/sparclite */
-  target_architecture_hook = sparc_target_architecture_hook;
+  /* OBSOLETE target_architecture_hook = sparc_target_architecture_hook; */
 }
 
 /* Compensate for stack bias. Note that we currently don't handle
@@ -2264,16 +2497,6 @@ sparc64_write_sp (CORE_ADDR val)
     write_register (SP_REGNUM, val);
 }
 
-void
-sparc64_write_fp (CORE_ADDR val)
-{
-  CORE_ADDR oldfp = read_register (FP_REGNUM);
-  if (oldfp & 1)
-    write_register (FP_REGNUM, val - 2047);
-  else
-    write_register (FP_REGNUM, val);
-}
-
 /* The SPARC 64 ABI passes floating-point arguments in FP0 to FP31,
    and all other arguments in O0 to O5.  They are also copied onto
    the stack in the correct places.  Apparently (empirically), 
@@ -2289,7 +2512,7 @@ sparc64_write_fp (CORE_ADDR val)
    int and float, we will waste every other register of both types.  */
 
 CORE_ADDR
-sparc64_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
+sparc64_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
                        int struct_return, CORE_ADDR struct_retaddr)
 {
   int i, j, register_counter = 0;
@@ -2304,7 +2527,7 @@ sparc64_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
   for (i = nargs - 1; i >= 0; i--)
     {
       int len = TYPE_LENGTH (check_typedef (VALUE_TYPE (args[i])));
-      value_ptr copyarg = args[i];
+      struct value *copyarg = args[i];
       int copylen = len;
 
       if (copylen < SPARC_INTREG_SIZE)
@@ -2330,7 +2553,7 @@ sparc64_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
   for (i = 0; i < nargs; i++)
     {
       int len = TYPE_LENGTH (check_typedef (VALUE_TYPE (args[i])));
-      value_ptr copyarg = args[i];
+      struct value *copyarg = args[i];
       enum type_code typecode = TYPE_CODE (VALUE_TYPE (args[i]));
       int copylen = len;
 
@@ -2378,10 +2601,12 @@ sparc64_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
                fpreg = FP0_REGNUM + 2 * register_counter;
                register_counter += 2;
                break;
+             default:
+               internal_error (__FILE__, __LINE__, "bad switch");
              }
-             write_register_bytes (REGISTER_BYTE (fpreg),
-                                   VALUE_CONTENTS (args[i]),
-                                   len);
+             deprecated_write_register_bytes (REGISTER_BYTE (fpreg),
+                                              VALUE_CONTENTS (args[i]),
+                                              len);
            }
        }
       else /* all other args go into the first six 'o' registers */
@@ -2392,7 +2617,7 @@ sparc64_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
            {
              int oreg = O0_REGNUM + register_counter;
 
-             write_register_gen (oreg, VALUE_CONTENTS (copyarg) + j);
+             deprecated_write_register_gen (oreg, VALUE_CONTENTS (copyarg) + j);
              register_counter += 1;
            }
         }
@@ -2466,18 +2691,19 @@ sparc64_extract_return_value (struct type *type, char *regbuf, char *valbuf)
   sp64_extract_return_value (type, regbuf, valbuf, 0);
 }
 
-extern void 
-sparclet_extract_return_value (struct type *type,
-                              char *regbuf, 
-                              char *valbuf)
-{
-  regbuf += REGISTER_RAW_SIZE (O0_REGNUM) * 8;
-  if (TYPE_LENGTH (type) < REGISTER_RAW_SIZE (O0_REGNUM))
-    regbuf += REGISTER_RAW_SIZE (O0_REGNUM) - TYPE_LENGTH (type);
-
-  memcpy ((void *) valbuf, regbuf, TYPE_LENGTH (type));
-}
-
+#if 0
+// OBSOLETE extern void 
+// OBSOLETE sparclet_extract_return_value (struct type *type,
+// OBSOLETE                           char *regbuf, 
+// OBSOLETE                           char *valbuf)
+// OBSOLETE {
+// OBSOLETE   regbuf += REGISTER_RAW_SIZE (O0_REGNUM) * 8;
+// OBSOLETE   if (TYPE_LENGTH (type) < REGISTER_RAW_SIZE (O0_REGNUM))
+// OBSOLETE     regbuf += REGISTER_RAW_SIZE (O0_REGNUM) - TYPE_LENGTH (type);
+// OBSOLETE 
+// OBSOLETE   memcpy ((void *) valbuf, regbuf, TYPE_LENGTH (type));
+// OBSOLETE }
+#endif
 
 extern CORE_ADDR
 sparc32_stack_align (CORE_ADDR addr)
@@ -2494,15 +2720,15 @@ sparc64_stack_align (CORE_ADDR addr)
 extern void
 sparc_print_extra_frame_info (struct frame_info *fi)
 {
-  if (fi && fi->extra_info && fi->extra_info->flat)
+  if (fi && get_frame_extra_info (fi) && get_frame_extra_info (fi)->flat)
     printf_filtered (" flat, pc saved at 0x%s, fp saved at 0x%s\n",
-                    paddr_nz (fi->extra_info->pc_addr), 
-                    paddr_nz (fi->extra_info->fp_addr));
+                    paddr_nz (get_frame_extra_info (fi)->pc_addr), 
+                    paddr_nz (get_frame_extra_info (fi)->fp_addr));
 }
 
 /* MULTI_ARCH support */
 
-static char *
+static const char *
 sparc32_register_name (int regno)
 {
   static char *register_names[] = 
@@ -2526,7 +2752,7 @@ sparc32_register_name (int regno)
     return register_names[regno];
 }
 
-static char *
+static const char *
 sparc64_register_name (int regno)
 {
   static char *register_names[] = 
@@ -2558,66 +2784,70 @@ sparc64_register_name (int regno)
     return register_names[regno];
 }
 
-static char *
-sparclite_register_name (int regno)
-{
-  static char *register_names[] = 
-  { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
-    "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
-    "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
-    "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
-
-    "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
-    "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
-    "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
-    "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
-
-    "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr",
-    "dia1", "dia2", "dda1", "dda2", "ddv1", "ddv2", "dcr", "dsr" 
-  };
-
-  if (regno < 0 ||
-      regno >= (sizeof (register_names) / sizeof (register_names[0])))
-    return NULL;
-  else
-    return register_names[regno];
-}
-
-static char *
-sparclet_register_name (int regno)
-{
-  static char *register_names[] = 
-  { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
-    "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
-    "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
-    "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
-
-    "", "", "", "", "", "", "", "", /* no floating point registers */
-    "", "", "", "", "", "", "", "",
-    "", "", "", "", "", "", "", "",
-    "", "", "", "", "", "", "", "",
-
-    "y", "psr", "wim", "tbr", "pc", "npc", "", "", /* no FPSR or CPSR */
-    "ccsr", "ccpr", "cccrcr", "ccor", "ccobr", "ccibr", "ccir", "", 
-
-    /*       ASR15                 ASR19 (don't display them) */    
-    "asr1",  "", "asr17", "asr18", "", "asr20", "asr21", "asr22"
-    /* None of the rest get displayed */
 #if 0
-    "awr0",  "awr1",  "awr2",  "awr3",  "awr4",  "awr5",  "awr6",  "awr7",  
-    "awr8",  "awr9",  "awr10", "awr11", "awr12", "awr13", "awr14", "awr15", 
-    "awr16", "awr17", "awr18", "awr19", "awr20", "awr21", "awr22", "awr23", 
-    "awr24", "awr25", "awr26", "awr27", "awr28", "awr29", "awr30", "awr31", 
-    "apsr"
-#endif /* 0 */
-  };
+// OBSOLETE static const char *
+// OBSOLETE sparclite_register_name (int regno)
+// OBSOLETE {
+// OBSOLETE   static char *register_names[] = 
+// OBSOLETE   { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
+// OBSOLETE     "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
+// OBSOLETE     "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
+// OBSOLETE     "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
+// OBSOLETE 
+// OBSOLETE     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
+// OBSOLETE     "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
+// OBSOLETE     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
+// OBSOLETE     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
+// OBSOLETE 
+// OBSOLETE     "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr",
+// OBSOLETE     "dia1", "dia2", "dda1", "dda2", "ddv1", "ddv2", "dcr", "dsr" 
+// OBSOLETE   };
+// OBSOLETE 
+// OBSOLETE   if (regno < 0 ||
+// OBSOLETE       regno >= (sizeof (register_names) / sizeof (register_names[0])))
+// OBSOLETE     return NULL;
+// OBSOLETE   else
+// OBSOLETE     return register_names[regno];
+// OBSOLETE }
+#endif
 
-  if (regno < 0 ||
-      regno >= (sizeof (register_names) / sizeof (register_names[0])))
-    return NULL;
-  else
-    return register_names[regno];
-}
+#if 0
+// OBSOLETE static const char *
+// OBSOLETE sparclet_register_name (int regno)
+// OBSOLETE {
+// OBSOLETE   static char *register_names[] = 
+// OBSOLETE   { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
+// OBSOLETE     "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
+// OBSOLETE     "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
+// OBSOLETE     "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
+// OBSOLETE 
+// OBSOLETE     "", "", "", "", "", "", "", "", /* no floating point registers */
+// OBSOLETE     "", "", "", "", "", "", "", "",
+// OBSOLETE     "", "", "", "", "", "", "", "",
+// OBSOLETE     "", "", "", "", "", "", "", "",
+// OBSOLETE 
+// OBSOLETE     "y", "psr", "wim", "tbr", "pc", "npc", "", "", /* no FPSR or CPSR */
+// OBSOLETE     "ccsr", "ccpr", "cccrcr", "ccor", "ccobr", "ccibr", "ccir", "", 
+// OBSOLETE 
+// OBSOLETE     /*       ASR15                 ASR19 (don't display them) */    
+// OBSOLETE     "asr1",  "", "asr17", "asr18", "", "asr20", "asr21", "asr22"
+// OBSOLETE     /* None of the rest get displayed */
+// OBSOLETE #if 0
+// OBSOLETE     "awr0",  "awr1",  "awr2",  "awr3",  "awr4",  "awr5",  "awr6",  "awr7",  
+// OBSOLETE     "awr8",  "awr9",  "awr10", "awr11", "awr12", "awr13", "awr14", "awr15", 
+// OBSOLETE     "awr16", "awr17", "awr18", "awr19", "awr20", "awr21", "awr22", "awr23", 
+// OBSOLETE     "awr24", "awr25", "awr26", "awr27", "awr28", "awr29", "awr30", "awr31", 
+// OBSOLETE     "apsr"
+// OBSOLETE #endif /* 0 */
+// OBSOLETE   };
+// OBSOLETE 
+// OBSOLETE   if (regno < 0 ||
+// OBSOLETE       regno >= (sizeof (register_names) / sizeof (register_names[0])))
+// OBSOLETE     return NULL;
+// OBSOLETE   else
+// OBSOLETE     return register_names[regno];
+// OBSOLETE }
+#endif
 
 CORE_ADDR
 sparc_push_return_address (CORE_ADDR pc_unused, CORE_ADDR sp)
@@ -2767,18 +2997,6 @@ sparc64_register_byte (int regno)
     return 64 * 8 + (regno - 80) * 8;
 }
 
-/* Advance PC across any function entry prologue instructions to reach
-   some "real" code.  SKIP_PROLOGUE_FRAMELESS_P advances the PC past
-   some of the prologue, but stops as soon as it knows that the
-   function has a frame.  Its result is equal to its input PC if the
-   function is frameless, unequal otherwise.  */
-
-static CORE_ADDR
-sparc_gdbarch_skip_prologue (CORE_ADDR ip)
-{
-  return examine_prologue (ip, 0, NULL, NULL);
-}
-
 /* Immediately after a function call, return the saved pc.
    Can't go through the frames for this because on some machines
    the new frame is not set up until the new function executes
@@ -2827,14 +3045,6 @@ sparc_gdbarch_fix_call_dummy (char *dummy,
     sparc_fix_call_dummy (dummy, pc, fun, type, gcc_p);
 }
 
-/* Coerce float to double: a no-op.  */
-
-static int
-sparc_coerce_float_to_double (struct type *formal, struct type *actual)
-{
-  return 1;
-}
-
 /* CALL_DUMMY_ADDRESS: fetch the breakpoint address for a call dummy.  */
 
 static CORE_ADDR
@@ -2920,13 +3130,23 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     };
   static LONGEST call_dummy_nil[] = {0};
 
+  /* Try to determine the OS ABI of the object we are loading.  */
+
+  if (info.abfd != NULL
+      && info.osabi == GDB_OSABI_UNKNOWN)
+    {
+      /* If it's an ELF file, assume it's Solaris.  */
+      if (bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
+       info.osabi = GDB_OSABI_SOLARIS;
+    }
+
   /* First see if there is already a gdbarch that can satisfy the request.  */
   arches = gdbarch_list_lookup_by_info (arches, &info);
   if (arches != NULL)
     return arches->gdbarch;
 
   /* None found: is the request for a sparc architecture? */
-  if (info.bfd_architecture != bfd_arch_sparc)
+  if (info.bfd_arch_info->arch != bfd_arch_sparc)
     return NULL;       /* No; then it's not for us.  */
 
   /* Yes: create a new gdbarch for the specified machine type.  */
@@ -2936,39 +3156,30 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* First set settings that are common for all sparc architectures.  */
   set_gdbarch_believe_pcc_promotion (gdbarch, 1);
   set_gdbarch_breakpoint_from_pc (gdbarch, memory_breakpoint_from_pc);
-  set_gdbarch_coerce_float_to_double (gdbarch, 
-                                     sparc_coerce_float_to_double);
-  set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 1);
-  set_gdbarch_call_dummy_p (gdbarch, 1);
-  set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 1);
   set_gdbarch_decr_pc_after_break (gdbarch, 0);
   set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
-  set_gdbarch_extract_struct_value_address (gdbarch, 
-                                           sparc_extract_struct_value_address);
+  set_gdbarch_deprecated_extract_struct_value_address (gdbarch, sparc_extract_struct_value_address);
   set_gdbarch_fix_call_dummy (gdbarch, sparc_gdbarch_fix_call_dummy);
   set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
   set_gdbarch_fp_regnum (gdbarch, SPARC_FP_REGNUM);
   set_gdbarch_fp0_regnum (gdbarch, SPARC_FP0_REGNUM);
-  set_gdbarch_frame_args_address (gdbarch, default_frame_address);
-  set_gdbarch_frame_chain (gdbarch, sparc_frame_chain);
-  set_gdbarch_frame_init_saved_regs (gdbarch, sparc_frame_init_saved_regs);
-  set_gdbarch_frame_locals_address (gdbarch, default_frame_address);
+  set_gdbarch_deprecated_frame_chain (gdbarch, sparc_frame_chain);
+  set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sparc_frame_init_saved_regs);
   set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
-  set_gdbarch_frame_saved_pc (gdbarch, sparc_frame_saved_pc);
+  set_gdbarch_deprecated_frame_saved_pc (gdbarch, sparc_frame_saved_pc);
   set_gdbarch_frameless_function_invocation (gdbarch, 
                                             frameless_look_for_prologue);
-  set_gdbarch_get_saved_register (gdbarch, sparc_get_saved_register);
-  set_gdbarch_ieee_float (gdbarch, 1);
-  set_gdbarch_init_extra_frame_info (gdbarch, sparc_init_extra_frame_info);
+  set_gdbarch_deprecated_get_saved_register (gdbarch, sparc_get_saved_register);
+  set_gdbarch_deprecated_init_extra_frame_info (gdbarch, sparc_init_extra_frame_info);
   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
   set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
   set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
   set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
-  set_gdbarch_max_register_raw_size (gdbarch, 8);
-  set_gdbarch_max_register_virtual_size (gdbarch, 8);
-  set_gdbarch_pop_frame (gdbarch, sparc_pop_frame);
-  set_gdbarch_push_return_address (gdbarch, sparc_push_return_address);
-  set_gdbarch_push_dummy_frame (gdbarch, sparc_push_dummy_frame);
+  set_gdbarch_deprecated_max_register_raw_size (gdbarch, 8);
+  set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 8);
+  set_gdbarch_deprecated_pop_frame (gdbarch, sparc_pop_frame);
+  set_gdbarch_deprecated_push_return_address (gdbarch, sparc_push_return_address);
+  set_gdbarch_deprecated_push_dummy_frame (gdbarch, sparc_push_dummy_frame);
   set_gdbarch_read_pc (gdbarch, generic_target_read_pc);
   set_gdbarch_register_convert_to_raw (gdbarch, sparc_convert_to_raw);
   set_gdbarch_register_convert_to_virtual (gdbarch, 
@@ -2977,11 +3188,12 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
                                    generic_register_convertible_not);
   set_gdbarch_reg_struct_has_addr (gdbarch, sparc_reg_struct_has_addr);
   set_gdbarch_return_value_on_stack (gdbarch, sparc_return_value_on_stack);
-  set_gdbarch_saved_pc_after_call (gdbarch, sparc_saved_pc_after_call);
+  set_gdbarch_deprecated_saved_pc_after_call (gdbarch, sparc_saved_pc_after_call);
+  set_gdbarch_prologue_frameless_p (gdbarch, sparc_prologue_frameless_p);
   set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
-  set_gdbarch_skip_prologue (gdbarch, sparc_gdbarch_skip_prologue);
+  set_gdbarch_skip_prologue (gdbarch, sparc_skip_prologue);
   set_gdbarch_sp_regnum (gdbarch, SPARC_SP_REGNUM);
-  set_gdbarch_use_generic_dummy_frames (gdbarch, 0);
+  set_gdbarch_deprecated_use_generic_dummy_frames (gdbarch, 0);
   set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
 
   /*
@@ -2991,37 +3203,80 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   switch (info.bfd_arch_info->mach)
     {
     case bfd_mach_sparc:
-    case bfd_mach_sparc_sparclet:
-    case bfd_mach_sparc_sparclite:
+#if 0
+      // OBSOLETE     case bfd_mach_sparc_sparclet:
+      // OBSOLETE     case bfd_mach_sparc_sparclite:
+#endif
     case bfd_mach_sparc_v8plus:
     case bfd_mach_sparc_v8plusa:
-    case bfd_mach_sparc_sparclite_le:
+#if 0
+      // OBSOLETE     case bfd_mach_sparc_sparclite_le:
+#endif
       /* 32-bit machine types: */
 
 #ifdef SPARC32_CALL_DUMMY_ON_STACK
-      set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_on_stack);
+      set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack);
       set_gdbarch_call_dummy_address (gdbarch, sparc_call_dummy_address);
       set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0x30);
       set_gdbarch_call_dummy_length (gdbarch, 0x38);
+
+      /* NOTE: cagney/2002-04-26: Based from info posted by Peter
+        Schauer around Oct '99.  Briefly, due to aspects of the SPARC
+        ABI, it isn't possible to use ON_STACK with a strictly
+        compliant compiler.
+
+        Peter Schauer writes ...
+
+        No, any call from GDB to a user function returning a
+        struct/union will fail miserably. Try this:
+
+        *NOINDENT*
+        struct x
+        {
+           int a[4];
+         };
+
+        struct x gx;
+
+        struct x
+        sret ()
+        {
+          return gx;
+        }
+
+        main ()
+        {
+          int i;
+          for (i = 0; i < 4; i++)
+            gx.a[i] = i + 1;
+          gx = sret ();
+        }
+        *INDENT*
+
+        Set a breakpoint at the gx = sret () statement, run to it and
+        issue a `print sret()'. It will not succed with your
+        approach, and I doubt that continuing the program will work
+        as well.
+
+        For details of the ABI see the Sparc Architecture Manual.  I
+        have Version 8 (Prentice Hall ISBN 0-13-825001-4) and the
+        calling conventions for functions returning aggregate values
+        are explained in Appendix D.3.  */
+
       set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
       set_gdbarch_call_dummy_words (gdbarch, call_dummy_32);
 #else
-      set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_at_entry_point);
-      set_gdbarch_call_dummy_address (gdbarch, entry_point_address);
-      set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
-      set_gdbarch_call_dummy_length (gdbarch, 0);
-      set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
+      set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_at_entry_point);
       set_gdbarch_call_dummy_words (gdbarch, call_dummy_nil);
 #endif
-      set_gdbarch_call_dummy_stack_adjust (gdbarch, 68);
-      set_gdbarch_call_dummy_start_offset (gdbarch, 0);
+      set_gdbarch_deprecated_call_dummy_stack_adjust (gdbarch, 68);
       set_gdbarch_frame_args_skip (gdbarch, 68);
       set_gdbarch_function_start_offset (gdbarch, 0);
       set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
       set_gdbarch_npc_regnum (gdbarch, SPARC32_NPC_REGNUM);
       set_gdbarch_pc_regnum (gdbarch, SPARC32_PC_REGNUM);
       set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
-      set_gdbarch_push_arguments (gdbarch, sparc32_push_arguments);
+      set_gdbarch_deprecated_push_arguments (gdbarch, sparc32_push_arguments);
       set_gdbarch_read_fp (gdbarch, generic_target_read_fp);
       set_gdbarch_read_sp (gdbarch, generic_target_read_sp);
 
@@ -3037,11 +3292,11 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       set_gdbarch_sizeof_call_dummy_words (gdbarch, 0);
 #endif
       set_gdbarch_stack_align (gdbarch, sparc32_stack_align);
-      set_gdbarch_store_struct_return (gdbarch, sparc32_store_struct_return);
+      set_gdbarch_deprecated_extra_stack_alignment_needed (gdbarch, 1);
+      set_gdbarch_deprecated_store_struct_return (gdbarch, sparc32_store_struct_return);
       set_gdbarch_use_struct_convention (gdbarch, 
                                         generic_use_struct_convention);
-      set_gdbarch_write_fp (gdbarch, generic_target_write_fp);
-      set_gdbarch_write_sp (gdbarch, generic_target_write_sp);
+      set_gdbarch_deprecated_dummy_write_sp (gdbarch, generic_target_write_sp);
       tdep->y_regnum = SPARC32_Y_REGNUM;
       tdep->fp_max_regnum = SPARC_FP0_REGNUM + 32;
       tdep->intreg_size = 4;
@@ -3055,7 +3310,7 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     default:   /* Any new machine type is likely to be 64-bit.  */
 
 #ifdef SPARC64_CALL_DUMMY_ON_STACK
-      set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_on_stack);
+      set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack);
       set_gdbarch_call_dummy_address (gdbarch, sparc_call_dummy_address);
       set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 8 * 4);
       set_gdbarch_call_dummy_length (gdbarch, 192);
@@ -3063,22 +3318,17 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       set_gdbarch_call_dummy_start_offset (gdbarch, 148);
       set_gdbarch_call_dummy_words (gdbarch, call_dummy_64);
 #else
-      set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_at_entry_point);
-      set_gdbarch_call_dummy_address (gdbarch, entry_point_address);
-      set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
-      set_gdbarch_call_dummy_length (gdbarch, 0);
-      set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
-      set_gdbarch_call_dummy_start_offset (gdbarch, 0);
+      set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_at_entry_point);
       set_gdbarch_call_dummy_words (gdbarch, call_dummy_nil);
 #endif
-      set_gdbarch_call_dummy_stack_adjust (gdbarch, 128);
+      set_gdbarch_deprecated_call_dummy_stack_adjust (gdbarch, 128);
       set_gdbarch_frame_args_skip (gdbarch, 136);
       set_gdbarch_function_start_offset (gdbarch, 0);
       set_gdbarch_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
       set_gdbarch_npc_regnum (gdbarch, SPARC64_NPC_REGNUM);
       set_gdbarch_pc_regnum (gdbarch, SPARC64_PC_REGNUM);
       set_gdbarch_ptr_bit (gdbarch, 8 * TARGET_CHAR_BIT);
-      set_gdbarch_push_arguments (gdbarch, sparc64_push_arguments);
+      set_gdbarch_deprecated_push_arguments (gdbarch, sparc64_push_arguments);
       /* NOTE different for at_entry */
       set_gdbarch_read_fp (gdbarch, sparc64_read_fp);
       set_gdbarch_read_sp (gdbarch, sparc64_read_sp);
@@ -3096,11 +3346,11 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       set_gdbarch_sizeof_call_dummy_words (gdbarch, 0);
 #endif
       set_gdbarch_stack_align (gdbarch, sparc64_stack_align);
-      set_gdbarch_store_struct_return (gdbarch, sparc64_store_struct_return);
+      set_gdbarch_deprecated_extra_stack_alignment_needed (gdbarch, 1);
+      set_gdbarch_deprecated_store_struct_return (gdbarch, sparc64_store_struct_return);
       set_gdbarch_use_struct_convention (gdbarch, 
                                         sparc64_use_struct_convention);
-      set_gdbarch_write_fp (gdbarch, sparc64_write_fp);
-      set_gdbarch_write_sp (gdbarch, sparc64_write_sp);
+      set_gdbarch_deprecated_dummy_write_sp (gdbarch, sparc64_write_sp);
       tdep->y_regnum = SPARC64_Y_REGNUM;
       tdep->fp_max_regnum = SPARC_FP0_REGNUM + 48;
       tdep->intreg_size = 8;
@@ -3116,96 +3366,133 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   switch (info.bfd_arch_info->mach)
     {
     case bfd_mach_sparc:
-      set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value);
-      set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid);
+      set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
       set_gdbarch_num_regs (gdbarch, 72);
       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4);
       set_gdbarch_register_name (gdbarch, sparc32_register_name);
-      set_gdbarch_store_return_value (gdbarch, sparc_store_return_value);
-      tdep->has_fpu = 1;       /* (all but sparclet and sparclite) */
+      set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
+#if 0
+      // OBSOLETE       tdep->has_fpu = 1;     /* (all but sparclet and sparclite) */
+#endif
       tdep->fp_register_bytes = 32 * 4;
       tdep->print_insn_mach = bfd_mach_sparc;
       break;
-    case bfd_mach_sparc_sparclet:
-      set_gdbarch_extract_return_value (gdbarch, 
-                                       sparclet_extract_return_value);
-      set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid);
-      set_gdbarch_num_regs (gdbarch, 32 + 32 + 8 + 8 + 8);
-      set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4 + 8*4);
-      set_gdbarch_register_name (gdbarch, sparclet_register_name);
-      set_gdbarch_store_return_value (gdbarch, sparclet_store_return_value);
-      tdep->has_fpu = 0;       /* (all but sparclet and sparclite) */
-      tdep->fp_register_bytes = 0;
-      tdep->print_insn_mach = bfd_mach_sparc_sparclet;
-      break;
-    case bfd_mach_sparc_sparclite:
-      set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value);
-      set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
-      set_gdbarch_num_regs (gdbarch, 80);
-      set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4);
-      set_gdbarch_register_name (gdbarch, sparclite_register_name);
-      set_gdbarch_store_return_value (gdbarch, sparc_store_return_value);
-      tdep->has_fpu = 0;       /* (all but sparclet and sparclite) */
-      tdep->fp_register_bytes = 0;
-      tdep->print_insn_mach = bfd_mach_sparc_sparclite;
-      break;
+#if 0
+      // OBSOLETE     case bfd_mach_sparc_sparclet:
+      // OBSOLETE       set_gdbarch_deprecated_extract_return_value (gdbarch, sparclet_extract_return_value);
+      // OBSOLETE       set_gdbarch_num_regs (gdbarch, 32 + 32 + 8 + 8 + 8);
+      // OBSOLETE       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4 + 8*4);
+      // OBSOLETE       set_gdbarch_register_name (gdbarch, sparclet_register_name);
+      // OBSOLETE       set_gdbarch_deprecated_store_return_value (gdbarch, sparclet_store_return_value);
+      // OBSOLETE       tdep->has_fpu = 0;     /* (all but sparclet and sparclite) */
+      // OBSOLETE       tdep->fp_register_bytes = 0;
+      // OBSOLETE       tdep->print_insn_mach = bfd_mach_sparc_sparclet;
+      // OBSOLETE       break;
+#endif
+#if 0
+      // OBSOLETE     case bfd_mach_sparc_sparclite:
+      // OBSOLETE       set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
+      // OBSOLETE       set_gdbarch_num_regs (gdbarch, 80);
+      // OBSOLETE       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4);
+      // OBSOLETE       set_gdbarch_register_name (gdbarch, sparclite_register_name);
+      // OBSOLETE       set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
+      // OBSOLETE       tdep->has_fpu = 0;     /* (all but sparclet and sparclite) */
+      // OBSOLETE       tdep->fp_register_bytes = 0;
+      // OBSOLETE       tdep->print_insn_mach = bfd_mach_sparc_sparclite;
+      // OBSOLETE       break;
+#endif
     case bfd_mach_sparc_v8plus:
-      set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value);
-      set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid);
+      set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
       set_gdbarch_num_regs (gdbarch, 72);
       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4);
       set_gdbarch_register_name (gdbarch, sparc32_register_name);
-      set_gdbarch_store_return_value (gdbarch, sparc_store_return_value);
+      set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
       tdep->print_insn_mach = bfd_mach_sparc;
       tdep->fp_register_bytes = 32 * 4;
-      tdep->has_fpu = 1;       /* (all but sparclet and sparclite) */
+#if 0
+      // OBSOLETE       tdep->has_fpu = 1;     /* (all but sparclet and sparclite) */
+#endif
       break;
     case bfd_mach_sparc_v8plusa:
-      set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value);
-      set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid);
+      set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
       set_gdbarch_num_regs (gdbarch, 72);
       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4);
       set_gdbarch_register_name (gdbarch, sparc32_register_name);
-      set_gdbarch_store_return_value (gdbarch, sparc_store_return_value);
-      tdep->has_fpu = 1;       /* (all but sparclet and sparclite) */
+      set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
+#if 0
+      // OBSOLETE       tdep->has_fpu = 1;     /* (all but sparclet and sparclite) */
+#endif
       tdep->fp_register_bytes = 32 * 4;
       tdep->print_insn_mach = bfd_mach_sparc;
       break;
-    case bfd_mach_sparc_sparclite_le:
-      set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value);
-      set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
-      set_gdbarch_num_regs (gdbarch, 80);
-      set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4);
-      set_gdbarch_register_name (gdbarch, sparclite_register_name);
-      set_gdbarch_store_return_value (gdbarch, sparc_store_return_value);
-      tdep->has_fpu = 0;       /* (all but sparclet and sparclite) */
-      tdep->fp_register_bytes = 0;
-      tdep->print_insn_mach = bfd_mach_sparc_sparclite;
-      break;
+#if 0
+// OBSOLETE     case bfd_mach_sparc_sparclite_le:
+// OBSOLETE       set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
+// OBSOLETE       set_gdbarch_num_regs (gdbarch, 80);
+// OBSOLETE       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4);
+// OBSOLETE       set_gdbarch_register_name (gdbarch, sparclite_register_name);
+// OBSOLETE       set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
+// OBSOLETE       tdep->has_fpu = 0;   /* (all but sparclet and sparclite) */
+// OBSOLETE       tdep->fp_register_bytes = 0;
+// OBSOLETE       tdep->print_insn_mach = bfd_mach_sparc_sparclite;
+// OBSOLETE       break;
+#endif
     case bfd_mach_sparc_v9:
-      set_gdbarch_extract_return_value (gdbarch, sparc64_extract_return_value);
-      set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid);
+      set_gdbarch_deprecated_extract_return_value (gdbarch, sparc64_extract_return_value);
       set_gdbarch_num_regs (gdbarch, 125);
       set_gdbarch_register_bytes (gdbarch, 32*8 + 32*8 + 45*8);
       set_gdbarch_register_name (gdbarch, sparc64_register_name);
-      set_gdbarch_store_return_value (gdbarch, sparc_store_return_value);
-      tdep->has_fpu = 1;       /* (all but sparclet and sparclite) */
+      set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
+#if 0
+      // OBSOLETE       tdep->has_fpu = 1;     /* (all but sparclet and sparclite) */
+#endif
       tdep->fp_register_bytes = 64 * 4;
       tdep->print_insn_mach = bfd_mach_sparc_v9a;
       break;
     case bfd_mach_sparc_v9a:
-      set_gdbarch_extract_return_value (gdbarch, sparc64_extract_return_value);
-      set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid);
+      set_gdbarch_deprecated_extract_return_value (gdbarch, sparc64_extract_return_value);
       set_gdbarch_num_regs (gdbarch, 125);
       set_gdbarch_register_bytes (gdbarch, 32*8 + 32*8 + 45*8);
       set_gdbarch_register_name (gdbarch, sparc64_register_name);
-      set_gdbarch_store_return_value (gdbarch, sparc_store_return_value);
-      tdep->has_fpu = 1;       /* (all but sparclet and sparclite) */
+      set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
+#if 0
+      // OBSOLETE       tdep->has_fpu = 1;     /* (all but sparclet and sparclite) */
+#endif
       tdep->fp_register_bytes = 64 * 4;
       tdep->print_insn_mach = bfd_mach_sparc_v9a;
       break;
     }
 
+  /* Hook in OS ABI-specific overrides, if they have been registered.  */
+  gdbarch_init_osabi (info, gdbarch);
+
   return gdbarch;
 }
 
+static void
+sparc_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+
+  if (tdep == NULL)
+    return;
+
+#if 0
+  // OBSOLETE   fprintf_unfiltered (file, "sparc_dump_tdep: has_fpu = %d\n",
+  // OBSOLETE                tdep->has_fpu);
+#endif
+  fprintf_unfiltered (file, "sparc_dump_tdep: fp_register_bytes = %d\n",
+                     tdep->fp_register_bytes);
+  fprintf_unfiltered (file, "sparc_dump_tdep: y_regnum = %d\n",
+                     tdep->y_regnum);
+  fprintf_unfiltered (file, "sparc_dump_tdep: fp_max_regnum = %d\n",
+                     tdep->fp_max_regnum);
+  fprintf_unfiltered (file, "sparc_dump_tdep: intreg_size = %d\n",
+                     tdep->intreg_size);
+  fprintf_unfiltered (file, "sparc_dump_tdep: reg_save_offset = %d\n",
+                     tdep->reg_save_offset);
+  fprintf_unfiltered (file, "sparc_dump_tdep: call_dummy_call_offset = %d\n",
+                     tdep->call_dummy_call_offset);
+  fprintf_unfiltered (file, "sparc_dump_tdep: print_insn_match = %d\n",
+                     tdep->print_insn_mach);
+}