X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Fregcache.h;h=5ee44788dcd32b323331f69a9e78be022202fe6e;hb=1a5c25988eabb35e0e40ea484b1eea029d9b7f53;hp=d52012cc868d11e1cd719500fbf3a99edf137526;hpb=0b30217134add051e159a192066a1e568ebd837f;p=thirdparty%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/regcache.h b/gdb/gdbserver/regcache.h index d52012cc868..5ee44788dcd 100644 --- a/gdb/gdbserver/regcache.h +++ b/gdb/gdbserver/regcache.h @@ -1,5 +1,5 @@ /* Register support routines for the remote server for GDB. - Copyright (C) 2001-2002, 2007-2012 Free Software Foundation, Inc. + Copyright (C) 2001-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -16,47 +16,58 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REGCACHE_H -#define REGCACHE_H +#ifndef GDBSERVER_REGCACHE_H +#define GDBSERVER_REGCACHE_H -struct inferior_list_entry; -struct thread_info; - -/* The register exists, it has a value, but we don't know what it is. - Used when inspecting traceframes. */ -#define REG_UNAVAILABLE 0 +#include "common/common-regcache.h" -/* We know the register's value (and we have it cached). */ -#define REG_VALID 1 +struct thread_info; +struct target_desc; /* The data for the register cache. Note that we have one per inferior; this is primarily for simplicity, as the performance benefit is minimal. */ -struct regcache +struct regcache : public reg_buffer_common { + /* The regcache's target description. */ + const struct target_desc *tdesc = nullptr; + /* Whether the REGISTERS buffer's contents are valid. If false, we haven't fetched the registers from the target yet. Not that this register cache is _not_ pass-through, unlike GDB's. Note that "valid" here is unrelated to whether the registers are available in a traceframe. For that, check REGISTER_STATUS below. */ - int registers_valid; - int registers_owned; - unsigned char *registers; + int registers_valid = 0; + int registers_owned = 0; + unsigned char *registers = nullptr; #ifndef IN_PROCESS_AGENT /* One of REG_UNAVAILBLE or REG_VALID. */ - unsigned char *register_status; + unsigned char *register_status = nullptr; #endif + + /* See common/common-regcache.h. */ + enum register_status get_register_status (int regnum) const override; + + /* See common/common-regcache.h. */ + void raw_supply (int regnum, const void *buf) override; + + /* See common/common-regcache.h. */ + void raw_collect (int regnum, void *buf) const override; + + /* See common/common-regcache.h. */ + bool raw_compare (int regnum, const void *buf, int offset) const override; }; struct regcache *init_register_cache (struct regcache *regcache, + const struct target_desc *tdesc, unsigned char *regbuf); void regcache_cpy (struct regcache *dst, struct regcache *src); /* Create a new register cache for INFERIOR. */ -struct regcache *new_register_cache (void); +struct regcache *new_register_cache (const struct target_desc *tdesc); struct regcache *get_thread_regcache (struct thread_info *thread, int fetch); @@ -64,11 +75,24 @@ struct regcache *get_thread_regcache (struct thread_info *thread, int fetch); void free_register_cache (struct regcache *regcache); -/* Invalidate cached registers for one or all threads. */ +/* Invalidate cached registers for one thread. */ + +void regcache_invalidate_thread (struct thread_info *); + +/* Invalidate cached registers for all threads of the given process. */ + +void regcache_invalidate_pid (int pid); + +/* Invalidate cached registers for all threads of the current + process. */ -void regcache_invalidate_one (struct inferior_list_entry *); void regcache_invalidate (void); +/* Invalidate and release the register cache of all threads of the + current process. */ + +void regcache_release (void); + /* Convert all registers to a string in the currently specified remote format. */ @@ -78,24 +102,15 @@ void registers_to_string (struct regcache *regcache, char *buf); void registers_from_string (struct regcache *regcache, char *buf); -CORE_ADDR regcache_read_pc (struct regcache *regcache); +/* For regcache_read_pc see common/common-regcache.h. */ void regcache_write_pc (struct regcache *regcache, CORE_ADDR pc); -/* Return a pointer to the description of register ``n''. */ - -struct reg *find_register_by_number (int n); +int register_cache_size (const struct target_desc *tdesc); -int register_size (int n); +int register_size (const struct target_desc *tdesc, int n); -int register_cache_size (void); - -int find_regno (const char *name); - -/* The following two variables are set by auto-generated - code in the init_registers_... routines. */ -extern const char **gdbserver_expedite_regs; -extern const char *gdbserver_xmltarget; +int find_regno (const struct target_desc *tdesc, const char *name); void supply_register (struct regcache *regcache, int n, const void *buf); @@ -104,6 +119,9 @@ void supply_register_zeroed (struct regcache *regcache, int n); void supply_register_by_name (struct regcache *regcache, const char *name, const void *buf); +void supply_register_by_name_zeroed (struct regcache *regcache, + const char *name); + void supply_regblock (struct regcache *regcache, const void *buf); void collect_register (struct regcache *regcache, int n, void *buf); @@ -113,4 +131,11 @@ void collect_register_as_string (struct regcache *regcache, int n, char *buf); void collect_register_by_name (struct regcache *regcache, const char *name, void *buf); -#endif /* REGCACHE_H */ +/* Read a raw register as an unsigned integer. Convenience wrapper + around regcache_raw_get_unsigned that takes a register name instead + of a register number. */ + +ULONGEST regcache_raw_get_unsigned_by_name (struct regcache *regcache, + const char *name); + +#endif /* GDBSERVER_REGCACHE_H */