*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / user-regs.c
CommitLineData
eb8bc282
AC
1/* User visible, per-frame registers, for GDB, the GNU debugger.
2
6aba47ca 3 Copyright (C) 2002, 2003, 2004, 2007 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"
25#include "gdb_string.h"
26#include "gdb_assert.h"
27#include "frame.h"
28
29/* A table of user registers.
30
31 User registers have regnum's that live above of the range [0
f57d151a
UW
32 .. gdbarch_num_regs + gdbarch_num_pseudo_regs)
33 (which is controlled by the target).
eb8bc282
AC
34 The target should never see a user register's regnum value.
35
36 Always append, never delete. By doing this, the relative regnum
f57d151a
UW
37 (offset from gdbarch_num_regs + gdbarch_num_pseudo_regs)
38 assigned to each user register never changes. */
eb8bc282
AC
39
40struct user_reg
41{
42 const char *name;
123dc839
DJ
43 struct value *(*read) (struct frame_info * frame, const void *baton);
44 const void *baton;
63022984 45 struct user_reg *next;
eb8bc282
AC
46};
47
8b9740d8
DJ
48/* This structure is named gdb_user_regs instead of user_regs to avoid
49 conflicts with any "struct user_regs" in system headers. For instance,
50 on ARM GNU/Linux native builds, nm-linux.h includes <signal.h> includes
51 <sys/ucontext.h> includes <sys/procfs.h> includes <sys/user.h>, which
52 declares "struct user_regs". */
53
54struct gdb_user_regs
eb8bc282 55{
63022984
AC
56 struct user_reg *first;
57 struct user_reg **last;
eb8bc282
AC
58};
59
60static void
8b9740d8 61append_user_reg (struct gdb_user_regs *regs, const char *name,
123dc839
DJ
62 user_reg_read_ftype *read, const void *baton,
63 struct user_reg *reg)
eb8bc282 64{
63022984
AC
65 /* The caller is responsible for allocating memory needed to store
66 the register. By doing this, the function can operate on a
67 register list stored in the common heap or a specific obstack. */
68 gdb_assert (reg != NULL);
69 reg->name = name;
70 reg->read = read;
123dc839 71 reg->baton = baton;
63022984
AC
72 reg->next = NULL;
73 (*regs->last) = reg;
74 regs->last = &(*regs->last)->next;
eb8bc282
AC
75}
76
77/* An array of the builtin user registers. */
78
8b9740d8 79static struct gdb_user_regs builtin_user_regs = { NULL, &builtin_user_regs.first };
eb8bc282
AC
80
81void
123dc839
DJ
82user_reg_add_builtin (const char *name, user_reg_read_ftype *read,
83 const void *baton)
eb8bc282 84{
123dc839 85 append_user_reg (&builtin_user_regs, name, read, baton,
63022984 86 XMALLOC (struct user_reg));
eb8bc282
AC
87}
88
89/* Per-architecture user registers. Start with the builtin user
90 registers and then, again, append. */
91
92static struct gdbarch_data *user_regs_data;
93
94static void *
95user_regs_init (struct gdbarch *gdbarch)
96{
63022984 97 struct user_reg *reg;
8b9740d8 98 struct gdb_user_regs *regs = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct gdb_user_regs);
63022984
AC
99 regs->last = &regs->first;
100 for (reg = builtin_user_regs.first; reg != NULL; reg = reg->next)
123dc839 101 append_user_reg (regs, reg->name, reg->read, reg->baton,
63022984 102 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
eb8bc282
AC
103 return regs;
104}
105
eb8bc282
AC
106void
107user_reg_add (struct gdbarch *gdbarch, const char *name,
123dc839 108 user_reg_read_ftype *read, const void *baton)
eb8bc282 109{
8b9740d8 110 struct gdb_user_regs *regs = gdbarch_data (gdbarch, user_regs_data);
eb8bc282
AC
111 if (regs == NULL)
112 {
113 /* ULGH, called during architecture initialization. Patch
114 things up. */
115 regs = user_regs_init (gdbarch);
030f20e1 116 deprecated_set_gdbarch_data (gdbarch, user_regs_data, regs);
eb8bc282 117 }
123dc839 118 append_user_reg (regs, name, read, baton,
63022984 119 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
eb8bc282
AC
120}
121
122int
123user_reg_map_name_to_regnum (struct gdbarch *gdbarch, const char *name,
124 int len)
125{
126 /* Make life easy, set the len to something reasonable. */
127 if (len < 0)
128 len = strlen (name);
129
130 /* Search register name space first - always let an architecture
131 specific register override the user registers. */
132 {
133 int i;
134 int maxregs = (gdbarch_num_regs (gdbarch)
135 + gdbarch_num_pseudo_regs (gdbarch));
136 for (i = 0; i < maxregs; i++)
137 {
138 const char *regname = gdbarch_register_name (gdbarch, i);
139 if (regname != NULL && len == strlen (regname)
140 && strncmp (regname, name, len) == 0)
141 {
142 return i;
143 }
144 }
145 }
146
147 /* Search the user name space. */
148 {
8b9740d8 149 struct gdb_user_regs *regs = gdbarch_data (gdbarch, user_regs_data);
63022984
AC
150 struct user_reg *reg;
151 int nr;
152 for (nr = 0, reg = regs->first; reg != NULL; reg = reg->next, nr++)
eb8bc282 153 {
63022984
AC
154 if ((len < 0 && strcmp (reg->name, name))
155 || (len == strlen (reg->name)
156 && strncmp (reg->name, name, len) == 0))
f57d151a
UW
157 return gdbarch_num_regs (current_gdbarch)
158 + gdbarch_num_pseudo_regs (current_gdbarch) + nr;
eb8bc282
AC
159 }
160 }
161
162 return -1;
163}
164
63022984
AC
165static struct user_reg *
166usernum_to_user_reg (struct gdbarch *gdbarch, int usernum)
167{
8b9740d8 168 struct gdb_user_regs *regs = gdbarch_data (gdbarch, user_regs_data);
63022984
AC
169 struct user_reg *reg;
170 for (reg = regs->first; reg != NULL; reg = reg->next)
171 {
172 if (usernum == 0)
173 return reg;
174 usernum--;
175 }
176 return NULL;
177}
178
eb8bc282
AC
179const char *
180user_reg_map_regnum_to_name (struct gdbarch *gdbarch, int regnum)
181{
182 int maxregs = (gdbarch_num_regs (gdbarch)
183 + gdbarch_num_pseudo_regs (gdbarch));
eb8bc282
AC
184 if (regnum < 0)
185 return NULL;
63022984 186 else if (regnum < maxregs)
eb8bc282 187 return gdbarch_register_name (gdbarch, regnum);
63022984
AC
188 else
189 {
190 struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
191 if (reg == NULL)
192 return NULL;
193 else
194 return reg->name;
195 }
eb8bc282
AC
196}
197
198struct value *
199value_of_user_reg (int regnum, struct frame_info *frame)
200{
201 struct gdbarch *gdbarch = get_frame_arch (frame);
63022984
AC
202 int maxregs = (gdbarch_num_regs (gdbarch)
203 + gdbarch_num_pseudo_regs (gdbarch));
204 struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
205 gdb_assert (reg != NULL);
123dc839 206 return reg->read (frame, reg->baton);
eb8bc282
AC
207}
208
209extern initialize_file_ftype _initialize_user_regs; /* -Wmissing-prototypes */
210
211void
212_initialize_user_regs (void)
213{
030f20e1 214 user_regs_data = gdbarch_data_register_post_init (user_regs_init);
eb8bc282 215}
This page took 0.534634 seconds and 4 git commands to generate.