X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fuser-regs.c;h=2541aa701134191e5eec185877ee0064de073d65;hb=33fbcbee30e6565db27a4c5076ff61c9fc8e0744;hp=fb04b3be89b8a722bb7b927be6a2b155f0771162;hpb=9b254dd1ce46c19dde1dde5b8d1e22e862dfacce;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/user-regs.c b/gdb/user-regs.c index fb04b3be89..2541aa7011 100644 --- a/gdb/user-regs.c +++ b/gdb/user-regs.c @@ -1,6 +1,6 @@ /* User visible, per-frame registers, for GDB, the GNU debugger. - Copyright (C) 2002, 2003, 2004, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2002-2004, 2007-2012 Free Software Foundation, Inc. Contributed by Red Hat. @@ -76,7 +76,9 @@ append_user_reg (struct gdb_user_regs *regs, const char *name, /* 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, @@ -95,7 +97,9 @@ static void * 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, @@ -108,6 +112,7 @@ user_reg_add (struct gdbarch *gdbarch, const char *name, 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 @@ -133,9 +138,11 @@ user_reg_map_name_to_regnum (struct gdbarch *gdbarch, const char *name, 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) { @@ -149,6 +156,7 @@ user_reg_map_name_to_regnum (struct gdbarch *gdbarch, const char *name, 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)) @@ -167,6 +175,7 @@ usernum_to_user_reg (struct gdbarch *gdbarch, int usernum) { 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) @@ -181,6 +190,7 @@ user_reg_map_regnum_to_name (struct gdbarch *gdbarch, int regnum) { int maxregs = (gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch)); + if (regnum < 0) return NULL; else if (regnum < maxregs) @@ -202,6 +212,7 @@ value_of_user_reg (int regnum, struct frame_info *frame) 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); }