diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fee143b14f..a7ebd9fd34 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +Fri Sep 26 12:22:00 1997 Mark Alexander + + * config/mips-tm-mips.h (mips_extra_func_info): New frame_adjust + member for storing offset of MIPS16 frame pointer from SP. + * mips-tdep.c: Use RA_REGNUM instead of hardcoded 31 throughout. + (PROC_FRAME_ADJUST): Define. + (mips16_heuristic_proc_desc): Store frame pointer adjustment value. + (get_frame_pointer): Use frame pointer adjustment value when + calculating frame address. + * remote-sim.c (gdbsim_fetch_register): Don't fetch registers + that have a null or empty name. +start-sanitize-tx19 + * config/mips/tm-tx19.h (MIPS_DEFAULT_FPU_TYPE): Define. + (REGISTER_NAMES): Redefine to eliminate FP registers. + * config/mips/tm-tx19l.h: Ditto. +end-sanitize-tx19 + Fri Sep 26 12:40:51 1997 Jeffrey A Law (law@cygnus.com) Michael Snyder (msnyder@cleaver.cygnus.com) diff --git a/gdb/config/mips/tm-mips.h b/gdb/config/mips/tm-mips.h index 484b0312ad..aa40510c54 100644 --- a/gdb/config/mips/tm-mips.h +++ b/gdb/config/mips/tm-mips.h @@ -452,6 +452,7 @@ extern void ecoff_relocate_efi PARAMS ((struct symbol *, CORE_ADDR)); typedef struct mips_extra_func_info { long numargs; /* number of args to procedure (was iopt) */ bfd_vma high_addr; /* upper address bound */ + long frame_adjust; /* offset of FP from SP (used on MIPS16) */ PDR pdr; /* Procedure descriptor record */ } *mips_extra_func_info_t; diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 6951ca59b8..9be5c20028 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -190,6 +190,7 @@ static unsigned int heuristic_fence_post = 0; #define PROC_HIGH_ADDR(proc) ((proc)->high_addr) /* upper address bound */ #define PROC_FRAME_OFFSET(proc) ((proc)->pdr.frameoffset) #define PROC_FRAME_REG(proc) ((proc)->pdr.framereg) +#define PROC_FRAME_ADJUST(proc) ((proc)->frame_adjust) #define PROC_REG_MASK(proc) ((proc)->pdr.regmask) #define PROC_FREG_MASK(proc) ((proc)->pdr.fregmask) #define PROC_REG_OFFSET(proc) ((proc)->pdr.regoffset) @@ -323,7 +324,7 @@ mips16_decode_reg_save (inst, gen_mask) } else if ((inst & 0xff00) == 0x6200 /* sw $ra,n($sp) */ || (inst & 0xff00) == 0xfa00) /* sd $ra,n($sp) */ - *gen_mask |= (1 << 31); + *gen_mask |= (1 << RA_REGNUM); } @@ -721,7 +722,7 @@ Otherwise, you told GDB there was a function where there isn't one, or\n\ static int mips16_get_imm (prev_inst, inst, nbits, scale, is_signed) unsigned short prev_inst; /* previous instruction */ - unsigned short inst; /* current current instruction */ + unsigned short inst; /* current instruction */ int nbits; /* number of bits in imm field */ int scale; /* scale factor to be applied to imm */ int is_signed; /* is the imm field signed? */ @@ -763,7 +764,8 @@ mips16_heuristic_proc_desc(start_pc, limit_pc, next_frame, sp) unsigned short prev_inst = 0; /* saved copy of previous instruction */ unsigned inst = 0; /* current instruction */ - PROC_FRAME_OFFSET(&temp_proc_desc) = 0; + PROC_FRAME_OFFSET(&temp_proc_desc) = 0; /* size of stack frame */ + PROC_FRAME_ADJUST(&temp_proc_desc) = 0; /* offset of FP from SP */ for (cur_pc = start_pc; cur_pc < limit_pc; cur_pc += MIPS16_INSTLEN) { @@ -804,14 +806,14 @@ mips16_heuristic_proc_desc(start_pc, limit_pc, next_frame, sp) else if ((inst & 0xff00) == 0x6200) /* sw $ra,n($sp) */ { offset = mips16_get_imm (prev_inst, inst, 8, 4, 0); - PROC_REG_MASK(&temp_proc_desc) |= (1 << 31); - temp_saved_regs.regs[31] = sp + offset; + PROC_REG_MASK(&temp_proc_desc) |= (1 << RA_REGNUM); + temp_saved_regs.regs[RA_REGNUM] = sp + offset; } else if ((inst & 0xff00) == 0xfa00) /* sd $ra,n($sp) */ { offset = mips16_get_imm (prev_inst, inst, 8, 8, 0); - PROC_REG_MASK(&temp_proc_desc) |= (1 << 31); - temp_saved_regs.regs[31] = sp + offset; + PROC_REG_MASK(&temp_proc_desc) |= (1 << RA_REGNUM); + temp_saved_regs.regs[RA_REGNUM] = sp + offset; } else if (inst == 0x673d) /* move $s1, $sp */ { @@ -823,6 +825,7 @@ mips16_heuristic_proc_desc(start_pc, limit_pc, next_frame, sp) offset = mips16_get_imm (prev_inst, inst, 8, 4, 0); frame_addr = sp + offset; PROC_FRAME_REG (&temp_proc_desc) = 17; + PROC_FRAME_ADJUST (&temp_proc_desc) = offset; } else if ((inst & 0xFF00) == 0xd900) /* sw reg,offset($s1) */ { @@ -858,8 +861,8 @@ mips16_heuristic_proc_desc(start_pc, limit_pc, next_frame, sp) offset = 28; if (inst & 0x20) { - PROC_REG_MASK(&temp_proc_desc) |= 1 << 31; - temp_saved_regs.regs[31] = sp + offset; + PROC_REG_MASK(&temp_proc_desc) |= 1 << RA_REGNUM; + temp_saved_regs.regs[RA_REGNUM] = sp + offset; offset -= MIPS_REGSIZE; } @@ -1110,8 +1113,9 @@ get_frame_pointer(frame, proc_desc) struct frame_info *frame; mips_extra_func_info_t proc_desc; { - return ADDR_BITS_REMOVE (read_next_frame_reg (frame, - PROC_FRAME_REG(proc_desc)) + PROC_FRAME_OFFSET(proc_desc)); + return ADDR_BITS_REMOVE ( + read_next_frame_reg (frame, PROC_FRAME_REG (proc_desc)) + + PROC_FRAME_OFFSET (proc_desc) - PROC_FRAME_ADJUST (proc_desc)); } mips_extra_func_info_t cached_proc_desc; diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c index 0bdb354264..d395d8f1d1 100644 --- a/gdb/remote-sim.c +++ b/gdb/remote-sim.c @@ -344,7 +344,7 @@ int regno; for (regno = 0; regno < NUM_REGS; regno++) gdbsim_fetch_register (regno); } - else + else if (reg_names[regno] != NULL && *reg_names[regno] != '\0') { char buf[MAX_REGISTER_RAW_SIZE];