static struct mips_extra_func_info temp_proc_desc;
static struct frame_saved_regs temp_saved_regs;
+/* This fencepost looks highly suspicious to me. Removing it also
+ seems suspicious as it could affect remote debugging across serial
+ lines. At the very least, this needs a warning message.
+
static CORE_ADDR
heuristic_proc_start(pc)
CORE_ADDR pc;
/* search back for previous return */
for (start_pc -= 4; ; start_pc -= 4)
- if (start_pc < fence) return 0;
+ if (start_pc < fence)
+ {
+ warning("Cannot find enclosing function for pc 0x%x", pc);
+ return 0;
+ }
else if (ABOUT_TO_RETURN(start_pc))
break;
write_memory (save_address, (char *)&buffer, sizeof(REGISTER_TYPE));
save_address -= 4;
}
- /* save floating-points registers */
- save_address = sp + PROC_FREG_OFFSET(proc_desc);
+ /* save floating-points registers starting with high order word */
+ save_address = sp + PROC_FREG_OFFSET(proc_desc) + 4;
for (ireg = 32; --ireg >= 0; )
if (PROC_FREG_MASK(proc_desc) & (1 << ireg))
{
else return 1;
}
\f
-/* To skip prologues, I use this predicate. Returns either PC
- itself if the code at PC does not look like a function prologue,
- PC+4 if it does (our caller does not need anything more fancy). */
+/* To skip prologues, I use this predicate. Returns either PC
+ itself if the code at PC does not look like a function prologue;
+ otherwise returns an address that (if we're lucky) follows
+ the prologue. */
CORE_ADDR
mips_skip_prologue(pc)
struct block *b;
unsigned long inst;
int offset;
+ int seen_sp_adjust = 0;
/* For -g modules and most functions anyways the
first instruction adjusts the stack.
for (offset = 0; offset < 100; offset += 4) {
inst = read_memory_integer(pc + offset, 4);
if ((inst & 0xffff0000) == 0x27bd0000) /* addiu $sp,$sp,offset */
- return pc + offset + 4;
- if ((inst & 0xFFE00000) != 0xAFA00000) /* sw reg,n($sp) */
- break;
+ seen_sp_adjust = 1;
+ else if ((inst & 0xFFE00000) == 0xAFA00000) /* sw reg,n($sp) */
+ continue;
+ else
+ break;
}
+ if (seen_sp_adjust)
+ return pc + offset;
/* Well, it looks like a frameless. Let's make sure.
Note that we are not called on the current PC,
_initialize_mips_tdep ()
{
add_show_from_set
- (add_set_cmd ("mips_fpu", class_support, var_boolean,
+ (add_set_cmd ("mipsfpu", class_support, var_boolean,
(char *) &mips_fpu,
"Set use of floating point coprocessor.\n\
Turn off to avoid using floating point instructions when calling functions\n\