1 /* Cache and manage the values of registers 2 3 Copyright (C) 2014-2023 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #ifndef COMMON_COMMON_REGCACHE_H 21 #define COMMON_COMMON_REGCACHE_H 22 23 /* This header is a stopgap until we have an independent regcache. */ 24 25 enum register_status : signed char 26 { 27 /* The register value is not in the cache, and we don't know yet 28 whether it's available in the target (or traceframe). */ 29 REG_UNKNOWN = 0, 30 31 /* The register value is valid and cached. */ 32 REG_VALID = 1, 33 34 /* The register value is unavailable. E.g., we're inspecting a 35 traceframe, and this register wasn't collected. Note that this 36 is different a different "unavailable" from saying the register 37 does not exist in the target's architecture --- in that case, 38 the target should have given us a target description that does 39 not include the register in the first place. */ 40 REG_UNAVAILABLE = -1 41 }; 42 43 /* Return a pointer to the register cache associated with the 44 thread specified by PTID. This function must be provided by 45 the client. */ 46 47 extern struct regcache *get_thread_regcache_for_ptid (ptid_t ptid); 48 49 /* Return the size of register numbered N in REGCACHE. This function 50 must be provided by the client. */ 51 52 extern int regcache_register_size (const struct regcache *regcache, int n); 53 54 /* Read the PC register. This function must be provided by the 55 client. */ 56 57 extern CORE_ADDR regcache_read_pc (struct regcache *regcache); 58 59 /* Read the PC register. If PC cannot be read, return 0. 60 This is a wrapper around 'regcache_read_pc'. */ 61 62 extern CORE_ADDR regcache_read_pc_protected (regcache *regcache); 63 64 /* Read a raw register into a unsigned integer. */ 65 extern enum register_status regcache_raw_read_unsigned 66 (struct regcache *regcache, int regnum, ULONGEST *val); 67 68 ULONGEST regcache_raw_get_unsigned (struct regcache *regcache, int regnum); 69 70 struct reg_buffer_common 71 { 72 virtual ~reg_buffer_common () = default; 73 74 /* Get the availability status of the value of register REGNUM in this 75 buffer. */ 76 virtual register_status get_register_status (int regnum) const = 0; 77 78 /* Supply register REGNUM, whose contents are stored in BUF, to REGCACHE. */ 79 virtual void raw_supply (int regnum, const void *buf) = 0; 80 81 /* Collect register REGNUM from REGCACHE and store its contents in BUF. */ 82 virtual void raw_collect (int regnum, void *buf) const = 0; 83 84 /* Compare the contents of the register stored in the regcache (ignoring the 85 first OFFSET bytes) to the contents of BUF (without any offset). Returns 86 true if the same. */ 87 virtual bool raw_compare (int regnum, const void *buf, int offset) const = 0; 88 }; 89 90 #endif /* COMMON_COMMON_REGCACHE_H */ 91