Fix typo in ChangeLog name (non-UTF8 character).
[deliverable/binutils-gdb.git] / gdb / regcache.c
CommitLineData
32178cab 1/* Cache and manage the values of registers for GDB, the GNU debugger.
3fadccb3 2
6aba47ca 3 Copyright (C) 1986, 1987, 1989, 1991, 1994, 1995, 1996, 1998, 2000, 2001,
4c38e0a4 4 2002, 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
32178cab
MS
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
32178cab
MS
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
32178cab
MS
20
21#include "defs.h"
32178cab
MS
22#include "inferior.h"
23#include "target.h"
24#include "gdbarch.h"
705152c5 25#include "gdbcmd.h"
4e052eda 26#include "regcache.h"
b59ff9d5 27#include "reggroups.h"
61a0eb5b 28#include "gdb_assert.h"
b66d6d2e 29#include "gdb_string.h"
af030b9a 30#include "gdbcmd.h" /* For maintenanceprintlist. */
f4c5303c 31#include "observer.h"
32178cab
MS
32
33/*
34 * DATA STRUCTURE
35 *
36 * Here is the actual register cache.
37 */
38
3fadccb3
AC
39/* Per-architecture object describing the layout of a register cache.
40 Computed once when the architecture is created */
41
42struct gdbarch_data *regcache_descr_handle;
43
44struct regcache_descr
45{
46 /* The architecture this descriptor belongs to. */
47 struct gdbarch *gdbarch;
48
bb1db049
AC
49 /* The raw register cache. Each raw (or hard) register is supplied
50 by the target interface. The raw cache should not contain
51 redundant information - if the PC is constructed from two
d2f0b918 52 registers then those registers and not the PC lives in the raw
bb1db049 53 cache. */
3fadccb3
AC
54 int nr_raw_registers;
55 long sizeof_raw_registers;
56 long sizeof_raw_register_valid_p;
57
d138e37a
AC
58 /* The cooked register space. Each cooked register in the range
59 [0..NR_RAW_REGISTERS) is direct-mapped onto the corresponding raw
60 register. The remaining [NR_RAW_REGISTERS
02f60eae 61 .. NR_COOKED_REGISTERS) (a.k.a. pseudo registers) are mapped onto
d138e37a 62 both raw registers and memory by the architecture methods
02f60eae 63 gdbarch_pseudo_register_read and gdbarch_pseudo_register_write. */
d138e37a 64 int nr_cooked_registers;
067df2e5
AC
65 long sizeof_cooked_registers;
66 long sizeof_cooked_register_valid_p;
d138e37a
AC
67
68 /* Offset and size (in 8 bit bytes), of reach register in the
69 register cache. All registers (including those in the range
70 [NR_RAW_REGISTERS .. NR_COOKED_REGISTERS) are given an offset.
71 Assigning all registers an offset makes it possible to keep
72 legacy code, such as that found in read_register_bytes() and
73 write_register_bytes() working. */
3fadccb3 74 long *register_offset;
3fadccb3 75 long *sizeof_register;
3fadccb3 76
bb425013
AC
77 /* Cached table containing the type of each register. */
78 struct type **register_type;
3fadccb3
AC
79};
80
3fadccb3
AC
81static void *
82init_regcache_descr (struct gdbarch *gdbarch)
83{
84 int i;
85 struct regcache_descr *descr;
86 gdb_assert (gdbarch != NULL);
87
bb425013 88 /* Create an initial, zero filled, table. */
116f06ea 89 descr = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct regcache_descr);
3fadccb3 90 descr->gdbarch = gdbarch;
3fadccb3 91
d138e37a
AC
92 /* Total size of the register space. The raw registers are mapped
93 directly onto the raw register cache while the pseudo's are
3fadccb3 94 either mapped onto raw-registers or memory. */
214e098a
UW
95 descr->nr_cooked_registers = gdbarch_num_regs (gdbarch)
96 + gdbarch_num_pseudo_regs (gdbarch);
97 descr->sizeof_cooked_register_valid_p = gdbarch_num_regs (gdbarch)
f57d151a 98 + gdbarch_num_pseudo_regs
214e098a 99 (gdbarch);
3fadccb3 100
bb425013 101 /* Fill in a table of register types. */
116f06ea
AC
102 descr->register_type
103 = GDBARCH_OBSTACK_CALLOC (gdbarch, descr->nr_cooked_registers, struct type *);
bb425013 104 for (i = 0; i < descr->nr_cooked_registers; i++)
336a3131 105 descr->register_type[i] = gdbarch_register_type (gdbarch, i);
bb425013 106
bb1db049
AC
107 /* Construct a strictly RAW register cache. Don't allow pseudo's
108 into the register cache. */
214e098a 109 descr->nr_raw_registers = gdbarch_num_regs (gdbarch);
bb1db049
AC
110
111 /* FIXME: cagney/2002-08-13: Overallocate the register_valid_p
112 array. This pretects GDB from erant code that accesses elements
f57d151a
UW
113 of the global register_valid_p[] array in the range
114 [gdbarch_num_regs .. gdbarch_num_regs + gdbarch_num_pseudo_regs). */
bb1db049
AC
115 descr->sizeof_raw_register_valid_p = descr->sizeof_cooked_register_valid_p;
116
067df2e5 117 /* Lay out the register cache.
3fadccb3 118
bb425013
AC
119 NOTE: cagney/2002-05-22: Only register_type() is used when
120 constructing the register cache. It is assumed that the
121 register's raw size, virtual size and type length are all the
122 same. */
3fadccb3
AC
123
124 {
125 long offset = 0;
116f06ea
AC
126 descr->sizeof_register
127 = GDBARCH_OBSTACK_CALLOC (gdbarch, descr->nr_cooked_registers, long);
128 descr->register_offset
129 = GDBARCH_OBSTACK_CALLOC (gdbarch, descr->nr_cooked_registers, long);
d138e37a 130 for (i = 0; i < descr->nr_cooked_registers; i++)
3fadccb3 131 {
bb425013 132 descr->sizeof_register[i] = TYPE_LENGTH (descr->register_type[i]);
3fadccb3
AC
133 descr->register_offset[i] = offset;
134 offset += descr->sizeof_register[i];
123a958e 135 gdb_assert (MAX_REGISTER_SIZE >= descr->sizeof_register[i]);
3fadccb3
AC
136 }
137 /* Set the real size of the register cache buffer. */
067df2e5 138 descr->sizeof_cooked_registers = offset;
3fadccb3
AC
139 }
140
067df2e5 141 /* FIXME: cagney/2002-05-22: Should only need to allocate space for
ce2826aa 142 the raw registers. Unfortunately some code still accesses the
067df2e5
AC
143 register array directly using the global registers[]. Until that
144 code has been purged, play safe and over allocating the register
145 buffer. Ulgh! */
146 descr->sizeof_raw_registers = descr->sizeof_cooked_registers;
147
3fadccb3
AC
148 return descr;
149}
150
151static struct regcache_descr *
152regcache_descr (struct gdbarch *gdbarch)
153{
154 return gdbarch_data (gdbarch, regcache_descr_handle);
155}
156
bb425013
AC
157/* Utility functions returning useful register attributes stored in
158 the regcache descr. */
159
160struct type *
161register_type (struct gdbarch *gdbarch, int regnum)
162{
163 struct regcache_descr *descr = regcache_descr (gdbarch);
164 gdb_assert (regnum >= 0 && regnum < descr->nr_cooked_registers);
165 return descr->register_type[regnum];
166}
167
0ed04cce
AC
168/* Utility functions returning useful register attributes stored in
169 the regcache descr. */
170
08a617da
AC
171int
172register_size (struct gdbarch *gdbarch, int regnum)
173{
174 struct regcache_descr *descr = regcache_descr (gdbarch);
175 int size;
f57d151a 176 gdb_assert (regnum >= 0
214e098a
UW
177 && regnum < (gdbarch_num_regs (gdbarch)
178 + gdbarch_num_pseudo_regs (gdbarch)));
08a617da 179 size = descr->sizeof_register[regnum];
08a617da
AC
180 return size;
181}
182
3fadccb3
AC
183/* The register cache for storing raw register values. */
184
185struct regcache
186{
187 struct regcache_descr *descr;
6c95b8df
PA
188
189 /* The address space of this register cache (for registers where it
190 makes sense, like PC or SP). */
191 struct address_space *aspace;
192
51b1fe4e 193 /* The register buffers. A read-only register cache can hold the
f57d151a
UW
194 full [0 .. gdbarch_num_regs + gdbarch_num_pseudo_regs) while a read/write
195 register cache can only hold [0 .. gdbarch_num_regs). */
2d522557 196 gdb_byte *registers;
b05e64e5
FR
197 /* Register cache status:
198 register_valid_p[REG] == 0 if REG value is not in the cache
199 > 0 if REG value is in the cache
200 < 0 if REG value is permanently unavailable */
201 signed char *register_valid_p;
2d28509a
AC
202 /* Is this a read-only cache? A read-only cache is used for saving
203 the target's register state (e.g, across an inferior function
204 call or just before forcing a function return). A read-only
205 cache can only be updated via the methods regcache_dup() and
206 regcache_cpy(). The actual contents are determined by the
207 reggroup_save and reggroup_restore methods. */
208 int readonly_p;
594f7785
UW
209 /* If this is a read-write cache, which thread's registers is
210 it connected to? */
211 ptid_t ptid;
3fadccb3
AC
212};
213
214struct regcache *
d37346f0 215regcache_xmalloc (struct gdbarch *gdbarch, struct address_space *aspace)
3fadccb3
AC
216{
217 struct regcache_descr *descr;
218 struct regcache *regcache;
219 gdb_assert (gdbarch != NULL);
220 descr = regcache_descr (gdbarch);
221 regcache = XMALLOC (struct regcache);
222 regcache->descr = descr;
51b1fe4e 223 regcache->registers
2d522557 224 = XCALLOC (descr->sizeof_raw_registers, gdb_byte);
51b1fe4e 225 regcache->register_valid_p
2d522557 226 = XCALLOC (descr->sizeof_raw_register_valid_p, gdb_byte);
d37346f0 227 regcache->aspace = aspace;
2d28509a 228 regcache->readonly_p = 1;
594f7785 229 regcache->ptid = minus_one_ptid;
3fadccb3
AC
230 return regcache;
231}
232
233void
234regcache_xfree (struct regcache *regcache)
235{
236 if (regcache == NULL)
237 return;
51b1fe4e
AC
238 xfree (regcache->registers);
239 xfree (regcache->register_valid_p);
3fadccb3
AC
240 xfree (regcache);
241}
242
b9362cc7 243static void
36160dc4
AC
244do_regcache_xfree (void *data)
245{
246 regcache_xfree (data);
247}
248
249struct cleanup *
250make_cleanup_regcache_xfree (struct regcache *regcache)
251{
252 return make_cleanup (do_regcache_xfree, regcache);
253}
254
41d35cb0
MK
255/* Return REGCACHE's architecture. */
256
257struct gdbarch *
258get_regcache_arch (const struct regcache *regcache)
259{
260 return regcache->descr->gdbarch;
261}
262
6c95b8df
PA
263struct address_space *
264get_regcache_aspace (const struct regcache *regcache)
265{
266 return regcache->aspace;
267}
268
51b1fe4e
AC
269/* Return a pointer to register REGNUM's buffer cache. */
270
2d522557 271static gdb_byte *
9a661b68 272register_buffer (const struct regcache *regcache, int regnum)
51b1fe4e
AC
273{
274 return regcache->registers + regcache->descr->register_offset[regnum];
275}
276
2d28509a 277void
5602984a
AC
278regcache_save (struct regcache *dst, regcache_cooked_read_ftype *cooked_read,
279 void *src)
2d28509a
AC
280{
281 struct gdbarch *gdbarch = dst->descr->gdbarch;
2d522557 282 gdb_byte buf[MAX_REGISTER_SIZE];
2d28509a 283 int regnum;
2d28509a 284 /* The DST should be `read-only', if it wasn't then the save would
5602984a 285 end up trying to write the register values back out to the
2d28509a 286 target. */
2d28509a
AC
287 gdb_assert (dst->readonly_p);
288 /* Clear the dest. */
289 memset (dst->registers, 0, dst->descr->sizeof_cooked_registers);
290 memset (dst->register_valid_p, 0, dst->descr->sizeof_cooked_register_valid_p);
291 /* Copy over any registers (identified by their membership in the
f57d151a
UW
292 save_reggroup) and mark them as valid. The full [0 .. gdbarch_num_regs +
293 gdbarch_num_pseudo_regs) range is checked since some architectures need
5602984a 294 to save/restore `cooked' registers that live in memory. */
2d28509a
AC
295 for (regnum = 0; regnum < dst->descr->nr_cooked_registers; regnum++)
296 {
297 if (gdbarch_register_reggroup_p (gdbarch, regnum, save_reggroup))
298 {
5602984a
AC
299 int valid = cooked_read (src, regnum, buf);
300 if (valid)
301 {
302 memcpy (register_buffer (dst, regnum), buf,
303 register_size (gdbarch, regnum));
304 dst->register_valid_p[regnum] = 1;
305 }
2d28509a
AC
306 }
307 }
308}
309
310void
5602984a
AC
311regcache_restore (struct regcache *dst,
312 regcache_cooked_read_ftype *cooked_read,
2d522557 313 void *cooked_read_context)
2d28509a
AC
314{
315 struct gdbarch *gdbarch = dst->descr->gdbarch;
2d522557 316 gdb_byte buf[MAX_REGISTER_SIZE];
2d28509a 317 int regnum;
5602984a
AC
318 /* The dst had better not be read-only. If it is, the `restore'
319 doesn't make much sense. */
2d28509a 320 gdb_assert (!dst->readonly_p);
2d28509a 321 /* Copy over any registers, being careful to only restore those that
f57d151a
UW
322 were both saved and need to be restored. The full [0 .. gdbarch_num_regs
323 + gdbarch_num_pseudo_regs) range is checked since some architectures need
5602984a
AC
324 to save/restore `cooked' registers that live in memory. */
325 for (regnum = 0; regnum < dst->descr->nr_cooked_registers; regnum++)
2d28509a 326 {
5602984a 327 if (gdbarch_register_reggroup_p (gdbarch, regnum, restore_reggroup))
2d28509a 328 {
2d522557 329 int valid = cooked_read (cooked_read_context, regnum, buf);
5602984a
AC
330 if (valid)
331 regcache_cooked_write (dst, regnum, buf);
2d28509a
AC
332 }
333 }
334}
335
5602984a 336static int
2d522557 337do_cooked_read (void *src, int regnum, gdb_byte *buf)
5602984a
AC
338{
339 struct regcache *regcache = src;
6f4e5a41 340 if (!regcache->register_valid_p[regnum] && regcache->readonly_p)
5602984a
AC
341 /* Don't even think about fetching a register from a read-only
342 cache when the register isn't yet valid. There isn't a target
343 from which the register value can be fetched. */
344 return 0;
345 regcache_cooked_read (regcache, regnum, buf);
346 return 1;
347}
348
349
3fadccb3
AC
350void
351regcache_cpy (struct regcache *dst, struct regcache *src)
352{
353 int i;
2d522557 354 gdb_byte *buf;
6c95b8df 355
3fadccb3
AC
356 gdb_assert (src != NULL && dst != NULL);
357 gdb_assert (src->descr->gdbarch == dst->descr->gdbarch);
358 gdb_assert (src != dst);
2d28509a 359 gdb_assert (src->readonly_p || dst->readonly_p);
6c95b8df 360
2d28509a 361 if (!src->readonly_p)
5602984a 362 regcache_save (dst, do_cooked_read, src);
2d28509a 363 else if (!dst->readonly_p)
5602984a 364 regcache_restore (dst, do_cooked_read, src);
2d28509a
AC
365 else
366 regcache_cpy_no_passthrough (dst, src);
3fadccb3
AC
367}
368
369void
370regcache_cpy_no_passthrough (struct regcache *dst, struct regcache *src)
371{
372 int i;
373 gdb_assert (src != NULL && dst != NULL);
374 gdb_assert (src->descr->gdbarch == dst->descr->gdbarch);
375 /* NOTE: cagney/2002-05-17: Don't let the caller do a no-passthrough
594f7785 376 move of data into the current regcache. Doing this would be
9564ee9f 377 silly - it would mean that valid_p would be completely invalid. */
594f7785 378 gdb_assert (dst->readonly_p);
6c95b8df 379
51b1fe4e
AC
380 memcpy (dst->registers, src->registers, dst->descr->sizeof_raw_registers);
381 memcpy (dst->register_valid_p, src->register_valid_p,
3fadccb3
AC
382 dst->descr->sizeof_raw_register_valid_p);
383}
384
385struct regcache *
386regcache_dup (struct regcache *src)
387{
388 struct regcache *newbuf;
d37346f0 389 newbuf = regcache_xmalloc (src->descr->gdbarch, get_regcache_aspace (src));
3fadccb3
AC
390 regcache_cpy (newbuf, src);
391 return newbuf;
392}
393
394struct regcache *
395regcache_dup_no_passthrough (struct regcache *src)
396{
397 struct regcache *newbuf;
d37346f0 398 newbuf = regcache_xmalloc (src->descr->gdbarch, get_regcache_aspace (src));
3fadccb3
AC
399 regcache_cpy_no_passthrough (newbuf, src);
400 return newbuf;
401}
402
403int
6ed7ea50 404regcache_valid_p (const struct regcache *regcache, int regnum)
3fadccb3
AC
405{
406 gdb_assert (regcache != NULL);
6ed7ea50
UW
407 gdb_assert (regnum >= 0);
408 if (regcache->readonly_p)
409 gdb_assert (regnum < regcache->descr->nr_cooked_registers);
410 else
411 gdb_assert (regnum < regcache->descr->nr_raw_registers);
412
51b1fe4e 413 return regcache->register_valid_p[regnum];
3fadccb3
AC
414}
415
9c5ea4d9
UW
416void
417regcache_invalidate (struct regcache *regcache, int regnum)
418{
419 gdb_assert (regcache != NULL);
420 gdb_assert (regnum >= 0);
421 gdb_assert (!regcache->readonly_p);
422 gdb_assert (regnum < regcache->descr->nr_raw_registers);
423 regcache->register_valid_p[regnum] = 0;
424}
425
426
3fadccb3 427/* Global structure containing the current regcache. */
3fadccb3 428
5ebd2499 429/* NOTE: this is a write-through cache. There is no "dirty" bit for
32178cab
MS
430 recording if the register values have been changed (eg. by the
431 user). Therefore all registers must be written back to the
432 target when appropriate. */
433
c2250ad1 434struct regcache_list
594f7785 435{
c2250ad1
UW
436 struct regcache *regcache;
437 struct regcache_list *next;
438};
439
440static struct regcache_list *current_regcache;
441
442struct regcache *
443get_thread_arch_regcache (ptid_t ptid, struct gdbarch *gdbarch)
444{
445 struct regcache_list *list;
446 struct regcache *new_regcache;
594f7785 447
c2250ad1
UW
448 for (list = current_regcache; list; list = list->next)
449 if (ptid_equal (list->regcache->ptid, ptid)
450 && get_regcache_arch (list->regcache) == gdbarch)
451 return list->regcache;
594f7785 452
d37346f0
DJ
453 new_regcache = regcache_xmalloc (gdbarch,
454 target_thread_address_space (ptid));
c2250ad1
UW
455 new_regcache->readonly_p = 0;
456 new_regcache->ptid = ptid;
6c95b8df 457 gdb_assert (new_regcache->aspace != NULL);
594f7785 458
c2250ad1
UW
459 list = xmalloc (sizeof (struct regcache_list));
460 list->regcache = new_regcache;
461 list->next = current_regcache;
462 current_regcache = list;
594f7785 463
c2250ad1 464 return new_regcache;
594f7785
UW
465}
466
c2250ad1
UW
467static ptid_t current_thread_ptid;
468static struct gdbarch *current_thread_arch;
469
470struct regcache *
471get_thread_regcache (ptid_t ptid)
472{
473 if (!current_thread_arch || !ptid_equal (current_thread_ptid, ptid))
474 {
475 current_thread_ptid = ptid;
476 current_thread_arch = target_thread_architecture (ptid);
477 }
478
479 return get_thread_arch_regcache (ptid, current_thread_arch);
480}
481
482struct regcache *
483get_current_regcache (void)
594f7785
UW
484{
485 return get_thread_regcache (inferior_ptid);
486}
32178cab 487
32178cab 488
f4c5303c
OF
489/* Observer for the target_changed event. */
490
2c0b251b 491static void
f4c5303c
OF
492regcache_observer_target_changed (struct target_ops *target)
493{
494 registers_changed ();
495}
496
5231c1fd
PA
497/* Update global variables old ptids to hold NEW_PTID if they were
498 holding OLD_PTID. */
499static void
500regcache_thread_ptid_changed (ptid_t old_ptid, ptid_t new_ptid)
501{
c2250ad1
UW
502 struct regcache_list *list;
503
504 for (list = current_regcache; list; list = list->next)
505 if (ptid_equal (list->regcache->ptid, old_ptid))
506 list->regcache->ptid = new_ptid;
5231c1fd
PA
507}
508
32178cab
MS
509/* Low level examining and depositing of registers.
510
511 The caller is responsible for making sure that the inferior is
512 stopped before calling the fetching routines, or it will get
513 garbage. (a change from GDB version 3, in which the caller got the
514 value from the last stop). */
515
516/* REGISTERS_CHANGED ()
517
518 Indicate that registers may have changed, so invalidate the cache. */
519
520void
521registers_changed (void)
522{
c2250ad1
UW
523 struct regcache_list *list, *next;
524
525 for (list = current_regcache; list; list = next)
526 {
527 next = list->next;
528 regcache_xfree (list->regcache);
529 xfree (list);
530 }
32178cab 531
594f7785 532 current_regcache = NULL;
32178cab 533
c2250ad1
UW
534 current_thread_ptid = null_ptid;
535 current_thread_arch = NULL;
536
a5d9d57d
DJ
537 /* Need to forget about any frames we have cached, too. */
538 reinit_frame_cache ();
539
32178cab
MS
540 /* Force cleanup of any alloca areas if using C alloca instead of
541 a builtin alloca. This particular call is used to clean up
542 areas allocated by low level target code which may build up
543 during lengthy interactions between gdb and the target before
544 gdb gives control to the user (ie watchpoints). */
545 alloca (0);
32178cab
MS
546}
547
32178cab 548
61a0eb5b 549void
2d522557 550regcache_raw_read (struct regcache *regcache, int regnum, gdb_byte *buf)
61a0eb5b 551{
3fadccb3
AC
552 gdb_assert (regcache != NULL && buf != NULL);
553 gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
3fadccb3
AC
554 /* Make certain that the register cache is up-to-date with respect
555 to the current thread. This switching shouldn't be necessary
556 only there is still only one target side register cache. Sigh!
557 On the bright side, at least there is a regcache object. */
2d28509a 558 if (!regcache->readonly_p)
3fadccb3 559 {
594f7785 560 if (!regcache_valid_p (regcache, regnum))
3fadccb3 561 {
594f7785
UW
562 struct cleanup *old_chain = save_inferior_ptid ();
563 inferior_ptid = regcache->ptid;
564 target_fetch_registers (regcache, regnum);
565 do_cleanups (old_chain);
3fadccb3 566 }
0a8146bf
AC
567#if 0
568 /* FIXME: cagney/2004-08-07: At present a number of targets
04c663e3
DA
569 forget (or didn't know that they needed) to set this leading to
570 panics. Also is the problem that targets need to indicate
0a8146bf
AC
571 that a register is in one of the possible states: valid,
572 undefined, unknown. The last of which isn't yet
573 possible. */
9c5ea4d9 574 gdb_assert (regcache_valid_p (regcache, regnum));
0a8146bf 575#endif
3fadccb3
AC
576 }
577 /* Copy the value directly into the register cache. */
51b1fe4e 578 memcpy (buf, register_buffer (regcache, regnum),
3fadccb3 579 regcache->descr->sizeof_register[regnum]);
61a0eb5b
AC
580}
581
28fc6740
AC
582void
583regcache_raw_read_signed (struct regcache *regcache, int regnum, LONGEST *val)
584{
2d522557 585 gdb_byte *buf;
28fc6740
AC
586 gdb_assert (regcache != NULL);
587 gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
588 buf = alloca (regcache->descr->sizeof_register[regnum]);
589 regcache_raw_read (regcache, regnum, buf);
e17a4113
UW
590 (*val) = extract_signed_integer
591 (buf, regcache->descr->sizeof_register[regnum],
592 gdbarch_byte_order (regcache->descr->gdbarch));
28fc6740
AC
593}
594
595void
596regcache_raw_read_unsigned (struct regcache *regcache, int regnum,
597 ULONGEST *val)
598{
2d522557 599 gdb_byte *buf;
28fc6740
AC
600 gdb_assert (regcache != NULL);
601 gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
602 buf = alloca (regcache->descr->sizeof_register[regnum]);
603 regcache_raw_read (regcache, regnum, buf);
e17a4113
UW
604 (*val) = extract_unsigned_integer
605 (buf, regcache->descr->sizeof_register[regnum],
606 gdbarch_byte_order (regcache->descr->gdbarch));
28fc6740
AC
607}
608
c00dcbe9
MK
609void
610regcache_raw_write_signed (struct regcache *regcache, int regnum, LONGEST val)
611{
612 void *buf;
613 gdb_assert (regcache != NULL);
614 gdb_assert (regnum >=0 && regnum < regcache->descr->nr_raw_registers);
615 buf = alloca (regcache->descr->sizeof_register[regnum]);
e17a4113
UW
616 store_signed_integer (buf, regcache->descr->sizeof_register[regnum],
617 gdbarch_byte_order (regcache->descr->gdbarch), val);
c00dcbe9
MK
618 regcache_raw_write (regcache, regnum, buf);
619}
620
621void
622regcache_raw_write_unsigned (struct regcache *regcache, int regnum,
623 ULONGEST val)
624{
625 void *buf;
626 gdb_assert (regcache != NULL);
627 gdb_assert (regnum >=0 && regnum < regcache->descr->nr_raw_registers);
628 buf = alloca (regcache->descr->sizeof_register[regnum]);
e17a4113
UW
629 store_unsigned_integer (buf, regcache->descr->sizeof_register[regnum],
630 gdbarch_byte_order (regcache->descr->gdbarch), val);
c00dcbe9
MK
631 regcache_raw_write (regcache, regnum, buf);
632}
633
68365089 634void
2d522557 635regcache_cooked_read (struct regcache *regcache, int regnum, gdb_byte *buf)
68365089 636{
d138e37a 637 gdb_assert (regnum >= 0);
68365089
AC
638 gdb_assert (regnum < regcache->descr->nr_cooked_registers);
639 if (regnum < regcache->descr->nr_raw_registers)
640 regcache_raw_read (regcache, regnum, buf);
2d28509a
AC
641 else if (regcache->readonly_p
642 && regnum < regcache->descr->nr_cooked_registers
643 && regcache->register_valid_p[regnum])
b2fa5097 644 /* Read-only register cache, perhaps the cooked value was cached? */
2d28509a
AC
645 memcpy (buf, register_buffer (regcache, regnum),
646 regcache->descr->sizeof_register[regnum]);
d138e37a 647 else
68365089
AC
648 gdbarch_pseudo_register_read (regcache->descr->gdbarch, regcache,
649 regnum, buf);
61a0eb5b
AC
650}
651
a378f419
AC
652void
653regcache_cooked_read_signed (struct regcache *regcache, int regnum,
654 LONGEST *val)
655{
2d522557 656 gdb_byte *buf;
a378f419 657 gdb_assert (regcache != NULL);
a66a9c23 658 gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_cooked_registers);
a378f419
AC
659 buf = alloca (regcache->descr->sizeof_register[regnum]);
660 regcache_cooked_read (regcache, regnum, buf);
e17a4113
UW
661 (*val) = extract_signed_integer
662 (buf, regcache->descr->sizeof_register[regnum],
663 gdbarch_byte_order (regcache->descr->gdbarch));
a378f419
AC
664}
665
666void
667regcache_cooked_read_unsigned (struct regcache *regcache, int regnum,
668 ULONGEST *val)
669{
2d522557 670 gdb_byte *buf;
a378f419 671 gdb_assert (regcache != NULL);
a66a9c23 672 gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_cooked_registers);
a378f419
AC
673 buf = alloca (regcache->descr->sizeof_register[regnum]);
674 regcache_cooked_read (regcache, regnum, buf);
e17a4113
UW
675 (*val) = extract_unsigned_integer
676 (buf, regcache->descr->sizeof_register[regnum],
677 gdbarch_byte_order (regcache->descr->gdbarch));
a378f419
AC
678}
679
a66a9c23
AC
680void
681regcache_cooked_write_signed (struct regcache *regcache, int regnum,
682 LONGEST val)
683{
684 void *buf;
685 gdb_assert (regcache != NULL);
686 gdb_assert (regnum >=0 && regnum < regcache->descr->nr_cooked_registers);
687 buf = alloca (regcache->descr->sizeof_register[regnum]);
e17a4113
UW
688 store_signed_integer (buf, regcache->descr->sizeof_register[regnum],
689 gdbarch_byte_order (regcache->descr->gdbarch), val);
a66a9c23
AC
690 regcache_cooked_write (regcache, regnum, buf);
691}
692
693void
694regcache_cooked_write_unsigned (struct regcache *regcache, int regnum,
695 ULONGEST val)
696{
697 void *buf;
698 gdb_assert (regcache != NULL);
699 gdb_assert (regnum >=0 && regnum < regcache->descr->nr_cooked_registers);
700 buf = alloca (regcache->descr->sizeof_register[regnum]);
e17a4113
UW
701 store_unsigned_integer (buf, regcache->descr->sizeof_register[regnum],
702 gdbarch_byte_order (regcache->descr->gdbarch), val);
a66a9c23
AC
703 regcache_cooked_write (regcache, regnum, buf);
704}
705
61a0eb5b 706void
2d522557
AC
707regcache_raw_write (struct regcache *regcache, int regnum,
708 const gdb_byte *buf)
61a0eb5b 709{
594f7785
UW
710 struct cleanup *old_chain;
711
3fadccb3
AC
712 gdb_assert (regcache != NULL && buf != NULL);
713 gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
2d28509a 714 gdb_assert (!regcache->readonly_p);
3fadccb3 715
3fadccb3
AC
716 /* On the sparc, writing %g0 is a no-op, so we don't even want to
717 change the registers array if something writes to this register. */
214e098a 718 if (gdbarch_cannot_store_register (get_regcache_arch (regcache), regnum))
3fadccb3
AC
719 return;
720
3fadccb3
AC
721 /* If we have a valid copy of the register, and new value == old
722 value, then don't bother doing the actual store. */
723 if (regcache_valid_p (regcache, regnum)
724 && (memcmp (register_buffer (regcache, regnum), buf,
725 regcache->descr->sizeof_register[regnum]) == 0))
726 return;
727
594f7785
UW
728 old_chain = save_inferior_ptid ();
729 inferior_ptid = regcache->ptid;
730
316f2060 731 target_prepare_to_store (regcache);
3fadccb3
AC
732 memcpy (register_buffer (regcache, regnum), buf,
733 regcache->descr->sizeof_register[regnum]);
51b1fe4e 734 regcache->register_valid_p[regnum] = 1;
56be3814 735 target_store_registers (regcache, regnum);
594f7785
UW
736
737 do_cleanups (old_chain);
61a0eb5b
AC
738}
739
68365089 740void
2d522557
AC
741regcache_cooked_write (struct regcache *regcache, int regnum,
742 const gdb_byte *buf)
68365089 743{
d138e37a 744 gdb_assert (regnum >= 0);
68365089
AC
745 gdb_assert (regnum < regcache->descr->nr_cooked_registers);
746 if (regnum < regcache->descr->nr_raw_registers)
747 regcache_raw_write (regcache, regnum, buf);
d138e37a 748 else
68365089 749 gdbarch_pseudo_register_write (regcache->descr->gdbarch, regcache,
d8124050 750 regnum, buf);
61a0eb5b
AC
751}
752
06c0b04e
AC
753/* Perform a partial register transfer using a read, modify, write
754 operation. */
755
756typedef void (regcache_read_ftype) (struct regcache *regcache, int regnum,
757 void *buf);
758typedef void (regcache_write_ftype) (struct regcache *regcache, int regnum,
759 const void *buf);
760
b9362cc7 761static void
06c0b04e
AC
762regcache_xfer_part (struct regcache *regcache, int regnum,
763 int offset, int len, void *in, const void *out,
2d522557
AC
764 void (*read) (struct regcache *regcache, int regnum,
765 gdb_byte *buf),
766 void (*write) (struct regcache *regcache, int regnum,
767 const gdb_byte *buf))
06c0b04e
AC
768{
769 struct regcache_descr *descr = regcache->descr;
fc1a4b47 770 gdb_byte reg[MAX_REGISTER_SIZE];
06c0b04e
AC
771 gdb_assert (offset >= 0 && offset <= descr->sizeof_register[regnum]);
772 gdb_assert (len >= 0 && offset + len <= descr->sizeof_register[regnum]);
773 /* Something to do? */
774 if (offset + len == 0)
775 return;
776 /* Read (when needed) ... */
777 if (in != NULL
778 || offset > 0
779 || offset + len < descr->sizeof_register[regnum])
780 {
781 gdb_assert (read != NULL);
782 read (regcache, regnum, reg);
783 }
784 /* ... modify ... */
785 if (in != NULL)
786 memcpy (in, reg + offset, len);
787 if (out != NULL)
788 memcpy (reg + offset, out, len);
789 /* ... write (when needed). */
790 if (out != NULL)
791 {
792 gdb_assert (write != NULL);
793 write (regcache, regnum, reg);
794 }
795}
796
797void
798regcache_raw_read_part (struct regcache *regcache, int regnum,
2d522557 799 int offset, int len, gdb_byte *buf)
06c0b04e
AC
800{
801 struct regcache_descr *descr = regcache->descr;
802 gdb_assert (regnum >= 0 && regnum < descr->nr_raw_registers);
803 regcache_xfer_part (regcache, regnum, offset, len, buf, NULL,
804 regcache_raw_read, regcache_raw_write);
805}
806
807void
808regcache_raw_write_part (struct regcache *regcache, int regnum,
2d522557 809 int offset, int len, const gdb_byte *buf)
06c0b04e
AC
810{
811 struct regcache_descr *descr = regcache->descr;
812 gdb_assert (regnum >= 0 && regnum < descr->nr_raw_registers);
813 regcache_xfer_part (regcache, regnum, offset, len, NULL, buf,
814 regcache_raw_read, regcache_raw_write);
815}
816
817void
818regcache_cooked_read_part (struct regcache *regcache, int regnum,
2d522557 819 int offset, int len, gdb_byte *buf)
06c0b04e
AC
820{
821 struct regcache_descr *descr = regcache->descr;
822 gdb_assert (regnum >= 0 && regnum < descr->nr_cooked_registers);
823 regcache_xfer_part (regcache, regnum, offset, len, buf, NULL,
824 regcache_cooked_read, regcache_cooked_write);
825}
826
827void
828regcache_cooked_write_part (struct regcache *regcache, int regnum,
2d522557 829 int offset, int len, const gdb_byte *buf)
06c0b04e
AC
830{
831 struct regcache_descr *descr = regcache->descr;
832 gdb_assert (regnum >= 0 && regnum < descr->nr_cooked_registers);
833 regcache_xfer_part (regcache, regnum, offset, len, NULL, buf,
834 regcache_cooked_read, regcache_cooked_write);
835}
32178cab 836
a16d75cc 837/* Supply register REGNUM, whose contents are stored in BUF, to REGCACHE. */
9a661b68
MK
838
839void
6618125d 840regcache_raw_supply (struct regcache *regcache, int regnum, const void *buf)
9a661b68
MK
841{
842 void *regbuf;
843 size_t size;
844
a16d75cc 845 gdb_assert (regcache != NULL);
9a661b68
MK
846 gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
847 gdb_assert (!regcache->readonly_p);
848
9a661b68
MK
849 regbuf = register_buffer (regcache, regnum);
850 size = regcache->descr->sizeof_register[regnum];
851
852 if (buf)
853 memcpy (regbuf, buf, size);
854 else
855 memset (regbuf, 0, size);
856
857 /* Mark the register as cached. */
858 regcache->register_valid_p[regnum] = 1;
859}
860
861/* Collect register REGNUM from REGCACHE and store its contents in BUF. */
862
863void
6618125d 864regcache_raw_collect (const struct regcache *regcache, int regnum, void *buf)
9a661b68
MK
865{
866 const void *regbuf;
867 size_t size;
868
869 gdb_assert (regcache != NULL && buf != NULL);
870 gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
871
872 regbuf = register_buffer (regcache, regnum);
873 size = regcache->descr->sizeof_register[regnum];
874 memcpy (buf, regbuf, size);
875}
876
193cb69f 877
515630c5 878/* Special handling for register PC. */
32178cab
MS
879
880CORE_ADDR
515630c5 881regcache_read_pc (struct regcache *regcache)
32178cab 882{
61a1198a
UW
883 struct gdbarch *gdbarch = get_regcache_arch (regcache);
884
32178cab
MS
885 CORE_ADDR pc_val;
886
61a1198a
UW
887 if (gdbarch_read_pc_p (gdbarch))
888 pc_val = gdbarch_read_pc (gdbarch, regcache);
cde9ea48 889 /* Else use per-frame method on get_current_frame. */
214e098a 890 else if (gdbarch_pc_regnum (gdbarch) >= 0)
cde9ea48 891 {
61a1198a 892 ULONGEST raw_val;
3e8c568d 893 regcache_cooked_read_unsigned (regcache,
214e098a 894 gdbarch_pc_regnum (gdbarch),
3e8c568d 895 &raw_val);
214e098a 896 pc_val = gdbarch_addr_bits_remove (gdbarch, raw_val);
cde9ea48
AC
897 }
898 else
515630c5
UW
899 internal_error (__FILE__, __LINE__,
900 _("regcache_read_pc: Unable to find PC"));
32178cab
MS
901 return pc_val;
902}
903
32178cab 904void
515630c5 905regcache_write_pc (struct regcache *regcache, CORE_ADDR pc)
32178cab 906{
61a1198a
UW
907 struct gdbarch *gdbarch = get_regcache_arch (regcache);
908
61a1198a
UW
909 if (gdbarch_write_pc_p (gdbarch))
910 gdbarch_write_pc (gdbarch, regcache, pc);
214e098a 911 else if (gdbarch_pc_regnum (gdbarch) >= 0)
3e8c568d 912 regcache_cooked_write_unsigned (regcache,
214e098a 913 gdbarch_pc_regnum (gdbarch), pc);
61a1198a
UW
914 else
915 internal_error (__FILE__, __LINE__,
515630c5 916 _("regcache_write_pc: Unable to update PC"));
edb3359d
DJ
917
918 /* Writing the PC (for instance, from "load") invalidates the
919 current frame. */
920 reinit_frame_cache ();
32178cab
MS
921}
922
32178cab 923
705152c5
MS
924static void
925reg_flush_command (char *command, int from_tty)
926{
927 /* Force-flush the register cache. */
928 registers_changed ();
929 if (from_tty)
a3f17187 930 printf_filtered (_("Register cache flushed.\n"));
705152c5
MS
931}
932
af030b9a
AC
933static void
934dump_endian_bytes (struct ui_file *file, enum bfd_endian endian,
935 const unsigned char *buf, long len)
936{
937 int i;
938 switch (endian)
939 {
940 case BFD_ENDIAN_BIG:
941 for (i = 0; i < len; i++)
942 fprintf_unfiltered (file, "%02x", buf[i]);
943 break;
944 case BFD_ENDIAN_LITTLE:
945 for (i = len - 1; i >= 0; i--)
946 fprintf_unfiltered (file, "%02x", buf[i]);
947 break;
948 default:
e2e0b3e5 949 internal_error (__FILE__, __LINE__, _("Bad switch"));
af030b9a
AC
950 }
951}
952
953enum regcache_dump_what
954{
b59ff9d5 955 regcache_dump_none, regcache_dump_raw, regcache_dump_cooked, regcache_dump_groups
af030b9a
AC
956};
957
958static void
959regcache_dump (struct regcache *regcache, struct ui_file *file,
960 enum regcache_dump_what what_to_dump)
961{
962 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
b59ff9d5 963 struct gdbarch *gdbarch = regcache->descr->gdbarch;
af030b9a
AC
964 int regnum;
965 int footnote_nr = 0;
966 int footnote_register_size = 0;
967 int footnote_register_offset = 0;
968 int footnote_register_type_name_null = 0;
969 long register_offset = 0;
123a958e 970 unsigned char buf[MAX_REGISTER_SIZE];
af030b9a
AC
971
972#if 0
af030b9a
AC
973 fprintf_unfiltered (file, "nr_raw_registers %d\n",
974 regcache->descr->nr_raw_registers);
975 fprintf_unfiltered (file, "nr_cooked_registers %d\n",
976 regcache->descr->nr_cooked_registers);
977 fprintf_unfiltered (file, "sizeof_raw_registers %ld\n",
978 regcache->descr->sizeof_raw_registers);
979 fprintf_unfiltered (file, "sizeof_raw_register_valid_p %ld\n",
980 regcache->descr->sizeof_raw_register_valid_p);
f57d151a 981 fprintf_unfiltered (file, "gdbarch_num_regs %d\n",
214e098a 982 gdbarch_num_regs (gdbarch));
f57d151a 983 fprintf_unfiltered (file, "gdbarch_num_pseudo_regs %d\n",
214e098a 984 gdbarch_num_pseudo_regs (gdbarch));
af030b9a
AC
985#endif
986
987 gdb_assert (regcache->descr->nr_cooked_registers
214e098a
UW
988 == (gdbarch_num_regs (gdbarch)
989 + gdbarch_num_pseudo_regs (gdbarch)));
af030b9a
AC
990
991 for (regnum = -1; regnum < regcache->descr->nr_cooked_registers; regnum++)
992 {
993 /* Name. */
994 if (regnum < 0)
995 fprintf_unfiltered (file, " %-10s", "Name");
996 else
997 {
214e098a 998 const char *p = gdbarch_register_name (gdbarch, regnum);
af030b9a
AC
999 if (p == NULL)
1000 p = "";
1001 else if (p[0] == '\0')
1002 p = "''";
1003 fprintf_unfiltered (file, " %-10s", p);
1004 }
1005
1006 /* Number. */
1007 if (regnum < 0)
1008 fprintf_unfiltered (file, " %4s", "Nr");
1009 else
1010 fprintf_unfiltered (file, " %4d", regnum);
1011
1012 /* Relative number. */
1013 if (regnum < 0)
1014 fprintf_unfiltered (file, " %4s", "Rel");
214e098a 1015 else if (regnum < gdbarch_num_regs (gdbarch))
af030b9a
AC
1016 fprintf_unfiltered (file, " %4d", regnum);
1017 else
f57d151a 1018 fprintf_unfiltered (file, " %4d",
214e098a 1019 (regnum - gdbarch_num_regs (gdbarch)));
af030b9a
AC
1020
1021 /* Offset. */
1022 if (regnum < 0)
1023 fprintf_unfiltered (file, " %6s ", "Offset");
1024 else
1025 {
1026 fprintf_unfiltered (file, " %6ld",
1027 regcache->descr->register_offset[regnum]);
a7e3c2ad 1028 if (register_offset != regcache->descr->register_offset[regnum]
d3b22ed5
AC
1029 || (regnum > 0
1030 && (regcache->descr->register_offset[regnum]
1031 != (regcache->descr->register_offset[regnum - 1]
1032 + regcache->descr->sizeof_register[regnum - 1])))
1033 )
af030b9a
AC
1034 {
1035 if (!footnote_register_offset)
1036 footnote_register_offset = ++footnote_nr;
1037 fprintf_unfiltered (file, "*%d", footnote_register_offset);
1038 }
1039 else
1040 fprintf_unfiltered (file, " ");
1041 register_offset = (regcache->descr->register_offset[regnum]
1042 + regcache->descr->sizeof_register[regnum]);
1043 }
1044
1045 /* Size. */
1046 if (regnum < 0)
1047 fprintf_unfiltered (file, " %5s ", "Size");
1048 else
01e1877c
AC
1049 fprintf_unfiltered (file, " %5ld",
1050 regcache->descr->sizeof_register[regnum]);
af030b9a
AC
1051
1052 /* Type. */
b59ff9d5
AC
1053 {
1054 const char *t;
1055 if (regnum < 0)
1056 t = "Type";
1057 else
1058 {
1059 static const char blt[] = "builtin_type";
1060 t = TYPE_NAME (register_type (regcache->descr->gdbarch, regnum));
1061 if (t == NULL)
1062 {
1063 char *n;
1064 if (!footnote_register_type_name_null)
1065 footnote_register_type_name_null = ++footnote_nr;
b435e160 1066 n = xstrprintf ("*%d", footnote_register_type_name_null);
b59ff9d5
AC
1067 make_cleanup (xfree, n);
1068 t = n;
1069 }
1070 /* Chop a leading builtin_type. */
1071 if (strncmp (t, blt, strlen (blt)) == 0)
1072 t += strlen (blt);
1073 }
1074 fprintf_unfiltered (file, " %-15s", t);
1075 }
1076
1077 /* Leading space always present. */
1078 fprintf_unfiltered (file, " ");
af030b9a
AC
1079
1080 /* Value, raw. */
1081 if (what_to_dump == regcache_dump_raw)
1082 {
1083 if (regnum < 0)
1084 fprintf_unfiltered (file, "Raw value");
1085 else if (regnum >= regcache->descr->nr_raw_registers)
1086 fprintf_unfiltered (file, "<cooked>");
1087 else if (!regcache_valid_p (regcache, regnum))
1088 fprintf_unfiltered (file, "<invalid>");
1089 else
1090 {
1091 regcache_raw_read (regcache, regnum, buf);
1092 fprintf_unfiltered (file, "0x");
0d20ae72 1093 dump_endian_bytes (file,
214e098a 1094 gdbarch_byte_order (gdbarch), buf,
01e1877c 1095 regcache->descr->sizeof_register[regnum]);
af030b9a
AC
1096 }
1097 }
1098
1099 /* Value, cooked. */
1100 if (what_to_dump == regcache_dump_cooked)
1101 {
1102 if (regnum < 0)
1103 fprintf_unfiltered (file, "Cooked value");
1104 else
1105 {
1106 regcache_cooked_read (regcache, regnum, buf);
1107 fprintf_unfiltered (file, "0x");
0d20ae72 1108 dump_endian_bytes (file,
214e098a 1109 gdbarch_byte_order (gdbarch), buf,
01e1877c 1110 regcache->descr->sizeof_register[regnum]);
af030b9a
AC
1111 }
1112 }
1113
b59ff9d5
AC
1114 /* Group members. */
1115 if (what_to_dump == regcache_dump_groups)
1116 {
1117 if (regnum < 0)
1118 fprintf_unfiltered (file, "Groups");
1119 else
1120 {
b59ff9d5 1121 const char *sep = "";
6c7d17ba
AC
1122 struct reggroup *group;
1123 for (group = reggroup_next (gdbarch, NULL);
1124 group != NULL;
1125 group = reggroup_next (gdbarch, group))
b59ff9d5 1126 {
6c7d17ba 1127 if (gdbarch_register_reggroup_p (gdbarch, regnum, group))
b59ff9d5 1128 {
6c7d17ba 1129 fprintf_unfiltered (file, "%s%s", sep, reggroup_name (group));
b59ff9d5
AC
1130 sep = ",";
1131 }
1132 }
1133 }
1134 }
1135
af030b9a
AC
1136 fprintf_unfiltered (file, "\n");
1137 }
1138
1139 if (footnote_register_size)
1140 fprintf_unfiltered (file, "*%d: Inconsistent register sizes.\n",
1141 footnote_register_size);
1142 if (footnote_register_offset)
1143 fprintf_unfiltered (file, "*%d: Inconsistent register offsets.\n",
1144 footnote_register_offset);
1145 if (footnote_register_type_name_null)
1146 fprintf_unfiltered (file,
1147 "*%d: Register type's name NULL.\n",
1148 footnote_register_type_name_null);
1149 do_cleanups (cleanups);
1150}
1151
1152static void
1153regcache_print (char *args, enum regcache_dump_what what_to_dump)
1154{
1155 if (args == NULL)
28c38f10 1156 regcache_dump (get_current_regcache (), gdb_stdout, what_to_dump);
af030b9a
AC
1157 else
1158 {
724b958c 1159 struct cleanup *cleanups;
af030b9a
AC
1160 struct ui_file *file = gdb_fopen (args, "w");
1161 if (file == NULL)
e2e0b3e5 1162 perror_with_name (_("maintenance print architecture"));
724b958c 1163 cleanups = make_cleanup_ui_file_delete (file);
28c38f10 1164 regcache_dump (get_current_regcache (), file, what_to_dump);
724b958c 1165 do_cleanups (cleanups);
af030b9a
AC
1166 }
1167}
1168
1169static void
1170maintenance_print_registers (char *args, int from_tty)
1171{
1172 regcache_print (args, regcache_dump_none);
1173}
1174
1175static void
1176maintenance_print_raw_registers (char *args, int from_tty)
1177{
1178 regcache_print (args, regcache_dump_raw);
1179}
1180
1181static void
1182maintenance_print_cooked_registers (char *args, int from_tty)
1183{
1184 regcache_print (args, regcache_dump_cooked);
1185}
1186
b59ff9d5
AC
1187static void
1188maintenance_print_register_groups (char *args, int from_tty)
1189{
1190 regcache_print (args, regcache_dump_groups);
1191}
1192
b9362cc7
AC
1193extern initialize_file_ftype _initialize_regcache; /* -Wmissing-prototype */
1194
32178cab
MS
1195void
1196_initialize_regcache (void)
1197{
030f20e1 1198 regcache_descr_handle = gdbarch_data_register_post_init (init_regcache_descr);
705152c5 1199
f4c5303c 1200 observer_attach_target_changed (regcache_observer_target_changed);
5231c1fd 1201 observer_attach_thread_ptid_changed (regcache_thread_ptid_changed);
f4c5303c 1202
705152c5 1203 add_com ("flushregs", class_maintenance, reg_flush_command,
1bedd215 1204 _("Force gdb to flush its register cache (maintainer command)"));
39f77062 1205
1a966eab
AC
1206 add_cmd ("registers", class_maintenance, maintenance_print_registers, _("\
1207Print the internal register configuration.\n\
1208Takes an optional file parameter."), &maintenanceprintlist);
af030b9a 1209 add_cmd ("raw-registers", class_maintenance,
1a966eab
AC
1210 maintenance_print_raw_registers, _("\
1211Print the internal register configuration including raw values.\n\
1212Takes an optional file parameter."), &maintenanceprintlist);
af030b9a 1213 add_cmd ("cooked-registers", class_maintenance,
1a966eab
AC
1214 maintenance_print_cooked_registers, _("\
1215Print the internal register configuration including cooked values.\n\
1216Takes an optional file parameter."), &maintenanceprintlist);
b59ff9d5 1217 add_cmd ("register-groups", class_maintenance,
1a966eab
AC
1218 maintenance_print_register_groups, _("\
1219Print the internal register configuration including each register's group.\n\
1220Takes an optional file parameter."),
af030b9a
AC
1221 &maintenanceprintlist);
1222
32178cab 1223}
This page took 1.3681 seconds and 4 git commands to generate.