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