2010-03-09 Sriraman Tallam <tmsriram@google.com>
[deliverable/binutils-gdb.git] / gdb / user-regs.c
index c1b57203dbe35ffc5453ff979881bcecdede5cce..7deeb1b65b7713079f40882df65cf86ce576f0e7 100644 (file)
@@ -1,6 +1,7 @@
 /* User visible, per-frame registers, for GDB, the GNU debugger.
 
 /* User visible, per-frame registers, for GDB, the GNU debugger.
 
-   Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2007, 2008, 2009, 2010
+   Free Software Foundation, Inc.
 
    Contributed by Red Hat.
 
 
    Contributed by Red Hat.
 
@@ -8,7 +9,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -17,9 +18,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "user-regs.h"
 
 #include "defs.h"
 #include "user-regs.h"
 /* A table of user registers.
 
    User registers have regnum's that live above of the range [0
 /* A table of user registers.
 
    User registers have regnum's that live above of the range [0
-   .. NUM_REGS + NUM_PSEUDO_REGS) (which is controlled by the target).
+   .. gdbarch_num_regs + gdbarch_num_pseudo_regs)
+   (which is controlled by the target).
    The target should never see a user register's regnum value.
 
    Always append, never delete.  By doing this, the relative regnum
    The target should never see a user register's regnum value.
 
    Always append, never delete.  By doing this, the relative regnum
-   (offset from NUM_REGS + NUM_PSEUDO_REGS) assigned to each user
-   register never changes.  */
+   (offset from gdbarch_num_regs + gdbarch_num_pseudo_regs)
+    assigned to each user  register never changes.  */
 
 struct user_reg
 {
   const char *name;
 
 struct user_reg
 {
   const char *name;
-  struct value *(*read) (struct frame_info * frame);
+  struct value *(*read) (struct frame_info * frame, const void *baton);
+  const void *baton;
   struct user_reg *next;
 };
 
   struct user_reg *next;
 };
 
@@ -59,7 +60,8 @@ struct gdb_user_regs
 
 static void
 append_user_reg (struct gdb_user_regs *regs, const char *name,
 
 static void
 append_user_reg (struct gdb_user_regs *regs, const char *name,
-                user_reg_read_ftype *read, struct user_reg *reg)
+                user_reg_read_ftype *read, const void *baton,
+                struct user_reg *reg)
 {
   /* The caller is responsible for allocating memory needed to store
      the register.  By doing this, the function can operate on a
 {
   /* The caller is responsible for allocating memory needed to store
      the register.  By doing this, the function can operate on a
@@ -67,6 +69,7 @@ append_user_reg (struct gdb_user_regs *regs, const char *name,
   gdb_assert (reg != NULL);
   reg->name = name;
   reg->read = read;
   gdb_assert (reg != NULL);
   reg->name = name;
   reg->read = read;
+  reg->baton = baton;
   reg->next = NULL;
   (*regs->last) = reg;
   regs->last = &(*regs->last)->next;
   reg->next = NULL;
   (*regs->last) = reg;
   regs->last = &(*regs->last)->next;
@@ -77,9 +80,10 @@ append_user_reg (struct gdb_user_regs *regs, const char *name,
 static struct gdb_user_regs builtin_user_regs = { NULL, &builtin_user_regs.first };
 
 void
 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)
+user_reg_add_builtin (const char *name, user_reg_read_ftype *read,
+                     const void *baton)
 {
 {
-  append_user_reg (&builtin_user_regs, name, read,
+  append_user_reg (&builtin_user_regs, name, read, baton,
                   XMALLOC (struct user_reg));
 }
 
                   XMALLOC (struct user_reg));
 }
 
@@ -95,14 +99,14 @@ user_regs_init (struct gdbarch *gdbarch)
   struct gdb_user_regs *regs = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct gdb_user_regs);
   regs->last = &regs->first;
   for (reg = builtin_user_regs.first; reg != NULL; reg = reg->next)
   struct gdb_user_regs *regs = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct gdb_user_regs);
   regs->last = &regs->first;
   for (reg = builtin_user_regs.first; reg != NULL; reg = reg->next)
-    append_user_reg (regs, reg->name, reg->read,
+    append_user_reg (regs, reg->name, reg->read, reg->baton,
                     GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
   return regs;
 }
 
 void
 user_reg_add (struct gdbarch *gdbarch, const char *name,
                     GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
   return regs;
 }
 
 void
 user_reg_add (struct gdbarch *gdbarch, const char *name,
-                user_reg_read_ftype *read)
+             user_reg_read_ftype *read, const void *baton)
 {
   struct gdb_user_regs *regs = gdbarch_data (gdbarch, user_regs_data);
   if (regs == NULL)
 {
   struct gdb_user_regs *regs = gdbarch_data (gdbarch, user_regs_data);
   if (regs == NULL)
@@ -112,7 +116,7 @@ user_reg_add (struct gdbarch *gdbarch, const char *name,
       regs = user_regs_init (gdbarch);
       deprecated_set_gdbarch_data (gdbarch, user_regs_data, regs);
     }
       regs = user_regs_init (gdbarch);
       deprecated_set_gdbarch_data (gdbarch, user_regs_data, regs);
     }
-  append_user_reg (regs, name, read,
+  append_user_reg (regs, name, read, baton,
                   GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
 }
 
                   GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
 }
 
@@ -151,7 +155,8 @@ user_reg_map_name_to_regnum (struct gdbarch *gdbarch, const char *name,
        if ((len < 0 && strcmp (reg->name, name))
            || (len == strlen (reg->name)
                && strncmp (reg->name, name, len) == 0))
        if ((len < 0 && strcmp (reg->name, name))
            || (len == strlen (reg->name)
                && strncmp (reg->name, name, len) == 0))
-         return NUM_REGS + NUM_PSEUDO_REGS + nr;
+         return gdbarch_num_regs (gdbarch)
+                + gdbarch_num_pseudo_regs (gdbarch) + nr;
       }
   }
 
       }
   }
 
@@ -199,7 +204,7 @@ value_of_user_reg (int regnum, struct frame_info *frame)
                 + gdbarch_num_pseudo_regs (gdbarch));
   struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
   gdb_assert (reg != NULL);
                 + gdbarch_num_pseudo_regs (gdbarch));
   struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
   gdb_assert (reg != NULL);
-  return reg->read (frame);
+  return reg->read (frame, reg->baton);
 }
 
 extern initialize_file_ftype _initialize_user_regs; /* -Wmissing-prototypes */
 }
 
 extern initialize_file_ftype _initialize_user_regs; /* -Wmissing-prototypes */
This page took 0.032703 seconds and 4 git commands to generate.