* corelow.c: Add multi thread/process support for core files with
authorStu Grossman <grossman@cygnus>
Sat, 25 Sep 1993 00:40:20 +0000 (00:40 +0000)
committerStu Grossman <grossman@cygnus>
Sat, 25 Sep 1993 00:40:20 +0000 (00:40 +0000)
.reg/XXX pseudo-sections.
* i386lynx-nat.c thread.h thread.c:  Remove unnecessary core file
support.

gdb/ChangeLog
gdb/corelow.c
gdb/i386lynx-nat.c
gdb/thread.c
gdb/thread.h

index 05c31fe..3f5f4f2 100644 (file)
@@ -1,5 +1,14 @@
+Fri Sep 24 17:25:41 1993  Stu Grossman  (grossman at cygnus.com)
+
+       * corelow.c:  Add multi thread/process support for core files with
+       .reg/XXX pseudo-sections.
+       * i386lynx-nat.c thread.h thread.c:  Remove unnecessary core file
+       support.
+
 Thu Sep 23 10:49:37 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
+       * remote-udi.c (download): Skip zero length sections.
+
        * valops.c (search_struct_method, value_struct_elt):
        Use (value)-1, not -1, for error.
 
index dfafe49..749acce 100644 (file)
@@ -51,6 +51,8 @@ static void
 core_close (quitting)
      int quitting;
 {
+  inferior_pid = 0;            /* Avoid confusion from thread stuff */
+
   if (core_bfd) {
     free (bfd_get_filename (core_bfd));
     bfd_close (core_bfd);
@@ -78,6 +80,30 @@ solib_add_stub (from_tty)
 }
 #endif /* SOLIB_ADD */
 
+/* Look for sections whose names start with `.reg/' so that we can extract the
+   list of threads in a core file.  */
+
+static void
+add_to_thread_list (abfd, asect, reg_sect)
+     bfd *abfd;
+     asection *asect;
+     asection *reg_sect;
+{
+  int thread_id;
+
+  if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0)
+    return;
+
+  thread_id = atoi (bfd_section_name (abfd, asect) + 5);
+
+  add_thread (thread_id);
+
+/* Warning, Will Robinson, looking at BFD private data! */
+
+  if (asect->filepos == reg_sect->filepos) /* Did we find .reg? */
+    inferior_pid = thread_id;  /* Yes, make it current */
+}
+
 /* This routine opens and sets up the core file bfd */
 
 void
@@ -154,6 +180,12 @@ core_open (filename, from_tty)
     printf_filtered ("Program terminated with signal %d, %s.\n", siggy,
            safe_strsignal (siggy));
 
+  /* Build up thread list from BFD sections. */
+
+  init_thread_list ();
+  bfd_map_over_sections (core_bfd, add_to_thread_list,
+                        bfd_get_section_by_name (core_bfd, ".reg"));
+
   if (ontop) {
     /* Fetch all registers from core file */
     target_fetch_registers (-1);
@@ -201,8 +233,20 @@ get_core_registers (regno)
   sec_ptr reg_sec;
   unsigned size;
   char *the_regs;
+  char secname[10];
+
+  /* Thread support.  If inferior_pid is non-zero, then we have found a core
+     file with threads (or multiple processes).  In that case, we need to
+     use the appropriate register section, else we just use `.reg'. */
+
+  /* XXX - same thing needs to be done for floating-point (.reg2) sections. */
+
+  if (inferior_pid)
+    sprintf (secname, ".reg/%d", inferior_pid);
+  else
+    strcpy (secname, ".reg");
 
-  reg_sec = bfd_get_section_by_name (core_bfd, ".reg");
+  reg_sec = bfd_get_section_by_name (core_bfd, secname);
   if (!reg_sec) goto cant;
   size = bfd_section_size (core_bfd, reg_sec);
   the_regs = alloca (size);
index 63300f1..5d3fb21 100644 (file)
@@ -21,7 +21,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "defs.h"
 #include "frame.h"
 #include "inferior.h"
-#include "gdbcore.h"
 #include "target.h"
 
 #include <sys/ptrace.h>
@@ -50,8 +49,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define        FS      0
 #define        GS      0
 
-static struct target_ops lynx_core_ops;
-
 /* this table must line up with REGISTER_NAMES in m-i386.h */
 static unsigned int regmap[] = 
 {
@@ -284,244 +281,3 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
       supply_register (regno, core_reg_sect + addr);
     }
 }
