/* Copyright (C) 1986-2023 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef INFRUN_H
#define INFRUN_H 1

#include "gdbthread.h"
#include "symtab.h"
#include "gdbsupport/byte-vector.h"
#include "gdbsupport/intrusive_list.h"

struct target_waitstatus;
class frame_info_ptr;
struct address_space;
struct return_value_info;
struct process_stratum_target;
struct thread_info;

/* True if we are debugging run control.  */
extern bool debug_infrun;

/* Print an "infrun" debug statement.  */

#define infrun_debug_printf(fmt, ...) \
  debug_prefixed_printf_cond (debug_infrun, "infrun", fmt, ##__VA_ARGS__)

/* Print "infrun" start/end debug statements.  */

#define INFRUN_SCOPED_DEBUG_START_END(fmt, ...) \
  scoped_debug_start_end (debug_infrun, "infrun", fmt, ##__VA_ARGS__)

/* Print "infrun" enter/exit debug statements.  */

#define INFRUN_SCOPED_DEBUG_ENTER_EXIT \
  scoped_debug_enter_exit (debug_infrun, "infrun")

/* A infrun debug helper routine to print out all the threads in the set
   THREADS (which should be a range type that returns thread_info*
   objects).

   The TITLE is a string that is printed before the list of threads.

   Output is only produced when 'set debug infrun on'.  */

template<typename ThreadRange>
static inline void
infrun_debug_show_threads (const char *title, ThreadRange threads)
{
  if (debug_infrun)
    {
      INFRUN_SCOPED_DEBUG_ENTER_EXIT;

      infrun_debug_printf ("%s:", title);
      for (thread_info *thread : threads)
	infrun_debug_printf ("  thread %s, executing = %d, resumed = %d, "
			     "state = %s",
			     thread->ptid.to_string ().c_str (),
			     thread->executing (),
			     thread->resumed (),
			     thread_state_string (thread->state));
    }
}


/* Nonzero if we want to give control to the user when we're notified
   of shared library events by the dynamic linker.  */
extern int stop_on_solib_events;

/* True if execution commands resume all threads of all processes by
   default; otherwise, resume only threads of the current inferior
   process.  */
extern bool sched_multi;

/* When set, stop the 'step' command if we enter a function which has
   no line number information.  The normal behavior is that we step
   over such function.  */
extern bool step_stop_if_no_debug;

/* If set, the inferior should be controlled in non-stop mode.  In
   this mode, each thread is controlled independently.  Execution
   commands apply only to the selected thread by default, and stop
   events stop only the thread that had the event -- the other threads
   are kept running freely.  */
extern bool non_stop;

/* When set (default), the target should attempt to disable the
   operating system's address space randomization feature when
   starting an inferior.  */
extern bool disable_randomization;

/* Returns a unique identifier for the current stop.  This can be used
   to tell whether a command has proceeded the inferior past the
   current location.  */
extern ULONGEST get_stop_id (void);

/* Reverse execution.  */
enum exec_direction_kind
  {
    EXEC_FORWARD,
    EXEC_REVERSE
  };

/* The current execution direction.  */
extern enum exec_direction_kind execution_direction;

/* Call this to point 'previous_thread' at the thread returned by
   inferior_thread, or at nullptr, if there's no selected thread.  */
extern void update_previous_thread ();

/* Get a weak reference to 'previous_thread'.  */
extern thread_info *get_previous_thread ();

extern void start_remote (int from_tty);

/* Clear out all variables saying what to do when inferior is
   continued or stepped.  First do this, then set the ones you want,
   then call `proceed'.  STEP indicates whether we're preparing for a
   step/stepi command.  */
extern void clear_proceed_status (int step);

extern void proceed (CORE_ADDR, enum gdb_signal);

/* Return a ptid representing the set of threads that we will proceed,
   in the perspective of the user/frontend.  We may actually resume
   fewer threads at first, e.g., if a thread is stopped at a
   breakpoint that needs stepping-off, but that should not be visible
   to the user/frontend, and neither should the frontend/user be
   allowed to proceed any of the threads that happen to be stopped for
   internal run control handling, if a previous command wanted them
   resumed.  */
extern ptid_t user_visible_resume_ptid (int step);

/* Return the process_stratum target that we will proceed, in the
   perspective of the user/frontend.  If RESUME_PTID is
   MINUS_ONE_PTID, then we'll resume all threads of all targets, so
   the function returns NULL.  Otherwise, we'll be resuming a process
   or thread of the current process, so we return the current
   inferior's process stratum target.  */
extern process_stratum_target *user_visible_resume_target (ptid_t resume_ptid);

/* Return control to GDB when the inferior stops for real.  Print
   appropriate messages, remove breakpoints, give terminal our modes,
   and run the stop hook.  Returns true if the stop hook proceeded the
   target, false otherwise.  */
extern bool normal_stop ();

/* Return the cached copy of the last target/ptid/waitstatus returned
   by target_wait().  The data is actually cached by handle_inferior_event(),
   which gets called immediately after target_wait().  */
extern void get_last_target_status (process_stratum_target **target,
				    ptid_t *ptid,
				    struct target_waitstatus *status);

/* Set the cached copy of the last target/ptid/waitstatus.  */
extern void set_last_target_status (process_stratum_target *target, ptid_t ptid,
				    const target_waitstatus &status);

/* Clear the cached copy of the last ptid/waitstatus returned by
   target_wait().  */
extern void nullify_last_target_wait_ptid ();

/* Stop all threads.  Only returns after everything is halted.

   REASON is a string indicating the reason why we stop all threads, used in
   debug messages.

   If INF is non-nullptr, stop all threads of that inferior.  Otherwise, stop
   all threads of all inferiors.  */
extern void stop_all_threads (const char *reason, inferior *inf = nullptr);

extern void prepare_for_detach (void);

extern void fetch_inferior_event ();

extern void init_wait_for_inferior (void);

extern void insert_step_resume_breakpoint_at_sal (struct gdbarch *,
						  struct symtab_and_line ,
						  struct frame_id);

/* Returns true if we're trying to step past the instruction at
   ADDRESS in ASPACE.  */
extern int stepping_past_instruction_at (struct address_space *aspace,
					 CORE_ADDR address);

/* Returns true if thread whose thread number is THREAD is stepping
   over a breakpoint.  */
extern int thread_is_stepping_over_breakpoint (int thread);

/* Returns true if we're trying to step past an instruction that
   triggers a non-steppable watchpoint.  */
extern int stepping_past_nonsteppable_watchpoint (void);

/* Record in TP the frame and location we're currently stepping through.  */
extern void set_step_info (thread_info *tp,
			   frame_info_ptr frame,
			   struct symtab_and_line sal);

/* Notify interpreters and observers that the current inferior has stopped with
   signal SIG.  */
extern void notify_signal_received (gdb_signal sig);

/* Notify interpreters and observers that the current inferior has stopped
   normally.  */
extern void notify_normal_stop (bpstat *bs, int print_frame);

/* Notify interpreters and observers that the user focus has changed.  */
extern void notify_user_selected_context_changed (user_selected_what selection);

/* Several print_*_reason helper functions to print why the inferior
   has stopped to the passed in UIOUT.  */

/* Signal received, print why the inferior has stopped.  */
extern void print_signal_received_reason (struct ui_out *uiout,
					  enum gdb_signal siggnal);

/* The inferior was terminated by a signal, print why it stopped.  */
extern void print_signal_exited_reason (struct ui_out *uiout,
					enum gdb_signal siggnal);

/* The inferior program is finished, print why it stopped.  */
extern void print_exited_reason (struct ui_out *uiout, int exitstatus);

/* Reverse execution: target ran out of history info, print why the
   inferior has stopped.  */
extern void print_no_history_reason (struct ui_out *uiout);

/* Print the result of a function at the end of a 'finish' command.
   RV points at an object representing the captured return value/type
   and its position in the value history.  */

extern void print_return_value (struct ui_out *uiout,
				struct return_value_info *rv);

/* Print current location without a level number, if we have changed
   functions or hit a breakpoint.  Print source line if we have one.
   If the execution command captured a return value, print it.  If
   DISPLAYS is false, do not call 'do_displays'.  */

extern void print_stop_event (struct ui_out *uiout, bool displays = true);

/* Pretty print the results of target_wait, for debugging purposes.  */

extern void print_target_wait_results (ptid_t waiton_ptid, ptid_t result_ptid,
				       const struct target_waitstatus &ws);

extern int signal_stop_state (int);

extern int signal_print_state (int);

extern int signal_pass_state (int);

extern int signal_stop_update (int, int);

extern int signal_print_update (int, int);

extern int signal_pass_update (int, int);

extern void update_signals_program_target (void);

/* Clear the convenience variables associated with the exit of the
   inferior.  Currently, those variables are $_exitcode and
   $_exitsignal.  */
extern void clear_exit_convenience_vars (void);

extern void update_observer_mode (void);

extern void signal_catch_update (const unsigned int *);

/* In some circumstances we allow a command to specify a numeric
   signal.  The idea is to keep these circumstances limited so that
   users (and scripts) develop portable habits.  For comparison,
   POSIX.2 `kill' requires that 1,2,3,6,9,14, and 15 work (and using a
   numeric signal at all is obsolescent.  We are slightly more lenient
   and allow 1-15 which should match host signal numbers on most
   systems.  Use of symbolic signal names is strongly encouraged.  */
enum gdb_signal gdb_signal_from_command (int num);

/* Enables/disables infrun's async event source in the event loop.  */
extern void infrun_async (int enable);

/* Call infrun's event handler the next time through the event
   loop.  */
extern void mark_infrun_async_event_handler (void);

/* The global chain of threads that need to do a step-over operation
   to get past e.g., a breakpoint.  */
extern thread_step_over_list global_thread_step_over_list;

/* Remove breakpoints if possible (usually that means, if everything
   is stopped).  On failure, print a message.  */
extern void maybe_remove_breakpoints (void);

/* If a UI was in sync execution mode, and now isn't, restore its
   prompt (a synchronous execution command has finished, and we're
   ready for input).  */
extern void all_uis_check_sync_execution_done (void);

/* If a UI was in sync execution mode, and hasn't displayed the prompt
   yet, re-disable its prompt (a synchronous execution command was
   started or re-started).  */
extern void all_uis_on_sync_execution_starting (void);

/* In all-stop, restart the target if it had to be stopped to
   detach.  */
extern void restart_after_all_stop_detach (process_stratum_target *proc_target);

/* RAII object to temporarily disable the requirement for target
   stacks to commit their resumed threads.

   On construction, set process_stratum_target::commit_resumed_state
   to false for all process_stratum targets in all target
   stacks.

   On destruction (or if reset_and_commit() is called), set
   process_stratum_target::commit_resumed_state to true for all
   process_stratum targets in all target stacks, except those that:

     - have no resumed threads
     - have a resumed thread with a pending status

   target_commit_resumed is not called in the destructor, because its
   implementations could throw, and we don't to swallow that error in
   a destructor.  Instead, the caller should call the
   reset_and_commit_resumed() method so that an eventual exception can
   propagate.  "reset" in the method name refers to the fact that this
   method has the same effect as the destructor, in addition to
   committing resumes.

   The creation of nested scoped_disable_commit_resumed objects is
   tracked, such that only the outermost instance actually does
   something, for cases like this:

     void
     inner_func ()
     {
       scoped_disable_commit_resumed disable;

       // do stuff

       disable.reset_and_commit ();
     }

     void
     outer_func ()
     {
       scoped_disable_commit_resumed disable;

       for (... each thread ...)
	 inner_func ();

       disable.reset_and_commit ();
     }

   In this case, we don't want the `disable` destructor in
   `inner_func` to require targets to commit resumed threads, so that
   the `reset_and_commit()` call in `inner_func` doesn't actually
   resume threads.  */

struct scoped_disable_commit_resumed
{
  explicit scoped_disable_commit_resumed (const char *reason);
  ~scoped_disable_commit_resumed ();

  DISABLE_COPY_AND_ASSIGN (scoped_disable_commit_resumed);

  /* Undoes the disabling done by the ctor, and calls
     maybe_call_commit_resumed_all_targets().  */
  void reset_and_commit ();

private:
  /* Undoes the disabling done by the ctor.  */
  void reset ();

  /* Whether this object has been reset.  */
  bool m_reset = false;

  const char *m_reason;
  bool m_prev_enable_commit_resumed;
};

/* Call target_commit_resumed method on all target stacks whose
   process_stratum target layer has COMMIT_RESUME_STATE set.  */

extern void maybe_call_commit_resumed_all_targets ();

/* RAII object to temporarily enable the requirement for target stacks
   to commit their resumed threads.  This is the inverse of
   scoped_disable_commit_resumed.  The constructor calls the
   maybe_call_commit_resumed_all_targets function itself, since it's
   OK to throw from a constructor.  */

struct scoped_enable_commit_resumed
{
  explicit scoped_enable_commit_resumed (const char *reason);
  ~scoped_enable_commit_resumed ();

  DISABLE_COPY_AND_ASSIGN (scoped_enable_commit_resumed);

private:
  const char *m_reason;
  bool m_prev_enable_commit_resumed;
};


#endif /* INFRUN_H */
