28 #include "filenames.h" 29 #include <unordered_map> 34 #define MAX_FIELD_SIZE 65536 35 #define MAX_FIELD_BITSIZE (MAX_FIELD_SIZE * TARGET_CHAR_BIT) 36 #define MAX_VECTOR_SIZE 65536 38 #if !defined(HAVE_LIBEXPAT) 47 static int have_warned;
52 warning (
_(
"Can not parse XML target description; XML support was " 53 "disabled at compile time"));
69 static std::unordered_map<std::string, target_desc *>
xml_cache;
98 void *user_data,
const char *body_text)
101 const struct bfd_arch_info *arch;
103 arch = bfd_scan_arch (body_text);
106 "architecture \"%s\""), body_text);
115 void *user_data,
const char *body_text)
122 warning (
_(
"Target description specified unknown osabi \"%s\""),
133 void *user_data,
const char *body_text)
136 const struct bfd_arch_info *arch;
138 arch = bfd_scan_arch (body_text);
151 if (strcmp (
version,
"1.0") != 0)
153 _(
"Target description has unsupported version \"%s\""),
183 int bitsize,
regnum, save_restore;
190 if (ix < length && strcmp (attrs[ix].
name,
"regnum") == 0)
195 if (ix < length && strcmp (attrs[ix].
name,
"type") == 0)
200 if (ix < length && strcmp (attrs[ix].
name,
"group") == 0)
201 group = (
char *) attrs[ix++].
value;
205 if (ix < length && strcmp (attrs[ix].
name,
"save-restore") == 0)
210 if (strcmp (
type,
"int") != 0
211 && strcmp (
type,
"float") != 0
213 gdb_xml_error (parser,
_(
"Register \"%s\" has unknown type \"%s\""),
262 _(
"Struct size %s is larger than maximum (%d)"),
283 _(
"Flags size %s is larger than maximum (%d)"),
304 _(
"Enum size %s is larger than maximum (%d)"),
331 field_type_id = (
char *) attr->
value;
336 field_type_id = NULL;
348 _(
"Field start %s is larger than maximum (%d)"),
364 _(
"Field end %s is larger than maximum (%d)"),
384 _(
"Bitfields must live in explicitly sized types"));
386 if (field_type_id != NULL
387 && strcmp (field_type_id,
"bool") == 0
391 _(
"Boolean fields must be one bit in size"));
396 _(
"Bitfield \"%s\" goes past " 397 "64 bits (unsupported)"),
407 gdb_xml_error (parser,
_(
"Bitfield \"%s\" does not fit in struct"),
410 if (field_type != NULL)
412 else if (start == end)
417 else if (start == -1 && end != -1)
419 else if (field_type_id != NULL)
425 _(
"Explicitly sized type cannot " 426 "contain non-bitfield \"%s\""),
429 if (field_type == NULL)
437 gdb_xml_error (parser,
_(
"Field \"%s\" has neither type nor bit position"),
462 _(
"Enum value %s is larger than maximum (%d)"),
481 char *id, *field_type_id;
484 id = (
char *) attrs[0].
value;
485 field_type_id = (
char *) attrs[1].
value;
491 _(
"Vector size %s is larger than maximum (%d)"),
496 if (field_type == NULL)
497 gdb_xml_error (parser,
_(
"Vector \"%s\" references undefined type \"%s\""),
630 _(
"target description"),
631 document, fetcher, fetcher_baton, 0))
633 warning (
_(
"Could not load XML target description; ignoring"));
639 const auto it =
xml_cache.find (expanded_text);
658 warning (
_(
"Could not load XML target description; ignoring"));
674 if (tdesc_str == NULL)
676 warning (
_(
"Could not open \"%s\""), filename);
681 (
void *)
ldirname (filename).c_str ());
712 if (tdesc_str == NULL)
727 #if !defined(HAVE_LIBEXPAT) 728 static int have_warned;
733 warning (
_(
"Can not fetch XML target description; XML support was " 734 "disabled at compile time"));
741 if (tdesc_str == NULL)
746 _(
"target description"),
750 warning (
_(
"Could not load XML target description; ignoring"));
void tdesc_add_typed_bitfield(tdesc_type_with_fields *type, const char *field_name, int start, int end, struct tdesc_type *field_type)
tdesc_type_with_fields * tdesc_create_enum(struct tdesc_feature *feature, const char *name, int size)
static const struct gdb_xml_attribute vector_attributes[]
struct tdesc_feature * current_feature
static void tdesc_end_osabi(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text)
void tdesc_add_flag(tdesc_type_with_fields *type, int start, const char *flag_name)
void set_tdesc_osabi(target_desc *target_desc, const char *name)
void warning(const char *fmt,...)
gdb_xml_attribute_handler gdb_xml_parse_attr_enum
static const struct gdb_xml_attribute reg_attributes[]
void * memset(T *s, int c, size_t n)=delete
static const struct gdb_xml_attribute feature_attributes[]
void set_tdesc_architecture(target_desc *target_desc, const char *name)
static const struct gdb_xml_element tdesc_elements[]
gdb::unique_xmalloc_ptr< char >(* xml_fetch_another)(const char *href, void *baton)
static void tdesc_start_feature(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes)
static std::unordered_map< std::string, target_desc * > xml_cache
void tdesc_create_reg(struct tdesc_feature *feature, const char *name, int regnum, int save_restore, const char *group, int bitsize, const char *type)
gdb::unique_xmalloc_ptr< char > target_read_stralloc(struct target_ops *ops, enum target_object object, const char *annex)
enum gdb_osabi osabi_from_tdesc_string(const char *name)
static void tdesc_start_union(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes)
struct cleanup * make_cleanup_free_target_description(struct target_desc *target_desc)
std::string ldirname(const char *filename)
std::unique_ptr< T, xfree_deleter< T > > unique_xmalloc_ptr
int gdb_xml_parse_quick(const char *name, const char *dtd_name, const struct gdb_xml_element *elements, const char *document, void *user_data)
struct gdb_xml_value * xml_find_attribute(VEC(gdb_xml_value_s) *attributes, const char *name)
void tdesc_add_enum_value(tdesc_type_with_fields *type, int value, const char *name)
bool xml_process_xincludes(std::string &result, const char *name, const char *text, xml_fetch_another fetcher, void *fetcher_baton, int depth)
char * pulongest(ULONGEST u)
void tdesc_add_bitfield(tdesc_type_with_fields *type, const char *field_name, int start, int end)
static const struct gdb_xml_attribute enum_attributes[]
static void tdesc_start_flags(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes)
static const struct gdb_xml_attribute field_attributes[]
static const struct gdb_xml_attribute flags_attributes[]
static struct target_desc * tdesc_parse_xml(const char *document, xml_fetch_another fetcher, void *fetcher_baton)
static const struct gdb_xml_attribute target_attributes[]
static void tdesc_start_reg(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes)
static void tdesc_start_enum_value(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes)
static const struct gdb_xml_attribute struct_union_attributes[]
void gdb_xml_error(struct gdb_xml_parser *parser, const char *format,...)
gdb::optional< std::string > target_fetch_description_xml(struct target_ops *ops)
static void tdesc_start_enum(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes)
const struct gdb_xml_enum gdb_xml_enums_boolean[]
static const struct gdb_xml_element enum_children[]
static void tdesc_start_struct(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes)
const struct target_desc * file_read_description_xml(const char *filename)
tdesc_type_with_fields * tdesc_create_union(struct tdesc_feature *feature, const char *name)
static void tdesc_start_target(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes)
#define MAX_FIELD_BITSIZE
void discard_cleanups(struct cleanup *old_chain)
const struct target_desc * target_read_description_xml(struct target_ops *ops)
gdb::unique_xmalloc_ptr< char > xml_fetch_content_from_file(const char *filename, void *baton)
static const struct gdb_xml_attribute enum_value_attributes[]
struct tdesc_feature * tdesc_create_feature(struct target_desc *tdesc, const char *name, const char *xml=nullptr)
tdesc_type_with_fields * tdesc_create_struct(struct tdesc_feature *feature, const char *name)
static const struct gdb_xml_element feature_children[]
#define VEC_address(T, V)
gdb_xml_attribute_handler gdb_xml_parse_attr_ulongest
target_desc * allocate_target_description(void)
unsigned long long ULONGEST
static PyObject * field_name(struct type *type, int field)
static void tdesc_end_arch(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text)
struct tdesc_type * tdesc_create_vector(struct tdesc_feature *feature, const char *name, struct tdesc_type *field_type, int count)
struct tdesc_type * tdesc_named_type(const struct tdesc_feature *feature, const char *id)
struct target_desc * tdesc
static void tdesc_end_compatible(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text)
void tdesc_add_field(tdesc_type_with_fields *type, const char *field_name, struct tdesc_type *field_type)
void tdesc_add_compatible(struct target_desc *target_desc, const struct bfd_arch_info *compatible)
tdesc_type_with_fields * current_type
static const struct gdb_xml_element target_children[]
static void tdesc_start_field(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes)
static void tdesc_start_vector(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes)
static const struct gdb_xml_element struct_union_children[]
tdesc_type_with_fields * tdesc_create_flags(struct tdesc_feature *feature, const char *name, int size)
void do_cleanups(struct cleanup *old_chain)
void tdesc_set_struct_size(tdesc_type_with_fields *type, int size)
static gdb::unique_xmalloc_ptr< char > fetch_available_features_from_target(const char *name, void *baton_)