]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/target-descriptions.h
2.41 Release sources
[thirdparty/binutils-gdb.git] / gdb / target-descriptions.h
index ef97d1d5f76d80bad1a47c435fa1b7f3cb871d73..ee48fdfaa0c234e8ce214c327e4866301d8b1e31 100644 (file)
@@ -1,6 +1,6 @@
 /* Target description support for GDB.
 
-   Copyright (C) 2006-2016 Free Software Foundation, Inc.
+   Copyright (C) 2006-2023 Free Software Foundation, Inc.
 
    Contributed by CodeSourcery.
 
 
 #ifndef TARGET_DESCRIPTIONS_H
 #define TARGET_DESCRIPTIONS_H 1
+#include "gdbsupport/tdesc.h"
+#include "gdbarch.h"
 
-struct tdesc_feature;
 struct tdesc_arch_data;
-struct tdesc_type;
-struct tdesc_reg;
-struct target_desc;
 struct target_ops;
-struct target_desc;
-/* An inferior's target description info is stored in this opaque
-   object.  There's one such object per inferior.  */
-struct target_desc_info;
 struct inferior;
 
 /* Fetch the current inferior's description, and switch its current
@@ -51,22 +45,6 @@ void target_clear_description (void);
 
 const struct target_desc *target_current_description (void);
 
-/* Copy inferior target description data.  Used for example when
-   handling (v)forks, where child's description is the same as the
-   parent's, since the child really is a copy of the parent.  */
-
-void copy_inferior_target_desc_info (struct inferior *destinf,
-                                    struct inferior *srcinf);
-
-/* Free a target_desc_info object.  */
-
-void target_desc_info_free (struct target_desc_info *tdesc_info);
-
-/* Returns true if INFO indicates the target description had been
-   supplied by the user.  */
-
-int target_desc_info_from_user_p (struct target_desc_info *info);
-
 /* Record architecture-specific functions to call for pseudo-register
    support.  If tdesc_use_registers is called and gdbarch_num_pseudo_regs
    is greater than zero, then these should be called as well.
@@ -83,6 +61,42 @@ void set_tdesc_pseudo_register_reggroup_p
   (struct gdbarch *gdbarch,
    gdbarch_register_reggroup_p_ftype *pseudo_reggroup_p);
 
+/* Pointer to a function that should be called for each unknown register in
+   a target description, used by TDESC_USE_REGISTERS.
+
+   GDBARCH is the architecture the target description is for, FEATURE is
+   the feature the unknown register is in, and REG_NAME is the name of the
+   register from the target description.  The POSSIBLE_REGNUM is a proposed
+   (GDB internal) number for this register.
+
+   The callback function can return, (-1) to indicate that the register
+   should not be assigned POSSIBLE_REGNUM now (though it might be later),
+   GDB will number the register automatically later on.  Return
+   POSSIBLE_REGNUM (or greater) to have this register assigned that number.
+   Returning a value less that POSSIBLE_REGNUM is also acceptable, but take
+   care not to clash with a register number that has already been
+   assigned.
+
+   The callback will always be called on the registers in the order they
+   appear in the target description.  This means all unknown registers
+   within a single feature will be called one after another.  */
+
+typedef int (*tdesc_unknown_register_ftype)
+       (struct gdbarch *gdbarch, tdesc_feature *feature,
+        const char *reg_name, int possible_regnum);
+
+/* A deleter adapter for a target arch data.  */
+
+struct tdesc_arch_data_deleter
+{
+  void operator() (struct tdesc_arch_data *data) const;
+};
+
+/* A unique pointer specialization that holds a target_desc.  */
+
+typedef std::unique_ptr<tdesc_arch_data, tdesc_arch_data_deleter>
+  tdesc_arch_data_up;
+
 /* Update GDBARCH to use the TARGET_DESC for registers.  TARGET_DESC
    may be GDBARCH's target description or (if GDBARCH does not have
    one which describes registers) another target description
@@ -98,18 +112,13 @@ void set_tdesc_pseudo_register_reggroup_p
 
 void tdesc_use_registers (struct gdbarch *gdbarch,
                          const struct target_desc *target_desc,
-                         struct tdesc_arch_data *early_data);
+                         tdesc_arch_data_up &&early_data,
+                         tdesc_unknown_register_ftype unk_reg_cb = NULL);
 
 /* Allocate initial data for validation of a target description during
    gdbarch initialization.  */
 
