* mips-tdep.c (mips32_heuristic_proc_desc): Clear temp_saved_regs

on restart.  Fixes problem with backtracing through functions that
	use virtual frame pointers.
This commit is contained in:
Stu Grossman 1998-12-19 17:56:40 +00:00
parent 27f6ea6995
commit 0e52a532e4
2 changed files with 18 additions and 6 deletions

View File

@ -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> 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 * config/mips/tm-mips.h (enum mips_fpu_type, mips_fpu): Move to
mips-tdep.c. mips-tdep.c.

View File

@ -1442,6 +1442,7 @@ mips32_heuristic_proc_desc(start_pc, limit_pc, next_frame, sp)
CORE_ADDR cur_pc; CORE_ADDR cur_pc;
CORE_ADDR frame_addr = 0; /* Value of $r30. Used by gcc for frame-pointer */ CORE_ADDR frame_addr = 0; /* Value of $r30. Used by gcc for frame-pointer */
restart: restart:
memset (&temp_saved_regs, '\0', sizeof(struct frame_saved_regs));
PROC_FRAME_OFFSET(&temp_proc_desc) = 0; PROC_FRAME_OFFSET(&temp_proc_desc) = 0;
PROC_FRAME_ADJUST (&temp_proc_desc) = 0; /* offset of FP from SP */ 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) 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 It does not seem to be necessary to do the
same for integral types. 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 && if (!MIPS_EABI
TARGET_BYTE_ORDER == BIG_ENDIAN && && (MIPS_REGSIZE < 8)
partial_len < MIPS_REGSIZE && && TARGET_BYTE_ORDER == BIG_ENDIAN
(typecode == TYPE_CODE_STRUCT || && (partial_len < MIPS_REGSIZE)
typecode == TYPE_CODE_UNION)) && (typecode == TYPE_CODE_STRUCT ||
typecode == TYPE_CODE_UNION))
regval <<= ((MIPS_REGSIZE - partial_len) * regval <<= ((MIPS_REGSIZE - partial_len) *
TARGET_CHAR_BIT); TARGET_CHAR_BIT);