/* User visible, per-frame registers, for GDB, the GNU debugger.
- Copyright (C) 2002, 2003, 2004, 2007, 2008, 2009
- Free Software Foundation, Inc.
+ Copyright (C) 2002-2014 Free Software Foundation, Inc.
Contributed by Red Hat.
#include "defs.h"
#include "user-regs.h"
#include "gdbtypes.h"
-#include "gdb_string.h"
+#include <string.h>
#include "gdb_assert.h"
#include "frame.h"
/* An array of the builtin user registers. */
-static struct gdb_user_regs builtin_user_regs = { NULL, &builtin_user_regs.first };
+static struct gdb_user_regs builtin_user_regs = {
+ NULL, &builtin_user_regs.first
+};
void
user_reg_add_builtin (const char *name, user_reg_read_ftype *read,
const void *baton)
{
append_user_reg (&builtin_user_regs, name, read, baton,
- XMALLOC (struct user_reg));
+ XNEW (struct user_reg));
}
/* Per-architecture user registers. Start with the builtin user
user_regs_init (struct gdbarch *gdbarch)
{
struct user_reg *reg;
- struct gdb_user_regs *regs = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct gdb_user_regs);
+ struct gdb_user_regs *regs
+ = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct gdb_user_regs);
+
regs->last = ®s->first;
for (reg = builtin_user_regs.first; reg != NULL; reg = reg->next)
append_user_reg (regs, reg->name, reg->read, reg->baton,
user_reg_read_ftype *read, const void *baton)
{
struct gdb_user_regs *regs = gdbarch_data (gdbarch, user_regs_data);
+
if (regs == NULL)
{
/* ULGH, called during architecture initialization. Patch
int i;
int maxregs = (gdbarch_num_regs (gdbarch)
+ gdbarch_num_pseudo_regs (gdbarch));
+
for (i = 0; i < maxregs; i++)
{
const char *regname = gdbarch_register_name (gdbarch, i);
+
if (regname != NULL && len == strlen (regname)
&& strncmp (regname, name, len) == 0)
{
struct gdb_user_regs *regs = gdbarch_data (gdbarch, user_regs_data);
struct user_reg *reg;
int nr;
+
for (nr = 0, reg = regs->first; reg != NULL; reg = reg->next, nr++)
{
if ((len < 0 && strcmp (reg->name, name))
{
struct gdb_user_regs *regs = gdbarch_data (gdbarch, user_regs_data);
struct user_reg *reg;
+
for (reg = regs->first; reg != NULL; reg = reg->next)
{
if (usernum == 0)
{
int maxregs = (gdbarch_num_regs (gdbarch)
+ gdbarch_num_pseudo_regs (gdbarch));
+
if (regnum < 0)
return NULL;
else if (regnum < maxregs)
int maxregs = (gdbarch_num_regs (gdbarch)
+ gdbarch_num_pseudo_regs (gdbarch));
struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
+
gdb_assert (reg != NULL);
return reg->read (frame, reg->baton);
}