]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/regcache.h
Remove regcache_register_status
[thirdparty/binutils-gdb.git] / gdb / regcache.h
1 /* Cache and manage the values of registers for GDB, the GNU debugger.
2
3 Copyright (C) 1986-2018 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 REGCACHE_H
21 #define REGCACHE_H
22
23 #include "common-regcache.h"
24 #include <forward_list>
25
26 struct regcache;
27 struct regset;
28 struct gdbarch;
29 struct address_space;
30
31 extern struct regcache *get_current_regcache (void);
32 extern struct regcache *get_thread_regcache (ptid_t ptid);
33 extern struct regcache *get_thread_arch_regcache (ptid_t, struct gdbarch *);
34 extern struct regcache *get_thread_arch_aspace_regcache (ptid_t,
35 struct gdbarch *,
36 struct address_space *);
37
38 /* Make certain that the register REGNUM in REGCACHE is up-to-date. */
39
40 void regcache_raw_update (struct regcache *regcache, int regnum);
41
42 /* Transfer a raw register [0..NUM_REGS) between core-gdb and the
43 regcache. The read variants return the status of the register. */
44
45 enum register_status regcache_raw_read (struct regcache *regcache,
46 int rawnum, gdb_byte *buf);
47 void regcache_raw_write (struct regcache *regcache, int rawnum,
48 const gdb_byte *buf);
49 extern enum register_status
50 regcache_raw_read_signed (struct regcache *regcache,
51 int regnum, LONGEST *val);
52
53 extern void regcache_raw_write_signed (struct regcache *regcache,
54 int regnum, LONGEST val);
55 extern void regcache_raw_write_unsigned (struct regcache *regcache,
56 int regnum, ULONGEST val);
57
58 /* Return the register's value in signed or throw if it's not
59 available. */
60
61 extern LONGEST regcache_raw_get_signed (struct regcache *regcache,
62 int regnum);
63
64 /* Partial transfer of raw registers. These perform read, modify,
65 write style operations. The read variant returns the status of the
66 register. */
67
68 extern enum register_status
69 regcache_raw_read_part (struct regcache *regcache, int regnum,
70 int offset, int len, gdb_byte *buf);
71 void regcache_raw_write_part (struct regcache *regcache, int regnum,
72 int offset, int len, const gdb_byte *buf);
73
74 void regcache_invalidate (struct regcache *regcache, int regnum);
75
76 /* Transfer of pseudo-registers. The read variants return a register
77 status, as an indication of when a ``cooked'' register was
78 constructed from valid, invalid or unavailable ``raw''
79 registers. */
80
81 /* Transfer a cooked register [0..NUM_REGS+NUM_PSEUDO_REGS). */
82 enum register_status regcache_cooked_read (struct regcache *regcache,
83 int rawnum, gdb_byte *buf);
84 void regcache_cooked_write (struct regcache *regcache, int rawnum,
85 const gdb_byte *buf);
86
87 /* Read register REGNUM from REGCACHE and return a new value. This
88 will call mark_value_bytes_unavailable as appropriate. */
89
90 struct value *regcache_cooked_read_value (struct regcache *regcache,
91 int regnum);
92
93 /* Read a register as a signed/unsigned quantity. */
94 extern enum register_status
95 regcache_cooked_read_signed (struct regcache *regcache,
96 int regnum, LONGEST *val);
97 extern enum register_status
98 regcache_cooked_read_unsigned (struct regcache *regcache,
99 int regnum, ULONGEST *val);
100 extern void regcache_cooked_write_signed (struct regcache *regcache,
101 int regnum, LONGEST val);
102 extern void regcache_cooked_write_unsigned (struct regcache *regcache,
103 int regnum, ULONGEST val);
104
105 /* Partial transfer of a cooked register. These perform read, modify,
106 write style operations. */
107
108 enum register_status regcache_cooked_read_part (struct regcache *regcache,
109 int regnum, int offset,
110 int len, gdb_byte *buf);
111 void regcache_cooked_write_part (struct regcache *regcache, int regnum,
112 int offset, int len, const gdb_byte *buf);
113
114 /* Special routines to read/write the PC. */
115
116 /* For regcache_read_pc see common/common-regcache.h. */
117 extern void regcache_write_pc (struct regcache *regcache, CORE_ADDR pc);
118
119 /* Transfer a raw register [0..NUM_REGS) between the regcache and the
120 target. These functions are called by the target in response to a
121 target_fetch_registers() or target_store_registers(). */
122
123 extern void regcache_raw_supply (struct regcache *regcache,
124 int regnum, const void *buf);
125 extern void regcache_raw_collect (const struct regcache *regcache,
126 int regnum, void *buf);
127
128 /* Mapping between register numbers and offsets in a buffer, for use
129 in the '*regset' functions below. In an array of
130 'regcache_map_entry' each element is interpreted like follows:
131
132 - If 'regno' is a register number: Map register 'regno' to the
133 current offset (starting with 0) and increase the current offset
134 by 'size' (or the register's size, if 'size' is zero). Repeat
135 this with consecutive register numbers up to 'regno+count-1'.
136
137 - If 'regno' is REGCACHE_MAP_SKIP: Add 'count*size' to the current
138 offset.
139
140 - If count=0: End of the map. */
141
142 struct regcache_map_entry
143 {
144 int count;
145 int regno;
146 int size;
147 };
148
149 /* Special value for the 'regno' field in the struct above. */
150
151 enum
152 {
153 REGCACHE_MAP_SKIP = -1,
154 };
155
156 /* Transfer a set of registers (as described by REGSET) between
157 REGCACHE and BUF. If REGNUM == -1, transfer all registers
158 belonging to the regset, otherwise just the register numbered
159 REGNUM. The REGSET's 'regmap' field must point to an array of
160 'struct regcache_map_entry'.
161
162 These functions are suitable for the 'regset_supply' and
163 'regset_collect' fields in a regset structure. */
164
165 extern void regcache_supply_regset (const struct regset *regset,
166 struct regcache *regcache,
167 int regnum, const void *buf,
168 size_t size);
169 extern void regcache_collect_regset (const struct regset *regset,
170 const struct regcache *regcache,
171 int regnum, void *buf, size_t size);
172
173
174 /* The type of a register. This function is slightly more efficient
175 then its gdbarch vector counterpart since it returns a precomputed
176 value stored in a table. */
177
178 extern struct type *register_type (struct gdbarch *gdbarch, int regnum);
179
180
181 /* Return the size of register REGNUM. All registers should have only
182 one size. */
183
184 extern int register_size (struct gdbarch *gdbarch, int regnum);
185
186 typedef enum register_status (regcache_cooked_read_ftype) (void *src,
187 int regnum,
188 gdb_byte *buf);
189
190 /* A (register_number, register_value) pair. */
191
192 typedef struct cached_reg
193 {
194 int num;
195 gdb_byte *data;
196 } cached_reg_t;
197
198 /* Buffer of registers. */
199
200 class reg_buffer
201 {
202 public:
203 reg_buffer (gdbarch *gdbarch, bool has_pseudo);
204
205 DISABLE_COPY_AND_ASSIGN (reg_buffer);
206
207 /* Return regcache's architecture. */
208 gdbarch *arch () const;
209
210 /* Get the availability status of the value of register REGNUM in this
211 buffer. */
212 enum register_status get_register_status (int regnum) const;
213
214 virtual ~reg_buffer ()
215 {
216 xfree (m_registers);
217 xfree (m_register_status);
218 }
219 protected:
220 /* Assert on the range of REGNUM. */
221 void assert_regnum (int regnum) const;
222
223 int num_raw_registers () const;
224
225 gdb_byte *register_buffer (int regnum) const;
226
227 /* Save a register cache. The set of registers saved into the
228 regcache determined by the save_reggroup. COOKED_READ returns
229 zero iff the register's value can't be returned. */
230 void save (regcache_cooked_read_ftype *cooked_read, void *src);
231
232 struct regcache_descr *m_descr;
233
234 bool m_has_pseudo;
235 /* The register buffers. */
236 gdb_byte *m_registers;
237 /* Register cache status. */
238 signed char *m_register_status;
239
240 friend class regcache;
241 friend class detached_regcache;
242 };
243
244 /* An abstract class which only has methods doing read. */
245
246 class readable_regcache : public reg_buffer
247 {
248 public:
249 readable_regcache (gdbarch *gdbarch, bool has_pseudo)
250 : reg_buffer (gdbarch, has_pseudo)
251 {}
252
253 enum register_status raw_read (int regnum, gdb_byte *buf);
254 template<typename T, typename = RequireLongest<T>>
255 enum register_status raw_read (int regnum, T *val);
256
257 enum register_status raw_read_part (int regnum, int offset, int len,
258 gdb_byte *buf);
259
260 virtual void raw_update (int regnum) = 0;
261
262 enum register_status cooked_read (int regnum, gdb_byte *buf);
263 template<typename T, typename = RequireLongest<T>>
264 enum register_status cooked_read (int regnum, T *val);
265
266 enum register_status cooked_read_part (int regnum, int offset, int len,
267 gdb_byte *buf);
268
269 struct value *cooked_read_value (int regnum);
270
271 protected:
272 enum register_status read_part (int regnum, int offset, int len, void *in,
273 bool is_raw);
274 };
275
276 /* Buffer of registers, can be read and written. */
277
278 class detached_regcache : public readable_regcache
279 {
280 public:
281 detached_regcache (gdbarch *gdbarch, bool has_pseudo)
282 : readable_regcache (gdbarch, has_pseudo)
283 {}
284
285 void raw_supply (int regnum, const void *buf);
286
287 void raw_supply (int regnum, const reg_buffer &src)
288 {
289 raw_supply (regnum, src.register_buffer (regnum));
290 }
291
292 void raw_update (int regnum) override
293 {}
294
295 void raw_supply_integer (int regnum, const gdb_byte *addr, int addr_len,
296 bool is_signed);
297
298 void raw_supply_zeroed (int regnum);
299
300 void invalidate (int regnum);
301
302 DISABLE_COPY_AND_ASSIGN (detached_regcache);
303 };
304
305 class readonly_detached_regcache;
306
307 /* The register cache for storing raw register values. */
308
309 class regcache : public detached_regcache
310 {
311 public:
312 DISABLE_COPY_AND_ASSIGN (regcache);
313
314 /* Return REGCACHE's address space. */
315 const address_space *aspace () const
316 {
317 return m_aspace;
318 }
319
320 /* Restore 'this' regcache. The set of registers restored into
321 the regcache determined by the restore_reggroup.
322 Writes to regcache will go through to the target. SRC is a
323 read-only register cache. */
324 void restore (readonly_detached_regcache *src);
325
326 void cooked_write (int regnum, const gdb_byte *buf);
327
328 void raw_write (int regnum, const gdb_byte *buf);
329
330 template<typename T, typename = RequireLongest<T>>
331 void raw_write (int regnum, T val);
332
333 template<typename T, typename = RequireLongest<T>>
334 void cooked_write (int regnum, T val);
335
336 void raw_update (int regnum) override;
337
338 void raw_collect (int regnum, void *buf) const;
339
340 void raw_collect_integer (int regnum, gdb_byte *addr, int addr_len,
341 bool is_signed) const;
342
343 void raw_write_part (int regnum, int offset, int len, const gdb_byte *buf);
344
345 void cooked_write_part (int regnum, int offset, int len,
346 const gdb_byte *buf);
347
348 void supply_regset (const struct regset *regset,
349 int regnum, const void *buf, size_t size);
350
351
352 void collect_regset (const struct regset *regset, int regnum,
353 void *buf, size_t size) const;
354
355 /* Return REGCACHE's ptid. */
356
357 ptid_t ptid () const
358 {
359 gdb_assert (m_ptid != minus_one_ptid);
360
361 return m_ptid;
362 }
363
364 void set_ptid (const ptid_t ptid)
365 {
366 this->m_ptid = ptid;
367 }
368
369 /* Dump the contents of a register from the register cache to the target
370 debug. */
371 void debug_print_register (const char *func, int regno);
372
373 static void regcache_thread_ptid_changed (ptid_t old_ptid, ptid_t new_ptid);
374 protected:
375 regcache (gdbarch *gdbarch, const address_space *aspace_);
376 static std::forward_list<regcache *> current_regcache;
377
378 private:
379
380 void transfer_regset (const struct regset *regset,
381 struct regcache *out_regcache,
382 int regnum, const void *in_buf,
383 void *out_buf, size_t size) const;
384
385 enum register_status write_part (int regnum, int offset, int len,
386 const void *out, bool is_raw);
387
388
389 /* The address space of this register cache (for registers where it
390 makes sense, like PC or SP). */
391 const address_space * const m_aspace;
392
393 /* If this is a read-write cache, which thread's registers is
394 it connected to? */
395 ptid_t m_ptid;
396
397 friend struct regcache *
398 get_thread_arch_aspace_regcache (ptid_t ptid, struct gdbarch *gdbarch,
399 struct address_space *aspace);
400
401 friend void
402 registers_changed_ptid (ptid_t ptid);
403 };
404
405 class readonly_detached_regcache : public readable_regcache
406 {
407 public:
408 readonly_detached_regcache (const regcache &src);
409
410 /* Create a readonly regcache by getting contents from COOKED_READ. */
411
412 readonly_detached_regcache (gdbarch *gdbarch,
413 regcache_cooked_read_ftype *cooked_read,
414 void *src)
415 : readable_regcache (gdbarch, true)
416 {
417 save (cooked_read, src);
418 }
419
420 DISABLE_COPY_AND_ASSIGN (readonly_detached_regcache);
421
422 void raw_update (int regnum) override
423 {}
424 };
425
426 extern void registers_changed (void);
427 extern void registers_changed_ptid (ptid_t);
428
429 /* An abstract base class for register dump. */
430
431 class register_dump
432 {
433 public:
434 void dump (ui_file *file);
435 virtual ~register_dump () = default;
436
437 protected:
438 register_dump (gdbarch *arch)
439 : m_gdbarch (arch)
440 {}
441
442 /* Dump the register REGNUM contents. If REGNUM is -1, print the
443 header. */
444 virtual void dump_reg (ui_file *file, int regnum) = 0;
445
446 gdbarch *m_gdbarch;
447 };
448
449 #endif /* REGCACHE_H */