/* Target description support for GDB.
- Copyright (C) 2006, 2007, 2008, 2009 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 inferior;
-/* Fetch the current target's description, and switch the current
+/* Fetch the current inferior's description, and switch its current
architecture to one which incorporates that description. */
void target_find_description (void);
-/* Discard any description fetched from the current target, and switch
- the current architecture to one with no target description. */
+/* Discard any description fetched from the target for the current
+ inferior, and switch the current architecture to one with no target
+ description. */
void target_clear_description (void);
-/* Return the global current target description. This should only be
- used by gdbarch initialization code; most access should be through
- an existing gdbarch. */
+/* Return the current inferior's target description. This should only
+ be used by gdbarch initialization code; most access should be
+ through an existing gdbarch. */
const struct target_desc *target_current_description (void);
(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
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
/* 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
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. */
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. */
struct type *tdesc_register_type (struct gdbarch *gdbarch, int regno);
+/* Return the type associated with ID, from the target description. */
+
+struct type *tdesc_find_type (struct gdbarch *gdbarch, const char *id);
+
/* Check whether REGNUM is a member of REGGROUP using the target
description. Return -1 if the target description does not
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);
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_union (struct tdesc_feature *feature,
- const char *name);
-void tdesc_add_field (struct tdesc_type *type, const char *field_name,
- struct tdesc_type *field_type);
-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 */