From 0e52a532e4c7ed810f839d05d16b7c03e935a706 Mon Sep 17 00:00:00 2001
From: Stu Grossman <grossman@cygnus>
Date: Sat, 19 Dec 1998 17:56:40 +0000
Subject: 	* mips-tdep.c (mips32_heuristic_proc_desc):  Clear
 temp_saved_regs 	on restart.  Fixes problem with backtracing through
 functions that 	use virtual frame pointers.

---
 gdb/ChangeLog   |  9 +++++++++
 gdb/mips-tdep.c | 15 +++++++++------
 2 files changed, 18 insertions(+), 6 deletions(-)

(limited to 'gdb')

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6d17304..3acdc14 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,14 @@
+Sat Dec 19 09:55:09 1998  Stu Grossman  <grossman@babylon-5.cygnus.com>
+
+	* mips-tdep.c (mips32_heuristic_proc_desc):  Clear temp_saved_regs
+	on restart.  Fixes problem with backtracing through functions that
+	use virtual frame pointers.
+
 Fri Dec 18 14:23:34 1998  Andrew Cagney  <cagney@chook>
 
+	* mips-tdep.c (mips_push_arguments): Don't left-shift small
+ 	structs being passed in a register when an O64 target.
+
 	* config/mips/tm-mips.h (enum mips_fpu_type, mips_fpu): Move to
  	mips-tdep.c.
 
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 23ab531..01e6b04 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -1442,6 +1442,7 @@ mips32_heuristic_proc_desc(start_pc, limit_pc, next_frame, sp)
   CORE_ADDR cur_pc;
   CORE_ADDR frame_addr = 0; /* Value of $r30. Used by gcc for frame-pointer */
 restart:
+  memset (&temp_saved_regs, '\0', sizeof(struct frame_saved_regs));
   PROC_FRAME_OFFSET(&temp_proc_desc) = 0;
   PROC_FRAME_ADJUST (&temp_proc_desc) = 0;	/* offset of FP from SP */
   for (cur_pc = start_pc; cur_pc < limit_pc; cur_pc += MIPS_INSTLEN)
@@ -1990,13 +1991,15 @@ mips_push_arguments(nargs, args, sp, struct_return, struct_addr)
 		     It does not seem to be necessary to do the
 		     same for integral types.
 
-		     Also don't do this adjustment on EABI targets.  */
+		     Also don't do this adjustment on EABI and O64
+		     binaries. */
 
-		  if (!MIPS_EABI &&
-		      TARGET_BYTE_ORDER == BIG_ENDIAN &&
-		      partial_len < MIPS_REGSIZE &&
-		      (typecode == TYPE_CODE_STRUCT ||
-		       typecode == TYPE_CODE_UNION))
+		  if (!MIPS_EABI
+		      && (MIPS_REGSIZE < 8)
+		      && TARGET_BYTE_ORDER == BIG_ENDIAN
+		      && (partial_len < MIPS_REGSIZE)
+		      && (typecode == TYPE_CODE_STRUCT ||
+			  typecode == TYPE_CODE_UNION))
 		    regval <<= ((MIPS_REGSIZE - partial_len) * 
 				TARGET_CHAR_BIT);
 
-- 
cgit v1.1