* corelow.c (core_close): Don't hardcode the core's pid.
authorPedro Alves <palves@redhat.com>
Mon, 16 Feb 2009 03:16:24 +0000 (03:16 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 16 Feb 2009 03:16:24 +0000 (03:16 +0000)
(core_open): Find core threads before calling
post_create_inferior.
(add_to_thread_list, get_core_register_section): Take into account
systems where the regset section names encode the pid of the
inferior.

* gdbarch.sh (core_reg_section_encodes_pid): New gdbarch setting.
* gdbarch.h, gdbarch.c: Regenerate.

* amd64-sol2-tdep.c (amd64_sol2_init_abi): Set it.
* i386-sol2-tdep.c (i386_sol2_init_abi): Set it.
* sparc-sol2-tdep.c (sparc32_sol2_init_abi): Set it.
* sparc64-sol2-tdep.c (sparc64_sol2_init_abi): Set it.

gdb/ChangeLog
gdb/amd64-sol2-tdep.c
gdb/corelow.c
gdb/gdbarch.c
gdb/gdbarch.h
gdb/gdbarch.sh
gdb/i386-sol2-tdep.c
gdb/sparc-sol2-tdep.c
gdb/sparc64-sol2-tdep.c

index f36c9ad..71c1f6a 100644 (file)
@@ -1,3 +1,20 @@
+2009-02-16  Pedro Alves  <pedro@codesourcery.com>
+
+       * corelow.c (core_close): Don't hardcode the core's pid.
+       (core_open): Find core threads before calling
+       post_create_inferior.
+       (add_to_thread_list, get_core_register_section): Take into account
+       systems where the regset section names encode the pid of the
+       inferior.
+
+       * gdbarch.sh (core_reg_section_encodes_pid): New gdbarch setting.
+       * gdbarch.h, gdbarch.c: Regenerate.
+
+       * amd64-sol2-tdep.c (amd64_sol2_init_abi): Set it.
+       * i386-sol2-tdep.c (i386_sol2_init_abi): Set it.
+       * sparc-sol2-tdep.c (sparc32_sol2_init_abi): Set it.
+       * sparc64-sol2-tdep.c (sparc64_sol2_init_abi): Set it.
+
 2009-02-14  Vladimir Prus  <vladimir@codesourcery.com>
 
        Include frame information for *stopped due to CLI commands.
index f580de5..6b3b5d7 100644 (file)
@@ -113,6 +113,10 @@ amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_skip_solib_resolver (gdbarch, sol2_skip_solib_resolver);
   set_solib_svr4_fetch_link_map_offsets
     (gdbarch, svr4_lp64_fetch_link_map_offsets);
+
+  /* Solaris encodes the pid of the inferior in regset section
+     names.  */
+  set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1);
 }
 \f
 
index 2d159b4..485e2c2 100644 (file)
@@ -199,8 +199,9 @@ core_close (int quitting)
 
   if (core_bfd)
     {
+      int pid = ptid_get_pid (inferior_ptid);
       inferior_ptid = null_ptid;       /* Avoid confusion from thread stuff */
-      delete_inferior_silent (CORELOW_PID);
+      delete_inferior_silent (pid);
 
       /* Clear out solib state while the bfd is still open. See
          comments in clear_solib in solib.c. */
@@ -244,7 +245,15 @@ add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg)
 
   thread_id = atoi (bfd_section_name (abfd, asect) + 5);
 
-  ptid = ptid_build (ptid_get_pid (inferior_ptid), thread_id, 0);
+  if (core_gdbarch
+      && gdbarch_core_reg_section_encodes_pid (core_gdbarch))
+    {
+      uint32_t merged_pid = thread_id;
+      ptid = ptid_build (merged_pid & 0xffff,
+                        merged_pid >> 16, 0);
+    }
+  else
+    ptid = ptid_build (ptid_get_pid (inferior_ptid), thread_id, 0);
 
   if (ptid_get_lwp (inferior_ptid) == 0)
     /* The main thread has already been added before getting here, and
@@ -374,16 +383,14 @@ core_open (char *filename, int from_tty)
      from ST to MT.  */
   add_thread_silent (inferior_ptid);
 
