1999-01-19 Fernando Nasser <fnasser@totem.to.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / alpha-tdep.c
index d64ab49bf6ca02edd919b07d456f1495d8d36477..02010160b96f41026adf97949650b46fcea1e0e6 100644 (file)
@@ -31,10 +31,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* FIXME: Some of this code should perhaps be merged with mips-tdep.c.  */
 
-/* FIXME: Put this declaration in frame.h.  */
-extern struct obstack frame_cache_obstack;
-\f
-
 /* Prototypes for local functions. */
 
 static alpha_extra_func_info_t push_sigtramp_desc PARAMS ((CORE_ADDR low_addr));
@@ -254,9 +250,7 @@ alpha_find_saved_regs (frame)
   alpha_extra_func_info_t proc_desc;
   int returnreg;
 
-  frame->saved_regs = (struct frame_saved_regs *)
-    obstack_alloc (&frame_cache_obstack, sizeof(struct frame_saved_regs));
-  memset (frame->saved_regs, 0, sizeof (struct frame_saved_regs));
+  frame_saved_regs_zalloc (frame);
 
   /* If it is the frame for __sigtramp, the saved registers are located
      in a sigcontext structure somewhere on the stack. __sigtramp
@@ -276,14 +270,14 @@ alpha_find_saved_regs (frame)
       for (ireg = 0; ireg < 32; ireg++)
        {
          reg_position = sigcontext_addr + SIGFRAME_REGSAVE_OFF + ireg * 8;
-         frame->saved_regs->regs[ireg] = reg_position;
+         frame->saved_regs[ireg] = reg_position;
        }
       for (ireg = 0; ireg < 32; ireg++)
        {
          reg_position = sigcontext_addr + SIGFRAME_FPREGSAVE_OFF + ireg * 8;
-         frame->saved_regs->regs[FP0_REGNUM + ireg] = reg_position;
+         frame->saved_regs[FP0_REGNUM + ireg] = reg_position;
        }
-      frame->saved_regs->regs[PC_REGNUM] = sigcontext_addr + SIGFRAME_PC_OFF;
+      frame->saved_regs[PC_REGNUM] = sigcontext_addr + SIGFRAME_PC_OFF;
       return;
     }
 
@@ -306,7 +300,7 @@ alpha_find_saved_regs (frame)
      register number.  */
   if (mask & (1 << returnreg))
     {
-      frame->saved_regs->regs[returnreg] = reg_position;
+      frame->saved_regs[returnreg] = reg_position;
       reg_position += 8;
       mask &= ~(1 << returnreg); /* Clear bit for RA so we
                                    don't save again later. */
@@ -315,7 +309,7 @@ alpha_find_saved_regs (frame)
   for (ireg = 0; ireg <= 31 ; ++ireg)
     if (mask & (1 << ireg))
       {
-       frame->saved_regs->regs[ireg] = reg_position;
+       frame->saved_regs[ireg] = reg_position;
        reg_position += 8;
       }
 
@@ -328,11 +322,11 @@ alpha_find_saved_regs (frame)
   for (ireg = 0; ireg <= 31 ; ++ireg)
     if (mask & (1 << ireg))
       {
-       frame->saved_regs->regs[FP0_REGNUM+ireg] = reg_position;
+       frame->saved_regs[FP0_REGNUM+ireg] = reg_position;
        reg_position += 8;
       }
 
-  frame->saved_regs->regs[PC_REGNUM] = frame->saved_regs->regs[returnreg];
+  frame->saved_regs[PC_REGNUM] = frame->saved_regs[returnreg];
 }
 
 static CORE_ADDR
@@ -350,8 +344,8 @@ read_next_frame_reg(fi, regno)
        {
          if (fi->saved_regs == NULL)
            alpha_find_saved_regs (fi);
-         if (fi->saved_regs->regs[regno])
-           return read_memory_integer(fi->saved_regs->regs[regno], 8);
+         if (fi->saved_regs[regno])
+           return read_memory_integer(fi->saved_regs[regno], 8);
        }
     }
   return read_register(regno);
@@ -399,6 +393,18 @@ alpha_saved_pc_after_call (frame)
 static struct alpha_extra_func_info temp_proc_desc;
 static struct frame_saved_regs temp_saved_regs;
 
+/* Nonzero if instruction at PC is a return instruction.  "ret
+   $zero,($ra),1" on alpha. */
+
+static int
+alpha_about_to_return (pc)
+     CORE_ADDR pc;
+{
+  return read_memory_integer (pc, 4) == 0x6bfa8001;
+}
+
+
+
 /* This fencepost looks highly suspicious to me.  Removing it also
    seems suspicious as it could affect remote debugging across serial
    lines.  */
@@ -449,8 +455,8 @@ Otherwise, you told GDB there was a function where there isn't one, or\n\
 
            return 0; 
          }
-       else if (ABOUT_TO_RETURN(start_pc))
-           break;
+       else if (alpha_about_to_return (start_pc))
+         break;
 
     start_pc += 4; /* skip return */
     return start_pc;
@@ -843,12 +849,11 @@ init_extra_frame_info (frame)
                                    (CORE_ADDR *)NULL,(CORE_ADDR *)NULL);
          if (!IN_SIGTRAMP (frame->pc, name))
            {
-             frame->saved_regs = (struct frame_saved_regs*)
-               obstack_alloc (&frame_cache_obstack,
-                              sizeof (struct frame_saved_regs));
-             *frame->saved_regs = temp_saved_regs;
-             frame->saved_regs->regs[PC_REGNUM]
-               = frame->saved_regs->regs[RA_REGNUM];
+             frame->saved_regs = (CORE_ADDR*)
+               frame_obstack_alloc (SIZEOF_FRAME_SAVED_REGS);
+             memcpy (frame->saved_regs, temp_saved_regs.regs, SIZEOF_FRAME_SAVED_REGS);
+             frame->saved_regs[PC_REGNUM]
+               = frame->saved_regs[RA_REGNUM];
            }
        }
     }
@@ -1104,12 +1109,12 @@ alpha_pop_frame()
       for (regnum = 32; --regnum >= 0; )
        if (PROC_REG_MASK(proc_desc) & (1 << regnum))
          write_register (regnum,
-                         read_memory_integer (frame->saved_regs->regs[regnum],
+                         read_memory_integer (frame->saved_regs[regnum],
                                               8));
       for (regnum = 32; --regnum >= 0; )
        if (PROC_FREG_MASK(proc_desc) & (1 << regnum))
          write_register (regnum + FP0_REGNUM,
-                         read_memory_integer (frame->saved_regs->regs[regnum + FP0_REGNUM], 8));
+                         read_memory_integer (frame->saved_regs[regnum + FP0_REGNUM], 8));
     }
   write_register (SP_REGNUM, new_sp);
   flush_cached_frames ();
This page took 0.029599 seconds and 4 git commands to generate.