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