* Rename remote-es1800.c to remote-es.c
[deliverable/binutils-gdb.git] / gdb / hppa-tdep.c
index ca2393886f25876fc3cfb70d14c29373775ac214..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;
+    }
 }
 
 /*
@@ -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.025838 seconds and 4 git commands to generate.