X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fgdbcore.h;h=7b18e5e93f8f32900176876cbd81c4a0c4637a58;hb=387e00f3b3e6ea3719f144d7090c1a242174be4d;hp=bdf14c264a877049e1117416abe7d5ca9a9e8c5f;hpb=507f3c78fb4a1235b731350d60f1bf0ce94b4175;p=binutils-gdb.git diff --git a/gdb/gdbcore.h b/gdb/gdbcore.h index bdf14c264a8..7b18e5e93f8 100644 --- a/gdb/gdbcore.h +++ b/gdb/gdbcore.h @@ -1,11 +1,12 @@ /* Machine independent variables that describe the core file under GDB. - Copyright 1986, 1987, 1989, 1990, 1992, 1995 Free Software Foundation, Inc. + + Copyright (C) 1986-2022 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + 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, @@ -14,178 +15,194 @@ 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, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ /* Interface routines for core, executable, etc. */ #if !defined (GDBCORE_H) #define GDBCORE_H 1 -#include "bfd.h" - -/* Return the name of the executable file as a string. - ERR nonzero means get error if there is none specified; - otherwise return 0 in that case. */ +struct type; +struct regcache; -extern char *get_exec_file (int err); +#include "bfd.h" +#include "exec.h" +#include "target.h" /* Nonzero if there is a core file. */ extern int have_core_file_p (void); -/* Read "memory data" from whatever target or inferior we have. - Returns zero if successful, errno value if not. EIO is used for - address out of bounds. If breakpoints are inserted, returns shadow - contents, not the breakpoints themselves. From breakpoint.c. */ - -extern int read_memory_nobpt (CORE_ADDR memaddr, char *myaddr, unsigned len); - /* Report a memory error with error(). */ -extern void memory_error (int status, CORE_ADDR memaddr); - -/* Like target_read_memory, but report an error if can't read. */ - -extern void read_memory (CORE_ADDR memaddr, char *myaddr, int len); +extern void memory_error (enum target_xfer_status status, CORE_ADDR memaddr); -/* Read an integer from debugged memory, given address and number of - bytes. */ +/* The string 'memory_error' would use as exception message. */ -extern LONGEST read_memory_integer (CORE_ADDR memaddr, int len); +extern std::string memory_error_message (enum target_xfer_status err, + struct gdbarch *gdbarch, + CORE_ADDR memaddr); -/* Read an unsigned integer from debugged memory, given address and - number of bytes. */ +/* Like target_read_memory, but report an error if can't read. */ -extern ULONGEST read_memory_unsigned_integer (CORE_ADDR memaddr, int len); +extern void read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len); -/* Read a null-terminated string from the debuggee's memory, given address, - * a buffer into which to place the string, and the maximum available space */ -extern void read_memory_string (CORE_ADDR, char *, int); +/* Like target_read_stack, but report an error if can't read. */ -/* This takes a char *, not void *. This is probably right, because - passing in an int * or whatever is wrong with respect to - byteswapping, alignment, different sizes for host vs. target types, - etc. */ +extern void read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len); -extern void write_memory (CORE_ADDR memaddr, char *myaddr, int len); +/* Like target_read_code, but report an error if can't read. */ -extern void generic_search (int len, char *data, char *mask, - CORE_ADDR startaddr, int increment, - CORE_ADDR lorange, CORE_ADDR hirange, - CORE_ADDR * addr_found, char *data_found); - -/* Hook for `exec_file_command' command to call. */ +extern void read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len); -extern void (*exec_file_display_hook) (char *filename); +/* Read an integer from debugged memory, given address and number of + bytes. */ -/* Hook for "file_command", which is more useful than above - (because it is invoked AFTER symbols are read, not before) */ +extern LONGEST read_memory_integer (CORE_ADDR memaddr, + int len, enum bfd_endian byte_order); +extern int safe_read_memory_integer (CORE_ADDR memaddr, int len, + enum bfd_endian byte_order, + LONGEST *return_value); -extern void (*file_changed_hook) (char *filename); +/* Read an unsigned integer from debugged memory, given address and + number of bytes. */ -extern void specify_exec_file_hook (void (*hook) (char *filename)); +extern ULONGEST read_memory_unsigned_integer (CORE_ADDR memaddr, + int len, + enum bfd_endian byte_order); +extern int safe_read_memory_unsigned_integer (CORE_ADDR memaddr, int len, + enum bfd_endian byte_order, + ULONGEST *return_value); -/* Binary File Diddlers for the exec and core files */ +/* Read an integer from debugged code memory, given address, + number of bytes, and byte order for code. */ -extern bfd *core_bfd; -extern bfd *exec_bfd; +extern LONGEST read_code_integer (CORE_ADDR memaddr, int len, + enum bfd_endian byte_order); -/* Whether to open exec and core files read-only or read-write. */ +/* Read an unsigned integer from debugged code memory, given address, + number of bytes, and byte order for code. */ -extern int write_files; +extern ULONGEST read_code_unsigned_integer (CORE_ADDR memaddr, + int len, + enum bfd_endian byte_order); -extern void core_file_command (char *filename, int from_tty); +/* Read the pointer of type TYPE at ADDR, and return the address it + represents. */ -extern void exec_file_attach (char *filename, int from_tty); +CORE_ADDR read_memory_typed_address (CORE_ADDR addr, struct type *type); -extern void exec_file_command (char *filename, int from_tty); +/* Same as target_write_memory, but report an error if can't + write. */ -extern void validate_files (void); +extern void write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, + ssize_t len); -extern CORE_ADDR register_addr (int regno, CORE_ADDR blockend); +/* Same as write_memory, but notify 'memory_changed' observers. */ -extern void registers_fetched (void); +extern void write_memory_with_notification (CORE_ADDR memaddr, + const bfd_byte *myaddr, + ssize_t len); -#if !defined (KERNEL_U_ADDR) -extern CORE_ADDR kernel_u_addr; -#define KERNEL_U_ADDR kernel_u_addr -#endif +/* Store VALUE at ADDR in the inferior as a LEN-byte unsigned integer. */ +extern void write_memory_unsigned_integer (CORE_ADDR addr, int len, + enum bfd_endian byte_order, + ULONGEST value); -/* The target vector for core files. */ +/* Store VALUE at ADDR in the inferior as a LEN-byte unsigned integer. */ +extern void write_memory_signed_integer (CORE_ADDR addr, int len, + enum bfd_endian byte_order, + LONGEST value); + +/* Hook for `exec_file_command' command to call. */ -extern struct target_ops core_ops; +extern void (*deprecated_exec_file_display_hook) (const char *filename); -/* The current default bfd target. */ +/* Hook for "file_command", which is more useful than above + (because it is invoked AFTER symbols are read, not before). */ -extern char *gnutarget; +extern void (*deprecated_file_changed_hook) (const char *filename); -extern void set_gnutarget (char *); +extern void specify_exec_file_hook (void (*hook) (const char *filename)); -/* Structure to keep track of core register reading functions for - various core file types. */ +/* Binary File Diddler for the core file. */ -struct core_fns - { +#define core_bfd (current_program_space->cbfd.get ()) - /* BFD flavour that a core file handler is prepared to read. This - can be used by the handler's core tasting function as a first - level filter to reject BFD's that don't have the right - flavour. */ +/* Whether to open exec and core files read-only or read-write. */ - enum bfd_flavour core_flavour; +extern bool write_files; - /* Core file handler function to call to recognize corefile - formats that BFD rejects. Some core file format just don't fit - into the BFD model, or may require other resources to identify - them, that simply aren't available to BFD (such as symbols from - another file). Returns nonzero if the handler recognizes the - format, zero otherwise. */ +/* Open and set up the core file bfd. */ - int (*check_format) (bfd *); +extern void core_target_open (const char *arg, int from_tty); - /* Core file handler function to call to ask if it can handle a - given core file format or not. Returns zero if it can't, - nonzero otherwise. */ +extern void core_file_command (const char *filename, int from_tty); - int (*core_sniffer) (struct core_fns *, bfd *); +extern void exec_file_attach (const char *filename, int from_tty); - /* Extract the register values out of the core file and store them where - `read_register' will find them. +/* If the filename of the main executable is unknown, attempt to + determine it. If a filename is determined, proceed as though + it was just specified with the "file" command. Do nothing if + the filename of the main executable is already known. + DEFER_BP_RESET uses SYMFILE_DEFER_BP_RESET for the main symbol file. */ - CORE_REG_SECT points to the register values themselves, read into - memory. +extern void exec_file_locate_attach (int pid, int defer_bp_reset, int from_tty); - CORE_REG_SIZE is the size of that area. +extern void validate_files (void); - WHICH says which set of registers we are handling: - 0 --- integer registers - 2 --- floating-point registers, on machines where they are - discontiguous - 3 --- extended floating-point registers, on machines where - these are present in yet a third area. (GNU/Linux uses - this to get at the SSE registers.) +/* Give the user a message if the current exec file does not match the exec + file determined from the target. In case of mismatch, ask the user + if the exec file determined from target must be loaded. */ +extern void validate_exec_file (int from_tty); - REG_ADDR is the offset from u.u_ar0 to the register values relative to - core_reg_sect. This is used with old-fashioned core files to locate the - registers in a large upage-plus-stack ".reg" section. Original upage - address X is at location core_reg_sect+x+reg_addr. */ +/* The current default bfd target. */ - void (*core_read_registers) (char *core_reg_sect, - unsigned core_reg_size, - int which, CORE_ADDR reg_addr); +extern const char *gnutarget; - /* Finds the next struct core_fns. They are allocated and initialized - in whatever module implements the functions pointed to; an - initializer calls add_core_fns to add them to the global chain. */ +extern void set_gnutarget (const char *); - struct core_fns *next; +/* Build either a single-thread or multi-threaded section name for + PTID. - }; + If ptid's lwp member is zero, we want to do the single-threaded + thing: look for a section named NAME (as passed to the + constructor). If ptid's lwp member is non-zero, we'll want do the + multi-threaded thing: look for a section named "NAME/LWP", where + LWP is the shortest ASCII decimal representation of ptid's lwp + member. */ -extern void add_core_fns (struct core_fns *cf); -extern int default_core_sniffer (struct core_fns *cf, bfd * abfd); -extern int default_check_format (bfd * abfd); +class thread_section_name +{ +public: + /* NAME is the single-threaded section name. If PTID represents an + LWP, then the build section name is "NAME/LWP", otherwise it's + just "NAME" unmodified. */ + thread_section_name (const char *name, ptid_t ptid) + { + if (ptid.lwp_p ()) + { + m_storage = string_printf ("%s/%ld", name, ptid.lwp ()); + m_section_name = m_storage.c_str (); + } + else + m_section_name = name; + } + + /* Return the computed section name. The result is valid as long as + this thread_section_name object is live. */ + const char *c_str () const + { return m_section_name; } + + DISABLE_COPY_AND_ASSIGN (thread_section_name); + +private: + /* Either a pointer into M_STORAGE, or a pointer to the name passed + as parameter to the constructor. */ + const char *m_section_name; + /* If we need to build a new section name, this is where we store + it. */ + std::string m_storage; +}; #endif /* !defined (GDBCORE_H) */