* mips-nat.c (fetch_core_registers, register_addr): Copy from
authorStu Grossman <grossman@cygnus>
Tue, 20 Oct 1992 05:47:47 +0000 (05:47 +0000)
committerStu Grossman <grossman@cygnus>
Tue, 20 Oct 1992 05:47:47 +0000 (05:47 +0000)
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
gdb/config/decstation.mh
gdb/config/irix3.mh
gdb/mips-nat.c
gdb/tm-irix3.h

index 276b3a258b5357f15f1d9ebc8caae696a3aeaf7d..8403b1b81fb1636f98f0eb7e76b84e7c913c10a7 100644 (file)
@@ -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().
 
index 84dde0cc58e8f94af6f2841239bf7d4edddb00b2..27cf5fd8a74de623bf5bdf54ad6e7f975e1983f4 100644 (file)
@@ -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
index d0cd7ac2a965507849994f999f04c3875ba67496..0d93c2ecc3b1e493c559ee9e70d956662cb64591 100644 (file)
@@ -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
index b47f75651876357666b1f772bffc6e219cf48a1c..7beb58261119562125f6a5aa280c4f50a8dfa585 100644 (file)
@@ -25,6 +25,17 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <sys/ptrace.h>
 #include <setjmp.h>            /* For JB_XXX.  */
 
+#include <sys/types.h>
+#include <sys/param.h>
+#include "gdbcore.h"
+
+/* These are needed on various systems to expand REGISTER_U_ADDR.  */
+#include <sys/dir.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/user.h>
+#include <sys/ptrace.h>
+
 /* 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;
+}
index 35421b321cb2b6c32f173e9927ec2f359c81c9ef..bcb2ab325f101bb073689104e0a1e115d9a72fcb 100644 (file)
@@ -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__"