gdb/mi: make current_token a field of mi_interp
[binutils-gdb.git] / gdb / reggroups.h
index 0088a8520e3266f9effcb06147289e90d43e5d14..e4d97637e3d1e3dd234d1afeb9652f4b460a9a27 100644 (file)
@@ -1,6 +1,6 @@
 /* Register groupings for GDB, the GNU debugger.
 
-   Copyright 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002-2023 Free Software Foundation, Inc.
 
    Contributed by Red Hat.
 
@@ -8,7 +8,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
-   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,
    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., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #ifndef REGGROUPS_H
 #define REGGROUPS_H
 
 struct gdbarch;
-struct reggroup;
 
-enum reggroup_type { USER_REGGROUP, INTERNAL_REGGROUP };
+/* The different register group types.  */
+enum reggroup_type {
+  /* Used for any register group that should be visible to the user.
+     Architecture specific register groups, as well as most of the default
+     groups will have this type.  */
+  USER_REGGROUP,
+
+  /* Used for a few groups that GDB uses while managing machine state.
+     These groups are mostly hidden from the user.  */
+  INTERNAL_REGGROUP
+};
+
+/* Individual register group.  */
+
+struct reggroup
+{
+  /* Create a new register group object.  The NAME is not owned by the new
+     reggroup object, so must outlive the object.  */
+  reggroup (const char *name, enum reggroup_type type)
+    : m_name (name),
+      m_type (type)
+  { /* Nothing.  */ }
+
+  /* Return the name for this register group.  */
+  const char *name () const
+  { return m_name; }
+
+  /* Return the type of this register group.  */
+  enum reggroup_type type () const
+  { return m_type; }
+
+private:
+  /* The name of this register group.  */
+  const char *m_name;
+
+  /* The type of this register group.  */
+  enum reggroup_type m_type;
+};
 
 /* Pre-defined, user visible, register groups.  */
-extern struct reggroup *const general_reggroup;
-extern struct reggroup *const float_reggroup;
-extern struct reggroup *const system_reggroup;
-extern struct reggroup *const vector_reggroup;
-extern struct reggroup *const all_reggroup;
+extern const reggroup *const general_reggroup;
+extern const reggroup *const float_reggroup;
+extern const reggroup *const system_reggroup;
+extern const reggroup *const vector_reggroup;
+extern const reggroup *const all_reggroup;
 
 /* Pre-defined, internal, register groups.  */
-extern struct reggroup *const save_reggroup;
-extern struct reggroup *const restore_reggroup;
+extern const reggroup *const save_reggroup;
+extern const reggroup *const restore_reggroup;
 
 /* Create a new local register group.  */
-extern struct reggroup *reggroup_new (const char *name,
-                                     enum reggroup_type type);
+extern const reggroup *reggroup_new (const char *name,
+                                    enum reggroup_type type);
 
-/* Add a register group (with attribute values) to the pre-defined list.  */
-extern void reggroup_add (struct gdbarch *gdbarch, struct reggroup *group);
+/* Create a new register group allocated onto the gdbarch obstack.  */
+extern const reggroup *reggroup_gdbarch_new (struct gdbarch *gdbarch,
+                                            const char *name,
+                                            enum reggroup_type type);
 
-/* Register group attributes.  */
-extern const char *reggroup_name (struct reggroup *reggroup);
-extern enum reggroup_type reggroup_type (struct reggroup *reggroup);
+/* Add register group GROUP to the list of register groups for GDBARCH.  */
+extern void reggroup_add (struct gdbarch *gdbarch, const reggroup *group);
 
-/* The register groups for the current architecture.  */
-extern struct reggroup *const *reggroups (struct gdbarch *gdbarch);
+/* Return the list of all register groups for GDBARCH.  */
+extern const std::vector<const reggroup *> &
+       gdbarch_reggroups (struct gdbarch *gdbarch);
+
+/* Find a reggroup by name.  */
+extern const reggroup *reggroup_find (struct gdbarch *gdbarch,
+                                     const char *name);
 
 /* Is REGNUM a member of REGGROUP?  */
 extern int default_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
-                                       struct reggroup *reggroup);
+                                       const struct reggroup *reggroup);
 
 #endif