From 56fc16c70b1b54ce459dbd471b77f40385257356 Mon Sep 17 00:00:00 2001 From: Stu Grossman Date: Tue, 20 Oct 1992 05:47:47 +0000 Subject: [PATCH] * mips-nat.c (fetch_core_registers, register_addr): Copy from coredep.c, but zero out FP_REGNUM & ZERO_REGNUM so that stack backtraces from core files work. * config/decstation.mh, config/irix3.mh: Remove coredep.o. Functions are now defined in mips-nat.c. --- gdb/ChangeLog | 8 ++++ gdb/config/decstation.mh | 2 +- gdb/config/irix3.mh | 2 +- gdb/mips-nat.c | 82 ++++++++++++++++++++++++++++++++++++++++ gdb/tm-irix3.h | 5 +++ 5 files changed, 97 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 276b3a258b..8403b1b81f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ Mon Oct 19 15:09:57 1992 Stu Grossman (grossman at cygnus.com) + * mips-nat.c (fetch_core_registers, register_addr): Copy from + coredep.c, but zero out FP_REGNUM & ZERO_REGNUM so that stack + backtraces from core files work. + * config/decstation.mh, config/irix3.mh: Remove coredep.o. + Functions are now defined in mips-nat.c. + + * tm-irix3.h: Put MIPS_EFI_SYMBOL_NAME in here too. + * remote-hms.c: Disable all uses of serial_nextbaudrate and serial_default_name(). diff --git a/gdb/config/decstation.mh b/gdb/config/decstation.mh index 84dde0cc58..27cf5fd8a7 100644 --- a/gdb/config/decstation.mh +++ b/gdb/config/decstation.mh @@ -2,7 +2,7 @@ XDEPFILES= XM_FILE= xm-mips.h NAT_FILE= nm-mips.h -NATDEPFILES= infptrace.o inftarg.o coredep.o corelow.o mips-nat.o fork-child.o +NATDEPFILES= infptrace.o inftarg.o corelow.o mips-nat.o fork-child.o # We can't use MMALLOC because the DECstation RPC library can't cope # with a malloc(0) that returns 0. Besides, it's useless on a machine diff --git a/gdb/config/irix3.mh b/gdb/config/irix3.mh index d0cd7ac2a9..0d93c2ecc3 100644 --- a/gdb/config/irix3.mh +++ b/gdb/config/irix3.mh @@ -2,7 +2,7 @@ XDEPFILES= XM_FILE= xm-irix3.h NAT_FILE= nm-irix3.h -NATDEPFILES= fork-child.o coredep.o corelow.o infptrace.o inftarg.o mips-nat.o +NATDEPFILES= fork-child.o corelow.o infptrace.o inftarg.o mips-nat.o ALLOCA=alloca.o ALLOCA1=alloca.o MUNCH_DEFINE=-B diff --git a/gdb/mips-nat.c b/gdb/mips-nat.c index b47f756518..7beb582611 100644 --- a/gdb/mips-nat.c +++ b/gdb/mips-nat.c @@ -25,6 +25,17 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include /* For JB_XXX. */ +#include +#include +#include "gdbcore.h" + +/* These are needed on various systems to expand REGISTER_U_ADDR. */ +#include +#include +#include +#include +#include + /* Size of elements in jmpbuf */ #define JB_ELEMENT_SIZE 4 @@ -144,3 +155,74 @@ get_longjmp_target(pc) return 1; } + +/* Extract the register values out of the core file and store + them where `read_register' will find them. + + CORE_REG_SECT points to the register values themselves, read into memory. + CORE_REG_SIZE is the size of that area. + WHICH says which set of registers we are handling (0 = int, 2 = float + on machines where they are discontiguous). + REG_ADDR is the offset from u.u_ar0 to the register values relative to + core_reg_sect. This is used with old-fashioned core files to + locate the registers in a large upage-plus-stack ".reg" section. + Original upage address X is at location core_reg_sect+x+reg_addr. + */ + +void +fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr) + char *core_reg_sect; + unsigned core_reg_size; + int which; + unsigned reg_addr; +{ + register int regno; + register unsigned int addr; + int bad_reg = -1; + register reg_ptr = -reg_addr; /* Original u.u_ar0 is -reg_addr. */ + + /* If u.u_ar0 was an absolute address in the core file, relativize it now, + so we can use it as an offset into core_reg_sect. When we're done, + "register 0" will be at core_reg_sect+reg_ptr, and we can use + register_addr to offset to the other registers. If this is a modern + core file without a upage, reg_ptr will be zero and this is all a big + NOP. */ + if (reg_ptr > core_reg_size) + reg_ptr -= KERNEL_U_ADDR; + + for (regno = 0; regno < NUM_REGS; regno++) + { + addr = register_addr (regno, reg_ptr); + if (addr >= core_reg_size) { + if (bad_reg < 0) + bad_reg = regno; + } else { + supply_register (regno, core_reg_sect + addr); + } + } + if (bad_reg >= 0) + { + error ("Register %s not found in core file.", reg_names[bad_reg]); + } + supply_register (ZERO_REGNUM, zerobuf); + /* Frame ptr reg must appear to be 0; it is faked by stack handling code. */ + supply_register (FP_REGNUM, zerobuf); +} + +/* Return the address in the core dump or inferior of register REGNO. + BLOCKEND is the address of the end of the user structure. */ + +unsigned int +register_addr (regno, blockend) + int regno; + int blockend; +{ + int addr; + + if (regno < 0 || regno >= NUM_REGS) + error ("Invalid register number %d.", regno); + + REGISTER_U_ADDR (addr, blockend, regno); + + return addr; +} diff --git a/gdb/tm-irix3.h b/gdb/tm-irix3.h index 35421b321c..bcb2ab325f 100644 --- a/gdb/tm-irix3.h +++ b/gdb/tm-irix3.h @@ -314,3 +314,8 @@ typedef struct mips_extra_func_info { struct frame_saved_regs *saved_regs; #define INIT_EXTRA_FRAME_INFO(fromleaf, fci) init_extra_frame_info(fci) + +/* Special symbol found in blocks associated with routines. We can hang + mips_extra_func_info_t's off of this. */ + +#define MIPS_EFI_SYMBOL_NAME "__GDB_EFI_INFO__" -- 2.34.1