From 0e52a532e4c7ed810f839d05d16b7c03e935a706 Mon Sep 17 00:00:00 2001 From: Stu Grossman Date: Sat, 19 Dec 1998 17:56:40 +0000 Subject: [PATCH] * 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(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6d17304331..3acdc140d3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ +Sat Dec 19 09:55:09 1998 Stu Grossman + + * 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 + * 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 23ab53103c..01e6b040fa 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);