|  | /* Target description support for GDB. | 
|  |  | 
|  | Copyright (C) 2006-2025 Free Software Foundation, Inc. | 
|  |  | 
|  | Contributed by CodeSourcery. | 
|  |  | 
|  | This file is part of GDB. | 
|  |  | 
|  | 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 3 of the License, or | 
|  | (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 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, see <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #ifndef GDB_TARGET_DESCRIPTIONS_H | 
|  | #define GDB_TARGET_DESCRIPTIONS_H | 
|  | #include "gdbsupport/tdesc.h" | 
|  | #include "gdbarch.h" | 
|  |  | 
|  | struct tdesc_arch_data; | 
|  | struct target_ops; | 
|  | struct inferior; | 
|  |  | 
|  | /* 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 target for the current | 
|  | inferior, and switch the current architecture to one with no target | 
|  | description.  */ | 
|  |  | 
|  | void target_clear_description (void); | 
|  |  | 
|  | /* Return INF's target description.  This should only be used by gdbarch | 
|  | initialization code; most access should be through an existing gdbarch.  */ | 
|  |  | 
|  | const target_desc *target_current_description (inferior *inf); | 
|  |  | 
|  | /* 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. | 
|  | They are equivalent to the gdbarch methods with similar names, | 
|  | except that they will only be called for pseudo registers.  */ | 
|  |  | 
|  | void set_tdesc_pseudo_register_name | 
|  | (struct gdbarch *gdbarch, gdbarch_register_name_ftype *pseudo_name); | 
|  |  | 
|  | void set_tdesc_pseudo_register_type | 
|  | (struct gdbarch *gdbarch, gdbarch_register_type_ftype *pseudo_type); | 
|  |  | 
|  | 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 | 
|  | constructed by the gdbarch initialization routine. | 
|  |  | 
|  | Fixed register assignments are taken from EARLY_DATA, which is freed. | 
|  | All registers which have not been assigned fixed numbers are given | 
|  | numbers above the current value of gdbarch_num_regs. | 
|  | gdbarch_num_regs and various  register-related predicates are updated to | 
|  | refer to the target description.  This function should only be called from | 
|  | the architecture's gdbarch initialization routine, and only after | 
|  | successfully validating the required registers.  */ | 
|  |  | 
|  | void tdesc_use_registers (struct gdbarch *gdbarch, | 
|  | const struct target_desc *target_desc, | 
|  | 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.  */ | 
|  |  | 
|  | 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 | 
|  | assigned to the register.  1 is returned if the register was found, | 
|  | 0 if it was not.  */ | 
|  |  | 
|  | int tdesc_numbered_register (const struct tdesc_feature *feature, | 
|  | struct tdesc_arch_data *data, | 
|  | int regno, const char *name); | 
|  |  | 
|  | /* Search FEATURE for a register named NAME, but do not assign a fixed | 
|  | register number to it.  */ | 
|  |  | 
|  | int tdesc_unnumbered_register (const struct tdesc_feature *feature, | 
|  | const char *name); | 
|  |  | 
|  | /* Search FEATURE for a register named NAME, and return its size in | 
|  | bits.  The register must exist.  */ | 
|  |  | 
|  | 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 | 
|  | tdesc_use_registers is called, REGNO will be assigned to the | 
|  | register.  1 is returned if the register was found, 0 if it was | 
|  | not.  */ | 
|  |  | 
|  | 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.  */ | 
|  |  | 
|  | /* Return the BFD architecture associated with this target | 
|  | description, or NULL if no architecture was specified.  */ | 
|  |  | 
|  | const struct bfd_arch_info *tdesc_architecture | 
|  | (const struct target_desc *); | 
|  |  | 
|  | /* Return the OSABI associated with this target description, or | 
|  | GDB_OSABI_UNKNOWN if no osabi was specified.  */ | 
|  |  | 
|  | enum gdb_osabi tdesc_osabi (const struct target_desc *); | 
|  |  | 
|  | /* Return non-zero if this target description is compatible | 
|  | with the given BFD architecture.  */ | 
|  |  | 
|  | int tdesc_compatible_p (const struct target_desc *, | 
|  | const struct bfd_arch_info *); | 
|  |  | 
|  | /* Return the string value of a property named KEY, or NULL if the | 
|  | property was not specified.  */ | 
|  |  | 
|  | const char *tdesc_property (const struct target_desc *, | 
|  | const char *key); | 
|  |  | 
|  | /* Return 1 if this target description describes any registers.  */ | 
|  |  | 
|  | int tdesc_has_registers (const struct target_desc *); | 
|  |  | 
|  | /* Return the feature with the given name, if present, or NULL if | 
|  | the named feature is not found.  */ | 
|  |  | 
|  | const struct tdesc_feature *tdesc_find_feature (const struct target_desc *, | 
|  | const char *name); | 
|  |  | 
|  | /* Return the name of FEATURE.  */ | 
|  |  | 
|  | const char *tdesc_feature_name (const struct tdesc_feature *feature); | 
|  |  | 
|  | /* Return the name of register REGNO, from the target description or | 
|  | from an architecture-provided pseudo_register_name method.  */ | 
|  |  | 
|  | const char *tdesc_register_name (struct gdbarch *gdbarch, int regno); | 
|  |  | 
|  | /* Return the type of register REGNO, from the target description or | 
|  | from an architecture-provided pseudo_register_type 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, | 
|  | const struct reggroup *reggroup); | 
|  |  | 
|  | /* Methods for constructing a target description.  */ | 
|  |  | 
|  | void set_tdesc_architecture (struct target_desc *, | 
|  | const struct bfd_arch_info *); | 
|  | void set_tdesc_property (struct target_desc *, | 
|  | const char *key, const char *value); | 
|  | void tdesc_add_compatible (struct target_desc *, | 
|  | const struct bfd_arch_info *); | 
|  |  | 
|  | #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 /* GDB_TARGET_DESCRIPTIONS_H */ |