[Ada] move some variables to scope where they are used
[deliverable/binutils-gdb.git] / gdb / user-regs.c
CommitLineData
eb8bc282
AC
1/* User visible, per-frame registers, for GDB, the GNU debugger.
2
4c38e0a4 3 Copyright (C) 2002, 2003, 2004, 2007, 2008, 2009, 2010
0fb0cc75 4 Free Software Foundation, Inc.
eb8bc282
AC
5
6 Contributed by Red Hat.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
eb8bc282
AC
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
eb8bc282
AC
22
23#include "defs.h"
24#include "user-regs.h"
25#include "gdbtypes.h"
26#include "gdb_string.h"
27#include "gdb_assert.h"
28#include "frame.h"
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;
123dc839
DJ
44 struct value *(*read) (struct frame_info * frame, const void *baton);
45 const void *baton;
63022984 46 struct user_reg *next;
eb8bc282
AC
47};
48
8b9740d8
DJ
49/* This structure is named gdb_user_regs instead of user_regs to avoid
50 conflicts with any "struct user_regs" in system headers. For instance,
51 on ARM GNU/Linux native builds, nm-linux.h includes <signal.h> includes
52 <sys/ucontext.h> includes <sys/procfs.h> includes <sys/user.h>, which
53 declares "struct user_regs". */
54
55struct gdb_user_regs
eb8bc282 56{
63022984
AC
57 struct user_reg *first;
58 struct user_reg **last;
eb8bc282
AC
59};
60
61static void
8b9740d8 62append_user_reg (struct gdb_user_regs *regs, const char *name,
123dc839
DJ
63 user_reg_read_ftype *read, const void *baton,
64 struct user_reg *reg)
eb8bc282 65{
63022984
AC
66 /* The caller is responsible for allocating memory needed to store
67 the register. By doing this, the function can operate on a
68 register list stored in the common heap or a specific obstack. */
69 gdb_assert (reg != NULL);
70 reg->name = name;
71 reg->read = read;
123dc839 72 reg->baton = baton;
63022984
AC
73 reg->next = NULL;
74 (*regs->last) = reg;
75 regs->last = &(*regs->last)->next;
eb8bc282
AC
76}
77
78/* An array of the builtin user registers. */
79
8b9740d8 80static struct gdb_user_regs builtin_user_regs = { NULL, &builtin_user_regs.first };
eb8bc282
AC
81
82void
123dc839
DJ
83user_reg_add_builtin (const char *name, user_reg_read_ftype *read,
84 const void *baton)
eb8bc282 85{
123dc839 86 append_user_reg (&builtin_user_regs, name, read, baton,
63022984 87 XMALLOC (struct user_reg));
eb8bc282
AC
88}
89
90/* Per-architecture user registers. Start with the builtin user
91 registers and then, again, append. */
92
93static struct gdbarch_data *user_regs_data;
94
95static void *
96user_regs_init (struct gdbarch *gdbarch)
97{
63022984 98 struct user_reg *reg;
5d502164
MS
99 struct gdb_user_regs *regs
100 = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct gdb_user_regs);
101
63022984
AC
102 regs->last = &regs->first;
103 for (reg = builtin_user_regs.first; reg != NULL; reg = reg->next)
123dc839 104 append_user_reg (regs, reg->name, reg->read, reg->baton,
63022984 105 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
eb8bc282
AC
106 return regs;
107}
108
eb8bc282
AC
109void
110user_reg_add (struct gdbarch *gdbarch, const char *name,
123dc839 111 user_reg_read_ftype *read, const void *baton)
eb8bc282 112{
8b9740d8 113 struct gdb_user_regs *regs = gdbarch_data (gdbarch, user_regs_data);
5d502164 114
eb8bc282
AC
115 if (regs == NULL)
116 {
117 /* ULGH, called during architecture initialization. Patch
118 things up. */
119 regs = user_regs_init (gdbarch);
030f20e1 120 deprecated_set_gdbarch_data (gdbarch, user_regs_data, regs);
eb8bc282 121 }
123dc839 122 append_user_reg (regs, name, read, baton,
63022984 123 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
eb8bc282
AC
124}
125
126int
127user_reg_map_name_to_regnum (struct gdbarch *gdbarch, const char *name,
128 int len)
129{
130 /* Make life easy, set the len to something reasonable. */
131 if (len < 0)
132 len = strlen (name);
133
134 /* Search register name space first - always let an architecture
135 specific register override the user registers. */
136 {
137 int i;
138 int maxregs = (gdbarch_num_regs (gdbarch)
139 + gdbarch_num_pseudo_regs (gdbarch));
5d502164 140
eb8bc282
AC
141 for (i = 0; i < maxregs; i++)
142 {
143 const char *regname = gdbarch_register_name (gdbarch, i);
5d502164 144
eb8bc282
AC
145 if (regname != NULL && len == strlen (regname)
146 && strncmp (regname, name, len) == 0)
147 {
148 return i;
149 }
150 }
151 }
152
153 /* Search the user name space. */
154 {
8b9740d8 155 struct gdb_user_regs *regs = gdbarch_data (gdbarch, user_regs_data);
63022984
AC
156 struct user_reg *reg;
157 int nr;
5d502164 158
63022984 159 for (nr = 0, reg = regs->first; reg != NULL; reg = reg->next, nr++)
eb8bc282 160 {
63022984
AC
161 if ((len < 0 && strcmp (reg->name, name))
162 || (len == strlen (reg->name)
163 && strncmp (reg->name, name, len) == 0))
40a6adc1
MD
164 return gdbarch_num_regs (gdbarch)
165 + gdbarch_num_pseudo_regs (gdbarch) + nr;
eb8bc282
AC
166 }
167 }
168
169 return -1;
170}
171
63022984
AC
172static struct user_reg *
173usernum_to_user_reg (struct gdbarch *gdbarch, int usernum)
174{
8b9740d8 175 struct gdb_user_regs *regs = gdbarch_data (gdbarch, user_regs_data);
63022984 176 struct user_reg *reg;
5d502164 177
63022984
AC
178 for (reg = regs->first; reg != NULL; reg = reg->next)
179 {
180 if (usernum == 0)
181 return reg;
182 usernum--;
183 }
184 return NULL;
185}
186
eb8bc282
AC
187const char *
188user_reg_map_regnum_to_name (struct gdbarch *gdbarch, int regnum)
189{
190 int maxregs = (gdbarch_num_regs (gdbarch)
191 + gdbarch_num_pseudo_regs (gdbarch));
5d502164 192
eb8bc282
AC
193 if (regnum < 0)
194 return NULL;
63022984 195 else if (regnum < maxregs)
eb8bc282 196 return gdbarch_register_name (gdbarch, regnum);
63022984
AC
197 else
198 {
199 struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
200 if (reg == NULL)
201 return NULL;
202 else
203 return reg->name;
204 }
eb8bc282
AC
205}
206
207struct value *
208value_of_user_reg (int regnum, struct frame_info *frame)
209{
210 struct gdbarch *gdbarch = get_frame_arch (frame);
63022984
AC
211 int maxregs = (gdbarch_num_regs (gdbarch)
212 + gdbarch_num_pseudo_regs (gdbarch));
213 struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
5d502164 214
63022984 215 gdb_assert (reg != NULL);
123dc839 216 return reg->read (frame, reg->baton);
eb8bc282
AC
217}
218
219extern initialize_file_ftype _initialize_user_regs; /* -Wmissing-prototypes */
220
221void
222_initialize_user_regs (void)
223{
030f20e1 224 user_regs_data = gdbarch_data_register_post_init (user_regs_init);
eb8bc282 225}
This page took 0.720354 seconds and 4 git commands to generate.