gdb: Improve concept of FAKE_PROCESS_ID to fix JIT crash
authorJohn Marino <draco@marino.st>
Tue, 12 Jul 2011 22:06:43 +0000 (00:06 +0200)
committerJohn Marino <draco@marino.st>
Thu, 1 Sep 2011 17:51:39 +0000 (19:51 +0200)
The fix for 7.2 seems to break on gdb 7.3 with addition of JIT
initialization which assumes at least one inferior defined.  The problem
is that this inferior isn't defined before the JIT routine is run.

Changing the fake process ID from zero has a lot of risk (miss some,
accidently change zero's that need to remain zero, etc), but it seems to
be the only way to fix it cleanly.

contrib/gdb-7/gdb/corelow.c
contrib/gdb-7/gdb/inf-ptrace.c
contrib/gdb-7/gdb/inferior.c
contrib/gdb-7/gdb/inferior.h
contrib/gdb-7/gdb/infrun.c
contrib/gdb-7/gdb/mi/mi-interp.c
contrib/gdb-7/gdb/mi/mi-main.c
contrib/gdb-7/gdb/top.c

index f34b8e1..2414232 100644 (file)
@@ -264,7 +264,7 @@ add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg)
 
   lwpid = core_tid;
 
-  if (current_inferior ()->pid == 0)
+  if (current_inferior ()->pid == FAKE_PROCESS_ID)
     inferior_appeared (current_inferior (), pid);
 
   ptid = ptid_build (pid, lwpid, 0);
index b5e1744..04711df 100644 (file)
@@ -315,7 +315,7 @@ inf_ptrace_kill (struct target_ops *ops)
   pid_t pid = ptid_get_pid (inferior_ptid);
   int status;
 
-  if (pid == 0)
+  if (pid == FAKE_PROCESS_ID)
     return;
 
   ptrace (PT_KILL, pid, (PTRACE_TYPE_ARG3)0, 0);
index bd368c2..3d4286e 100644 (file)
@@ -138,7 +138,7 @@ add_inferior_silent (int pid)
 
   observer_notify_inferior_added (inf);
 
-  if (kernel_debugger || (pid != 0))
+  if (pid != FAKE_PROCESS_ID)
     inferior_appeared (inf, pid);
 
   return inf;
@@ -274,7 +274,7 @@ exit_inferior_1 (struct inferior *inftoex, int silent)
      so that the observers have a chance to look it up.  */
   observer_notify_inferior_exit (inf);
 
-  inf->pid = 0;
+  inf->pid = FAKE_PROCESS_ID;
   if (inf->vfork_parent != NULL)
     {
       inf->vfork_parent->vfork_child = NULL;
@@ -338,7 +338,7 @@ discard_all_inferiors (void)
 
   for (inf = inferior_list; inf; inf = inf->next)
     {
-      if (kernel_debugger || (inf->pid != 0))
+      if (inf->pid != FAKE_PROCESS_ID)
        exit_inferior_silent (inf->pid);
     }
 }
