* hppa-tdep.c (hppa_push_arguments): Allocate enough space for
[deliverable/binutils-gdb.git] / gdb / hppa-tdep.c
index 4d2a38a2e115e73d16678eb23362c6804b87bc06..2ae279a736a433ed3f66ffb30f578d2458d725c3 100644 (file)
@@ -61,6 +61,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 static int restore_pc_queue PARAMS ((struct frame_saved_regs *fsr));
 static int hppa_alignof PARAMS ((struct type *arg));
+CORE_ADDR frame_saved_pc PARAMS ((FRAME frame));
 
 \f
 /* Routines to extract various sized constants out of hppa 
@@ -125,6 +126,24 @@ extract_5_store (word)
   return low_sign_extend (word & MASK_5, 5);
 }
 
+/* extract the immediate field from a break instruction */
+
+unsigned
+extract_5r_store (word)
+     unsigned word;
+{
+  return (word & MASK_5);
+}
+
+/* extract the immediate field from a {sr}sm instruction */
+
+unsigned
+extract_5R_store (word)
+     unsigned word;
+{
+  return (word >> 16 & MASK_5);
+}
+
 /* extract an 11 bit immediate field */
 
 int
@@ -327,6 +346,26 @@ rp_saved(pc)
     return 0;
 }
 \f
+int
+frameless_function_invocation (frame)
+     FRAME frame;
+{
+
+  if (use_unwind)
+    {
+      struct unwind_table_entry *u;
+
+      u = find_unwind_entry (frame->pc);
+
+      if (u == 0)
+       return 0;
+
+      return (u->Total_frame_size == 0);
+    }
+  else
+    return frameless_look_for_prologue (frame);
+}
+
 CORE_ADDR
 saved_pc_after_call (frame)
      FRAME frame;
@@ -344,7 +383,7 @@ frame_saved_pc (frame)
 {
   CORE_ADDR pc = get_frame_pc (frame);
 
-  if (frameless_look_for_prologue (frame))
+  if (frameless_function_invocation (frame))
     {
       int ret_regnum;
 
@@ -383,7 +422,7 @@ init_extra_frame_info (fromleaf, frame)
   else
     frame->frame = read_register (SP_REGNUM) - framesize;
 
-  if (!frameless_look_for_prologue (frame)) /* Frameless? */
+  if (!frameless_function_invocation (frame)) /* Frameless? */
     return;                                /* No, quit now */
 
   /* For frameless functions, we need to look at the caller's frame */
@@ -419,43 +458,29 @@ frame_chain_valid (chain, thisframe)
   if (!chain)
     return 0;
 
-  msym = lookup_minimal_symbol_by_pc (FRAME_SAVED_PC (thisframe));
-
-  if (msym
-      && (strcmp (SYMBOL_NAME (msym), "_start") == 0))
-    return 0;
-  else
-    return 1;
-}
-
-#if 0
-/* Some helper functions. gcc_p returns 1 if the function beginning at 
-   pc appears to have been compiled with gcc. hpux_cc_p returns 1 if
-   fn was compiled with hpux cc. gcc functions look like :
+  if (use_unwind)
+    {
 
-   stw     rp,-0x14(sp) ; optional
-   or      r4,r0,r1
-   or      sp,r0,r4
-   stwm    r1,framesize(sp)
+      struct unwind_table_entry *u;
 
-   hpux cc functions look like:
+      u = find_unwind_entry (thisframe->pc);
 
-   stw     rp,-0x14(sp) ; optional.
-   stwm    r3,framesiz(sp)
-   */
+      if (u && (u->Save_SP || u->Total_frame_size))
+       return 1;
+      else
+       return 0;
+    }
+  else
+    {
+      msym = lookup_minimal_symbol_by_pc (FRAME_SAVED_PC (thisframe));
 
-gcc_p (pc)
-     CORE_ADDR pc;
-{
-  if (read_memory_integer (pc, 4) == 0x6BC23FD9)                       
-    pc = pc + 4;                                                       
-      
-  if (read_memory_integer (pc, 4) == 0x8040241
-      && read_memory_integer (pc + 4, 4) == 0x81E0244)
-    return 1;
-  return 0;
+      if (msym
+         && (strcmp (SYMBOL_NAME (msym), "_start") == 0))
+       return 0;
+      else
+       return 1;
+    }
 }
-#endif
 
 /*
  * These functions deal with saving and restoring register state
@@ -514,26 +539,26 @@ find_dummy_frame_regs (frame, frame_saved_regs)
   frame_saved_regs->regs[RP_REGNUM] = fp - 20 & ~0x3;
   frame_saved_regs->regs[FP_REGNUM] = fp;
   frame_saved_regs->regs[1] = fp + 8;
-  frame_saved_regs->regs[3] = fp + 12;
 
-  for (fp += 16, i = 5; i < 32; fp += 4, i++)
-    frame_saved_regs->regs[i] = fp;
+  for (fp += 12, i = 3; i < 32; i++)
+    {
+      if (i != FP_REGNUM)
+       {
+         frame_saved_regs->regs[i] = fp;
+         fp += 4;
+       }
+    }
 
   fp += 4;
   for (i = FP0_REGNUM; i < NUM_REGS; i++, fp += 8)
     frame_saved_regs->regs[i] = fp;
 
   frame_saved_regs->regs[IPSW_REGNUM] = fp;
-  fp += 4;
-  frame_saved_regs->regs[SAR_REGNUM] = fp;
-  fp += 4;
-  frame_saved_regs->regs[PCOQ_HEAD_REGNUM] = fp;
-  fp +=4;
-  frame_saved_regs->regs[PCSQ_HEAD_REGNUM] = fp;
-  fp +=4;
-  frame_saved_regs->regs[PCOQ_TAIL_REGNUM] = fp;
-  fp +=4;
-  frame_saved_regs->regs[PCSQ_TAIL_REGNUM] = fp;
+  frame_saved_regs->regs[SAR_REGNUM] = fp + 4;
+  frame_saved_regs->regs[PCOQ_HEAD_REGNUM] = fp + 8;
+  frame_saved_regs->regs[PCSQ_HEAD_REGNUM] = fp + 12;
+  frame_saved_regs->regs[PCOQ_TAIL_REGNUM] = fp + 16;
+  frame_saved_regs->regs[PCSQ_TAIL_REGNUM] = fp + 20;
 }
 
 int
@@ -649,7 +674,7 @@ hppa_push_arguments (nargs, args, sp, struct_return, struct_addr)
      CORE_ADDR struct_addr;
 {
   /* array of arguments' offsets */
-  int *offset = (int *)alloca(nargs);
+  int *offset = (int *)alloca(nargs * sizeof (int));
   int cum = 0;
   int i, alignment;
   
@@ -667,7 +692,7 @@ hppa_push_arguments (nargs, args, sp, struct_return, struct_addr)
        cum = (cum + alignment) & -alignment;
       offset[i] = -cum;
     }
-  sp += min ((cum + 7) & -8, 16);
+  sp += max ((cum + 7) & -8, 16);
 
   for (i = 0; i < nargs; i++)
     write_memory (sp + offset[i], VALUE_CONTENTS (args[i]),
@@ -927,7 +952,7 @@ unwind_command (exp, from_tty)
 }
 
 void
-_initialize_hppah_tdep ()
+_initialize_hppa_tdep ()
 {
   add_com ("unwind", class_obscure, unwind_command, "Print unwind info\n");
   add_show_from_set
This page took 0.027073 seconds and 4 git commands to generate.