gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / user-regs.c
CommitLineData
eb8bc282
AC
1/* User visible, per-frame registers, for GDB, the GNU debugger.
2
b811d2c2 3 Copyright (C) 2002-2020 Free Software Foundation, Inc.
eb8bc282
AC
4
5 Contributed by Red Hat.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
eb8bc282
AC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
eb8bc282
AC
21
22#include "defs.h"
23#include "user-regs.h"
24#include "gdbtypes.h"
eb8bc282 25#include "frame.h"
f5b95c01
AA
26#include "arch-utils.h"
27#include "command.h"
28#include "cli/cli-cmds.h"
eb8bc282
AC
29
30/* A table of user registers.
31
32 User registers have regnum's that live above of the range [0
f57d151a
UW
33 .. gdbarch_num_regs + gdbarch_num_pseudo_regs)
34 (which is controlled by the target).
eb8bc282
AC
35 The target should never see a user register's regnum value.
36
37 Always append, never delete. By doing this, the relative regnum
f57d151a
UW
38 (offset from gdbarch_num_regs + gdbarch_num_pseudo_regs)
39 assigned to each user register never changes. */
eb8bc282
AC
40
41struct user_reg
42{
43 const char *name;
5ccd2fb7
KR
44 /* Avoid the "read" symbol name as it conflicts with a preprocessor symbol
45 in the NetBSD header for Stack Smashing Protection, that wraps the read(2)
46 syscall. */
47 struct value *(*xread) (struct frame_info * frame, const void *baton);
123dc839 48 const void *baton;
63022984 49 struct user_reg *next;
eb8bc282
AC
50};
51
8b9740d8
DJ
52/* This structure is named gdb_user_regs instead of user_regs to avoid
53 conflicts with any "struct user_regs" in system headers. For instance,
54 on ARM GNU/Linux native builds, nm-linux.h includes <signal.h> includes
55 <sys/ucontext.h> includes <sys/procfs.h> includes <sys/user.h>, which
56 declares "struct user_regs". */
57
58struct gdb_user_regs
eb8bc282 59{
63022984
AC
60 struct user_reg *first;
61 struct user_reg **last;
eb8bc282
AC
62};
63
64static void
8b9740d8 65append_user_reg (struct gdb_user_regs *regs, const char *name,
5ccd2fb7 66 user_reg_read_ftype *xread, const void *baton,
123dc839 67 struct user_reg *reg)
eb8bc282 68{
63022984
AC
69 /* The caller is responsible for allocating memory needed to store
70 the register. By doing this, the function can operate on a
71 register list stored in the common heap or a specific obstack. */
72 gdb_assert (reg != NULL);
73 reg->name = name;
5ccd2fb7 74 reg->xread = xread;
123dc839 75 reg->baton = baton;
63022984
AC
76 reg->next = NULL;
77 (*regs->last) = reg;
78 regs->last = &(*regs->last)->next;
eb8bc282
AC
79}
80
81/* An array of the builtin user registers. */
82
3e43a32a
MS
83static struct gdb_user_regs builtin_user_regs = {
84 NULL, &builtin_user_regs.first
85};
eb8bc282
AC
86
87void
5ccd2fb7 88user_reg_add_builtin (const char *name, user_reg_read_ftype *xread,
123dc839 89 const void *baton)
eb8bc282 90{
5ccd2fb7 91 append_user_reg (&builtin_user_regs, name, xread, baton,
70ba0933 92 XNEW (struct user_reg));
eb8bc282
AC
93}
94
95/* Per-architecture user registers. Start with the builtin user
96 registers and then, again, append. */
97
98static struct gdbarch_data *user_regs_data;
99
100static void *
101user_regs_init (struct gdbarch *gdbarch)
102{
63022984 103 struct user_reg *reg;
5d502164
MS
104 struct gdb_user_regs *regs
105 = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct gdb_user_regs);
106
63022984
AC
107 regs->last = &regs->first;
108 for (reg = builtin_user_regs.first; reg != NULL; reg = reg->next)
5ccd2fb7 109 append_user_reg (regs, reg->name, reg->xread, reg->baton,
63022984 110 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
eb8bc282
AC
111 return regs;
112}
113
eb8bc282
AC
114void
115user_reg_add (struct gdbarch *gdbarch, const char *name,
5ccd2fb7 116 user_reg_read_ftype *xread, const void *baton)
eb8bc282 117{
19ba03f4
SM
118 struct gdb_user_regs *regs
119 = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data);
5d502164 120
eb8bc282
AC
121 if (regs == NULL)
122 {
123 /* ULGH, called during architecture initialization. Patch
124 things up. */
19ba03f4 125 regs = (struct gdb_user_regs *) user_regs_init (gdbarch);
030f20e1 126 deprecated_set_gdbarch_data (gdbarch, user_regs_data, regs);
eb8bc282 127 }
5ccd2fb7 128 append_user_reg (regs, name, xread, baton,
63022984 129 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
eb8bc282
AC
130}
131
132int
133user_reg_map_name_to_regnum (struct gdbarch *gdbarch, const char *name,
134 int len)
135{
136 /* Make life easy, set the len to something reasonable. */
137 if (len < 0)
138 len = strlen (name);
139
140 /* Search register name space first - always let an architecture
141 specific register override the user registers. */
142 {
143 int i;
f6efe3f8 144 int maxregs = gdbarch_num_cooked_regs (gdbarch);
5d502164 145
eb8bc282
AC
146 for (i = 0; i < maxregs; i++)
147 {
148 const char *regname = gdbarch_register_name (gdbarch, i);
5d502164 149
eb8bc282
AC
150 if (regname != NULL && len == strlen (regname)
151 && strncmp (regname, name, len) == 0)
152 {
153 return i;
154 }
155 }
156 }
157
158 /* Search the user name space. */
159 {
19ba03f4
SM
160 struct gdb_user_regs *regs
161 = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data);
63022984
AC
162 struct user_reg *reg;
163 int nr;
5d502164 164
63022984 165 for (nr = 0, reg = regs->first; reg != NULL; reg = reg->next, nr++)
eb8bc282 166 {
63022984
AC
167 if ((len < 0 && strcmp (reg->name, name))
168 || (len == strlen (reg->name)
169 && strncmp (reg->name, name, len) == 0))
f6efe3f8 170 return gdbarch_num_cooked_regs (gdbarch) + nr;
eb8bc282
AC
171 }
172 }
173
174 return -1;
175}
176
63022984
AC
177static struct user_reg *
178usernum_to_user_reg (struct gdbarch *gdbarch, int usernum)
179{
19ba03f4
SM
180 struct gdb_user_regs *regs
181 = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data);
63022984 182 struct user_reg *reg;
5d502164 183
63022984
AC
184 for (reg = regs->first; reg != NULL; reg = reg->next)
185 {
186 if (usernum == 0)
187 return reg;
188 usernum--;
189 }
190 return NULL;
191}
192
eb8bc282
AC
193const char *
194user_reg_map_regnum_to_name (struct gdbarch *gdbarch, int regnum)
195{
f6efe3f8 196 int maxregs = gdbarch_num_cooked_regs (gdbarch);
5d502164 197
eb8bc282
AC
198 if (regnum < 0)
199 return NULL;
63022984 200 else if (regnum < maxregs)
eb8bc282 201 return gdbarch_register_name (gdbarch, regnum);
63022984
AC
202 else
203 {
204 struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
205 if (reg == NULL)
206 return NULL;
207 else
208 return reg->name;
209 }
eb8bc282
AC
210}
211
212struct value *
213value_of_user_reg (int regnum, struct frame_info *frame)
214{
215 struct gdbarch *gdbarch = get_frame_arch (frame);
f6efe3f8 216 int maxregs = gdbarch_num_cooked_regs (gdbarch);
63022984 217 struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
5d502164 218
63022984 219 gdb_assert (reg != NULL);
5ccd2fb7 220 return reg->xread (frame, reg->baton);
eb8bc282
AC
221}
222
f5b95c01 223static void
4d4589ef 224maintenance_print_user_registers (const char *args, int from_tty)
f5b95c01
AA
225{
226 struct gdbarch *gdbarch = get_current_arch ();
227 struct gdb_user_regs *regs;
228 struct user_reg *reg;
229 int regnum;
230
19ba03f4 231 regs = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data);
f6efe3f8 232 regnum = gdbarch_num_cooked_regs (gdbarch);
f5b95c01 233
25dda427 234 fprintf_unfiltered (gdb_stdout, " %-11s %3s\n", "Name", "Nr");
f5b95c01 235 for (reg = regs->first; reg != NULL; reg = reg->next, ++regnum)
25dda427 236 fprintf_unfiltered (gdb_stdout, " %-11s %3d\n", reg->name, regnum);
f5b95c01
AA
237}
238
6c265988 239void _initialize_user_regs ();
eb8bc282 240void
6c265988 241_initialize_user_regs ()
eb8bc282 242{
030f20e1 243 user_regs_data = gdbarch_data_register_post_init (user_regs_init);
f5b95c01
AA
244
245 add_cmd ("user-registers", class_maintenance,
246 maintenance_print_user_registers,
89549d7f 247 _("List the names of the current user registers."),
f5b95c01 248 &maintenanceprintlist);
eb8bc282 249}
This page took 1.858253 seconds and 4 git commands to generate.