-  /* This is done first, before anything has a chance to query the
-     inferior for information such as symbols.  */
-  post_create_inferior (&core_ops, from_tty);
-
   /* Build up thread list from BFD sections, and possibly set the
      current thread to the .reg/NN section matching the .reg
      section. */
   bfd_map_over_sections (core_bfd, add_to_thread_list,
                         bfd_get_section_by_name (core_bfd, ".reg"));
 
+  post_create_inferior (&core_ops, from_tty);
+
   /* Now go through the target stack looking for threads since there
      may be a thread_stratum target loaded on top of target core by
      now.  The layer above should claim threads found in the BFD
@@ -453,7 +460,18 @@ get_core_register_section (struct regcache *regcache,
   char *contents;
 
   xfree (section_name);
-  if (ptid_get_lwp (inferior_ptid))
+
+  if (core_gdbarch
+      && gdbarch_core_reg_section_encodes_pid (core_gdbarch))
+    {
+      uint32_t merged_pid;
+
+      merged_pid = ptid_get_lwp (inferior_ptid);
+      merged_pid = merged_pid << 16 | ptid_get_pid (inferior_ptid);
+
+      section_name = xstrprintf ("%s/%s", name, plongest (merged_pid));
+    }
+  else if (ptid_get_lwp (inferior_ptid))
     section_name = xstrprintf ("%s/%ld", name, ptid_get_lwp (inferior_ptid));
   else
     section_name = xstrdup (name);
index b8e8258..1b4a6f4 100644 (file)
@@ -223,6 +223,7 @@ struct gdbarch
   gdbarch_register_reggroup_p_ftype *register_reggroup_p;
   gdbarch_fetch_pointer_argument_ftype *fetch_pointer_argument;
   gdbarch_regset_from_core_section_ftype *regset_from_core_section;
+  int core_reg_section_encodes_pid;
   struct core_regset_section * core_regset_sections;
   gdbarch_core_xfer_shared_libraries_ftype *core_xfer_shared_libraries;
   int vtable_function_descriptors;
@@ -356,6 +357,7 @@ struct gdbarch startup_gdbarch =
   default_register_reggroup_p,  /* register_reggroup_p */
   0,  /* fetch_pointer_argument */
   0,  /* regset_from_core_section */
+  0,  /* core_reg_section_encodes_pid */
   0,  /* core_regset_sections */
   0,  /* core_xfer_shared_libraries */
   0,  /* vtable_function_descriptors */
@@ -609,6 +611,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
   /* Skip verify of register_reggroup_p, invalid_p == 0 */
   /* Skip verify of fetch_pointer_argument, has predicate */
   /* Skip verify of regset_from_core_section, has predicate */
+  /* Skip verify of core_reg_section_encodes_pid, invalid_p == 0 */
   /* Skip verify of core_xfer_shared_libraries, has predicate */
   /* Skip verify of vtable_function_descriptors, invalid_p == 0 */
   /* Skip verify of vbit_in_delta, invalid_p == 0 */
