RISC-V: Support the ISA-dependent CSR checking.
[deliverable/binutils-gdb.git] / gdb / infrun.c
index 9c4a07daba9779ee878fb8e63617a5a6027cfd54..d9a6f733519486bd86ee25c571334b78803f8e1f 100644 (file)
@@ -1020,8 +1020,6 @@ handle_vfork_child_exec_or_exit (int exec)
        }
       else
        {
-         struct program_space *pspace;
-
          /* If this is a vfork child exiting, then the pspace and
             aspaces were shared with the parent.  Since we're
             reporting the process exit, we'll be mourning all that is
@@ -1037,18 +1035,12 @@ handle_vfork_child_exec_or_exit (int exec)
          scoped_restore restore_ptid
            = make_scoped_restore (&inferior_ptid, null_ptid);
 
-         /* This inferior is dead, so avoid giving the breakpoints
-            module the option to write through to it (cloning a
-            program space resets breakpoints).  */
-         inf->aspace = NULL;
-         inf->pspace = NULL;
-         pspace = new program_space (maybe_new_address_space ());
-         set_current_program_space (pspace);
+         inf->pspace = new program_space (maybe_new_address_space ());
+         inf->aspace = inf->pspace->aspace;
+         set_current_program_space (inf->pspace);
          inf->removable = 1;
          inf->symfile_flags = SYMFILE_NO_READ;
-         clone_program_space (pspace, vfork_parent->pspace);
-         inf->pspace = pspace;
-         inf->aspace = pspace->aspace;
+         clone_program_space (inf->pspace, vfork_parent->pspace);
 
          resume_parent = vfork_parent->pid;
        }
@@ -1548,7 +1540,7 @@ get_displaced_step_closure_by_addr (CORE_ADDR addr)
   /* If checking the mode of displaced instruction in copy area.  */
   if (displaced->step_thread != nullptr
       && displaced->step_copy == addr)
-    return displaced->step_closure;
+    return displaced->step_closure.get ();
 
   return NULL;
 }
@@ -1604,20 +1596,18 @@ use_displaced_stepping (struct thread_info *tp)
          && !displaced_state->failed_before);
 }
 
-/* Clean out any stray displaced stepping state.  */
+/* Simple function wrapper around displaced_step_inferior_state::reset.  */
+
 static void
-displaced_step_clear (struct displaced_step_inferior_state *displaced)
+displaced_step_reset (displaced_step_inferior_state *displaced)
 {
-  /* Indicate that there is no cleanup pending.  */
-  displaced->step_thread = nullptr;
-
-  delete displaced->step_closure;
-  displaced->step_closure = NULL;
+  displaced->reset ();
 }
 
-/* A cleanup that wraps displaced_step_clear.  */
-using displaced_step_clear_cleanup
-  = FORWARD_SCOPE_EXIT (displaced_step_clear);
+/* A cleanup that wraps displaced_step_reset.  We use this instead of, say,
+   SCOPE_EXIT, because it needs to be discardable with "cleanup.release ()".  */
+
+using displaced_step_reset_cleanup = FORWARD_SCOPE_EXIT (displaced_step_reset);
 
 /* Dump LEN bytes at BUF in hex to FILE, followed by a newline.  */
 void
@@ -1656,7 +1646,6 @@ displaced_step_prepare_throw (thread_info *tp)
   const address_space *aspace = regcache->aspace ();
   CORE_ADDR original, copy;
   ULONGEST len;
