* gdb.t06/twice.exp: Don't care about the file name GDB prints.
[deliverable/binutils-gdb.git] / gdb / hppa-tdep.c
index 49af79ea12959416729d70d47eb398d13533d111..b174b0976661d714db4ed201df64a077d16099ae 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 
@@ -345,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;
@@ -362,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;
 
@@ -401,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 */
@@ -437,13 +458,28 @@ frame_chain_valid (chain, thisframe)
   if (!chain)
     return 0;
 
-  msym = lookup_minimal_symbol_by_pc (FRAME_SAVED_PC (thisframe));
+  if (use_unwind)
+    {
 
-  if (msym
-      && (strcmp (SYMBOL_NAME (msym), "_start") == 0))
-    return 0;
+      struct unwind_table_entry *u;
+
+      u = find_unwind_entry (thisframe->pc);
+
+      if (u && (u->Save_SP || u->Total_frame_size))
+       return 1;
+      else
+       return 0;
+    }
   else
-    return 1;
+    {
+      msym = lookup_minimal_symbol_by_pc (FRAME_SAVED_PC (thisframe));
+
+      if (msym
+         && (strcmp (SYMBOL_NAME (msym), "_start") == 0))
+       return 0;
+      else
+       return 1;
+    }
 }
 
 /*
@@ -503,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
@@ -638,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;
   
This page took 0.024564 seconds and 4 git commands to generate.