X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ftarget.h;h=f2bb55e4bdd28675e76973c4863960ece269dd54;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=14ec07fc0e4b1ec516119a97f261873bd65f3f83;hpb=491adecac48c5960fe29582f5046c015ff92c211;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/target.h b/gdb/target.h index 14ec07fc0e..f2bb55e4bd 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -1,6 +1,6 @@ /* Interface between GDB and target environments, including files and processes - Copyright (C) 1990-2019 Free Software Foundation, Inc. + Copyright (C) 1990-2020 Free Software Foundation, Inc. Contributed by Cygnus Support. Written by John Gilmore. @@ -42,7 +42,8 @@ struct inferior; #include "infrun.h" /* For enum exec_direction_kind. */ #include "breakpoint.h" /* For enum bptype. */ -#include "common/scoped_restore.h" +#include "gdbsupport/scoped_restore.h" +#include "gdbsupport/refcounted-object.h" /* This include file defines the interface between the main part of the debugger, and the part which is target-specific, or @@ -74,15 +75,15 @@ struct inferior; #include "bfd.h" #include "symtab.h" #include "memattr.h" -#include "vec.h" -#include "gdb_signals.h" +#include "gdbsupport/gdb_signals.h" #include "btrace.h" #include "record.h" #include "command.h" #include "disasm.h" #include "tracepoint.h" +#include "displaced-stepping.h" -#include "break-common.h" /* For enum target_hw_bp_type. */ +#include "gdbsupport/break-common.h" /* For enum target_hw_bp_type. */ enum strata { @@ -137,8 +138,6 @@ enum target_object { /* AVR target specific transfer. See "avr-tdep.c" and "remote.c". */ TARGET_OBJECT_AVR, - /* SPU target specific transfer. See "spu-tdep.c". */ - TARGET_OBJECT_SPU, /* Transfer up-to LEN bytes of memory starting at OFFSET. */ TARGET_OBJECT_MEMORY, /* Memory, avoiding GDB's data cache and trusting the executable. @@ -430,6 +429,7 @@ struct target_info }; struct target_ops + : public refcounted_object { /* Return this target's stratum. */ virtual strata stratum () const = 0; @@ -448,10 +448,10 @@ struct target_ops virtual const target_info &info () const = 0; /* Name this target type. */ - const char *shortname () + const char *shortname () const { return info ().shortname; } - const char *longname () + const char *longname () const { return info ().longname; } /* Close the target. This is where the target can handle @@ -481,6 +481,13 @@ struct target_ops TARGET_DEFAULT_NORETURN (noprocess ()); virtual void commit_resume () TARGET_DEFAULT_IGNORE (); + /* See target_wait's description. Note that implementations of + this method must not assume that inferior_ptid on entry is + pointing at the thread or inferior that ends up reporting an + event. The reported event could be for some other thread in + the current inferior or even for a different process of the + current target. inferior_ptid may also be null_ptid on + entry. */ virtual ptid_t wait (ptid_t, struct target_waitstatus *, int TARGET_DEBUG_PRINTER (target_debug_print_options)) TARGET_DEFAULT_FUNC (default_target_wait); @@ -616,13 +623,13 @@ struct target_ops TARGET_DEFAULT_RETURN (1); virtual int remove_vfork_catchpoint (int) TARGET_DEFAULT_RETURN (1); - virtual int follow_fork (int, int) + virtual bool follow_fork (bool, bool) TARGET_DEFAULT_FUNC (default_follow_fork); virtual int insert_exec_catchpoint (int) TARGET_DEFAULT_RETURN (1); virtual int remove_exec_catchpoint (int) TARGET_DEFAULT_RETURN (1); - virtual void follow_exec (struct inferior *, char *) + virtual void follow_exec (struct inferior *, const char *) TARGET_DEFAULT_IGNORE (); virtual int set_syscall_catchpoint (int, bool, int, gdb::array_view) @@ -637,21 +644,19 @@ struct target_ops /* Documentation of this routine is provided with the corresponding target_* macro. */ - virtual void pass_signals (int, - const unsigned char * TARGET_DEBUG_PRINTER (target_debug_print_signals)) + virtual void pass_signals (gdb::array_view TARGET_DEBUG_PRINTER (target_debug_print_signals)) TARGET_DEFAULT_IGNORE (); /* Documentation of this routine is provided with the corresponding target_* function. */ - virtual void program_signals (int, - const unsigned char * TARGET_DEBUG_PRINTER (target_debug_print_signals)) + virtual void program_signals (gdb::array_view TARGET_DEBUG_PRINTER (target_debug_print_signals)) TARGET_DEFAULT_IGNORE (); virtual bool thread_alive (ptid_t ptid) TARGET_DEFAULT_RETURN (false); virtual void update_thread_list () TARGET_DEFAULT_IGNORE (); - virtual const char *pid_to_str (ptid_t) + virtual std::string pid_to_str (ptid_t) TARGET_DEFAULT_FUNC (default_pid_to_str); virtual const char *extra_thread_info (thread_info *) TARGET_DEFAULT_RETURN (NULL); @@ -661,6 +666,9 @@ struct target_ops int, inferior *inf) TARGET_DEFAULT_RETURN (NULL); + /* See target_thread_info_to_thread_handle. */ + virtual gdb::byte_vector thread_info_to_thread_handle (struct thread_info *) + TARGET_DEFAULT_RETURN (gdb::byte_vector ()); virtual void stop (ptid_t) TARGET_DEFAULT_IGNORE (); virtual void interrupt () @@ -681,7 +689,7 @@ struct target_ops virtual bool has_memory () { return false; } virtual bool has_stack () { return false; } virtual bool has_registers () { return false; } - virtual bool has_execution (ptid_t) { return false; } + virtual bool has_execution (inferior *inf) { return false; } /* Control thread execution. */ virtual thread_control_capabilities get_thread_control_capabilities () @@ -696,6 +704,8 @@ struct target_ops TARGET_DEFAULT_RETURN (false); virtual void async (int) TARGET_DEFAULT_NORETURN (tcomplain ()); + virtual int async_wait_fd () + TARGET_DEFAULT_NORETURN (noprocess ()); virtual void thread_events (int) TARGET_DEFAULT_IGNORE (); /* This method must be implemented in some situations. See the @@ -720,9 +730,9 @@ struct target_ops TARGET_DEFAULT_NORETURN (tcomplain ()); /* Return the thread-local address at OFFSET in the thread-local storage for the thread PTID and the shared library - or executable file given by OBJFILE. If that block of + or executable file given by LOAD_MODULE_ADDR. If that block of thread-local storage hasn't been allocated yet, this function - may return an error. LOAD_MODULE_ADDR may be zero for statically + may throw an error. LOAD_MODULE_ADDR may be zero for statically linked multithreaded inferiors. */ virtual CORE_ADDR get_thread_local_address (ptid_t ptid, CORE_ADDR load_module_addr, @@ -880,11 +890,10 @@ struct target_ops /* Determine current architecture of thread PTID. The target is supposed to determine the architecture of the code where - the target is currently stopped at (on Cell, if a target is in spu_run, - to_thread_architecture would return SPU, otherwise PPC32 or PPC64). - This is architecture used to perform decr_pc_after_break adjustment, - and also determines the frame architecture of the innermost frame. - ptrace operations need to operate according to target_gdbarch (). */ + the target is currently stopped at. The architecture information is + used to perform decr_pc_after_break adjustment, and also to determine + the frame architecture of the innermost frame. ptrace operations need to + operate according to target_gdbarch (). */ virtual struct gdbarch *thread_architecture (ptid_t) TARGET_DEFAULT_RETURN (NULL); @@ -1244,6 +1253,15 @@ struct target_ops /* Cleanup after generating a core file. */ virtual void done_generating_core () TARGET_DEFAULT_IGNORE (); + + virtual bool supports_displaced_step (thread_info *thread) + TARGET_DEFAULT_FUNC (default_supports_displaced_step); + + virtual displaced_step_prepare_status displaced_step_prepare (thread_info *thread) + TARGET_DEFAULT_FUNC (default_displaced_step_prepare); + + virtual displaced_step_finish_status displaced_step_finish (thread_info *thread, gdb_signal sig) + TARGET_DEFAULT_FUNC (default_displaced_step_finish); }; /* Deleter for std::unique_ptr. See comments in @@ -1260,6 +1278,27 @@ struct target_ops_deleter /* A unique pointer for target_ops. */ typedef std::unique_ptr target_ops_up; +/* Decref a target and close if, if there are no references left. */ +extern void decref_target (target_ops *t); + +/* A policy class to interface gdb::ref_ptr with target_ops. */ + +struct target_ops_ref_policy +{ + static void incref (target_ops *t) + { + t->incref (); + } + + static void decref (target_ops *t) + { + decref_target (t); + } +}; + +/* A gdb::ref_ptr pointer to a target_ops. */ +typedef gdb::ref_ptr target_ops_ref; + /* Native target backends call this once at initialization time to inform the core about which is the target that can respond to "run" or "attach". Note: native targets are always singletons. */ @@ -1314,6 +1353,9 @@ private: extern target_ops *current_top_target (); +/* Return the dummy target. */ +extern target_ops *get_dummy_target (); + /* Define easy words for doing these operations on our current target. */ #define target_shortname (current_top_target ()->shortname ()) @@ -1537,7 +1579,7 @@ enum flash_preserve_mode that supports writing to flash memory, and it should be used for all cases where access to flash memory is desirable. - REQUESTS is the vector (see vec.h) of memory_write_request. + REQUESTS is the vector of memory_write_request. PRESERVE_FLASH_P indicates what to do with blocks which must be erased, but not completely rewritten. PROGRESS_CB is a function that will be periodically called to provide @@ -1628,15 +1670,15 @@ extern void target_load (const char *arg, int from_tty); necessary to continue debugging either the parent or child, as requested, and releasing the other. Information about the fork or vfork event is available via get_last_target_status (). - This function returns 1 if the inferior should not be resumed + This function returns true if the inferior should not be resumed (i.e. there is another event pending). */ -int target_follow_fork (int follow_child, int detach_fork); +bool target_follow_fork (bool follow_child, bool detach_fork); /* Handle the target-specific bookkeeping required when the inferior makes an exec call. INF is the exec'd inferior. */ -void target_follow_exec (struct inferior *inf, char *execd_pathname); +void target_follow_exec (struct inferior *inf, const char *execd_pathname); /* On some targets, we can catch an inferior exec event when it occurs. These functions insert/remove an already-created @@ -1682,7 +1724,7 @@ extern int target_can_run (); /* Set list of signals to be handled in the target. - PASS_SIGNALS is an array of size NSIG, indexed by target signal number + PASS_SIGNALS is an array indexed by target signal number (enum gdb_signal). For every signal whose entry in this array is non-zero, the target is allowed -but not required- to skip reporting arrival of the signal to the GDB core by returning from target_wait, @@ -1692,12 +1734,13 @@ extern int target_can_run (); about to receive a signal, it needs to be reported in any case, even if mentioned in a previous target_pass_signals call. */ -extern void target_pass_signals (int nsig, const unsigned char *pass_signals); +extern void target_pass_signals + (gdb::array_view pass_signals); /* Set list of signals the target may pass to the inferior. This directly maps to the "handle SIGNAL pass/nopass" setting. - PROGRAM_SIGNALS is an array of size NSIG, indexed by target signal + PROGRAM_SIGNALS is an array indexed by target signal number (enum gdb_signal). For every signal whose entry in this array is non-zero, the target is allowed to pass the signal to the inferior. Signals not present in the array shall be silently @@ -1708,8 +1751,8 @@ extern void target_pass_signals (int nsig, const unsigned char *pass_signals); example, when detaching (as threads may have been suspended with pending signals not reported to GDB). */ -extern void target_program_signals (int nsig, - const unsigned char *program_signals); +extern void target_program_signals + (gdb::array_view program_signals); /* Check to see if a thread is still alive. */ @@ -1785,9 +1828,10 @@ extern int target_has_registers_1 (void); case this will become true after to_create_inferior or to_attach. */ -extern int target_has_execution_1 (ptid_t); +extern bool target_has_execution_1 (inferior *inf); -/* Like target_has_execution_1, but always passes inferior_ptid. */ +/* Like target_has_execution_1, but always passes + current_inferior(). */ extern int target_has_execution_current (void); @@ -1800,7 +1844,7 @@ extern int target_has_execution_current (void); (current_top_target ()->get_thread_control_capabilities () & tc_schedlock) /* Controls whether async mode is permitted. */ -extern int target_async_permitted; +extern bool target_async_permitted; /* Can the target support asynchronous execution? */ #define target_can_async_p() (current_top_target ()->can_async_p ()) @@ -1823,6 +1867,9 @@ extern enum auto_boolean target_non_stop_enabled; non-stop" is on. */ extern int target_is_non_stop_p (void); +/* Return true if at least one inferior has a non-stop target. */ +extern bool exists_non_stop_target (); + #define target_execution_direction() \ (current_top_target ()->execution_direction ()) @@ -1830,9 +1877,9 @@ extern int target_is_non_stop_p (void); `process xyz', but on some systems it may contain `process xyz thread abc'. */ -extern const char *target_pid_to_str (ptid_t ptid); +extern std::string target_pid_to_str (ptid_t ptid); -extern const char *normal_pid_to_str (ptid_t ptid); +extern std::string normal_pid_to_str (ptid_t ptid); /* Return a short string describing extra information about PID, e.g. "sleeping", "runnable", "running on LWP 3". Null return value @@ -1852,6 +1899,12 @@ extern const char *target_thread_name (struct thread_info *); extern struct thread_info *target_thread_handle_to_thread_info (const gdb_byte *thread_handle, int handle_len, struct inferior *inf); +/* Given a thread, return the thread handle, a target-specific sequence of + bytes which serves as a thread identifier within the program being + debugged. */ +extern gdb::byte_vector target_thread_info_to_thread_handle + (struct thread_info *); + /* Attempts to find the pathname of the executable file that was run to create a specified process. @@ -2092,21 +2145,15 @@ extern int target_search_memory (CORE_ADDR start_addr, current_top_target ()->filesystem_is_local () /* Open FILENAME on the target, in the filesystem as seen by INF, - using FLAGS and MODE. If INF is NULL, use the filesystem seen - by the debugger (GDB or, for remote targets, the remote stub). - Return a target file descriptor, or -1 if an error occurs (and - set *TARGET_ERRNO). */ + using FLAGS and MODE. If INF is NULL, use the filesystem seen by + the debugger (GDB or, for remote targets, the remote stub). Return + a target file descriptor, or -1 if an error occurs (and set + *TARGET_ERRNO). If WARN_IF_SLOW is true, print a warning message + if the file is being accessed over a link that may be slow. */ extern int target_fileio_open (struct inferior *inf, const char *filename, int flags, - int mode, int *target_errno); - -/* Like target_fileio_open, but print a warning message if the - file is being accessed over a link that may be slow. */ -extern int target_fileio_open_warn_if_slow (struct inferior *inf, - const char *filename, - int flags, - int mode, - int *target_errno); + int mode, bool warn_if_slow, + int *target_errno); /* Write up to LEN bytes from WRITE_BUF to FD on the target. Return the number of bytes written, or -1 if an error occurs @@ -2334,6 +2381,9 @@ extern void add_deprecated_target_alias (const target_info &info, extern void push_target (struct target_ops *); +/* An overload that deletes the target on failure. */ +extern void push_target (target_ops_up &&); + extern int unpush_target (struct target_ops *); extern void target_pre_inferior (int); @@ -2351,7 +2401,7 @@ extern void pop_all_targets_at_and_above (enum strata stratum); strictly above ABOVE_STRATUM. */ extern void pop_all_targets_above (enum strata above_stratum); -extern int target_is_pushed (struct target_ops *t); +extern bool target_is_pushed (target_ops *t); extern CORE_ADDR target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset); @@ -2471,12 +2521,12 @@ extern int remote_timeout; extern scoped_restore_tmpl make_scoped_restore_show_memory_breakpoints (int show); -extern int may_write_registers; -extern int may_write_memory; -extern int may_insert_breakpoints; -extern int may_insert_tracepoints; -extern int may_insert_fast_tracepoints; -extern int may_stop; +extern bool may_write_registers; +extern bool may_write_memory; +extern bool may_insert_breakpoints; +extern bool may_insert_tracepoints; +extern bool may_insert_fast_tracepoints; +extern bool may_stop; extern void update_target_permissions (void);