@@ -360,10 +360,10 @@ find_inferior_pid (int pid)
 {
   struct inferior *inf;
 
-  /* Looking for inferior pid == 0 is always wrong, and indicative of
-     a bug somewhere else.  There may be more than one with pid == 0,
+  /* Looking for a fake inferior pid is always wrong, and indicative of
+     a bug somewhere else.  There may be more than one with fake pid,
      for instance.  */
-  gdb_assert (kernel_debugger || (pid != 0));
+  gdb_assert (pid != FAKE_PROCESS_ID);
 
   for (inf = inferior_list; inf; inf = inf->next)
     if (inf->pid == pid)
@@ -456,7 +456,7 @@ have_inferiors (void)
   struct inferior *inf;
 
   for (inf = inferior_list; inf; inf = inf->next)
-    if (kernel_debugger || (inf->pid != 0))
+    if (inf->pid != FAKE_PROCESS_ID)
       return 1;
 
   return 0;
@@ -468,7 +468,7 @@ have_live_inferiors (void)
   struct inferior *inf;
 
   for (inf = inferior_list; inf; inf = inf->next)
-    if (inf->pid != 0)
+    if (inf->pid != FAKE_PROCESS_ID)
       {
        struct thread_info *tp;
        
@@ -495,7 +495,7 @@ prune_inferiors (void)
     {
       if (ss == current
          || !ss->removable
-         || (kernel_debugger || (ss->pid != 0)))
+         || (ss->pid != FAKE_PROCESS_ID))
        {
          ss_link = &ss->next;
          ss = *ss_link;
@@ -577,7 +577,7 @@ print_inferior (struct ui_out *uiout, char *requested_inferiors)
 
       ui_out_field_int (uiout, "number", inf->num);
 
-      if (kernel_debugger || (inf->pid != 0))
+      if (kernel_debugger || (inf->pid != FAKE_PROCESS_ID))
        ui_out_field_string (uiout, "target-id",
                             target_pid_to_str (pid_to_ptid (inf->pid)));
       else
@@ -703,7 +703,7 @@ inferior_command (char *args, int from_tty)
                    ? bfd_get_filename (inf->pspace->ebfd)
                    : _("<noexec>")));
 
-  if (inf->pid != 0)
+  if (inf->pid != FAKE_PROCESS_ID)
     {
       if (inf->pid != ptid_get_pid (inferior_ptid))
        {
@@ -730,9 +730,9 @@ inferior_command (char *args, int from_tty)
       set_current_program_space (inf->pspace);
     }
 
-  if (inf->pid != 0 && is_running (inferior_ptid))
+  if (inf->pid != FAKE_PROCESS_ID && is_running (inferior_ptid))
     ui_out_text (uiout, "(running)\n");
-  else if (inf->pid != 0)
+  else if (inf->pid != FAKE_PROCESS_ID)
     {
       ui_out_text (uiout, "\n");
       print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
@@ -777,7 +777,7 @@ remove_inferior_command (char *args, int from_tty)
          continue;
        }
     
-      if (inf->pid != 0)
+      if (inf->pid != FAKE_PROCESS_ID)
        {
          warning (_("Can not remove active inferior %d."), num);
          continue;
@@ -1071,15 +1071,9 @@ initialize_inferiors (void)
      that.  Do this after initialize_progspace, due to the
      current_program_space reference.  */
      
-  /* However, when invoked by DragonFly kgdb which always has many inferiors,
-     the default inferior will not be defined.  The swapper process always has
-     pid 0, which conflicts with the default. */
-
-  if (!kernel_debugger) {
-    current_inferior_ = add_inferior (0);
-    current_inferior_->pspace = current_program_space;
-    current_inferior_->aspace = current_program_space->aspace;
-  }
+  current_inferior_ = add_inferior (FAKE_PROCESS_ID);
+  current_inferior_->pspace = current_program_space;
+  current_inferior_->aspace = current_program_space->aspace;
 
   add_info ("inferiors", info_inferiors_command, 
            _("IDs of specified inferiors (all inferiors if no argument)."));
index acae0f7..21ae9a7 100644 (file)
@@ -32,6 +32,8 @@ struct regcache;
 struct ui_out;
 struct terminal_info;
 
+#define FAKE_PROCESS_ID -777
+
 /* For bpstat.  */
 #include "breakpoint.h"
 
index 43949d0..6973a2f 100644 (file)
@@ -1103,7 +1103,7 @@ remove_displaced_stepping_state (int pid)
 {
   struct displaced_step_inferior_state *it, **prev_next_p;
 
-  gdb_assert (kernel_debugger || (pid != 0));
+  gdb_assert (pid != FAKE_PROCESS_ID);
 
   it = displaced_step_inferior_states;
   prev_next_p = &displaced_step_inferior_states;
index 5e01abc..bdaab01 100644 (file)
@@ -467,7 +467,7 @@ mi_output_running_pid (struct thread_info *info, void *arg)
 static int
 mi_inferior_count (struct inferior *inf, void *arg)
 {
-  if (inf->pid != 0)
+  if (inf->pid != FAKE_PROCESS_ID)
     {
       int *count_p = arg;
       (*count_p)++;
index ef6bfc3..236fcb6 100644 (file)
@@ -363,7 +363,7 @@ mi_cmd_exec_interrupt (char *command, char **argv, int argc)
 static int
 run_one_inferior (struct inferior *inf, void *arg)
 {
-  if (inf->pid != 0)
+  if (inf->pid != FAKE_PROCESS_ID)
     {
       if (inf->pid != ptid_get_pid (inferior_ptid))
        {
@@ -565,7 +565,7 @@ print_one_inferior (struct inferior *inferior, void *xdata)
 
       ui_out_field_fmt (uiout, "id", "i%d", inferior->num);
       ui_out_field_string (uiout, "type", "process");
-      if (inferior->pid != 0)
+      if (inferior->pid != FAKE_PROCESS_ID)
        ui_out_field_int (uiout, "pid", inferior->pid);
 
       if (inferior->pspace->ebfd)
@@ -575,7 +575,7 @@ print_one_inferior (struct inferior *inferior, void *xdata)
        }
 
       data.cores = 0;
-      if (inferior->pid != 0)
+      if (inferior->pid != FAKE_PROCESS_ID)
        {
          data.pid = inferior->pid;
          iterate_over_threads (collect_cores, &data);
@@ -1784,7 +1784,7 @@ mi_cmd_remove_inferior (char *command, char **argv, int argc)
   if (!inf)
     error (_("the specified thread group does not exist"));
 
-  if (inf->pid != 0)
+  if (inf->pid != FAKE_PROCESS_ID)
     error (_("cannot remove an active inferior"));
 
   if (inf == current_inferior ())
@@ -1797,7 +1797,7 @@ mi_cmd_remove_inferior (char *command, char **argv, int argc)
        error (_("Cannot remove last inferior"));
 
       set_current_inferior (new_inferior);
-      if (new_inferior->pid != 0)
+      if (new_inferior->pid != FAKE_PROCESS_ID)
        tp = any_thread_of_process (new_inferior->pid);
       switch_to_thread (tp ? tp->ptid : null_ptid);
       set_current_program_space (new_inferior->pspace);
@@ -2053,7 +2053,7 @@ mi_cmd_execute (struct mi_parse *parse)
         an inferior with multiple threads, then a random one will be picked.
         This is not a problem -- frontend should always provide --thread if
         it wishes to operate on a specific thread.  */
-      if (inf->pid != 0)
+      if (inf->pid != FAKE_PROCESS_ID)
        tp = any_thread_of_process (inf->pid);
       switch_to_thread (tp ? tp->ptid : null_ptid);
       set_current_program_space (inf->pspace);
index a25550f..a21fb55 100644 (file)
@@ -1144,7 +1144,7 @@ kill_or_detach (struct inferior *inf, void *args)
   struct qt_args *qt = args;
   struct thread_info *thread;
 
-  if (inf->pid == 0)
+  if (inf->pid == FAKE_PROCESS_ID)
     return 0;
 
   thread = any_thread_of_process (inf->pid);
@@ -1174,7 +1174,7 @@ print_inferior_quit_action (struct inferior *inf, void *arg)
 {
   struct ui_file *stb = arg;
 
-  if (inf->pid == 0)
+  if (inf->pid == FAKE_PROCESS_ID)
     return 0;
 
   if (inf->attach_flag)