-
-#if 0
-
-/* Discard all vestiges of any previous core file
-   and mark data and stack spaces as empty.  */
-
-/* ARGSUSED */
-static void
-lynx_core_close (quitting)
-     int quitting;
-{
-  if (core_bfd)
-    {
-      free (bfd_get_filename (core_bfd));
-      bfd_close (core_bfd);
-      core_bfd = NULL;
-
-      if (core_ops.to_sections)
-       {
-         free ((PTR)lynx_core_ops.to_sections);
-         lynx_core_ops.to_sections = NULL;
-         lynx_core_ops.to_sections_end = NULL;
-       }
-    }
-}
-
-/* This routine opens and sets up the core file bfd */
-
-static void
-lynx_core_open (filename, from_tty)
-     char *filename;
-     int from_tty;
-{
-  const char *p;
-  int siggy;
-  struct cleanup *old_chain;
-  char *temp;
-  bfd *temp_bfd;
-  int ontop;
-  int scratch_chan;
-
-  target_preopen (from_tty);
-  if (!filename)
-    {
-      error (core_bfd ? 
-            "No core file specified.  (Use `detach' to stop debugging a core file.)"
-            : "No core file specified.");
-    }
-
-  filename = tilde_expand (filename);
-  if (filename[0] != '/')
-    {
-      temp = concat (current_directory, "/", filename, NULL);
-      free (filename);
-      filename = temp;
-    }
-
-  old_chain = make_cleanup (free, filename);
-
-  scratch_chan = open (filename, write_files? O_RDWR: O_RDONLY, 0);
-  if (scratch_chan < 0)
-    perror_with_name (filename);
-
-  temp_bfd = bfd_fdopenr (filename, NULL, scratch_chan);
-  if (temp_bfd == NULL)
-    perror_with_name (filename);
-
-  if (!bfd_check_format (temp_bfd, bfd_core))
-    {
-      /* Do it after the err msg */
-      make_cleanup (bfd_close, temp_bfd);
-      error ("\"%s\" is not a core dump: %s", filename, bfd_errmsg(bfd_error));
-    }
-
-  /* Looks semi-reasonable.  Toss the old core file and work on the new.  */
-
-  discard_cleanups (old_chain);                /* Don't free filename any more */
-  unpush_target (&core_ops);
-  core_bfd = temp_bfd;
-  old_chain = make_cleanup (core_close, core_bfd);
-
-  validate_files ();
-
-  /* Find the data section */
-  if (build_section_table (core_bfd, &core_ops.to_sections,
-                          &core_ops.to_sections_end))
-    error ("Can't find sections in `%s': %s", bfd_get_filename(core_bfd),
-          bfd_errmsg (bfd_error));
-
-  ontop = !push_target (&core_ops);
-  discard_cleanups (old_chain);
-
-  p = bfd_core_file_failing_command (core_bfd);
-  if (p)
-    printf_filtered ("Core was generated by `%s'.\n", p);
-
-  siggy = bfd_core_file_failing_signal (core_bfd);
-  if (siggy > 0)
-    printf_filtered ("Program terminated with signal %d, %s.\n", siggy,
-           safe_strsignal (siggy));
-
-  /* Locate all of the thread register sections.  They have names like .regxx,
-     where xx is the thread-id.  */
-
-  bfd_map_over_sections (core_bfd, grok_register_sections, 
-
-  if (ontop)
-    {
-      /* Fetch all registers from core file */
-      target_fetch_registers (-1);
-
-      /* Now, set up the frame cache, and print the top of stack */
-      set_current_frame (create_new_frame (read_fp (),
-                                          read_pc ()));
-      select_frame (get_current_frame (), 0);
-      print_stack_frame (selected_frame, selected_frame_level, 1);
-    }
-  else
-    {
-      warning (
-              "you won't be able to access this core file until you terminate\n\
-your %s; do ``info files''", current_target->to_longname);
-    }
-}
-
-static void
-lynx_core_detach (args, from_tty)
-     char *args;
-     int from_tty;
-{
-  if (args)
-    error ("Too many arguments");
-  unpush_target (&core_ops);
-  if (from_tty)
-    printf_filtered ("No core file now.\n");
-}
-
-/* Get the registers out of a core file.  This is the machine-
-   independent part.  Fetch_core_registers is the machine-dependent
-   part, typically implemented in the xm-file for each architecture.  */
-
-/* We just get all the registers, so we don't use regno.  */
-/* ARGSUSED */
-static void
-get_core_registers (regno)
-     int regno;
-{
-  sec_ptr reg_sec;
-  unsigned size;
-  char *the_regs;
-  char regsecname[20];
-
-  sprintf (regsecname, ".reg%d", TIDGET (inferior_pid));
-
-  reg_sec = bfd_get_section_by_name (core_bfd, regsecname);
-  if (!reg_sec)
-    goto cant;
-  size = bfd_section_size (core_bfd, reg_sec);
-  the_regs = alloca (size);
-  if (bfd_get_section_contents (core_bfd, reg_sec, the_regs, (file_ptr)0,
-                               size))
-    {
-      fetch_core_registers (the_regs, size, 0,
-                           (unsigned) bfd_section_vma (abfd,reg_sec));
-    }
-  else
-    {
-cant:
-      fprintf_filtered (stderr, "Couldn't fetch registers from core file: %s\n",
-              bfd_errmsg (bfd_error));
-    }
-
-  registers_fetched();
-}
-
-static void
-core_files_info (t)
-  struct target_ops *t;
-{
-  print_section_info (t, core_bfd);
-}
-\f
-/* If mourn is being called in all the right places, this could be say
-   `gdb internal error' (since generic_mourn calls mark_breakpoints_out).  */
-
-static int
-ignore (addr, contents)
-     CORE_ADDR addr;
-     char *contents;
-{
-}
-
-static struct target_ops
-lynx_core_ops =
-{
-  "core",
-  "Local core dump file",
-  "Use a core file as a target.  Specify the filename of the core file.",
-  lynx_core_open,
-  lynx_core_close,
-  find_default_attach,
-  lynx_core_detach,
-  0,
-  0,
-  get_core_registers, 
-  0,
-  0,
-  xfer_memory,
-  lynx_core_files_info,
-  ignore,
-  ignore,
-  0,
-  0,
-  0,
-  0,
-  0,
-  0,
-  0,
-  0,
-  find_default_create_inferior,
-  0,                           /* mourn_inferior */
-  0,                           /* can_run */
-  0,                           /* notice_signals */
-  core_stratum,
-  0,                           /* next */
-  0,
-  1,
-  1,
-  1,
-  0,
-  0,
-  0,
-  OPS_MAGIC,                   /* Always the last thing */
-};
-
-void
-_initialize_i386lynx_nat()
-{
-  add_target (&lynx_core_ops);
-}
-#endif
index 0e80975..fdc13bc 100644 (file)
@@ -109,19 +109,6 @@ in_thread_list (pid)
   return 0;                    /* Never heard of 'im */
 }
 
-#if 0
-void
-bfd_get_core_threads (abfd)
-    bfd *abfd;
-{
-    int i;
-
-    inferior_pid = BUILDPID (inferior_pid, core_thread (abfd)->pid);
-    for (i = 0; i < core_pss (abfd).threadcnt; i++)
-      add_thread (core_thread (abfd)[i].pid);
-}
-#endif
-
 static void
 prune_threads ()
 {
index 6f450b4..36b0035 100644 (file)
@@ -29,12 +29,4 @@ extern void add_thread PARAMS ((int));
 
 extern int in_thread_list PARAMS ((int));
 
-#if 0
-#ifdef __STDC__
-struct _bfd;
-#endif
-
-extern void bfd_get_core_threads PARAMS ((struct _bfd *));
-#endif
-
 #endif /* THREAD_H */