|  | /* Interface between GDB and target environments, including files and processes | 
|  |  | 
|  | Copyright (C) 1990-2025 Free Software Foundation, Inc. | 
|  |  | 
|  | Contributed by Cygnus Support.  Written by John Gilmore. | 
|  |  | 
|  | 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/>.  */ | 
|  |  | 
|  | /* This include file defines the interface between the main part of | 
|  | the debugger, and the part which is target-specific, or specific to | 
|  | the communications interface between us and the target. | 
|  |  | 
|  | A TARGET is an interface between the debugger and a particular | 
|  | kind of file or process.  Targets can be STACKED in STRATA, | 
|  | so that more than one target can potentially respond to a request. | 
|  | In particular, memory accesses will walk down the stack of targets | 
|  | until they find a target that is interested in handling that particular | 
|  | address.  STRATA are artificial boundaries on the stack, within | 
|  | which particular kinds of targets live.  Strata exist so that | 
|  | people don't get confused by pushing e.g. a process target and then | 
|  | a file target, and wondering why they can't see the current values | 
|  | of variables any more (the file target is handling them and they | 
|  | never get to the process target).  So when you push a file target, | 
|  | it goes into the file stratum, which is always below the process | 
|  | stratum. | 
|  |  | 
|  | Note that rather than allow an empty stack, we always have the | 
|  | dummy target at the bottom stratum, so we can call the target | 
|  | methods without checking them.  */ | 
|  |  | 
|  | #ifndef GDB_TARGET_H | 
|  | #define GDB_TARGET_H | 
|  |  | 
|  | struct objfile; | 
|  | struct ui_file; | 
|  | struct mem_attrib; | 
|  | struct target_ops; | 
|  | struct bp_location; | 
|  | struct bp_target_info; | 
|  | struct regcache; | 
|  | struct trace_state_variable; | 
|  | struct trace_status; | 
|  | struct uploaded_tsv; | 
|  | struct uploaded_tp; | 
|  | struct static_tracepoint_marker; | 
|  | struct traceframe_info; | 
|  | struct expression; | 
|  | struct dcache_struct; | 
|  | struct inferior; | 
|  |  | 
|  | /* Define const gdb_byte using one identifier, to make it easy for | 
|  | make-target-delegates.py to parse.  */ | 
|  | typedef const gdb_byte const_gdb_byte; | 
|  |  | 
|  | #include "infrun.h" | 
|  | #include "breakpoint.h" | 
|  | #include "gdbsupport/scoped_restore.h" | 
|  | #include "gdbsupport/refcounted-object.h" | 
|  | #include "target-section.h" | 
|  | #include "target/target.h" | 
|  | #include "target/resume.h" | 
|  | #include "target/wait.h" | 
|  | #include "target/waitstatus.h" | 
|  | #include "bfd.h" | 
|  | #include "symtab.h" | 
|  | #include "memattr.h" | 
|  | #include "gdbsupport/gdb_signals.h" | 
|  | #include "btrace.h" | 
|  | #include "record.h" | 
|  | #include "command.h" | 
|  | #include "disasm-flags.h" | 
|  | #include "tracepoint.h" | 
|  | #include "gdbsupport/fileio.h" | 
|  | #include "gdbsupport/x86-xstate.h" | 
|  |  | 
|  | #include "gdbsupport/break-common.h" | 
|  |  | 
|  | enum strata | 
|  | { | 
|  | dummy_stratum,		/* The lowest of the low */ | 
|  | file_stratum,		/* Executable files, etc */ | 
|  | process_stratum,		/* Executing processes or core dump files */ | 
|  | thread_stratum,		/* Executing threads */ | 
|  | record_stratum,		/* Support record debugging */ | 
|  | arch_stratum,		/* Architecture overrides */ | 
|  | debug_stratum		/* Target debug.  Must be last.  */ | 
|  | }; | 
|  |  | 
|  | enum thread_control_capabilities | 
|  | { | 
|  | tc_none = 0,		/* Default: can't control thread execution.  */ | 
|  | tc_schedlock = 1,		/* Can lock the thread scheduler.  */ | 
|  | }; | 
|  |  | 
|  | /* The structure below stores information about a system call. | 
|  | It is basically used in the "catch syscall" command, and in | 
|  | every function that gives information about a system call. | 
|  |  | 
|  | It's also good to mention that its fields represent everything | 
|  | that we currently know about a syscall in GDB.  */ | 
|  | struct syscall | 
|  | { | 
|  | /* The syscall number.  */ | 
|  | int number; | 
|  |  | 
|  | /* The syscall name.  */ | 
|  | const char *name; | 
|  | }; | 
|  |  | 
|  | /* Return a pretty printed form of TARGET_OPTIONS.  */ | 
|  | extern std::string target_options_to_string (target_wait_flags target_options); | 
|  |  | 
|  | /* Possible types of events that the inferior handler will have to | 
|  | deal with.  */ | 
|  | enum inferior_event_type | 
|  | { | 
|  | /* Process a normal inferior event which will result in target_wait | 
|  | being called.  */ | 
|  | INF_REG_EVENT, | 
|  | /* We are called to do stuff after the inferior stops.  */ | 
|  | INF_EXEC_COMPLETE, | 
|  | }; | 
|  |  | 
|  | /* Target objects which can be transferred using target_read, | 
|  | target_write, et cetera.  */ | 
|  |  | 
|  | enum target_object | 
|  | { | 
|  | /* AVR target specific transfer.  See "avr-tdep.c" and "remote.c".  */ | 
|  | TARGET_OBJECT_AVR, | 
|  | /* Transfer up-to LEN bytes of memory starting at OFFSET.  */ | 
|  | TARGET_OBJECT_MEMORY, | 
|  | /* Memory, avoiding GDB's data cache and trusting the executable. | 
|  | Target implementations of to_xfer_partial never need to handle | 
|  | this object, and most callers should not use it.  */ | 
|  | TARGET_OBJECT_RAW_MEMORY, | 
|  | /* Memory known to be part of the target's stack.  This is cached even | 
|  | if it is not in a region marked as such, since it is known to be | 
|  | "normal" RAM.  */ | 
|  | TARGET_OBJECT_STACK_MEMORY, | 
|  | /* Memory known to be part of the target code.   This is cached even | 
|  | if it is not in a region marked as such.  */ | 
|  | TARGET_OBJECT_CODE_MEMORY, | 
|  | /* Kernel Unwind Table.  See "ia64-tdep.c".  */ | 
|  | TARGET_OBJECT_UNWIND_TABLE, | 
|  | /* Transfer auxiliary vector.  */ | 
|  | TARGET_OBJECT_AUXV, | 
|  | /* StackGhost cookie.  See "sparc-tdep.c".  */ | 
|  | TARGET_OBJECT_WCOOKIE, | 
|  | /* Target memory map in XML format.  */ | 
|  | TARGET_OBJECT_MEMORY_MAP, | 
|  | /* Flash memory.  This object can be used to write contents to | 
|  | a previously erased flash memory.  Using it without erasing | 
|  | flash can have unexpected results.  Addresses are physical | 
|  | address on target, and not relative to flash start.  */ | 
|  | TARGET_OBJECT_FLASH, | 
|  | /* Available target-specific features, e.g. registers and coprocessors. | 
|  | See "target-descriptions.c".  ANNEX should never be empty.  */ | 
|  | TARGET_OBJECT_AVAILABLE_FEATURES, | 
|  | /* Currently loaded libraries, in XML format.  */ | 
|  | TARGET_OBJECT_LIBRARIES, | 
|  | /* Currently loaded libraries specific for SVR4 systems, in XML format.  */ | 
|  | TARGET_OBJECT_LIBRARIES_SVR4, | 
|  | /* Currently loaded libraries specific to AIX systems, in XML format.  */ | 
|  | TARGET_OBJECT_LIBRARIES_AIX, | 
|  | /* Get OS specific data.  The ANNEX specifies the type (running | 
|  | processes, etc.).  The data being transferred is expected to follow | 
|  | the DTD specified in features/osdata.dtd.  */ | 
|  | TARGET_OBJECT_OSDATA, | 
|  | /* Extra signal info.  Usually the contents of `siginfo_t' on unix | 
|  | platforms.  */ | 
|  | TARGET_OBJECT_SIGNAL_INFO, | 
|  | /* The list of threads that are being debugged.  */ | 
|  | TARGET_OBJECT_THREADS, | 
|  | /* Collected static trace data.  */ | 
|  | TARGET_OBJECT_STATIC_TRACE_DATA, | 
|  | /* Traceframe info, in XML format.  */ | 
|  | TARGET_OBJECT_TRACEFRAME_INFO, | 
|  | /* Load maps for FDPIC systems.  */ | 
|  | TARGET_OBJECT_FDPIC, | 
|  | /* Darwin dynamic linker info data.  */ | 
|  | TARGET_OBJECT_DARWIN_DYLD_INFO, | 
|  | /* OpenVMS Unwind Information Block.  */ | 
|  | TARGET_OBJECT_OPENVMS_UIB, | 
|  | /* Branch trace data, in XML format.  */ | 
|  | TARGET_OBJECT_BTRACE, | 
|  | /* Branch trace configuration, in XML format.  */ | 
|  | TARGET_OBJECT_BTRACE_CONF, | 
|  | /* The pathname of the executable file that was run to create | 
|  | a specified process.  ANNEX should be a string representation | 
|  | of the process ID of the process in question, in hexadecimal | 
|  | format.  */ | 
|  | TARGET_OBJECT_EXEC_FILE, | 
|  | /* FreeBSD virtual memory mappings.  */ | 
|  | TARGET_OBJECT_FREEBSD_VMMAP, | 
|  | /* FreeBSD process strings.  */ | 
|  | TARGET_OBJECT_FREEBSD_PS_STRINGS, | 
|  | /* Possible future objects: TARGET_OBJECT_FILE, ...  */ | 
|  | }; | 
|  |  | 
|  | /* Possible values returned by target_xfer_partial, etc.  */ | 
|  |  | 
|  | enum target_xfer_status | 
|  | { | 
|  | /* Some bytes are transferred.  */ | 
|  | TARGET_XFER_OK = 1, | 
|  |  | 
|  | /* No further transfer is possible.  */ | 
|  | TARGET_XFER_EOF = 0, | 
|  |  | 
|  | /* The piece of the object requested is unavailable.  */ | 
|  | TARGET_XFER_UNAVAILABLE = 2, | 
|  |  | 
|  | /* Generic I/O error.  Note that it's important that this is '-1', | 
|  | as we still have target_xfer-related code returning hardcoded | 
|  | '-1' on error.  */ | 
|  | TARGET_XFER_E_IO = -1, | 
|  |  | 
|  | /* Keep list in sync with target_xfer_status_to_string.  */ | 
|  | }; | 
|  |  | 
|  | /* Return the string form of STATUS.  */ | 
|  |  | 
|  | extern const char * | 
|  | target_xfer_status_to_string (enum target_xfer_status status); | 
|  |  | 
|  | typedef enum target_xfer_status | 
|  | target_xfer_partial_ftype (struct target_ops *ops, | 
|  | enum target_object object, | 
|  | const char *annex, | 
|  | gdb_byte *readbuf, | 
|  | const gdb_byte *writebuf, | 
|  | ULONGEST offset, | 
|  | ULONGEST len, | 
|  | ULONGEST *xfered_len); | 
|  |  | 
|  | enum target_xfer_status | 
|  | raw_memory_xfer_partial (struct target_ops *ops, gdb_byte *readbuf, | 
|  | const gdb_byte *writebuf, ULONGEST memaddr, | 
|  | LONGEST len, ULONGEST *xfered_len); | 
|  |  | 
|  | /* Request that OPS transfer up to LEN addressable units of the target's | 
|  | OBJECT.  When reading from a memory object, the size of an addressable unit | 
|  | is architecture dependent and can be found using | 
|  | gdbarch_addressable_memory_unit_size.  Otherwise, an addressable unit is 1 | 
|  | byte long.  BUF should point to a buffer large enough to hold the read data, | 
|  | taking into account the addressable unit size.  The OFFSET, for a seekable | 
|  | object, specifies the starting point.  The ANNEX can be used to provide | 
|  | additional data-specific information to the target. | 
|  |  | 
|  | Return the number of addressable units actually transferred, or a negative | 
|  | error code (an 'enum target_xfer_error' value) if the transfer is not | 
|  | supported or otherwise fails.  Return of a positive value less than | 
|  | LEN indicates that no further transfer is possible.  Unlike the raw | 
|  | to_xfer_partial interface, callers of these functions do not need | 
|  | to retry partial transfers.  */ | 
|  |  | 
|  | extern LONGEST target_read (struct target_ops *ops, | 
|  | enum target_object object, | 
|  | const char *annex, gdb_byte *buf, | 
|  | ULONGEST offset, LONGEST len); | 
|  |  | 
|  | struct memory_read_result | 
|  | { | 
|  | memory_read_result (ULONGEST begin_, ULONGEST end_, | 
|  | gdb::unique_xmalloc_ptr<gdb_byte> &&data_) | 
|  | : begin (begin_), | 
|  | end (end_), | 
|  | data (std::move (data_)) | 
|  | { | 
|  | } | 
|  |  | 
|  | ~memory_read_result () = default; | 
|  |  | 
|  | memory_read_result (memory_read_result &&other) = default; | 
|  |  | 
|  | DISABLE_COPY_AND_ASSIGN (memory_read_result); | 
|  |  | 
|  | /* First address that was read.  */ | 
|  | ULONGEST begin; | 
|  | /* Past-the-end address.  */ | 
|  | ULONGEST end; | 
|  | /* The data.  */ | 
|  | gdb::unique_xmalloc_ptr<gdb_byte> data; | 
|  | }; | 
|  |  | 
|  | extern std::vector<memory_read_result> read_memory_robust | 
|  | (struct target_ops *ops, const ULONGEST offset, const LONGEST len); | 
|  |  | 
|  | /* Request that OPS transfer up to LEN addressable units from BUF to the | 
|  | target's OBJECT.  When writing to a memory object, the addressable unit | 
|  | size is architecture dependent and can be found using | 
|  | gdbarch_addressable_memory_unit_size.  Otherwise, an addressable unit is 1 | 
|  | byte long.  The OFFSET, for a seekable object, specifies the starting point. | 
|  | The ANNEX can be used to provide additional data-specific information to | 
|  | the target. | 
|  |  | 
|  | Return the number of addressable units actually transferred, or a negative | 
|  | error code (an 'enum target_xfer_status' value) if the transfer is not | 
|  | supported or otherwise fails.  Return of a positive value less than | 
|  | LEN indicates that no further transfer is possible.  Unlike the raw | 
|  | to_xfer_partial interface, callers of these functions do not need to | 
|  | retry partial transfers.  */ | 
|  |  | 
|  | extern LONGEST target_write (struct target_ops *ops, | 
|  | enum target_object object, | 
|  | const char *annex, const gdb_byte *buf, | 
|  | ULONGEST offset, LONGEST len); | 
|  |  | 
|  | /* Similar to target_write, except that it also calls PROGRESS with | 
|  | the number of bytes written and the opaque BATON after every | 
|  | successful partial write (and before the first write).  This is | 
|  | useful for progress reporting and user interaction while writing | 
|  | data.  To abort the transfer, the progress callback can throw an | 
|  | exception.  */ | 
|  |  | 
|  | LONGEST target_write_with_progress (struct target_ops *ops, | 
|  | enum target_object object, | 
|  | const char *annex, const gdb_byte *buf, | 
|  | ULONGEST offset, LONGEST len, | 
|  | void (*progress) (ULONGEST, void *), | 
|  | void *baton); | 
|  |  | 
|  | /* Wrapper to perform a full read of unknown size.  OBJECT/ANNEX will be read | 
|  | using OPS.  The return value will be uninstantiated if the transfer fails or | 
|  | is not supported. | 
|  |  | 
|  | This method should be used for objects sufficiently small to store | 
|  | in a single xmalloc'd buffer, when no fixed bound on the object's | 
|  | size is known in advance.  Don't try to read TARGET_OBJECT_MEMORY | 
|  | through this function.  */ | 
|  |  | 
|  | extern std::optional<gdb::byte_vector> target_read_alloc | 
|  | (struct target_ops *ops, enum target_object object, const char *annex); | 
|  |  | 
|  | /* Read OBJECT/ANNEX using OPS.  The result is a NUL-terminated character vector | 
|  | (therefore usable as a NUL-terminated string).  If an error occurs or the | 
|  | transfer is unsupported, the return value will be uninstantiated.  Empty | 
|  | objects are returned as allocated but empty strings.  Therefore, on success, | 
|  | the returned vector is guaranteed to have at least one element.  A warning is | 
|  | issued if the result contains any embedded NUL bytes.  */ | 
|  |  | 
|  | extern std::optional<gdb::char_vector> target_read_stralloc | 
|  | (struct target_ops *ops, enum target_object object, const char *annex); | 
|  |  | 
|  | /* See target_ops->to_xfer_partial.  */ | 
|  | extern target_xfer_partial_ftype target_xfer_partial; | 
|  |  | 
|  | /* Wrappers to target read/write that perform memory transfers.  They | 
|  | throw an error if the memory transfer fails. | 
|  |  | 
|  | NOTE: cagney/2003-10-23: The naming schema is lifted from | 
|  | "frame.h".  The parameter order is lifted from get_frame_memory, | 
|  | which in turn lifted it from read_memory.  */ | 
|  |  | 
|  | extern void get_target_memory (struct target_ops *ops, CORE_ADDR addr, | 
|  | gdb_byte *buf, LONGEST len); | 
|  | extern ULONGEST get_target_memory_unsigned (struct target_ops *ops, | 
|  | CORE_ADDR addr, int len, | 
|  | enum bfd_endian byte_order); | 
|  |  | 
|  | struct thread_info;		/* fwd decl for parameter list below: */ | 
|  |  | 
|  | /* The type of the callback to the to_async method.  */ | 
|  |  | 
|  | typedef void async_callback_ftype (enum inferior_event_type event_type, | 
|  | void *context); | 
|  |  | 
|  | /* Normally target debug printing is purely type-based.  However, | 
|  | sometimes it is necessary to override the debug printing on a | 
|  | per-argument basis.  This macro can be used, attribute-style, to | 
|  | name the target debug printing function for a particular method | 
|  | argument.  FUNC is the name of the function.  The macro's | 
|  | definition is empty because it is only used by the | 
|  | make-target-delegates script.  */ | 
|  |  | 
|  | #define TARGET_DEBUG_PRINTER(FUNC) | 
|  |  | 
|  | /* These defines are used to mark target_ops methods.  The script | 
|  | make-target-delegates scans these and auto-generates the base | 
|  | method implementations.  There are four macros that can be used: | 
|  |  | 
|  | 1. TARGET_DEFAULT_IGNORE.  There is no argument.  The base method | 
|  | does nothing.  This is only valid if the method return type is | 
|  | 'void'. | 
|  |  | 
|  | 2. TARGET_DEFAULT_NORETURN.  The argument is a function call, like | 
|  | 'tcomplain ()'.  The base method simply makes this call, which is | 
|  | assumed not to return. | 
|  |  | 
|  | 3. TARGET_DEFAULT_RETURN.  The argument is a C expression.  The | 
|  | base method returns this expression's value. | 
|  |  | 
|  | 4. TARGET_DEFAULT_FUNC.  The argument is the name of a function. | 
|  | make-target-delegates does not generate a base method in this case, | 
|  | but instead uses the argument function as the base method.  */ | 
|  |  | 
|  | #define TARGET_DEFAULT_IGNORE() | 
|  | #define TARGET_DEFAULT_NORETURN(ARG) | 
|  | #define TARGET_DEFAULT_RETURN(ARG) | 
|  | #define TARGET_DEFAULT_FUNC(ARG) | 
|  |  | 
|  | /* Each target that can be activated with "target TARGET_NAME" passes | 
|  | the address of one of these objects to add_target, which uses the | 
|  | object's address as unique identifier, and registers the "target | 
|  | TARGET_NAME" command using SHORTNAME as target name.  */ | 
|  |  | 
|  | struct target_info | 
|  | { | 
|  | /* Name of this target.  */ | 
|  | const char *shortname; | 
|  |  | 
|  | /* Name for printing.  */ | 
|  | const char *longname; | 
|  |  | 
|  | /* Documentation.  Does not include trailing newline, and starts | 
|  | with a one-line description (probably similar to longname).  */ | 
|  | const char *doc; | 
|  | }; | 
|  |  | 
|  | /* A GDB target. | 
|  |  | 
|  | Each inferior has a stack of these.  See overall description at the | 
|  | top. | 
|  |  | 
|  | Most target methods traverse the current inferior's target stack; | 
|  | you call the method on the top target (normally via one of the | 
|  | target_foo wrapper free functions), and the implementation of said | 
|  | method does its work and returns, or defers to the same method on | 
|  | the target beneath on the current inferior's target stack.  Thus, | 
|  | the inferior you want to call the target method on must be made the | 
|  | current inferior before calling a target method, so that the stack | 
|  | traversal works correctly. | 
|  |  | 
|  | Methods that traverse the stack have a TARGET_DEFAULT_XXX marker in | 
|  | their declaration below.  See the macros' description above, where | 
|  | they're defined.  */ | 
|  |  | 
|  | struct target_ops | 
|  | : public refcounted_object | 
|  | { | 
|  | /* Return this target's stratum.  */ | 
|  | virtual strata stratum () const = 0; | 
|  |  | 
|  | /* To the target under this one.  */ | 
|  | target_ops *beneath () const; | 
|  |  | 
|  | /* Free resources associated with the target.  Note that singleton | 
|  | targets, like e.g., native targets, are global objects, not | 
|  | heap allocated, and are thus only deleted on GDB exit.  The | 
|  | main teardown entry point is the "close" method, below.  */ | 
|  | virtual ~target_ops () {} | 
|  |  | 
|  | /* Return a reference to this target's unique target_info | 
|  | object.  */ | 
|  | virtual const target_info &info () const = 0; | 
|  |  | 
|  | /* Name this target type.  */ | 
|  | const char *shortname () const | 
|  | { return info ().shortname; } | 
|  |  | 
|  | const char *longname () const | 
|  | { return info ().longname; } | 
|  |  | 
|  | /* Close the target.  This is where the target can handle | 
|  | teardown.  Heap-allocated targets should delete themselves | 
|  | before returning.  */ | 
|  | virtual void close (); | 
|  |  | 
|  | /* Attaches to a process on the target side.  Arguments are as | 
|  | passed to the `attach' command by the user.  This routine can | 
|  | be called when the target is not on the target-stack, if the | 
|  | target_ops::can_run method returns 1; in that case, it must push | 
|  | itself onto the stack.  Upon exit, the target should be ready | 
|  | for normal operations, and should be ready to deliver the | 
|  | status of the process immediately (without waiting) to an | 
|  | upcoming target_wait call.  */ | 
|  | virtual bool can_attach (); | 
|  | virtual void attach (const char *, int); | 
|  | virtual void post_attach (int) | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  |  | 
|  | /* Detaches from the inferior.  Note that on targets that support | 
|  | async execution (i.e., targets where it is possible to detach | 
|  | from programs with threads running), the target is responsible | 
|  | for removing breakpoints from the program before the actual | 
|  | detach, otherwise the program dies when it hits one.  */ | 
|  | virtual void detach (inferior *, int) | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  |  | 
|  | virtual void disconnect (const char *, int) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  | virtual void resume (ptid_t, | 
|  | int TARGET_DEBUG_PRINTER (target_debug_print_step), | 
|  | enum gdb_signal) | 
|  | TARGET_DEFAULT_NORETURN (noprocess ()); | 
|  |  | 
|  | /* Ensure that all resumed threads are committed to the target. | 
|  |  | 
|  | See the description of | 
|  | process_stratum_target::commit_resumed_state for more | 
|  | details.  */ | 
|  | virtual void commit_resumed () | 
|  | 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 *, | 
|  | target_wait_flags options) | 
|  | TARGET_DEFAULT_FUNC (default_target_wait); | 
|  | virtual void fetch_registers (struct regcache *, int) | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual void store_registers (struct regcache *, int) | 
|  | TARGET_DEFAULT_NORETURN (noprocess ()); | 
|  | virtual void prepare_to_store (struct regcache *) | 
|  | TARGET_DEFAULT_NORETURN (noprocess ()); | 
|  |  | 
|  | virtual void files_info () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual int insert_breakpoint (struct gdbarch *, | 
|  | struct bp_target_info *) | 
|  | TARGET_DEFAULT_NORETURN (noprocess ()); | 
|  | virtual int remove_breakpoint (struct gdbarch *, | 
|  | struct bp_target_info *, | 
|  | enum remove_bp_reason) | 
|  | TARGET_DEFAULT_NORETURN (noprocess ()); | 
|  |  | 
|  | /* Returns true if the target stopped because it executed a | 
|  | software breakpoint.  This is necessary for correct background | 
|  | execution / non-stop mode operation, and for correct PC | 
|  | adjustment on targets where the PC needs to be adjusted when a | 
|  | software breakpoint triggers.  In these modes, by the time GDB | 
|  | processes a breakpoint event, the breakpoint may already be | 
|  | done from the target, so GDB needs to be able to tell whether | 
|  | it should ignore the event and whether it should adjust the PC. | 
|  | See adjust_pc_after_break.  */ | 
|  | virtual bool stopped_by_sw_breakpoint () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | /* Returns true if the above method is supported.  */ | 
|  | virtual bool supports_stopped_by_sw_breakpoint () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Returns true if the target stopped for a hardware breakpoint. | 
|  | Likewise, if the target supports hardware breakpoints, this | 
|  | method is necessary for correct background execution / non-stop | 
|  | mode operation.  Even though hardware breakpoints do not | 
|  | require PC adjustment, GDB needs to be able to tell whether the | 
|  | hardware breakpoint event is a delayed event for a breakpoint | 
|  | that is already gone and should thus be ignored.  */ | 
|  | virtual bool stopped_by_hw_breakpoint () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | /* Returns true if the above method is supported.  */ | 
|  | virtual bool supports_stopped_by_hw_breakpoint () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | virtual int can_use_hw_breakpoint (enum bptype, int, int) | 
|  | TARGET_DEFAULT_RETURN (0); | 
|  | virtual int ranged_break_num_registers () | 
|  | TARGET_DEFAULT_RETURN (-1); | 
|  | virtual int insert_hw_breakpoint (struct gdbarch *, | 
|  | struct bp_target_info *) | 
|  | TARGET_DEFAULT_RETURN (-1); | 
|  | virtual int remove_hw_breakpoint (struct gdbarch *, | 
|  | struct bp_target_info *) | 
|  | TARGET_DEFAULT_RETURN (-1); | 
|  |  | 
|  | /* Documentation of what the two routines below are expected to do is | 
|  | provided with the corresponding target_* macros.  */ | 
|  | virtual int remove_watchpoint (CORE_ADDR, int, | 
|  | enum target_hw_bp_type, struct expression *) | 
|  | TARGET_DEFAULT_RETURN (-1); | 
|  | virtual int insert_watchpoint (CORE_ADDR, int, | 
|  | enum target_hw_bp_type, struct expression *) | 
|  | TARGET_DEFAULT_RETURN (-1); | 
|  |  | 
|  | virtual int insert_mask_watchpoint (CORE_ADDR, CORE_ADDR, | 
|  | enum target_hw_bp_type) | 
|  | TARGET_DEFAULT_RETURN (1); | 
|  | virtual int remove_mask_watchpoint (CORE_ADDR, CORE_ADDR, | 
|  | enum target_hw_bp_type) | 
|  | TARGET_DEFAULT_RETURN (1); | 
|  | virtual bool stopped_by_watchpoint () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | virtual bool have_steppable_watchpoint () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | virtual bool stopped_data_address (CORE_ADDR *) | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | virtual bool watchpoint_addr_within_range (CORE_ADDR, CORE_ADDR, int) | 
|  | TARGET_DEFAULT_FUNC (default_watchpoint_addr_within_range); | 
|  |  | 
|  | /* Documentation of this routine is provided with the corresponding | 
|  | target_* macro.  */ | 
|  | virtual int region_ok_for_hw_watchpoint (CORE_ADDR, int) | 
|  | TARGET_DEFAULT_FUNC (default_region_ok_for_hw_watchpoint); | 
|  |  | 
|  | virtual bool can_accel_watchpoint_condition (CORE_ADDR, int, int, | 
|  | struct expression *) | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | virtual int masked_watch_num_registers (CORE_ADDR, CORE_ADDR) | 
|  | TARGET_DEFAULT_RETURN (-1); | 
|  |  | 
|  | /* Return 1 for sure target can do single step.  Return -1 for | 
|  | unknown.  Return 0 for target can't do.  */ | 
|  | virtual int can_do_single_step () | 
|  | TARGET_DEFAULT_RETURN (-1); | 
|  |  | 
|  | virtual bool supports_terminal_ours () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | virtual void terminal_init () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual void terminal_inferior () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual void terminal_save_inferior () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual void terminal_ours_for_output () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual void terminal_ours () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual void terminal_info (const char *, int) | 
|  | TARGET_DEFAULT_FUNC (default_terminal_info); | 
|  | virtual void kill () | 
|  | TARGET_DEFAULT_NORETURN (noprocess ()); | 
|  | virtual void load (const char *, int) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  | /* Start an inferior process and set inferior_ptid to its pid. | 
|  | EXEC_FILE is the file to run. | 
|  | ALLARGS is a string containing the arguments to the program. | 
|  | ENV is the environment vector to pass.  Errors reported with error(). | 
|  | On VxWorks and various standalone systems, we ignore exec_file.  */ | 
|  | virtual bool can_create_inferior (); | 
|  | virtual void create_inferior (const char *, const std::string &, | 
|  | char **, int); | 
|  | virtual int insert_fork_catchpoint (int) | 
|  | TARGET_DEFAULT_RETURN (1); | 
|  | virtual int remove_fork_catchpoint (int) | 
|  | TARGET_DEFAULT_RETURN (1); | 
|  | virtual int insert_vfork_catchpoint (int) | 
|  | TARGET_DEFAULT_RETURN (1); | 
|  | virtual int remove_vfork_catchpoint (int) | 
|  | TARGET_DEFAULT_RETURN (1); | 
|  | virtual void follow_fork (inferior *, ptid_t, target_waitkind, bool, bool) | 
|  | TARGET_DEFAULT_FUNC (default_follow_fork); | 
|  |  | 
|  | /* Add CHILD_PTID to the thread list, after handling a | 
|  | TARGET_WAITKIND_THREAD_CLONE event for the clone parent.  The | 
|  | parent is inferior_ptid.  */ | 
|  | virtual void follow_clone (ptid_t child_ptid) | 
|  | TARGET_DEFAULT_FUNC (default_follow_clone); | 
|  |  | 
|  | virtual int insert_exec_catchpoint (int) | 
|  | TARGET_DEFAULT_RETURN (1); | 
|  | virtual int remove_exec_catchpoint (int) | 
|  | TARGET_DEFAULT_RETURN (1); | 
|  | virtual void follow_exec (inferior *, ptid_t, const char *) | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual int set_syscall_catchpoint (int, bool, int, | 
|  | gdb::array_view<const int>) | 
|  | TARGET_DEFAULT_RETURN (1); | 
|  | virtual void mourn_inferior () | 
|  | TARGET_DEFAULT_FUNC (default_mourn_inferior); | 
|  |  | 
|  | /* Note that can_run is special and can be invoked on an unpushed | 
|  | target.  Targets defining this method must also define | 
|  | to_can_async_p and to_supports_non_stop.  */ | 
|  | virtual bool can_run (); | 
|  |  | 
|  | /* Documentation of this routine is provided with the corresponding | 
|  | target_* macro.  */ | 
|  | virtual void pass_signals (gdb::array_view<const unsigned char> 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 (gdb::array_view<const unsigned char> 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 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); | 
|  | virtual const char *thread_name (thread_info *) | 
|  | TARGET_DEFAULT_RETURN (NULL); | 
|  | virtual thread_info *thread_handle_to_thread_info (const gdb_byte *, | 
|  | int, | 
|  | inferior *inf) | 
|  | TARGET_DEFAULT_RETURN (NULL); | 
|  | /* See target_thread_info_to_thread_handle.  */ | 
|  | virtual gdb::array_view<const_gdb_byte> thread_info_to_thread_handle (struct thread_info *) | 
|  | TARGET_DEFAULT_RETURN (gdb::array_view<const gdb_byte> ()); | 
|  | virtual void stop (ptid_t) | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual void interrupt () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual void pass_ctrlc () | 
|  | TARGET_DEFAULT_FUNC (default_target_pass_ctrlc); | 
|  | virtual void rcmd (const char *command, struct ui_file *output) | 
|  | TARGET_DEFAULT_FUNC (default_rcmd); | 
|  | virtual const char *pid_to_exec_file (int pid) | 
|  | TARGET_DEFAULT_RETURN (NULL); | 
|  | virtual void log_command (const char *) | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual const std::vector<target_section> *get_section_table () | 
|  | TARGET_DEFAULT_RETURN (default_get_section_table ()); | 
|  |  | 
|  | /* Provide default values for all "must have" methods.  */ | 
|  | virtual bool has_all_memory () { return false; } | 
|  | virtual bool has_memory () { return false; } | 
|  | virtual bool has_stack () { return false; } | 
|  | virtual bool has_registers () { return false; } | 
|  | virtual bool has_execution (inferior *inf) { return false; } | 
|  |  | 
|  | /* Control thread execution.  */ | 
|  | virtual thread_control_capabilities get_thread_control_capabilities () | 
|  | TARGET_DEFAULT_RETURN (tc_none); | 
|  | virtual bool attach_no_wait () | 
|  | TARGET_DEFAULT_RETURN (0); | 
|  | /* This method must be implemented in some situations.  See the | 
|  | comment on 'can_run'.  */ | 
|  | virtual bool can_async_p () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | virtual bool is_async_p () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | virtual void async (bool) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  | virtual int async_wait_fd () | 
|  | TARGET_DEFAULT_NORETURN (noprocess ()); | 
|  | /* Return true if the target has pending events to report to the | 
|  | core.  If true, then GDB avoids resuming the target until all | 
|  | pending events are consumed, so that multiple resumptions can | 
|  | be coalesced as an optimization.  Most targets can't tell | 
|  | whether they have pending events without calling target_wait, | 
|  | so we default to returning false.  The only downside is that a | 
|  | potential optimization is missed.  */ | 
|  | virtual bool has_pending_events () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | virtual void thread_events (bool) | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | /* Returns true if the target supports setting thread options | 
|  | OPTIONS, false otherwise.  */ | 
|  | virtual bool supports_set_thread_options (gdb_thread_options options) | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | /* This method must be implemented in some situations.  See the | 
|  | comment on 'can_run'.  */ | 
|  | virtual bool supports_non_stop () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | /* Return true if the target operates in non-stop mode even with | 
|  | "set non-stop off".  */ | 
|  | virtual bool always_non_stop_p () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | /* find_memory_regions support method for gcore */ | 
|  | virtual int find_memory_regions (find_memory_region_ftype func, void *data) | 
|  | TARGET_DEFAULT_FUNC (dummy_find_memory_regions); | 
|  | /* make_corefile_notes support method for gcore */ | 
|  | virtual gdb::unique_xmalloc_ptr<char> make_corefile_notes (bfd *, int *) | 
|  | TARGET_DEFAULT_FUNC (dummy_make_corefile_notes); | 
|  | /* get_bookmark support method for bookmarks */ | 
|  | virtual gdb_byte *get_bookmark (const char *, int) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  | /* goto_bookmark support method for bookmarks */ | 
|  | virtual void goto_bookmark (const gdb_byte *, int) | 
|  | 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 LOAD_MODULE_ADDR.  If that block of | 
|  | thread-local storage hasn't been allocated yet, this function | 
|  | 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, | 
|  | CORE_ADDR offset) | 
|  | TARGET_DEFAULT_NORETURN (generic_tls_error ()); | 
|  |  | 
|  | /* Request that OPS transfer up to LEN addressable units of the target's | 
|  | OBJECT.  When reading from a memory object, the size of an addressable | 
|  | unit is architecture dependent and can be found using | 
|  | gdbarch_addressable_memory_unit_size.  Otherwise, an addressable unit is | 
|  | 1 byte long.  The OFFSET, for a seekable object, specifies the | 
|  | starting point.  The ANNEX can be used to provide additional | 
|  | data-specific information to the target. | 
|  |  | 
|  | When accessing memory, inferior_ptid indicates which process's | 
|  | memory is to be accessed.  This is usually the same process as | 
|  | the current inferior, however it may also be a process that is | 
|  | a fork child of the current inferior, at a moment that the | 
|  | child does not exist in GDB's inferior lists.  This happens | 
|  | when we remove software breakpoints from the address space of a | 
|  | fork child process that we're not going to stay attached to. | 
|  | Because the fork child is a clone of the fork parent, we can | 
|  | use the fork parent inferior's stack for target method | 
|  | delegation. | 
|  |  | 
|  | Return the transferred status, error or OK (an | 
|  | 'enum target_xfer_status' value).  Save the number of addressable units | 
|  | actually transferred in *XFERED_LEN if transfer is successful | 
|  | (TARGET_XFER_OK) or the number unavailable units if the requested | 
|  | data is unavailable (TARGET_XFER_UNAVAILABLE).  *XFERED_LEN | 
|  | smaller than LEN does not indicate the end of the object, only | 
|  | the end of the transfer; higher level code should continue | 
|  | transferring if desired.  This is handled in target.c. | 
|  |  | 
|  | The interface does not support a "retry" mechanism.  Instead it | 
|  | assumes that at least one addressable unit will be transferred on each | 
|  | successful call. | 
|  |  | 
|  | NOTE: cagney/2003-10-17: The current interface can lead to | 
|  | fragmented transfers.  Lower target levels should not implement | 
|  | hacks, such as enlarging the transfer, in an attempt to | 
|  | compensate for this.  Instead, the target stack should be | 
|  | extended so that it implements supply/collect methods and a | 
|  | look-aside object cache.  With that available, the lowest | 
|  | target can safely and freely "push" data up the stack. | 
|  |  | 
|  | See target_read and target_write for more information.  One, | 
|  | and only one, of readbuf or writebuf must be non-NULL.  */ | 
|  |  | 
|  | virtual enum target_xfer_status xfer_partial (enum target_object object, | 
|  | const char *annex, | 
|  | gdb_byte *readbuf, | 
|  | const gdb_byte *writebuf, | 
|  | ULONGEST offset, ULONGEST len, | 
|  | ULONGEST *xfered_len) | 
|  | TARGET_DEFAULT_RETURN (TARGET_XFER_E_IO); | 
|  |  | 
|  | /* Return the limit on the size of any single memory transfer | 
|  | for the target.  */ | 
|  |  | 
|  | virtual ULONGEST get_memory_xfer_limit () | 
|  | TARGET_DEFAULT_RETURN (ULONGEST_MAX); | 
|  |  | 
|  | /* Returns the memory map for the target.  A return value of NULL | 
|  | means that no memory map is available.  If a memory address | 
|  | does not fall within any returned regions, it's assumed to be | 
|  | RAM.  The returned memory regions should not overlap. | 
|  |  | 
|  | The order of regions does not matter; target_memory_map will | 
|  | sort regions by starting address.  For that reason, this | 
|  | function should not be called directly except via | 
|  | target_memory_map. | 
|  |  | 
|  | This method should not cache data; if the memory map could | 
|  | change unexpectedly, it should be invalidated, and higher | 
|  | layers will re-fetch it.  */ | 
|  | virtual std::vector<mem_region> memory_map () | 
|  | TARGET_DEFAULT_RETURN (std::vector<mem_region> ()); | 
|  |  | 
|  | /* Erases the region of flash memory starting at ADDRESS, of | 
|  | length LENGTH. | 
|  |  | 
|  | Precondition: both ADDRESS and ADDRESS+LENGTH should be aligned | 
|  | on flash block boundaries, as reported by 'to_memory_map'.  */ | 
|  | virtual void flash_erase (ULONGEST address, LONGEST length) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Finishes a flash memory write sequence.  After this operation | 
|  | all flash memory should be available for writing and the result | 
|  | of reading from areas written by 'to_flash_write' should be | 
|  | equal to what was written.  */ | 
|  | virtual void flash_done () | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Describe the architecture-specific features of the current | 
|  | inferior. | 
|  |  | 
|  | Returns the description found, or nullptr if no description was | 
|  | available. | 
|  |  | 
|  | If some target features differ between threads, the description | 
|  | returned by read_description (and the resulting gdbarch) won't | 
|  | accurately describe all threads.  In this case, the | 
|  | thread_architecture method can be used to obtain gdbarches that | 
|  | accurately describe each thread.  */ | 
|  | virtual const struct target_desc *read_description () | 
|  | TARGET_DEFAULT_RETURN (NULL); | 
|  |  | 
|  | /* Build the PTID of the thread on which a given task is running, | 
|  | based on LWP and THREAD.  These values are extracted from the | 
|  | task Private_Data section of the Ada Task Control Block, and | 
|  | their interpretation depends on the target.  */ | 
|  | virtual ptid_t get_ada_task_ptid (long lwp, ULONGEST thread) | 
|  | TARGET_DEFAULT_FUNC (default_get_ada_task_ptid); | 
|  |  | 
|  | /* Read one auxv entry from *READPTR, not reading locations >= ENDPTR. | 
|  | Return 0 if *READPTR is already at the end of the buffer. | 
|  | Return -1 if there is insufficient buffer for a whole entry. | 
|  | Return 1 if an entry was read into *TYPEP and *VALP.  */ | 
|  | virtual int auxv_parse (const gdb_byte **readptr, | 
|  | const gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) | 
|  | TARGET_DEFAULT_FUNC (default_auxv_parse); | 
|  |  | 
|  | /* Search SEARCH_SPACE_LEN bytes beginning at START_ADDR for the | 
|  | sequence of bytes in PATTERN with length PATTERN_LEN. | 
|  |  | 
|  | The result is 1 if found, 0 if not found, and -1 if there was an error | 
|  | requiring halting of the search (e.g. memory read error). | 
|  | If the pattern is found the address is recorded in FOUND_ADDRP.  */ | 
|  | virtual int search_memory (CORE_ADDR start_addr, ULONGEST search_space_len, | 
|  | const gdb_byte *pattern, ULONGEST pattern_len, | 
|  | CORE_ADDR *found_addrp) | 
|  | TARGET_DEFAULT_FUNC (default_search_memory); | 
|  |  | 
|  | /* Can target execute in reverse?  */ | 
|  | virtual bool can_execute_reverse () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* The direction the target is currently executing.  Must be | 
|  | implemented on targets that support reverse execution and async | 
|  | mode.  The default simply returns forward execution.  */ | 
|  | virtual enum exec_direction_kind execution_direction () | 
|  | TARGET_DEFAULT_FUNC (default_execution_direction); | 
|  |  | 
|  | /* Does this target support debugging multiple processes | 
|  | simultaneously?  */ | 
|  | virtual bool supports_multi_process () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Does this target support enabling and disabling tracepoints while a trace | 
|  | experiment is running?  */ | 
|  | virtual bool supports_enable_disable_tracepoint () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Does this target support disabling address space randomization?  */ | 
|  | virtual bool supports_disable_randomization () | 
|  | TARGET_DEFAULT_FUNC (find_default_supports_disable_randomization); | 
|  |  | 
|  | /* Does this target support the tracenz bytecode for string collection?  */ | 
|  | virtual bool supports_string_tracing () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Does this target support evaluation of breakpoint conditions on its | 
|  | end?  */ | 
|  | virtual bool supports_evaluation_of_breakpoint_conditions () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Does this target support native dumpcore API?  */ | 
|  | virtual bool supports_dumpcore () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Generate the core file with native target API.  */ | 
|  | virtual void dumpcore (const char *filename) | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  |  | 
|  | /* Does this target support evaluation of breakpoint commands on its | 
|  | end?  */ | 
|  | virtual bool can_run_breakpoint_commands () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Determine current architecture of thread PTID. | 
|  |  | 
|  | The target is supposed to determine the architecture of the code where | 
|  | 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 the current inferior's gdbarch.  */ | 
|  | virtual struct gdbarch *thread_architecture (ptid_t) | 
|  | TARGET_DEFAULT_RETURN (NULL); | 
|  |  | 
|  | /* Target file operations.  */ | 
|  |  | 
|  | /* Return true if the filesystem seen by the current inferior | 
|  | is the local filesystem, false otherwise.  */ | 
|  | virtual bool filesystem_is_local () | 
|  | TARGET_DEFAULT_RETURN (true); | 
|  |  | 
|  | /* 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). | 
|  | If WARN_IF_SLOW is nonzero, print a warning message if the file | 
|  | is being accessed over a link that may be slow.  Return a | 
|  | target file descriptor, or -1 if an error occurs (and set | 
|  | *TARGET_ERRNO).  */ | 
|  | virtual int fileio_open (struct inferior *inf, const char *filename, | 
|  | int flags, int mode, int warn_if_slow, | 
|  | fileio_error *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 | 
|  | (and set *TARGET_ERRNO).  */ | 
|  | virtual int fileio_pwrite (int fd, const gdb_byte *write_buf, int len, | 
|  | ULONGEST offset, fileio_error *target_errno); | 
|  |  | 
|  | /* Read up to LEN bytes FD on the target into READ_BUF. | 
|  | Return the number of bytes read, or -1 if an error occurs | 
|  | (and set *TARGET_ERRNO).  */ | 
|  | virtual int fileio_pread (int fd, gdb_byte *read_buf, int len, | 
|  | ULONGEST offset, fileio_error *target_errno); | 
|  |  | 
|  | /* Get information about the file opened as FD and put it in | 
|  | SB.  Return 0 on success, or -1 if an error occurs (and set | 
|  | *TARGET_ERRNO).  */ | 
|  | virtual int fileio_fstat (int fd, struct stat *sb, fileio_error *target_errno); | 
|  |  | 
|  | /* Get information about the file FILENAME and put it in SB.  Look for | 
|  | FILENAME in the filesystem as seen by INF.  If INF is NULL, use the | 
|  | filesystem seen by the debugger (GDB or, for remote targets, the | 
|  | remote stub).  Return 0 on success, or -1 if an error occurs (and | 
|  | set *TARGET_ERRNO).  */ | 
|  | virtual int fileio_lstat (struct inferior *inf, const char *filename, | 
|  | struct stat *sb, fileio_error *target_errno); | 
|  |  | 
|  | /* Close FD on the target.  Return 0, or -1 if an error occurs | 
|  | (and set *TARGET_ERRNO).  */ | 
|  | virtual int fileio_close (int fd, fileio_error *target_errno); | 
|  |  | 
|  | /* Unlink FILENAME on the target, in the filesystem as seen by | 
|  | INF.  If INF is NULL, use the filesystem seen by the debugger | 
|  | (GDB or, for remote targets, the remote stub).  Return 0, or | 
|  | -1 if an error occurs (and set *TARGET_ERRNO).  */ | 
|  | virtual int fileio_unlink (struct inferior *inf, | 
|  | const char *filename, | 
|  | fileio_error *target_errno); | 
|  |  | 
|  | /* Read value of symbolic link FILENAME on the target, in the | 
|  | filesystem as seen by INF.  If INF is NULL, use the filesystem | 
|  | seen by the debugger (GDB or, for remote targets, the remote | 
|  | stub).  Return a string, or an empty optional if an error | 
|  | occurs (and set *TARGET_ERRNO).  */ | 
|  | virtual std::optional<std::string> fileio_readlink (struct inferior *inf, | 
|  | const char *filename, | 
|  | fileio_error *target_errno); | 
|  |  | 
|  | /* Implement the "info proc" command.  Returns true if the target | 
|  | actually implemented the command, false otherwise.  */ | 
|  | virtual bool info_proc (const char *, enum info_proc_what); | 
|  |  | 
|  | /* Tracepoint-related operations.  */ | 
|  |  | 
|  | /* Prepare the target for a tracing run.  */ | 
|  | virtual void trace_init () | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Send full details of a tracepoint location to the target.  */ | 
|  | virtual void download_tracepoint (struct bp_location *location) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Is the target able to download tracepoint locations in current | 
|  | state?  */ | 
|  | virtual bool can_download_tracepoint () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Send full details of a trace state variable to the target.  */ | 
|  | virtual void download_trace_state_variable (const trace_state_variable &tsv) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Enable a tracepoint on the target.  */ | 
|  | virtual void enable_tracepoint (struct bp_location *location) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Disable a tracepoint on the target.  */ | 
|  | virtual void disable_tracepoint (struct bp_location *location) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Inform the target info of memory regions that are readonly | 
|  | (such as text sections), and so it should return data from | 
|  | those rather than look in the trace buffer.  */ | 
|  | virtual void trace_set_readonly_regions () | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Start a trace run.  */ | 
|  | virtual void trace_start () | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Get the current status of a tracing run.  */ | 
|  | virtual int get_trace_status (struct trace_status *ts) | 
|  | TARGET_DEFAULT_RETURN (-1); | 
|  |  | 
|  | virtual void get_tracepoint_status (tracepoint *tp, | 
|  | struct uploaded_tp *utp) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Stop a trace run.  */ | 
|  | virtual void trace_stop () | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Ask the target to find a trace frame of the given type TYPE, | 
|  | using NUM, ADDR1, and ADDR2 as search parameters.  Returns the | 
|  | number of the trace frame, and also the tracepoint number at | 
|  | TPP.  If no trace frame matches, return -1.  May throw if the | 
|  | operation fails.  */ | 
|  | virtual int trace_find (enum trace_find_type type, int num, | 
|  | CORE_ADDR addr1, CORE_ADDR addr2, int *tpp) | 
|  | TARGET_DEFAULT_RETURN (-1); | 
|  |  | 
|  | /* Get the value of the trace state variable number TSV, returning | 
|  | 1 if the value is known and writing the value itself into the | 
|  | location pointed to by VAL, else returning 0.  */ | 
|  | virtual bool get_trace_state_variable_value (int tsv, LONGEST *val) | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | virtual int save_trace_data (const char *filename) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | virtual int upload_tracepoints (struct uploaded_tp **utpp) | 
|  | TARGET_DEFAULT_RETURN (0); | 
|  |  | 
|  | virtual int upload_trace_state_variables (struct uploaded_tsv **utsvp) | 
|  | TARGET_DEFAULT_RETURN (0); | 
|  |  | 
|  | virtual LONGEST get_raw_trace_data (gdb_byte *buf, | 
|  | ULONGEST offset, LONGEST len) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Get the minimum length of instruction on which a fast tracepoint | 
|  | may be set on the target.  If this operation is unsupported, | 
|  | return -1.  If for some reason the minimum length cannot be | 
|  | determined, return 0.  */ | 
|  | virtual int get_min_fast_tracepoint_insn_len () | 
|  | TARGET_DEFAULT_RETURN (-1); | 
|  |  | 
|  | /* Set the target's tracing behavior in response to unexpected | 
|  | disconnection - set VAL to 1 to keep tracing, 0 to stop.  */ | 
|  | virtual void set_disconnected_tracing (int val) | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | virtual void set_circular_trace_buffer (int val) | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  | /* Set the size of trace buffer in the target.  */ | 
|  | virtual void set_trace_buffer_size (LONGEST val) | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  |  | 
|  | /* Add/change textual notes about the trace run, returning true if | 
|  | successful, false otherwise.  */ | 
|  | virtual bool set_trace_notes (const char *user, const char *notes, | 
|  | const char *stopnotes) | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Return the processor core that thread PTID was last seen on. | 
|  | This information is updated only when: | 
|  | - update_thread_list is called | 
|  | - thread stops | 
|  | If the core cannot be determined -- either for the specified | 
|  | thread, or right now, or in this debug session, or for this | 
|  | target -- return -1.  */ | 
|  | virtual int core_of_thread (ptid_t ptid) | 
|  | TARGET_DEFAULT_RETURN (-1); | 
|  |  | 
|  | /* Verify that the memory in the [MEMADDR, MEMADDR+SIZE) range | 
|  | matches the contents of [DATA,DATA+SIZE).  Returns 1 if there's | 
|  | a match, 0 if there's a mismatch, and -1 if an error is | 
|  | encountered while reading memory.  */ | 
|  | virtual int verify_memory (const gdb_byte *data, | 
|  | CORE_ADDR memaddr, ULONGEST size) | 
|  | TARGET_DEFAULT_FUNC (default_verify_memory); | 
|  |  | 
|  | /* Set *ADDR to the address of the start of the Thread Information | 
|  | Block (TIB) for thread PTID.  Return true on success and false | 
|  | otherwise. | 
|  |  | 
|  | ADDR may be nullptr, in which case the checks will be done but | 
|  | the result will be discarded.  */ | 
|  | virtual bool get_tib_address (ptid_t ptid, CORE_ADDR *addr) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Send the new settings of write permission variables.  */ | 
|  | virtual void set_permissions () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  |  | 
|  | /* Look for a static tracepoint marker at ADDR, and fill in MARKER | 
|  | with its details.  Return true on success, false on failure.  */ | 
|  | virtual bool static_tracepoint_marker_at (CORE_ADDR, | 
|  | static_tracepoint_marker *marker) | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Return a vector of all tracepoints markers string id ID, or all | 
|  | markers if ID is NULL.  */ | 
|  | virtual std::vector<static_tracepoint_marker> | 
|  | static_tracepoint_markers_by_strid (const char *id) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Return a traceframe info object describing the current | 
|  | traceframe's contents.  This method should not cache data; | 
|  | higher layers take care of caching, invalidating, and | 
|  | re-fetching when necessary.  */ | 
|  | virtual traceframe_info_up traceframe_info () | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Ask the target to use or not to use agent according to USE. | 
|  | Return true if successful, false otherwise.  */ | 
|  | virtual bool use_agent (bool use) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Is the target able to use agent in current state?  */ | 
|  | virtual bool can_use_agent () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Enable branch tracing for TP using CONF configuration. | 
|  | Return a branch trace target information struct for reading and for | 
|  | disabling branch trace.  */ | 
|  | virtual struct btrace_target_info *enable_btrace (thread_info *tp, | 
|  | const struct btrace_config *conf) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Disable branch tracing and deallocate TINFO.  */ | 
|  | virtual void disable_btrace (struct btrace_target_info *tinfo) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Disable branch tracing and deallocate TINFO.  This function is similar | 
|  | to to_disable_btrace, except that it is called during teardown and is | 
|  | only allowed to perform actions that are safe.  A counter-example would | 
|  | be attempting to talk to a remote target.  */ | 
|  | virtual void teardown_btrace (struct btrace_target_info *tinfo) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Read branch trace data for the thread indicated by BTINFO into DATA. | 
|  | DATA is cleared before new trace is added.  */ | 
|  | virtual enum btrace_error read_btrace (struct btrace_data *data, | 
|  | struct btrace_target_info *btinfo, | 
|  | enum btrace_read_type type) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Get the branch trace configuration.  */ | 
|  | virtual const struct btrace_config *btrace_conf (const struct btrace_target_info *) | 
|  | TARGET_DEFAULT_RETURN (NULL); | 
|  |  | 
|  | /* Current recording method.  */ | 
|  | virtual enum record_method record_method (ptid_t ptid) | 
|  | TARGET_DEFAULT_RETURN (RECORD_METHOD_NONE); | 
|  |  | 
|  | /* Stop trace recording.  */ | 
|  | virtual void stop_recording () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  |  | 
|  | /* Print information about the recording.  */ | 
|  | virtual void info_record () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  |  | 
|  | /* Save the recorded execution trace into a file.  */ | 
|  | virtual void save_record (const char *filename) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Delete the recorded execution trace from the current position | 
|  | onwards.  */ | 
|  | virtual bool supports_delete_record () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  | virtual void delete_record () | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Query if the record target is currently replaying PTID.  */ | 
|  | virtual bool record_is_replaying (ptid_t ptid) | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Query if the record target will replay PTID if it were resumed in | 
|  | execution direction DIR.  */ | 
|  | virtual bool record_will_replay (ptid_t ptid, int dir) | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Stop replaying.  */ | 
|  | virtual void record_stop_replaying () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  |  | 
|  | /* Go to the begin of the execution trace.  */ | 
|  | virtual void goto_record_begin () | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Go to the end of the execution trace.  */ | 
|  | virtual void goto_record_end () | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Go to a specific location in the recorded execution trace.  */ | 
|  | virtual void goto_record (ULONGEST insn) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Disassemble SIZE instructions in the recorded execution trace from | 
|  | the current position. | 
|  | If SIZE < 0, disassemble abs (SIZE) preceding instructions; otherwise, | 
|  | disassemble SIZE succeeding instructions.  */ | 
|  | virtual void insn_history (int size, gdb_disassembly_flags flags) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Disassemble SIZE instructions in the recorded execution trace around | 
|  | FROM. | 
|  | If SIZE < 0, disassemble abs (SIZE) instructions before FROM; otherwise, | 
|  | disassemble SIZE instructions after FROM.  */ | 
|  | virtual void insn_history_from (ULONGEST from, int size, | 
|  | gdb_disassembly_flags flags) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Disassemble a section of the recorded execution trace from instruction | 
|  | BEGIN (inclusive) to instruction END (inclusive).  */ | 
|  | virtual void insn_history_range (ULONGEST begin, ULONGEST end, | 
|  | gdb_disassembly_flags flags) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Print a function trace of the recorded execution trace. | 
|  | If SIZE < 0, print abs (SIZE) preceding functions; otherwise, print SIZE | 
|  | succeeding functions.  */ | 
|  | virtual void call_history (int size, record_print_flags flags) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Print a function trace of the recorded execution trace starting | 
|  | at function FROM. | 
|  | If SIZE < 0, print abs (SIZE) functions before FROM; otherwise, print | 
|  | SIZE functions after FROM.  */ | 
|  | virtual void call_history_from (ULONGEST begin, int size, record_print_flags flags) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Print a function trace of an execution trace section from function BEGIN | 
|  | (inclusive) to function END (inclusive).  */ | 
|  | virtual void call_history_range (ULONGEST begin, ULONGEST end, record_print_flags flags) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* True if TARGET_OBJECT_LIBRARIES_SVR4 may be read with a | 
|  | non-empty annex.  */ | 
|  | virtual bool augmented_libraries_svr4_read () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Those unwinders are tried before any other arch unwinders.  If | 
|  | SELF doesn't have unwinders, it should delegate to the | 
|  | "beneath" target.  */ | 
|  | virtual const struct frame_unwind *get_unwinder () | 
|  | TARGET_DEFAULT_RETURN (NULL); | 
|  |  | 
|  | virtual const struct frame_unwind *get_tailcall_unwinder () | 
|  | TARGET_DEFAULT_RETURN (NULL); | 
|  |  | 
|  | /* Prepare to generate a core file.  */ | 
|  | virtual void prepare_to_generate_core () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  |  | 
|  | /* Cleanup after generating a core file.  */ | 
|  | virtual void done_generating_core () | 
|  | TARGET_DEFAULT_IGNORE (); | 
|  |  | 
|  | /* Returns true if the target supports memory tagging, false otherwise.  */ | 
|  | virtual bool supports_memory_tagging () | 
|  | TARGET_DEFAULT_RETURN (false); | 
|  |  | 
|  | /* Return the allocated memory tags of type TYPE associated with | 
|  | [ADDRESS, ADDRESS + LEN) in TAGS. | 
|  |  | 
|  | LEN is the number of bytes in the memory range.  TAGS is a vector of | 
|  | bytes containing the tags found in the above memory range. | 
|  |  | 
|  | It is up to the architecture/target to interpret the bytes in the TAGS | 
|  | vector and read the tags appropriately. | 
|  |  | 
|  | Returns true if fetching the tags succeeded and false otherwise.  */ | 
|  | virtual bool fetch_memtags (CORE_ADDR address, size_t len, | 
|  | gdb::byte_vector &tags, int type) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Write the allocation tags of type TYPE contained in TAGS to the memory | 
|  | range [ADDRESS, ADDRESS + LEN). | 
|  |  | 
|  | LEN is the number of bytes in the memory range.  TAGS is a vector of | 
|  | bytes containing the tags to be stored to the memory range. | 
|  |  | 
|  | It is up to the architecture/target to interpret the bytes in the TAGS | 
|  | vector and store them appropriately. | 
|  |  | 
|  | Returns true if storing the tags succeeded and false otherwise.  */ | 
|  | virtual bool store_memtags (CORE_ADDR address, size_t len, | 
|  | const gdb::byte_vector &tags, int type) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Returns true if ADDRESS is tagged, otherwise returns false.  */ | 
|  | virtual bool is_address_tagged (gdbarch *gdbarch, CORE_ADDR address) | 
|  | TARGET_DEFAULT_NORETURN (tcomplain ()); | 
|  |  | 
|  | /* Return the x86 XSAVE extended state area layout.  */ | 
|  | virtual x86_xsave_layout fetch_x86_xsave_layout () | 
|  | TARGET_DEFAULT_RETURN (x86_xsave_layout ()); | 
|  |  | 
|  | /* Return true if the target supports displaced stepping for THREAD.  */ | 
|  | virtual bool supports_displaced_step (thread_info *thread) | 
|  | TARGET_DEFAULT_FUNC (default_supports_displaced_step); | 
|  |  | 
|  | /* See documentation of gdbarch_displaced_step_prepare.  */ | 
|  | virtual displaced_step_prepare_status displaced_step_prepare (thread_info *thread, | 
|  | CORE_ADDR &displaced_pc) | 
|  | TARGET_DEFAULT_FUNC (default_displaced_step_prepare); | 
|  |  | 
|  | /* See documentation of gdbarch_displaced_step_finish.  */ | 
|  | virtual displaced_step_finish_status displaced_step_finish | 
|  | (thread_info *thread, const target_waitstatus &status) | 
|  | TARGET_DEFAULT_FUNC (default_displaced_step_finish); | 
|  |  | 
|  | /* See documentation of gdbarch_displaced_step_restore_all_in_ptid.  */ | 
|  | virtual void displaced_step_restore_all_in_ptid (inferior *parent_inf, | 
|  | ptid_t child_ptid) | 
|  | TARGET_DEFAULT_FUNC (default_displaced_step_restore_all_in_ptid); | 
|  | }; | 
|  |  | 
|  | /* Deleter for std::unique_ptr.  See comments in | 
|  | target_ops::~target_ops and target_ops::close about heap-allocated | 
|  | targets.  */ | 
|  | struct target_ops_deleter | 
|  | { | 
|  | void operator() (target_ops *target) | 
|  | { | 
|  | target->close (); | 
|  | } | 
|  | }; | 
|  |  | 
|  | /* A unique pointer for target_ops.  */ | 
|  | typedef std::unique_ptr<target_ops, target_ops_deleter> target_ops_up; | 
|  |  | 
|  | /* A policy class to interface gdb::ref_ptr with target_ops.  */ | 
|  |  | 
|  | struct target_ops_ref_policy | 
|  | { | 
|  | static void incref (target_ops *t) | 
|  | { | 
|  | t->incref (); | 
|  | } | 
|  |  | 
|  | /* Decrement the reference count on T, and, if the reference count | 
|  | reaches zero, close the target.  */ | 
|  | static void decref (target_ops *t); | 
|  | }; | 
|  |  | 
|  | /* A gdb::ref_ptr pointer to a target_ops.  */ | 
|  | typedef gdb::ref_ptr<target_ops, target_ops_ref_policy> 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.  */ | 
|  | extern void set_native_target (target_ops *target); | 
|  |  | 
|  | /* Get the registered native target, if there's one.  Otherwise return | 
|  | NULL.  */ | 
|  | extern target_ops *get_native_target (); | 
|  |  | 
|  | /* Type that manages a target stack.  See description of target stacks | 
|  | and strata at the top of the file.  */ | 
|  |  | 
|  | class target_stack | 
|  | { | 
|  | public: | 
|  | target_stack () = default; | 
|  | DISABLE_COPY_AND_ASSIGN (target_stack); | 
|  |  | 
|  | /* Push a new target into the stack of the existing target | 
|  | accessors, possibly superseding some existing accessor.  */ | 
|  | void push (target_ops *t); | 
|  |  | 
|  | /* Remove a target from the stack, wherever it may be.  Return true | 
|  | if it was removed, false otherwise.  */ | 
|  | bool unpush (target_ops *t); | 
|  |  | 
|  | /* Returns true if T is pushed on the target stack.  */ | 
|  | bool is_pushed (const target_ops *t) const | 
|  | { return at (t->stratum ()) == t; } | 
|  |  | 
|  | /* Return the target at STRATUM.  */ | 
|  | target_ops *at (strata stratum) const { return m_stack[stratum].get (); } | 
|  |  | 
|  | /* Return the target at the top of the stack.  */ | 
|  | target_ops *top () const { return at (m_top); } | 
|  |  | 
|  | /* Find the next target down the stack from the specified target.  */ | 
|  | target_ops *find_beneath (const target_ops *t) const; | 
|  |  | 
|  | private: | 
|  | /* The stratum of the top target.  */ | 
|  | enum strata m_top {}; | 
|  |  | 
|  | /* The stack, represented as an array, with one slot per stratum. | 
|  | If no target is pushed at some stratum, the corresponding slot is | 
|  | null.  */ | 
|  | std::array<target_ops_ref, (int) debug_stratum + 1> m_stack; | 
|  | }; | 
|  |  | 
|  | /* Return the dummy target.  */ | 
|  | extern target_ops *get_dummy_target (); | 
|  |  | 
|  | /* Define easy words for doing these operations on our current target.  */ | 
|  |  | 
|  | extern const char *target_shortname (); | 
|  |  | 
|  | /* Find the correct target to use for "attach".  If a target on the | 
|  | current stack supports attaching, then it is returned.  Otherwise, | 
|  | the default run target is returned.  */ | 
|  |  | 
|  | extern struct target_ops *find_attach_target (void); | 
|  |  | 
|  | /* Find the correct target to use for "run".  If a target on the | 
|  | current stack supports creating a new inferior, then it is | 
|  | returned.  Otherwise, the default run target is returned.  */ | 
|  |  | 
|  | extern struct target_ops *find_run_target (void); | 
|  |  | 
|  | /* Some targets don't generate traps when attaching to the inferior, | 
|  | or their target_attach implementation takes care of the waiting. | 
|  | These targets must set to_attach_no_wait.  */ | 
|  |  | 
|  | extern bool target_attach_no_wait (); | 
|  |  | 
|  | /* The target_attach operation places a process under debugger control, | 
|  | and stops the process. | 
|  |  | 
|  | This operation provides a target-specific hook that allows the | 
|  | necessary bookkeeping to be performed after an attach completes.  */ | 
|  |  | 
|  | extern void target_post_attach (int pid); | 
|  |  | 
|  | /* Display a message indicating we're about to attach to a given | 
|  | process.  */ | 
|  |  | 
|  | extern void target_announce_attach (int from_tty, int pid); | 
|  |  | 
|  | /* Display a message indicating we're about to detach from the current | 
|  | inferior process.  */ | 
|  |  | 
|  | extern void target_announce_detach (int from_tty); | 
|  |  | 
|  | /* Takes a program previously attached to and detaches it. | 
|  | The program may resume execution (some targets do, some don't) and will | 
|  | no longer stop on signals, etc.  We better not have left any breakpoints | 
|  | in the program or it'll die when it hits one.  FROM_TTY says whether to be | 
|  | verbose or not.  */ | 
|  |  | 
|  | extern void target_detach (inferior *inf, int from_tty); | 
|  |  | 
|  | /* Disconnect from the current target without resuming it (leaving it | 
|  | waiting for a debugger).  */ | 
|  |  | 
|  | extern void target_disconnect (const char *, int); | 
|  |  | 
|  | /* Resume execution (or prepare for execution) of the current thread | 
|  | (INFERIOR_PTID), while optionally letting other threads of the | 
|  | current process or all processes run free. | 
|  |  | 
|  | STEP says whether to hardware single-step the current thread or to | 
|  | let it run free; SIGNAL is the signal to be given to the current | 
|  | thread, or GDB_SIGNAL_0 for no signal.  The caller may not pass | 
|  | GDB_SIGNAL_DEFAULT. | 
|  |  | 
|  | SCOPE_PTID indicates the resumption scope.  I.e., which threads | 
|  | (other than the current) run free.  If resuming a single thread, | 
|  | SCOPE_PTID is the same thread as the current thread.  A wildcard | 
|  | SCOPE_PTID (all threads, or all threads of process) lets threads | 
|  | other than the current (for which the wildcard SCOPE_PTID matches) | 
|  | resume with their 'thread->suspend.stop_signal' signal (usually | 
|  | GDB_SIGNAL_0) if it is in "pass" state, or with no signal if in "no | 
|  | pass" state.  Note neither STEP nor SIGNAL apply to any thread | 
|  | other than the current. | 
|  |  | 
|  | In order to efficiently handle batches of resumption requests, | 
|  | targets may implement this method such that it records the | 
|  | resumption request, but defers the actual resumption to the | 
|  | target_commit_resume method implementation.  See | 
|  | target_commit_resume below.  */ | 
|  | extern void target_resume (ptid_t scope_ptid, | 
|  | int step, enum gdb_signal signal); | 
|  |  | 
|  | /* Ensure that all resumed threads are committed to the target. | 
|  |  | 
|  | See the description of process_stratum_target::commit_resumed_state | 
|  | for more details.  */ | 
|  | extern void target_commit_resumed (); | 
|  |  | 
|  | /* For target_read_memory see target/target.h.  */ | 
|  |  | 
|  | /* The default target_ops::to_wait implementation.  */ | 
|  |  | 
|  | extern ptid_t default_target_wait (struct target_ops *ops, | 
|  | ptid_t ptid, | 
|  | struct target_waitstatus *status, | 
|  | target_wait_flags options); | 
|  |  | 
|  | /* Return true if the target has pending events to report to the core. | 
|  | See target_ops::has_pending_events().  */ | 
|  |  | 
|  | extern bool target_has_pending_events (); | 
|  |  | 
|  | /* Fetch at least register REGNO, or all regs if regno == -1.  No result.  */ | 
|  |  | 
|  | extern void target_fetch_registers (struct regcache *regcache, int regno); | 
|  |  | 
|  | /* Store at least register REGNO, or all regs if REGNO == -1. | 
|  | It can store as many registers as it wants to, so target_prepare_to_store | 
|  | must have been previously called.  Calls error() if there are problems.  */ | 
|  |  | 
|  | extern void target_store_registers (struct regcache *regcache, int regs); | 
|  |  | 
|  | /* Get ready to modify the registers array.  On machines which store | 
|  | individual registers, this doesn't need to do anything.  On machines | 
|  | which store all the registers in one fell swoop, this makes sure | 
|  | that REGISTERS contains all the registers from the program being | 
|  | debugged.  */ | 
|  |  | 
|  | extern void target_prepare_to_store (regcache *regcache); | 
|  |  | 
|  | /* Implement the "info proc" command.  This returns one if the request | 
|  | was handled, and zero otherwise.  It can also throw an exception if | 
|  | an error was encountered while attempting to handle the | 
|  | request.  */ | 
|  |  | 
|  | int target_info_proc (const char *, enum info_proc_what); | 
|  |  | 
|  | /* Returns true if this target can disable address space randomization.  */ | 
|  |  | 
|  | int target_supports_disable_randomization (void); | 
|  |  | 
|  | /* Returns true if this target can enable and disable tracepoints | 
|  | while a trace experiment is running.  */ | 
|  |  | 
|  | extern bool target_supports_enable_disable_tracepoint (); | 
|  |  | 
|  | extern bool target_supports_string_tracing (); | 
|  |  | 
|  | /* Returns true if this target can handle breakpoint conditions | 
|  | on its end.  */ | 
|  |  | 
|  | extern bool target_supports_evaluation_of_breakpoint_conditions (); | 
|  |  | 
|  | /* Does this target support dumpcore API?  */ | 
|  |  | 
|  | extern bool target_supports_dumpcore (); | 
|  |  | 
|  | /* Generate the core file with target API.  */ | 
|  |  | 
|  | extern void target_dumpcore (const char *filename); | 
|  |  | 
|  | /* Returns true if this target can handle breakpoint commands | 
|  | on its end.  */ | 
|  |  | 
|  | extern bool target_can_run_breakpoint_commands (); | 
|  |  | 
|  | /* For target_read_memory see target/target.h.  */ | 
|  |  | 
|  | extern int target_read_raw_memory (CORE_ADDR memaddr, gdb_byte *myaddr, | 
|  | ssize_t len); | 
|  |  | 
|  | extern int target_read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len); | 
|  |  | 
|  | extern int target_read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len); | 
|  |  | 
|  | /* For target_write_memory see target/target.h.  */ | 
|  |  | 
|  | extern int target_write_raw_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, | 
|  | ssize_t len); | 
|  |  | 
|  | /* Fetches the target's memory map.  If one is found it is sorted | 
|  | and returned, after some consistency checking.  Otherwise, NULL | 
|  | is returned.  */ | 
|  | std::vector<mem_region> target_memory_map (void); | 
|  |  | 
|  | /* Erases all flash memory regions on the target.  */ | 
|  | void flash_erase_command (const char *cmd, int from_tty); | 
|  |  | 
|  | /* Erase the specified flash region.  */ | 
|  | void target_flash_erase (ULONGEST address, LONGEST length); | 
|  |  | 
|  | /* Finish a sequence of flash operations.  */ | 
|  | void target_flash_done (void); | 
|  |  | 
|  | /* Describes a request for a memory write operation.  */ | 
|  | struct memory_write_request | 
|  | { | 
|  | memory_write_request (ULONGEST begin_, ULONGEST end_, | 
|  | gdb_byte *data_ = nullptr, void *baton_ = nullptr) | 
|  | : begin (begin_), end (end_), data (data_), baton (baton_) | 
|  | {} | 
|  |  | 
|  | /* Beginning address that must be written.  */ | 
|  | ULONGEST begin; | 
|  | /* Past-the-end address.  */ | 
|  | ULONGEST end; | 
|  | /* The data to write.  */ | 
|  | gdb_byte *data; | 
|  | /* A callback baton for progress reporting for this request.  */ | 
|  | void *baton; | 
|  | }; | 
|  |  | 
|  | /* Enumeration specifying different flash preservation behavior.  */ | 
|  | enum flash_preserve_mode | 
|  | { | 
|  | flash_preserve, | 
|  | flash_discard | 
|  | }; | 
|  |  | 
|  | /* Write several memory blocks at once.  This version can be more | 
|  | efficient than making several calls to target_write_memory, in | 
|  | particular because it can optimize accesses to flash memory. | 
|  |  | 
|  | Moreover, this is currently the only memory access function in gdb | 
|  | 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 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 | 
|  | feedback to user.  It will be called with the baton corresponding | 
|  | to the request currently being written.  It may also be called | 
|  | with a NULL baton, when preserved flash sectors are being rewritten. | 
|  |  | 
|  | The function returns 0 on success, and error otherwise.  */ | 
|  | int target_write_memory_blocks | 
|  | (const std::vector<memory_write_request> &requests, | 
|  | enum flash_preserve_mode preserve_flash_p, | 
|  | void (*progress_cb) (ULONGEST, void *)); | 
|  |  | 
|  | /* Print a line about the current target.  */ | 
|  |  | 
|  | extern void target_files_info (); | 
|  |  | 
|  | /* Insert a breakpoint at address BP_TGT->placed_address in | 
|  | the target machine.  Returns 0 for success, and returns non-zero or | 
|  | throws an error (with a detailed failure reason error code and | 
|  | message) otherwise.  */ | 
|  |  | 
|  | extern int target_insert_breakpoint (struct gdbarch *gdbarch, | 
|  | struct bp_target_info *bp_tgt); | 
|  |  | 
|  | /* Remove a breakpoint at address BP_TGT->placed_address in the target | 
|  | machine.  Result is 0 for success, non-zero for error.  */ | 
|  |  | 
|  | extern int target_remove_breakpoint (struct gdbarch *gdbarch, | 
|  | struct bp_target_info *bp_tgt, | 
|  | enum remove_bp_reason reason); | 
|  |  | 
|  | /* Return true if the target stack has a non-default | 
|  | "terminal_ours" method.  */ | 
|  |  | 
|  | extern bool target_supports_terminal_ours (void); | 
|  |  | 
|  | /* Kill the inferior process.   Make it go away.  */ | 
|  |  | 
|  | extern void target_kill (void); | 
|  |  | 
|  | /* Load an executable file into the target process.  This is expected | 
|  | to not only bring new code into the target process, but also to | 
|  | update GDB's symbol tables to match. | 
|  |  | 
|  | ARG contains command-line arguments, to be broken down with | 
|  | buildargv ().  The first non-switch argument is the filename to | 
|  | load, FILE; the second is a number (as parsed by strtoul (..., ..., | 
|  | 0)), which is an offset to apply to the load addresses of FILE's | 
|  | sections.  The target may define switches, or other non-switch | 
|  | arguments, as it pleases.  */ | 
|  |  | 
|  | extern void target_load (const char *arg, int from_tty); | 
|  |  | 
|  | /* On some targets, we can catch an inferior fork or vfork event when | 
|  | it occurs.  These functions insert/remove an already-created | 
|  | catchpoint for such events.  They return  0 for success, 1 if the | 
|  | catchpoint type is not supported and -1 for failure.  */ | 
|  |  | 
|  | extern int target_insert_fork_catchpoint (int pid); | 
|  |  | 
|  | extern int target_remove_fork_catchpoint (int pid); | 
|  |  | 
|  | extern int target_insert_vfork_catchpoint (int pid); | 
|  |  | 
|  | extern int target_remove_vfork_catchpoint (int pid); | 
|  |  | 
|  | /* Call the follow_fork method on the current target stack. | 
|  |  | 
|  | This function is called when the inferior forks or vforks, to perform any | 
|  | bookkeeping and fiddling necessary to continue debugging either the parent, | 
|  | the child or both.  */ | 
|  |  | 
|  | void target_follow_fork (inferior *inf, ptid_t child_ptid, | 
|  | target_waitkind fork_kind, bool follow_child, | 
|  | bool detach_fork); | 
|  |  | 
|  | /* Handle the target-specific bookkeeping required when the inferior makes an | 
|  | exec call. | 
|  |  | 
|  | The current inferior at the time of the call is the inferior that did the | 
|  | exec.  FOLLOW_INF is the inferior in which execution continues post-exec. | 
|  | If "follow-exec-mode" is "same", FOLLOW_INF is the same as the current | 
|  | inferior, meaning that execution continues with the same inferior.  If | 
|  | "follow-exec-mode" is "new", FOLLOW_INF is a different inferior, meaning | 
|  | that execution continues in a new inferior. | 
|  |  | 
|  | On exit, the target must leave FOLLOW_INF as the current inferior.  */ | 
|  |  | 
|  | void target_follow_exec (inferior *follow_inf, ptid_t ptid, | 
|  | const char *execd_pathname); | 
|  |  | 
|  | /* On some targets, we can catch an inferior exec event when it | 
|  | occurs.  These functions insert/remove an already-created | 
|  | catchpoint for such events.  They return  0 for success, 1 if the | 
|  | catchpoint type is not supported and -1 for failure.  */ | 
|  |  | 
|  | extern int target_insert_exec_catchpoint (int pid); | 
|  |  | 
|  | extern int target_remove_exec_catchpoint (int pid); | 
|  |  | 
|  | /* Syscall catch. | 
|  |  | 
|  | NEEDED is true if any syscall catch (of any kind) is requested. | 
|  | If NEEDED is false, it means the target can disable the mechanism to | 
|  | catch system calls because there are no more catchpoints of this type. | 
|  |  | 
|  | ANY_COUNT is nonzero if a generic (filter-less) syscall catch is | 
|  | being requested.  In this case, SYSCALL_COUNTS should be ignored. | 
|  |  | 
|  | SYSCALL_COUNTS is an array of ints, indexed by syscall number.  An | 
|  | element in this array is nonzero if that syscall should be caught. | 
|  | This argument only matters if ANY_COUNT is zero. | 
|  |  | 
|  | Return 0 for success, 1 if syscall catchpoints are not supported or -1 | 
|  | for failure.  */ | 
|  |  | 
|  | extern int target_set_syscall_catchpoint | 
|  | (int pid, bool needed, int any_count, | 
|  | gdb::array_view<const int> syscall_counts); | 
|  |  | 
|  | /* The debugger has completed a blocking wait() call.  There is now | 
|  | some process event that must be processed.  This function should | 
|  | be defined by those targets that require the debugger to perform | 
|  | cleanup or internal state changes in response to the process event.  */ | 
|  |  | 
|  | /* For target_mourn_inferior see target/target.h.  */ | 
|  |  | 
|  | /* Does target have enough data to do a run or attach command?  */ | 
|  |  | 
|  | extern int target_can_run (); | 
|  |  | 
|  | /* Set list of signals to be handled in the target. | 
|  |  | 
|  | 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, | 
|  | and to pass the signal directly to the inferior instead. | 
|  |  | 
|  | However, if the target is hardware single-stepping a thread that is | 
|  | 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 | 
|  | (gdb::array_view<const unsigned char> 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 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 | 
|  | discarded.  This does not influence whether to pass signals to the | 
|  | inferior as a result of a target_resume call.  This is useful in | 
|  | scenarios where the target needs to decide whether to pass or not a | 
|  | signal to the inferior without GDB core involvement, such as for | 
|  | example, when detaching (as threads may have been suspended with | 
|  | pending signals not reported to GDB).  */ | 
|  |  | 
|  | extern void target_program_signals | 
|  | (gdb::array_view<const unsigned char> program_signals); | 
|  |  | 
|  | /* Check to see if a thread is still alive.  */ | 
|  |  | 
|  | extern int target_thread_alive (ptid_t ptid); | 
|  |  | 
|  | /* Sync the target's threads with GDB's thread list.  */ | 
|  |  | 
|  | extern void target_update_thread_list (void); | 
|  |  | 
|  | /* Make target stop in a continuable fashion.  (For instance, under | 
|  | Unix, this should act like SIGSTOP).  Note that this function is | 
|  | asynchronous: it does not wait for the target to become stopped | 
|  | before returning.  If this is the behavior you want please use | 
|  | target_stop_and_wait.  */ | 
|  |  | 
|  | extern void target_stop (ptid_t ptid); | 
|  |  | 
|  | /* Interrupt the target.  Unlike target_stop, this does not specify | 
|  | which thread/process reports the stop.  For most target this acts | 
|  | like raising a SIGINT, though that's not absolutely required.  This | 
|  | function is asynchronous.  */ | 
|  |  | 
|  | extern void target_interrupt (); | 
|  |  | 
|  | /* Pass a ^C, as determined to have been pressed by checking the quit | 
|  | flag, to the target, as if the user had typed the ^C on the | 
|  | inferior's controlling terminal while the inferior was in the | 
|  | foreground.  Remote targets may take the opportunity to detect the | 
|  | remote side is not responding and offer to disconnect.  */ | 
|  |  | 
|  | extern void target_pass_ctrlc (void); | 
|  |  | 
|  | /* The default target_ops::to_pass_ctrlc implementation.  Simply calls | 
|  | target_interrupt.  */ | 
|  | extern void default_target_pass_ctrlc (struct target_ops *ops); | 
|  |  | 
|  | /* Send the specified COMMAND to the target's monitor | 
|  | (shell,interpreter) for execution.  The result of the query is | 
|  | placed in OUTBUF.  */ | 
|  |  | 
|  | extern void target_rcmd (const char *command, struct ui_file *outbuf); | 
|  |  | 
|  | /* Does the target include memory?  (Dummy targets don't.)  */ | 
|  |  | 
|  | extern int target_has_memory (); | 
|  |  | 
|  | /* Does the target have a stack?  (Exec files don't, VxWorks doesn't, until | 
|  | we start a process.)  */ | 
|  |  | 
|  | extern int target_has_stack (); | 
|  |  | 
|  | /* Does the target have registers?  (Exec files don't.)  */ | 
|  |  | 
|  | extern int target_has_registers (); | 
|  |  | 
|  | /* Does the target have execution?  Can we make it jump (through | 
|  | hoops), or pop its stack a few times?  This means that the current | 
|  | target is currently executing; for some targets, that's the same as | 
|  | whether or not the target is capable of execution, but there are | 
|  | also targets which can be current while not executing.  In that | 
|  | case this will become true after to_create_inferior or | 
|  | to_attach.  INF is the inferior to use; nullptr means to use the | 
|  | current inferior.  */ | 
|  |  | 
|  | extern bool target_has_execution (inferior *inf = nullptr); | 
|  |  | 
|  | /* Can the target support the debugger control of thread execution? | 
|  | Can it lock the thread scheduler?  */ | 
|  |  | 
|  | extern bool target_can_lock_scheduler (); | 
|  |  | 
|  | /* Controls whether async mode is permitted.  */ | 
|  | extern bool target_async_permitted; | 
|  |  | 
|  | /* Can the target support asynchronous execution?  */ | 
|  | extern bool target_can_async_p (); | 
|  |  | 
|  | /* An overload of the above that can be called when the target is not yet | 
|  | pushed, this calls TARGET::can_async_p directly.  */ | 
|  | extern bool target_can_async_p (struct target_ops *target); | 
|  |  | 
|  | /* Is the target in asynchronous execution mode?  */ | 
|  | extern bool target_is_async_p (); | 
|  |  | 
|  | /* Enables/disabled async target events.  */ | 
|  | extern void target_async (bool enable); | 
|  |  | 
|  | /* Enables/disables thread create and exit events.  */ | 
|  | extern void target_thread_events (bool enable); | 
|  |  | 
|  | /* Returns true if the target supports setting thread options | 
|  | OPTIONS.  */ | 
|  | extern bool target_supports_set_thread_options (gdb_thread_options options); | 
|  |  | 
|  | /* Whether support for controlling the target backends always in | 
|  | non-stop mode is enabled.  */ | 
|  | extern enum auto_boolean target_non_stop_enabled; | 
|  |  | 
|  | /* Is the target in non-stop mode?  Some targets control the inferior | 
|  | in non-stop mode even with "set non-stop off".  Always true if "set | 
|  | non-stop" is on.  */ | 
|  | extern bool target_is_non_stop_p (); | 
|  |  | 
|  | /* Return true if at least one inferior has a non-stop target.  */ | 
|  | extern bool exists_non_stop_target (); | 
|  |  | 
|  | extern exec_direction_kind target_execution_direction (); | 
|  |  | 
|  | /* Converts a process id to a string.  Usually, the string just contains | 
|  | `process xyz', but on some systems it may contain | 
|  | `process xyz thread abc'.  */ | 
|  |  | 
|  | extern std::string target_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 | 
|  | is okay.  */ | 
|  |  | 
|  | extern const char *target_extra_thread_info (thread_info *tp); | 
|  |  | 
|  | /* Return the thread's name, or NULL if the target is unable to determine it. | 
|  | The returned value must not be freed by the caller. | 
|  |  | 
|  | You likely don't want to call this function, but use the thread_name | 
|  | function instead, which prefers the user-given thread name, if set.  */ | 
|  |  | 
|  | extern const char *target_thread_name (struct thread_info *); | 
|  |  | 
|  | /* Given a pointer to a thread library specific thread handle and | 
|  | its length, return a pointer to the corresponding thread_info struct.  */ | 
|  |  | 
|  | 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::array_view<const gdb_byte> 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. | 
|  |  | 
|  | The process PID must be stopped when this operation is used. | 
|  |  | 
|  | If the executable file cannot be determined, NULL is returned. | 
|  |  | 
|  | Else, a pointer to a character string containing the pathname | 
|  | is returned.  This string should be copied into a buffer by | 
|  | the client if the string will not be immediately used, or if | 
|  | it must persist.  */ | 
|  |  | 
|  | extern const char *target_pid_to_exec_file (int pid); | 
|  |  | 
|  | /* See the to_thread_architecture description in struct target_ops.  */ | 
|  |  | 
|  | extern gdbarch *target_thread_architecture (ptid_t ptid); | 
|  |  | 
|  | /* | 
|  | * Iterator function for target memory regions. | 
|  | * Calls a callback function once for each memory region 'mapped' | 
|  | * in the child process.  Defined as a simple macro rather than | 
|  | * as a function macro so that it can be tested for nullity. | 
|  | */ | 
|  |  | 
|  | extern int target_find_memory_regions (find_memory_region_ftype func, | 
|  | void *data); | 
|  |  | 
|  | /* | 
|  | * Compose corefile .note section. | 
|  | */ | 
|  |  | 
|  | extern gdb::unique_xmalloc_ptr<char> target_make_corefile_notes (bfd *bfd, | 
|  | int *size_p); | 
|  |  | 
|  | /* Bookmark interfaces.  */ | 
|  | extern gdb_byte *target_get_bookmark (const char *args, int from_tty); | 
|  |  | 
|  | extern void target_goto_bookmark (const gdb_byte *arg, int from_tty); | 
|  |  | 
|  | /* Hardware watchpoint interfaces.  */ | 
|  |  | 
|  | /* GDB's current model is that there are three "kinds" of watchpoints, | 
|  | with respect to when they trigger and how you can move past them. | 
|  |  | 
|  | Those are: continuable, steppable, and non-steppable. | 
|  |  | 
|  | Continuable watchpoints are like x86's -- those trigger after the | 
|  | memory access's side effects are fully committed to memory.  I.e., | 
|  | they trap with the PC pointing at the next instruction already. | 
|  | Continuing past such a watchpoint is doable by just normally | 
|  | continuing, hence the name. | 
|  |  | 
|  | Both steppable and non-steppable watchpoints trap before the memory | 
|  | access.  I.e, the PC points at the instruction that is accessing | 
|  | the memory.  So GDB needs to single-step once past the current | 
|  | instruction in order to make the access effective and check whether | 
|  | the instruction's side effects change the watched expression. | 
|  |  | 
|  | Now, in order to step past that instruction, depending on | 
|  | architecture and target, you can have two situations: | 
|  |  | 
|  | - steppable watchpoints: you can single-step with the watchpoint | 
|  | still armed, and the watchpoint won't trigger again. | 
|  |  | 
|  | - non-steppable watchpoints: if you try to single-step with the | 
|  | watchpoint still armed, you'd trap the watchpoint again and the | 
|  | thread wouldn't make any progress.  So GDB needs to temporarily | 
|  | remove the watchpoint in order to step past it. | 
|  |  | 
|  | If your target/architecture does not signal that it has either | 
|  | steppable or non-steppable watchpoints via either | 
|  | target_have_steppable_watchpoint or | 
|  | gdbarch_have_nonsteppable_watchpoint, GDB assumes continuable | 
|  | watchpoints.  */ | 
|  |  | 
|  | /* Returns true if we were stopped by a hardware watchpoint (memory read or | 
|  | write).  Only the INFERIOR_PTID task is being queried.  */ | 
|  |  | 
|  | extern bool target_stopped_by_watchpoint (); | 
|  |  | 
|  | /* Returns true if the target stopped because it executed a | 
|  | software breakpoint instruction.  */ | 
|  |  | 
|  | extern bool target_stopped_by_sw_breakpoint (); | 
|  |  | 
|  | extern bool target_supports_stopped_by_sw_breakpoint (); | 
|  |  | 
|  | extern bool target_stopped_by_hw_breakpoint (); | 
|  |  | 
|  | extern bool target_supports_stopped_by_hw_breakpoint (); | 
|  |  | 
|  | /* True if we have steppable watchpoints  */ | 
|  |  | 
|  | extern bool target_have_steppable_watchpoint (); | 
|  |  | 
|  | /* Provide defaults for hardware watchpoint functions.  */ | 
|  |  | 
|  | /* If the *_hw_breakpoint functions have not been defined | 
|  | elsewhere use the definitions in the target vector.  */ | 
|  |  | 
|  | /* Returns positive if we can set a hardware watchpoint of type TYPE. | 
|  | Returns negative if the target doesn't have enough hardware debug | 
|  | registers available.  Return zero if hardware watchpoint of type | 
|  | TYPE isn't supported.  TYPE is one of bp_hardware_watchpoint, | 
|  | bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint. | 
|  | CNT is the number of such watchpoints used so far, including this | 
|  | one.  OTHERTYPE is the number of watchpoints of other types than | 
|  | this one used so far.  */ | 
|  |  | 
|  | extern int target_can_use_hardware_watchpoint (bptype type, int cnt, | 
|  | int othertype); | 
|  |  | 
|  | /* Returns the number of debug registers needed to watch the given | 
|  | memory region, or zero if not supported.  */ | 
|  |  | 
|  | extern int target_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len); | 
|  |  | 
|  | extern int target_can_do_single_step (); | 
|  |  | 
|  | /* Set/clear a hardware watchpoint starting at ADDR, for LEN bytes. | 
|  | TYPE is 0 for write, 1 for read, and 2 for read/write accesses. | 
|  | COND is the expression for its condition, or NULL if there's none. | 
|  | Returns 0 for success, 1 if the watchpoint type is not supported, | 
|  | -1 for failure.  */ | 
|  |  | 
|  | extern int target_insert_watchpoint (CORE_ADDR addr, int len, | 
|  | target_hw_bp_type type, expression *cond); | 
|  |  | 
|  | extern int target_remove_watchpoint (CORE_ADDR addr, int len, | 
|  | target_hw_bp_type type, expression *cond); | 
|  |  | 
|  | /* Insert a new masked watchpoint at ADDR using the mask MASK. | 
|  | RW may be hw_read for a read watchpoint, hw_write for a write watchpoint | 
|  | or hw_access for an access watchpoint.  Returns 0 for success, 1 if | 
|  | masked watchpoints are not supported, -1 for failure.  */ | 
|  |  | 
|  | extern int target_insert_mask_watchpoint (CORE_ADDR, CORE_ADDR, | 
|  | enum target_hw_bp_type); | 
|  |  | 
|  | /* Remove a masked watchpoint at ADDR with the mask MASK. | 
|  | RW may be hw_read for a read watchpoint, hw_write for a write watchpoint | 
|  | or hw_access for an access watchpoint.  Returns 0 for success, non-zero | 
|  | for failure.  */ | 
|  |  | 
|  | extern int target_remove_mask_watchpoint (CORE_ADDR, CORE_ADDR, | 
|  | enum target_hw_bp_type); | 
|  |  | 
|  | /* Insert a hardware breakpoint at address BP_TGT->placed_address in | 
|  | the target machine.  Returns 0 for success, and returns non-zero or | 
|  | throws an error (with a detailed failure reason error code and | 
|  | message) otherwise.  */ | 
|  |  | 
|  | extern int target_insert_hw_breakpoint (gdbarch *gdbarch, | 
|  | bp_target_info *bp_tgt); | 
|  |  | 
|  | extern int target_remove_hw_breakpoint (gdbarch *gdbarch, | 
|  | bp_target_info *bp_tgt); | 
|  |  | 
|  | /* Return number of debug registers needed for a ranged breakpoint, | 
|  | or -1 if ranged breakpoints are not supported.  */ | 
|  |  | 
|  | extern int target_ranged_break_num_registers (void); | 
|  |  | 
|  | /* Return non-zero if target knows the data address which triggered this | 
|  | target_stopped_by_watchpoint, in such case place it to *ADDR_P.  Only the | 
|  | INFERIOR_PTID task is being queried.  */ | 
|  | #define target_stopped_data_address(target, addr_p) \ | 
|  | (target)->stopped_data_address (addr_p) | 
|  |  | 
|  | /* Return non-zero if ADDR is within the range of a watchpoint spanning | 
|  | LENGTH bytes beginning at START.  */ | 
|  | #define target_watchpoint_addr_within_range(target, addr, start, length) \ | 
|  | (target)->watchpoint_addr_within_range (addr, start, length) | 
|  |  | 
|  | /* Return non-zero if the target is capable of using hardware to evaluate | 
|  | the condition expression.  In this case, if the condition is false when | 
|  | the watched memory location changes, execution may continue without the | 
|  | debugger being notified. | 
|  |  | 
|  | Due to limitations in the hardware implementation, it may be capable of | 
|  | avoiding triggering the watchpoint in some cases where the condition | 
|  | expression is false, but may report some false positives as well. | 
|  | For this reason, GDB will still evaluate the condition expression when | 
|  | the watchpoint triggers.  */ | 
|  |  | 
|  | extern bool target_can_accel_watchpoint_condition (CORE_ADDR addr, int len, | 
|  | int type, expression *cond); | 
|  |  | 
|  | /* Return number of debug registers needed for a masked watchpoint, | 
|  | -1 if masked watchpoints are not supported or -2 if the given address | 
|  | and mask combination cannot be used.  */ | 
|  |  | 
|  | extern int target_masked_watch_num_registers (CORE_ADDR addr, CORE_ADDR mask); | 
|  |  | 
|  | /* Target can execute in reverse?  */ | 
|  |  | 
|  | extern bool target_can_execute_reverse (); | 
|  |  | 
|  | extern const struct target_desc *target_read_description (struct target_ops *); | 
|  |  | 
|  | extern ptid_t target_get_ada_task_ptid (long lwp, ULONGEST tid); | 
|  |  | 
|  | /* Main entry point for searching memory.  */ | 
|  | extern int target_search_memory (CORE_ADDR start_addr, | 
|  | ULONGEST search_space_len, | 
|  | const gdb_byte *pattern, | 
|  | ULONGEST pattern_len, | 
|  | CORE_ADDR *found_addrp); | 
|  |  | 
|  | /* Target file operations.  */ | 
|  |  | 
|  | /* Return true if the filesystem seen by the current inferior | 
|  | is the local filesystem, zero otherwise.  */ | 
|  |  | 
|  | extern bool 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).  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, bool warn_if_slow, | 
|  | fileio_error *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 | 
|  | (and set *TARGET_ERRNO).  */ | 
|  | extern int target_fileio_pwrite (int fd, const gdb_byte *write_buf, int len, | 
|  | ULONGEST offset, fileio_error *target_errno); | 
|  |  | 
|  | /* Read up to LEN bytes FD on the target into READ_BUF. | 
|  | Return the number of bytes read, or -1 if an error occurs | 
|  | (and set *TARGET_ERRNO).  */ | 
|  | extern int target_fileio_pread (int fd, gdb_byte *read_buf, int len, | 
|  | ULONGEST offset, fileio_error *target_errno); | 
|  |  | 
|  | /* Get information about the file opened as FD on the target | 
|  | and put it in SB.  Return 0 on success, or -1 if an error | 
|  | occurs (and set *TARGET_ERRNO).  */ | 
|  | extern int target_fileio_fstat (int fd, struct stat *sb, | 
|  | fileio_error *target_errno); | 
|  |  | 
|  | /* Get information about the file at FILENAME on the target and put it in | 
|  | SB.  Look in the filesystem as seen by INF.  If INF is NULL, use the | 
|  | filesystem seen by the debugger (GDB or, for remote targets, the remote | 
|  | stub).  Return 0 on success, or -1 if an error occurs (and set | 
|  | *TARGET_ERRNO).  */ | 
|  | extern int target_fileio_lstat (struct inferior *inf, const char *filename, | 
|  | struct stat *sb, fileio_error *target_errno); | 
|  |  | 
|  | /* Close FD on the target.  Return 0, or -1 if an error occurs | 
|  | (and set *TARGET_ERRNO).  */ | 
|  | extern int target_fileio_close (int fd, fileio_error *target_errno); | 
|  |  | 
|  | /* Unlink FILENAME on the target, in the filesystem as seen by INF. | 
|  | If INF is NULL, use the filesystem seen by the debugger (GDB or, | 
|  | for remote targets, the remote stub).  Return 0, or -1 if an error | 
|  | occurs (and set *TARGET_ERRNO).  */ | 
|  | extern int target_fileio_unlink (struct inferior *inf, | 
|  | const char *filename, | 
|  | fileio_error *target_errno); | 
|  |  | 
|  | /* Read value of symbolic link FILENAME on the target, in the | 
|  | filesystem as seen by INF.  If INF is NULL, use the filesystem seen | 
|  | by the debugger (GDB or, for remote targets, the remote stub). | 
|  | Return a null-terminated string allocated via xmalloc, or NULL if | 
|  | an error occurs (and set *TARGET_ERRNO).  */ | 
|  | extern std::optional<std::string> target_fileio_readlink | 
|  | (struct inferior *inf, const char *filename, fileio_error *target_errno); | 
|  |  | 
|  | /* Read target file FILENAME, in the filesystem as seen by INF.  If | 
|  | INF is NULL, use the filesystem seen by the debugger (GDB or, for | 
|  | remote targets, the remote stub).  The return value will be -1 if | 
|  | the transfer fails or is not supported; 0 if the object is empty; | 
|  | or the length of the object otherwise.  If a positive value is | 
|  | returned, a sufficiently large buffer will be allocated using | 
|  | xmalloc and returned in *BUF_P containing the contents of the | 
|  | object. | 
|  |  | 
|  | This method should be used for objects sufficiently small to store | 
|  | in a single xmalloc'd buffer, when no fixed bound on the object's | 
|  | size is known in advance.  */ | 
|  | extern LONGEST target_fileio_read_alloc (struct inferior *inf, | 
|  | const char *filename, | 
|  | gdb_byte **buf_p); | 
|  |  | 
|  | /* Read target file FILENAME, in the filesystem as seen by INF.  If | 
|  | INF is NULL, use the filesystem seen by the debugger (GDB or, for | 
|  | remote targets, the remote stub).  The result is NUL-terminated and | 
|  | returned as a string, allocated using xmalloc.  If an error occurs | 
|  | or the transfer is unsupported, NULL is returned.  Empty objects | 
|  | are returned as allocated but empty strings.  A warning is issued | 
|  | if the result contains any embedded NUL bytes.  */ | 
|  | extern gdb::unique_xmalloc_ptr<char> target_fileio_read_stralloc | 
|  | (struct inferior *inf, const char *filename); | 
|  |  | 
|  | /* Invalidate the target associated with open handles that were open | 
|  | on target TARG, since we're about to close (and maybe destroy) the | 
|  | target.  The handles remain open from the client's perspective, but | 
|  | trying to do anything with them other than closing them will fail | 
|  | with EIO.  */ | 
|  | extern void fileio_handles_invalidate_target (target_ops *targ); | 
|  |  | 
|  | /* Tracepoint-related operations.  */ | 
|  |  | 
|  | extern void target_trace_init (); | 
|  |  | 
|  | extern void target_download_tracepoint (bp_location *location); | 
|  |  | 
|  | extern bool target_can_download_tracepoint (); | 
|  |  | 
|  | extern void target_download_trace_state_variable (const trace_state_variable &tsv); | 
|  |  | 
|  | extern void target_enable_tracepoint (bp_location *loc); | 
|  |  | 
|  | extern void target_disable_tracepoint (bp_location *loc); | 
|  |  | 
|  | extern void target_trace_start (); | 
|  |  | 
|  | extern void target_trace_set_readonly_regions (); | 
|  |  | 
|  | extern int target_get_trace_status (trace_status *ts); | 
|  |  | 
|  | extern void target_get_tracepoint_status (tracepoint *tp, uploaded_tp *utp); | 
|  |  | 
|  | extern void target_trace_stop (); | 
|  |  | 
|  | extern int target_trace_find (trace_find_type type, int num, CORE_ADDR addr1, | 
|  | CORE_ADDR addr2, int *tpp); | 
|  |  | 
|  | extern bool target_get_trace_state_variable_value (int tsv, LONGEST *val); | 
|  |  | 
|  | extern int target_save_trace_data (const char *filename); | 
|  |  | 
|  | extern int target_upload_tracepoints (uploaded_tp **utpp); | 
|  |  | 
|  | extern int target_upload_trace_state_variables (uploaded_tsv **utsvp); | 
|  |  | 
|  | extern LONGEST target_get_raw_trace_data (gdb_byte *buf, ULONGEST offset, | 
|  | LONGEST len); | 
|  |  | 
|  | extern int target_get_min_fast_tracepoint_insn_len (); | 
|  |  | 
|  | extern void target_set_disconnected_tracing (int val); | 
|  |  | 
|  | extern void target_set_circular_trace_buffer (int val); | 
|  |  | 
|  | extern void target_set_trace_buffer_size (LONGEST val); | 
|  |  | 
|  | extern bool target_set_trace_notes (const char *user, const char *notes, | 
|  | const char *stopnotes); | 
|  |  | 
|  | /* A wrapper that calls get_tib_address on the top target of the | 
|  | current inferior.  */ | 
|  | extern bool target_get_tib_address (ptid_t ptid, CORE_ADDR *addr); | 
|  |  | 
|  | extern void target_set_permissions (); | 
|  |  | 
|  | extern bool target_static_tracepoint_marker_at | 
|  | (CORE_ADDR addr, static_tracepoint_marker *marker); | 
|  |  | 
|  | extern std::vector<static_tracepoint_marker> | 
|  | target_static_tracepoint_markers_by_strid (const char *marker_id); | 
|  |  | 
|  | extern traceframe_info_up target_traceframe_info (); | 
|  |  | 
|  | extern bool target_use_agent (bool use); | 
|  |  | 
|  | extern bool target_can_use_agent (); | 
|  |  | 
|  | extern bool target_augmented_libraries_svr4_read (); | 
|  |  | 
|  | extern bool target_supports_memory_tagging (); | 
|  |  | 
|  | extern bool target_fetch_memtags (CORE_ADDR address, size_t len, | 
|  | gdb::byte_vector &tags, int type); | 
|  |  | 
|  | extern bool target_store_memtags (CORE_ADDR address, size_t len, | 
|  | const gdb::byte_vector &tags, int type); | 
|  |  | 
|  | extern bool target_is_address_tagged (gdbarch *gdbarch, CORE_ADDR address); | 
|  |  | 
|  | extern x86_xsave_layout target_fetch_x86_xsave_layout (); | 
|  |  | 
|  | /* Command logging facility.  */ | 
|  |  | 
|  | extern void target_log_command (const char *p); | 
|  |  | 
|  | extern int target_core_of_thread (ptid_t ptid); | 
|  |  | 
|  | /* See to_get_unwinder in struct target_ops.  */ | 
|  | extern const struct frame_unwind *target_get_unwinder (void); | 
|  |  | 
|  | /* See to_get_tailcall_unwinder in struct target_ops.  */ | 
|  | extern const struct frame_unwind *target_get_tailcall_unwinder (void); | 
|  |  | 
|  | /* This implements basic memory verification, reading target memory | 
|  | and performing the comparison here (as opposed to accelerated | 
|  | verification making use of the qCRC packet, for example).  */ | 
|  |  | 
|  | extern int simple_verify_memory (struct target_ops* ops, | 
|  | const gdb_byte *data, | 
|  | CORE_ADDR memaddr, ULONGEST size); | 
|  |  | 
|  | /* Verify that the memory in the [MEMADDR, MEMADDR+SIZE) range matches | 
|  | the contents of [DATA,DATA+SIZE).  Returns 1 if there's a match, 0 | 
|  | if there's a mismatch, and -1 if an error is encountered while | 
|  | reading memory.  Throws an error if the functionality is found not | 
|  | to be supported by the current target.  */ | 
|  | int target_verify_memory (const gdb_byte *data, | 
|  | CORE_ADDR memaddr, ULONGEST size); | 
|  |  | 
|  | /* Routines for maintenance of the target structures... | 
|  |  | 
|  | add_target:   Add a target to the list of all possible targets. | 
|  | This only makes sense for targets that should be activated using | 
|  | the "target TARGET_NAME ..." command. | 
|  |  | 
|  | push_target:  Make this target the top of the stack of currently used | 
|  | targets, within its particular stratum of the stack.  Result | 
|  | is 0 if now atop the stack, nonzero if not on top (maybe | 
|  | should warn user). | 
|  |  | 
|  | unpush_target: Remove this from the stack of currently used targets, | 
|  | no matter where it is on the list.  Returns 0 if no | 
|  | change, 1 if removed from stack.  */ | 
|  |  | 
|  | /* Type of callback called when the user activates a target with | 
|  | "target TARGET_NAME".  The callback routine takes the rest of the | 
|  | parameters from the command, and (if successful) pushes a new | 
|  | target onto the stack.  */ | 
|  | typedef void target_open_ftype (const char *args, int from_tty); | 
|  |  | 
|  | /* Add the target described by INFO to the list of possible targets | 
|  | and add a new command 'target $(INFO->shortname)'.  Set COMPLETER | 
|  | as the command's completer if not NULL.  */ | 
|  |  | 
|  | extern void add_target (const target_info &info, | 
|  | target_open_ftype *func, | 
|  | completer_ftype *completer = NULL); | 
|  |  | 
|  | /* Adds a command ALIAS for the target described by INFO and marks it | 
|  | deprecated.  This is useful for maintaining backwards compatibility | 
|  | when renaming targets.  */ | 
|  |  | 
|  | extern void add_deprecated_target_alias (const target_info &info, | 
|  | const char *alias); | 
|  |  | 
|  | /* A unique_ptr helper to unpush a target.  */ | 
|  |  | 
|  | struct target_unpusher | 
|  | { | 
|  | void operator() (struct target_ops *ops) const; | 
|  | }; | 
|  |  | 
|  | /* A unique_ptr that unpushes a target on destruction.  */ | 
|  |  | 
|  | typedef std::unique_ptr<struct target_ops, target_unpusher> target_unpush_up; | 
|  |  | 
|  | extern void target_pre_inferior (); | 
|  |  | 
|  | extern void target_preopen (int); | 
|  |  | 
|  | /* Using the objfile specified in OBJFILE, find the address for the | 
|  | current thread's thread-local storage with offset OFFSET.  If it's | 
|  | provided, NAME might be used to indicate the relevant variable | 
|  | in an error message.  */ | 
|  |  | 
|  | extern CORE_ADDR target_translate_tls_address (struct objfile *objfile, | 
|  | CORE_ADDR offset, | 
|  | const char *name = nullptr); | 
|  |  | 
|  | /* Return the "section" containing the specified address.  */ | 
|  | const struct target_section *target_section_by_addr (struct target_ops *target, | 
|  | CORE_ADDR addr); | 
|  |  | 
|  | /* Return the target section table this target (or the targets | 
|  | beneath) currently manipulate.  */ | 
|  |  | 
|  | extern const std::vector<target_section> *target_get_section_table | 
|  | (struct target_ops *target); | 
|  |  | 
|  | /* Default implementation of get_section_table for dummy_target.  */ | 
|  |  | 
|  | extern const std::vector<target_section> *default_get_section_table (); | 
|  |  | 
|  | /* From mem-break.c */ | 
|  |  | 
|  | extern int memory_remove_breakpoint (struct target_ops *, | 
|  | struct gdbarch *, struct bp_target_info *, | 
|  | enum remove_bp_reason); | 
|  |  | 
|  | extern int memory_insert_breakpoint (struct target_ops *, | 
|  | struct gdbarch *, struct bp_target_info *); | 
|  |  | 
|  | /* Convenience template use to add memory breakpoints support to a | 
|  | target.  */ | 
|  |  | 
|  | template <typename BaseTarget> | 
|  | struct memory_breakpoint_target : public BaseTarget | 
|  | { | 
|  | int insert_breakpoint (struct gdbarch *gdbarch, | 
|  | struct bp_target_info *bp_tgt) override | 
|  | { return memory_insert_breakpoint (this, gdbarch, bp_tgt); } | 
|  |  | 
|  | int remove_breakpoint (struct gdbarch *gdbarch, | 
|  | struct bp_target_info *bp_tgt, | 
|  | enum remove_bp_reason reason) override | 
|  | { return memory_remove_breakpoint (this, gdbarch, bp_tgt, reason); } | 
|  | }; | 
|  |  | 
|  | /* Check whether the memory at the breakpoint's placed address still | 
|  | contains the expected breakpoint instruction.  */ | 
|  |  | 
|  | extern int memory_validate_breakpoint (struct gdbarch *gdbarch, | 
|  | struct bp_target_info *bp_tgt); | 
|  |  | 
|  | extern int default_memory_remove_breakpoint (struct gdbarch *, | 
|  | struct bp_target_info *); | 
|  |  | 
|  | extern int default_memory_insert_breakpoint (struct gdbarch *, | 
|  | struct bp_target_info *); | 
|  |  | 
|  |  | 
|  | /* From target.c */ | 
|  |  | 
|  | extern void initialize_targets (void); | 
|  |  | 
|  | [[noreturn]] extern void noprocess (void); | 
|  |  | 
|  | extern void target_require_runnable (void); | 
|  |  | 
|  | /* Find the target at STRATUM.  If no target is at that stratum, | 
|  | return NULL.  */ | 
|  |  | 
|  | struct target_ops *find_target_at (enum strata stratum); | 
|  |  | 
|  | /* Read OS data object of type TYPE from the target, and return it in XML | 
|  | format.  The return value follows the same rules as target_read_stralloc.  */ | 
|  |  | 
|  | extern std::optional<gdb::char_vector> target_get_osdata (const char *type); | 
|  |  | 
|  | /* Stuff that should be shared among the various remote targets.  */ | 
|  |  | 
|  |  | 
|  | /* Timeout limit for response from target.  */ | 
|  | extern int remote_timeout; | 
|  |  | 
|  |  | 
|  |  | 
|  | /* Set the show memory breakpoints mode to show, and return a | 
|  | scoped_restore to restore it back to the current value.  */ | 
|  | extern scoped_restore_tmpl<int> | 
|  | make_scoped_restore_show_memory_breakpoints (int show); | 
|  |  | 
|  | /* True if we should trust readonly sections from the | 
|  | executable when reading memory.  */ | 
|  | extern bool trust_readonly; | 
|  |  | 
|  | 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); | 
|  |  | 
|  |  | 
|  | /* Imported from machine dependent code.  */ | 
|  |  | 
|  | /* See to_enable_btrace in struct target_ops.  */ | 
|  | extern struct btrace_target_info * | 
|  | target_enable_btrace (thread_info *tp, const struct btrace_config *); | 
|  |  | 
|  | /* See to_disable_btrace in struct target_ops.  */ | 
|  | extern void target_disable_btrace (struct btrace_target_info *btinfo); | 
|  |  | 
|  | /* See to_teardown_btrace in struct target_ops.  */ | 
|  | extern void target_teardown_btrace (struct btrace_target_info *btinfo); | 
|  |  | 
|  | /* See to_read_btrace in struct target_ops.  */ | 
|  | extern enum btrace_error target_read_btrace (struct btrace_data *, | 
|  | struct btrace_target_info *, | 
|  | enum btrace_read_type); | 
|  |  | 
|  | /* See to_btrace_conf in struct target_ops.  */ | 
|  | extern const struct btrace_config * | 
|  | target_btrace_conf (const struct btrace_target_info *); | 
|  |  | 
|  | /* See to_stop_recording in struct target_ops.  */ | 
|  | extern void target_stop_recording (void); | 
|  |  | 
|  | /* See to_save_record in struct target_ops.  */ | 
|  | extern void target_save_record (const char *filename); | 
|  |  | 
|  | /* Query if the target supports deleting the execution log.  */ | 
|  | extern int target_supports_delete_record (void); | 
|  |  | 
|  | /* See to_delete_record in struct target_ops.  */ | 
|  | extern void target_delete_record (void); | 
|  |  | 
|  | /* See to_record_method.  */ | 
|  | extern enum record_method target_record_method (ptid_t ptid); | 
|  |  | 
|  | /* See to_record_is_replaying in struct target_ops.  */ | 
|  | extern int target_record_is_replaying (ptid_t ptid); | 
|  |  | 
|  | /* See to_record_will_replay in struct target_ops.  */ | 
|  | extern int target_record_will_replay (ptid_t ptid, int dir); | 
|  |  | 
|  | /* See to_record_stop_replaying in struct target_ops.  */ | 
|  | extern void target_record_stop_replaying (void); | 
|  |  | 
|  | /* See to_goto_record_begin in struct target_ops.  */ | 
|  | extern void target_goto_record_begin (void); | 
|  |  | 
|  | /* See to_goto_record_end in struct target_ops.  */ | 
|  | extern void target_goto_record_end (void); | 
|  |  | 
|  | /* See to_goto_record in struct target_ops.  */ | 
|  | extern void target_goto_record (ULONGEST insn); | 
|  |  | 
|  | /* See to_insn_history.  */ | 
|  | extern void target_insn_history (int size, gdb_disassembly_flags flags); | 
|  |  | 
|  | /* See to_insn_history_from.  */ | 
|  | extern void target_insn_history_from (ULONGEST from, int size, | 
|  | gdb_disassembly_flags flags); | 
|  |  | 
|  | /* See to_insn_history_range.  */ | 
|  | extern void target_insn_history_range (ULONGEST begin, ULONGEST end, | 
|  | gdb_disassembly_flags flags); | 
|  |  | 
|  | /* See to_call_history.  */ | 
|  | extern void target_call_history (int size, record_print_flags flags); | 
|  |  | 
|  | /* See to_call_history_from.  */ | 
|  | extern void target_call_history_from (ULONGEST begin, int size, | 
|  | record_print_flags flags); | 
|  |  | 
|  | /* See to_call_history_range.  */ | 
|  | extern void target_call_history_range (ULONGEST begin, ULONGEST end, | 
|  | record_print_flags flags); | 
|  |  | 
|  | /* See to_prepare_to_generate_core.  */ | 
|  | extern void target_prepare_to_generate_core (void); | 
|  |  | 
|  | /* See to_done_generating_core.  */ | 
|  | extern void target_done_generating_core (void); | 
|  |  | 
|  | #endif /* GDB_TARGET_H */ |