-  struct displaced_step_closure *closure;
   int status;
 
   /* We should never reach this function if the architecture does not
@@ -1699,7 +1688,7 @@ displaced_step_prepare_throw (thread_info *tp)
                            target_pid_to_str (tp->ptid).c_str ());
     }
 
-  displaced_step_clear (displaced);
+  displaced_step_reset (displaced);
 
   scoped_restore_current_thread restore_thread;
 
@@ -1748,9 +1737,9 @@ displaced_step_prepare_throw (thread_info *tp)
                                 len);
     };
 
-  closure = gdbarch_displaced_step_copy_insn (gdbarch,
-                                             original, copy, regcache);
-  if (closure == NULL)
+  displaced->step_closure
+    = gdbarch_displaced_step_copy_insn (gdbarch, original, copy, regcache);
+  if (displaced->step_closure == NULL)
     {
       /* The architecture doesn't know how or want to displaced step
         this instruction or instruction sequence.  Fallback to
@@ -1762,12 +1751,11 @@ displaced_step_prepare_throw (thread_info *tp)
      succeeds.  */
   displaced->step_thread = tp;
   displaced->step_gdbarch = gdbarch;
-  displaced->step_closure = closure;
   displaced->step_original = original;
   displaced->step_copy = copy;
 
   {
-    displaced_step_clear_cleanup cleanup (displaced);
+    displaced_step_reset_cleanup cleanup (displaced);
 
     /* Resume execution at the copy.  */
     regcache_write_pc (regcache, copy);
@@ -1870,7 +1858,7 @@ displaced_step_fixup (thread_info *event_thread, enum gdb_signal signal)
   if (displaced->step_thread != event_thread)
     return 0;
 
-  displaced_step_clear_cleanup cleanup (displaced);
+  displaced_step_reset_cleanup cleanup (displaced);
 
   displaced_step_restore (displaced, displaced->step_thread->ptid);
 
@@ -1887,7 +1875,7 @@ displaced_step_fixup (thread_info *event_thread, enum gdb_signal signal)
     {
       /* Fix up the resulting state.  */
       gdbarch_displaced_step_fixup (displaced->step_gdbarch,
-                                    displaced->step_closure,
+                                    displaced->step_closure.get (),
                                     displaced->step_original,
                                     displaced->step_copy,
                                     get_thread_regcache (displaced->step_thread));
@@ -2290,7 +2278,7 @@ resume_1 (enum gdb_signal sig)
        }
 
       tp->inf->process_target ()->threads_executing = true;
-      tp->resumed = 1;
+      tp->resumed = true;
 
       /* FIXME: What should we do if we are supposed to resume this
         thread with a signal?  Maybe we should maintain a queue of
@@ -2418,7 +2406,7 @@ resume_1 (enum gdb_signal sig)
 
              resume_ptid = internal_resume_ptid (user_step);
              do_target_resume (resume_ptid, 0, GDB_SIGNAL_0);
-             tp->resumed = 1;
+             tp->resumed = true;
              return;
            }
        }
@@ -2480,8 +2468,8 @@ resume_1 (enum gdb_signal sig)
          pc = regcache_read_pc (get_thread_regcache (tp));
 
          displaced = get_displaced_stepping_state (tp->inf);
-         step = gdbarch_displaced_step_hw_singlestep (gdbarch,
-                                                      displaced->step_closure);
+         step = gdbarch_displaced_step_hw_singlestep
+           (gdbarch, displaced->step_closure.get ());
        }
     }
 
@@ -2630,7 +2618,7 @@ resume_1 (enum gdb_signal sig)
     }
 
   do_target_resume (resume_ptid, step, sig);
-  tp->resumed = 1;
+  tp->resumed = true;
 }
 
 /* Resume the inferior.  SIG is the signal to give the inferior
@@ -3030,7 +3018,7 @@ proceed (CORE_ADDR addr, enum gdb_signal siggnal)
      inferior function, as in that case we pretend the inferior
      doesn't run at all.  */
   if (!cur_thr->control.in_infcall)
-    set_running (resume_target, resume_ptid, 1);
+    set_running (resume_target, resume_ptid, true);
 
   if (debug_infrun)
     fprintf_unfiltered (gdb_stdlog,
@@ -3314,7 +3302,7 @@ infrun_thread_stop_requested (ptid_t ptid)
       /* Otherwise we can process the (new) pending event now.  Set
         it so this pending event is considered by
         do_target_wait.  */
-      tp->resumed = 1;
+      tp->resumed = true;
     }
 }
 
