gdb/user-regs.c - gdb
 Global variables defined
 
 Data types defined
 
 Functions defined
 
 Source code
  
 
 
 
 
 
 
 
- #include "defs.h"
 
- #include "user-regs.h"
 
- #include "gdbtypes.h"
 
- #include "frame.h"
 
- #include "arch-utils.h"
 
- #include "command.h"
 
- #include "cli/cli-cmds.h"
 
 
 
 
 
- struct user_reg
 
- {
 
-   const char *name;
 
-   struct value *(*read) (struct frame_info * frame, const void *baton);
 
-   const void *baton;
 
-   struct user_reg *next;
 
- };
 
 
 
- struct gdb_user_regs
 
- {
 
-   struct user_reg *first;
 
-   struct user_reg **last;
 
- };
 
 
- static void
 
- append_user_reg (struct gdb_user_regs *regs, const char *name,
 
-                  user_reg_read_ftype *read, const void *baton,
 
-                  struct user_reg *reg)
 
- {
 
-   
-   gdb_assert (reg != NULL);
 
-   reg->name = name;
 
-   reg->read = read;
 
-   reg->baton = baton;
 
-   reg->next = NULL;
 
-   (*regs->last) = reg;
 
-   regs->last = &(*regs->last)->next;
 
- }
 
 
 
- 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,
 
-                    XNEW (struct user_reg));
 
- }
 
 
 
- static struct gdbarch_data *user_regs_data;
 
 
- 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);
 
 
-   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,
 
-                      GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
 
-   return regs;
 
- }
 
 
- void
 
- 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)
 
-     {
 
-       
-       regs = user_regs_init (gdbarch);
 
-       deprecated_set_gdbarch_data (gdbarch, user_regs_data, regs);
 
-     }
 
-   append_user_reg (regs, name, read, baton,
 
-                    GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
 
- }
 
 
- int
 
- user_reg_map_name_to_regnum (struct gdbarch *gdbarch, const char *name,
 
-                              int len)
 
- {
 
-   
-   if (len < 0)
 
-     len = strlen (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)
 
-           {
 
-             return i;
 
-           }
 
-       }
 
-   }
 
 
-   
-   {
 
-     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))
 
-             || (len == strlen (reg->name)
 
-                 && strncmp (reg->name, name, len) == 0))
 
-           return gdbarch_num_regs (gdbarch)
 
-                  + gdbarch_num_pseudo_regs (gdbarch) + nr;
 
-       }
 
-   }
 
 
-   return -1;
 
- }
 
 
- static struct user_reg *
 
- 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)
 
-         return reg;
 
-       usernum--;
 
-     }
 
-   return NULL;
 
- }
 
 
- const char *
 
- 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)
 
-     return gdbarch_register_name (gdbarch, regnum);
 
-   else
 
-     {
 
-       struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
 
-       if (reg == NULL)
 
-         return NULL;
 
-       else
 
-         return reg->name;
 
-     }
 
- }
 
 
- struct value *
 
- value_of_user_reg (int regnum, struct frame_info *frame)
 
- {
 
-   struct gdbarch *gdbarch = get_frame_arch (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);
 
- }
 
 
- static void
 
- maintenance_print_user_registers (char *args, int from_tty)
 
- {
 
-   struct gdbarch *gdbarch = get_current_arch ();
 
-   struct gdb_user_regs *regs;
 
-   struct user_reg *reg;
 
-   int regnum;
 
 
-   regs = gdbarch_data (gdbarch, user_regs_data);
 
-   regnum = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
 
 
-   fprintf_unfiltered (gdb_stdout, " %-11s %3s\n", "Name", "Nr");
 
-   for (reg = regs->first; reg != NULL; reg = reg->next, ++regnum)
 
-     fprintf_unfiltered (gdb_stdout, " %-11s %3d\n", reg->name, regnum);
 
- }
 
 
- extern initialize_file_ftype _initialize_user_regs; 
 
- void
 
- _initialize_user_regs (void)
 
- {
 
-   user_regs_data = gdbarch_data_register_post_init (user_regs_init);
 
 
-   add_cmd ("user-registers", class_maintenance,
 
-            maintenance_print_user_registers,
 
-            _("List the names of the current user registers.\n"),
 
-            &maintenanceprintlist);
 
- }