-struct tdesc_arch_data *tdesc_data_alloc (void);
-
-/* Clean up data allocated by tdesc_data_alloc.  This should only
-   be called to discard the data; tdesc_use_registers takes ownership
-   of its EARLY_DATA argument.  */
-
-void tdesc_data_cleanup (void *data_untyped);
+tdesc_arch_data_up tdesc_data_alloc ();
 
 /* Search FEATURE for a register named NAME.  Record REGNO and the
    register in DATA; when tdesc_use_registers is called, REGNO will be
@@ -129,8 +138,8 @@ int tdesc_unnumbered_register (const struct tdesc_feature *feature,
 /* Search FEATURE for a register named NAME, and return its size in
    bits.  The register must exist.  */
 
-int tdesc_register_size (const struct tdesc_feature *feature,
-                        const char *name);
+int tdesc_register_bitsize (const struct tdesc_feature *feature,
+                           const char *name);
 
 /* Search FEATURE for a register with any of the names from NAMES
    (NULL-terminated).  Record REGNO and the register in DATA; when
@@ -142,6 +151,10 @@ int tdesc_numbered_register_choices (const struct tdesc_feature *feature,
                                     struct tdesc_arch_data *data,
                                     int regno, const char *const names[]);
 
+/* Return true if DATA contains an entry for REGNO, a GDB register
+   number.  */
+
+extern bool tdesc_found_register (struct tdesc_arch_data *data, int regno);
 
 /* Accessors for target descriptions.  */
 
@@ -182,12 +195,6 @@ const struct tdesc_feature *tdesc_find_feature (const struct target_desc *,
 
 const char *tdesc_feature_name (const struct tdesc_feature *feature);
 
-/* Return the type associated with ID in the context of FEATURE, or
-   NULL if none.  */
-
-struct tdesc_type *tdesc_named_type (const struct tdesc_feature *feature,
-                                    const char *id);
-
 /* Return the name of register REGNO, from the target description or
    from an architecture-provided pseudo_register_name method.  */
 
@@ -207,12 +214,10 @@ struct type *tdesc_find_type (struct gdbarch *gdbarch, const char *id);
    specify a group.  */
 
 int tdesc_register_in_reggroup_p (struct gdbarch *gdbarch, int regno,
-                                 struct reggroup *reggroup);
+                                 const struct reggroup *reggroup);
 
 /* Methods for constructing a target description.  */
 
-struct target_desc *allocate_target_description (void);
-struct cleanup *make_cleanup_free_target_description (struct target_desc *);
 void set_tdesc_architecture (struct target_desc *,
                             const struct bfd_arch_info *);
 void set_tdesc_osabi (struct target_desc *, enum gdb_osabi osabi);
@@ -221,36 +226,16 @@ void set_tdesc_property (struct target_desc *,
 void tdesc_add_compatible (struct target_desc *,
                           const struct bfd_arch_info *);
 
-struct tdesc_feature *tdesc_create_feature (struct target_desc *tdesc,
-                                           const char *name);
-struct tdesc_type *tdesc_create_vector (struct tdesc_feature *feature,
-                                       const char *name,
-                                       struct tdesc_type *field_type,
-                                       int count);
-struct tdesc_type *tdesc_create_struct (struct tdesc_feature *feature,
-                                       const char *name);
-void tdesc_set_struct_size (struct tdesc_type *type, int size);
-struct tdesc_type *tdesc_create_union (struct tdesc_feature *feature,
-                                      const char *name);
-struct tdesc_type *tdesc_create_flags (struct tdesc_feature *feature,
-                                      const char *name,
-                                      int size);
-struct tdesc_type *tdesc_create_enum (struct tdesc_feature *feature,
-                                     const char *name,
-                                     int size);
-void tdesc_add_field (struct tdesc_type *type, const char *field_name,
-                     struct tdesc_type *field_type);
-void tdesc_add_typed_bitfield (struct tdesc_type *type, const char *field_name,
-                              int start, int end,
-                              struct tdesc_type *field_type);
-void tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
-                        int start, int end);
-void tdesc_add_flag (struct tdesc_type *type, int start,
-                    const char *flag_name);
-void tdesc_add_enum_value (struct tdesc_type *type, int value,
-                          const char *name);
-void tdesc_create_reg (struct tdesc_feature *feature, const char *name,
-                      int regnum, int save_restore, const char *group,
-                      int bitsize, const char *type);
+#if GDB_SELF_TEST
+namespace selftests {
+
+/* Record that XML_FILE should generate a target description that equals
+   TDESC, to be verified by the "maintenance check xml-descriptions"
+   command.  This function takes ownership of TDESC.  */
+
+void record_xml_tdesc (const char *xml_file,
+                      const struct target_desc *tdesc);
+}
+#endif
 
 #endif /* TARGET_DESCRIPTIONS_H */