@@ -4757,7 +4745,7 @@ stop_all_threads (void)
 
                  /* The thread may be not executing, but still be
                     resumed with a pending status to process.  */
-                 t->resumed = 0;
+                 t->resumed = false;
                }
            }
 
@@ -4796,7 +4784,7 @@ stop_all_threads (void)
 
              t->stop_requested = 0;
              t->executing = 0;
-             t->resumed = 0;
+             t->resumed = false;
              t->control.may_range_step = 0;
 
              /* This may be the first time we see the inferior report
@@ -5134,10 +5122,10 @@ handle_inferior_event (struct execution_control_state *ecs)
     else
       mark_ptid = ecs->ptid;
 
-    set_executing (ecs->target, mark_ptid, 0);
+    set_executing (ecs->target, mark_ptid, false);
 
     /* Likewise the resumed flag.  */
-    set_resumed (ecs->target, mark_ptid, 0);
+    set_resumed (ecs->target, mark_ptid, false);
   }
 
   switch (ecs->ws.kind)
@@ -5313,6 +5301,15 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
            struct regcache *child_regcache;
            CORE_ADDR parent_pc;
 
+           if (ecs->ws.kind == TARGET_WAITKIND_FORKED)
+             {
+               struct displaced_step_inferior_state *displaced
+                 = get_displaced_stepping_state (parent_inf);
+
+               /* Restore scratch pad for child process.  */
+               displaced_step_restore (displaced, ecs->ws.value.related_pid);
+             }
+
            /* GDB has got TARGET_WAITKIND_FORKED or TARGET_WAITKIND_VFORKED,
               indicating that the displaced stepping of syscall instruction
               has been done.  Perform cleanup for parent process here.  Note
@@ -5323,15 +5320,6 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
               that needs it.  */
            start_step_over ();
 
-           if (ecs->ws.kind == TARGET_WAITKIND_FORKED)
-             {
-               struct displaced_step_inferior_state *displaced
-                 = get_displaced_stepping_state (parent_inf);
-
-               /* Restore scratch pad for child process.  */
-               displaced_step_restore (displaced, ecs->ws.value.related_pid);
-             }
-
            /* Since the vfork/fork syscall instruction was executed in the scratchpad,
               the child's PC is also within the scratchpad.  Set the child's PC
               to the parent's PC value, which has already been fixed up.
@@ -5631,7 +5619,7 @@ restart_threads (struct thread_info *event_thread)
                                "infrun: restart threads: "
                                "[%s] has pending status\n",
                                target_pid_to_str (tp->ptid).c_str ());
-         tp->resumed = 1;
+         tp->resumed = true;
          continue;
        }
 
@@ -5771,7 +5759,7 @@ finish_step_over (struct execution_control_state *ecs)
          /* This was cleared early, by handle_inferior_event.  Set it
             so this pending event is considered by
             do_target_wait.  */
-         tp->resumed = 1;
+         tp->resumed = true;
 
          gdb_assert (!tp->executing);
 
@@ -6155,8 +6143,8 @@ handle_signal_stop (struct execution_control_state *ecs)
      been removed.  */
   if (random_signal && target_stopped_by_sw_breakpoint ())
     {
-      if (program_breakpoint_here_p (gdbarch,
-                                    ecs->event_thread->suspend.stop_pc))
+      if (gdbarch_program_breakpoint_here_p (gdbarch,
+                                            ecs->event_thread->suspend.stop_pc))
        {
          struct regcache *regcache;
          int decr_pc;
@@ -7432,7 +7420,7 @@ keep_going_stepped_thread (struct thread_info *tp)
                                     get_frame_address_space (frame),
                                     tp->suspend.stop_pc);
 
-      tp->resumed = 1;
+      tp->resumed = true;
       resume_ptid = internal_resume_ptid (tp->control.stepping_command);
       do_target_resume (resume_ptid, 0, GDB_SIGNAL_0);
     }
This page took 0.031248 seconds and 4 git commands to generate.