X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftarget-descriptions.h;h=171ef76379a7d61ee85587fb70b4d70cb584fcb4;hb=3cabfd268b2d2301a8bfcfa124c162a1d45cfc68;hp=361ac97a8bd6b3d5deefff84d901225b301f6349;hpb=61baf725eca99af2569262d10aca03dcde2698f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h index 361ac97a8b..171ef76379 100644 --- a/gdb/target-descriptions.h +++ b/gdb/target-descriptions.h @@ -1,6 +1,6 @@ /* Target description support for GDB. - Copyright (C) 2006-2017 Free Software Foundation, Inc. + Copyright (C) 2006-2020 Free Software Foundation, Inc. Contributed by CodeSourcery. @@ -21,14 +21,11 @@ #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; @@ -83,6 +80,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_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 +131,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 +157,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 @@ -182,12 +210,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. */ @@ -211,8 +233,6 @@ int tdesc_register_in_reggroup_p (struct gdbarch *gdbarch, int regno, /* 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 +241,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 */