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