@@ -736,6 +739,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
                       "gdbarch_dump: core_read_description = <%s>\n",
                       host_address_to_string (gdbarch->core_read_description));
   fprintf_unfiltered (file,
+                      "gdbarch_dump: core_reg_section_encodes_pid = %s\n",
+                      plongest (gdbarch->core_reg_section_encodes_pid));
+  fprintf_unfiltered (file,
                       "gdbarch_dump: core_regset_sections = %s\n",
                       host_address_to_string (gdbarch->core_regset_sections));
   fprintf_unfiltered (file,
@@ -2899,6 +2905,23 @@ set_gdbarch_regset_from_core_section (struct gdbarch *gdbarch,
   gdbarch->regset_from_core_section = regset_from_core_section;
 }
 
+int
+gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch)
+{
+  gdb_assert (gdbarch != NULL);
+  /* Skip verify of core_reg_section_encodes_pid, invalid_p == 0 */
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_core_reg_section_encodes_pid called\n");
+  return gdbarch->core_reg_section_encodes_pid;
+}
+
+void
+set_gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch,
+                                          int core_reg_section_encodes_pid)
+{
+  gdbarch->core_reg_section_encodes_pid = core_reg_section_encodes_pid;
+}
+
 struct core_regset_section *
 gdbarch_core_regset_sections (struct gdbarch *gdbarch)
 {
index 4f6db30..2774966 100644 (file)
@@ -638,6 +638,15 @@ typedef const struct regset * (gdbarch_regset_from_core_section_ftype) (struct g
 extern const struct regset * gdbarch_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size);
 extern void set_gdbarch_regset_from_core_section (struct gdbarch *gdbarch, gdbarch_regset_from_core_section_ftype *regset_from_core_section);
 
+/* When creating core dumps, some systems encode the PID in addition
+   to the LWP id in core file register section names.  In those cases, the
+   "XXX" in ".reg/XXX" is encoded as [LWPID << 16 | PID].  This setting
+   is set to true for such architectures; false if "XXX" represents an LWP
+   or thread id with no special encoding. */
+
+extern int gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch);
+extern void set_gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch, int core_reg_section_encodes_pid);
+
 /* Supported register notes in a core file. */
 
 extern struct core_regset_section * gdbarch_core_regset_sections (struct gdbarch *gdbarch);
@@ -804,7 +813,7 @@ extern int gdbarch_target_signal_to_host (struct gdbarch *gdbarch, enum target_s
 extern void set_gdbarch_target_signal_to_host (struct gdbarch *gdbarch, gdbarch_target_signal_to_host_ftype *target_signal_to_host);
 
 /* Extra signal info inspection.
-
+  
    Return a type suitable to inspect extra signal information. */
 
 extern int gdbarch_get_siginfo_type_p (struct gdbarch *gdbarch);
index bcca6c9..ac20d4b 100755 (executable)
@@ -600,6 +600,13 @@ F:CORE_ADDR:fetch_pointer_argument:struct frame_info *frame, int argi, struct ty
 # name SECT_NAME and size SECT_SIZE.
 M:const struct regset *:regset_from_core_section:const char *sect_name, size_t sect_size:sect_name, sect_size
 
+# When creating core dumps, some systems encode the PID in addition
+# to the LWP id in core file register section names.  In those cases, the
+# "XXX" in ".reg/XXX" is encoded as [LWPID << 16 | PID].  This setting
+# is set to true for such architectures; false if "XXX" represents an LWP
+# or thread id with no special encoding.
+v:int:core_reg_section_encodes_pid:::0:0::0
+
 # Supported register notes in a core file.
 v:struct core_regset_section *:core_regset_sections:const char *name, int len::::::host_address_to_string (gdbarch->core_regset_sections)
 
index c30cd6d..f9666f1 100644 (file)
@@ -135,6 +135,10 @@ i386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_skip_solib_resolver (gdbarch, sol2_skip_solib_resolver);
   set_solib_svr4_fetch_link_map_offsets
     (gdbarch, svr4_ilp32_fetch_link_map_offsets);
+
+  /* Solaris encodes the pid of the inferior in regset section
+     names.  */
+  set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1);
 }
 \f
 
index 1f9eb58..b1255b6 100644 (file)
@@ -231,6 +231,10 @@ sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_software_single_step (gdbarch, NULL);
 
   frame_unwind_append_unwinder (gdbarch, &sparc32_sol2_sigtramp_frame_unwind);
+
+  /* Solaris encodes the pid of the inferior in regset section
+     names.  */
+  set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1);
 }
 \f
 
index 4af2807..e5800cc 100644 (file)
@@ -180,6 +180,10 @@ sparc64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 
   /* Solaris has kernel-assisted single-stepping support.  */
   set_gdbarch_software_single_step (gdbarch, NULL);
+
+  /* Solaris encodes the pid of the inferior in regset section
+     names.  */
+  set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1);
 }
 \f