2012-12-11 Pedro Alves <pedro@codesourcery.com>
authorPedro Alves <palves@redhat.com>
Tue, 11 Dec 2012 15:23:15 +0000 (15:23 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 11 Dec 2012 15:23:15 +0000 (15:23 +0000)
    Pedro Alves  <palves@redhat.com>

* procfs.c (procfs_make_note_section) [NEW_PROC_API]: Output a
NT_PSTATUS note.
* sol2-tdep.c (sol2_core_pid_to_str): Print process IDs
differently from LWP IDs.

gdb/ChangeLog
gdb/procfs.c
gdb/sol2-tdep.c

index 0d90883..fb92aab 100644 (file)
@@ -1,3 +1,11 @@
+2012-12-11  Pedro Alves  <pedro@codesourcery.com>
+           Pedro Alves  <palves@redhat.com>
+
+       * procfs.c (procfs_make_note_section) [NEW_PROC_API]: Output a
+       NT_PSTATUS note.
+       * sol2-tdep.c (sol2_core_pid_to_str): Print process IDs
+       differently from LWP IDs.
+
 2012-12-11  Pedro Alves  <palves@redhat.com>
 
        * configure.ac (detect type of /proc): Remove Unixware handling.
index fa18b46..1c5cc13 100644 (file)
@@ -5507,6 +5507,13 @@ procfs_make_note_section (bfd *obfd, int *note_size)
 
   stop_signal = find_stop_signal ();
 
+#ifdef NEW_PROC_API
+  fill_gregset (get_current_regcache (), &gregs, -1);
+  note_data = elfcore_write_pstatus (obfd, note_data, note_size,
+                                    PIDGET (inferior_ptid),
+                                    stop_signal, &gregs);
+#endif
+
   thread_args.obfd = obfd;
   thread_args.note_data = note_data;
   thread_args.note_size = note_size;
index e93758d..e292b8d 100644 (file)
@@ -43,7 +43,29 @@ char *
 sol2_core_pid_to_str (struct gdbarch *gdbarch, ptid_t ptid)
 {
   static char buf[80];
+  struct inferior *inf;
+  int pid;
 
-  xsnprintf (buf, sizeof buf, "LWP %ld", ptid_get_lwp (ptid));
-  return buf;
+  /* Check whether we're printing an LWP (gdb thread) or a
+     process.  */
+  pid = ptid_get_lwp (ptid);
+  if (pid != 0)
+    {
+      /* A thread.  */
+      xsnprintf (buf, sizeof buf, "LWP %ld", ptid_get_lwp (ptid));
+      return buf;
+    }
+
+  /* GDB didn't use to put a NT_PSTATUS note in Solaris cores.  If
+     that's missing, then we're dealing with a fake PID corelow.c made
+     up.  */
+  inf = find_inferior_pid (ptid_get_pid (ptid));
+  if (inf == NULL || inf->fake_pid_p)
+    {
+      xsnprintf (buf, sizeof buf, "<core>");
+      return buf;
+    }
+
+  /* Not fake; print as usual.  */
+  return normal_pid_to_str (ptid);
 }