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)
46 static int have_warned;
51 warning (_(
"Can not parse XML target description; XML support was "
52 "disabled at compile time"));
68static std::unordered_map<std::string, target_desc_up>
xml_cache;
97 void *user_data,
const char *body_text)
100 const struct bfd_arch_info *arch;
102 arch = bfd_scan_arch (body_text);
104 gdb_xml_error (parser, _(
"Target description specified unknown "
105 "architecture \"%s\""), body_text);
114 void *user_data,
const char *body_text)
121 warning (_(
"Target description specified unknown osabi \"%s\""),
132 void *user_data,
const char *body_text)
135 const struct bfd_arch_info *arch;
137 arch = bfd_scan_arch (body_text);
146 void *user_data, std::vector<gdb_xml_value> &
attributes)
151 if (strcmp (
version,
"1.0") != 0)
153 _(
"Target description has unsupported version \"%s\""),
162 void *user_data, std::vector<gdb_xml_value> &
attributes)
176 void *user_data, std::vector<gdb_xml_value> &
attributes)
182 int bitsize,
regnum, save_restore;
192 regnum = data->next_regnum;
204 if (ix < length && strcmp (
attributes[ix].
name,
"save-restore") == 0)
209 if (strcmp (
type,
"int") != 0
210 && strcmp (
type,
"float") != 0
211 && tdesc_named_type (data->current_feature,
type) == NULL)
212 gdb_xml_error (parser, _(
"Register \"%s\" has unknown type \"%s\""),
215 tdesc_create_reg (data->current_feature,
name,
regnum, save_restore, group,
218 data->next_regnum =
regnum + 1;
227 void *user_data, std::vector<gdb_xml_value> &
attributes)
232 data->current_type = tdesc_create_union (data->current_feature,
id);
233 data->current_type_size = 0;
242 void *user_data, std::vector<gdb_xml_value> &
attributes)
248 tdesc_type_with_fields *type_with_fields
249 = tdesc_create_struct (data->current_feature,
id);
250 data->current_type = type_with_fields;
251 data->current_type_size = 0;
256 ULONGEST
size = * (ULONGEST *) attr->
value.get ();
261 _(
"Struct size %s is larger than maximum (%d)"),
264 tdesc_set_struct_size (type_with_fields,
size);
265 data->current_type_size =
size;
272 void *user_data, std::vector<gdb_xml_value> &
attributes)
276 ULONGEST
size = * (ULONGEST *)
282 _(
"Flags size %s is larger than maximum (%d)"),
286 data->current_type = tdesc_create_flags (data->current_feature,
id,
size);
287 data->current_type_size =
size;
293 void *user_data, std::vector<gdb_xml_value> &
attributes)
297 int size = * (ULONGEST *)
303 _(
"Enum size %s is larger than maximum (%d)"),
307 data->current_type = tdesc_create_enum (data->current_feature,
id,
size);
308 data->current_type_size = 0;
317 void *user_data, std::vector<gdb_xml_value> &
attributes)
321 struct tdesc_type *field_type;
330 field_type_id = (
char *) attr->
value.get ();
331 field_type = tdesc_named_type (data->current_feature, field_type_id);
335 field_type_id = NULL;
342 ULONGEST ul_start = * (ULONGEST *) attr->
value.get ();
347 _(
"Field start %s is larger than maximum (%d)"),
358 ULONGEST ul_end = * (ULONGEST *) attr->
value.get ();
363 _(
"Field end %s is larger than maximum (%d)"),
373 tdesc_type_with_fields *t = data->current_type;
381 if (data->current_type_size == 0)
383 _(
"Bitfields must live in explicitly sized types"));
385 if (field_type_id != NULL
386 && strcmp (field_type_id,
"bool") == 0
390 _(
"Boolean fields must be one bit in size"));
395 _(
"Bitfield \"%s\" goes past "
396 "64 bits (unsupported)"),
403 gdb_xml_error (parser, _(
"Bitfield \"%s\" has start after end"),
405 if (end >= data->current_type_size * TARGET_CHAR_BIT)
406 gdb_xml_error (parser, _(
"Bitfield \"%s\" does not fit in struct"),
409 if (field_type != NULL)
410 tdesc_add_typed_bitfield (t,
field_name, start, end, field_type);
411 else if (start == end)
414 tdesc_add_bitfield (t,
field_name, start, end);
416 else if (start == -1 && end != -1)
418 else if (field_type_id != NULL)
422 if (data->current_type_size != 0)
424 _(
"Explicitly sized type cannot "
425 "contain non-bitfield \"%s\""),
428 if (field_type == NULL)
429 gdb_xml_error (parser, _(
"Field \"%s\" references undefined "
433 tdesc_add_field (data->current_type,
field_name, field_type);
436 gdb_xml_error (parser, _(
"Field \"%s\" has neither type nor bit position"),
446 void *user_data, std::vector<gdb_xml_value> &
attributes)
457 ul_value = * (ULONGEST *) attr->
value.get ();
458 if (ul_value > INT_MAX)
461 _(
"Enum value %s is larger than maximum (%d)"),
462 pulongest (ul_value), INT_MAX);
475 void *user_data, std::vector<gdb_xml_value> &
attributes)
478 struct tdesc_type *field_type;
479 char *id, *field_type_id;
489 _(
"Vector size %s is larger than maximum (%d)"),
493 field_type = tdesc_named_type (data->current_feature, field_type_id);
494 if (field_type == NULL)
495 gdb_xml_error (parser, _(
"Vector \"%s\" references undefined type \"%s\""),
498 tdesc_create_vector (data->current_feature,
id, field_type, count);
624 std::string expanded_text;
627 _(
"target description"),
628 document, fetcher, 0))
630 warning (_(
"Could not load XML target description; ignoring"));
636 const auto it =
xml_cache.find (expanded_text);
638 return it->second.get ();
642 data.tdesc = description.get ();
648 xml_cache.emplace (std::move (expanded_text), std::move (description));
653 warning (_(
"Could not load XML target description; ignoring"));
666 gdb::optional<gdb::char_vector> tdesc_str
670 warning (_(
"Could not open \"%s\""), filename);
674 const std::string dirname =
ldirname (filename);
675 auto fetch_another = [&dirname] (
const char *
name)
690static gdb::optional<gdb::char_vector>
707 gdb::optional<gdb::char_vector> tdesc_str
712 auto fetch_another = [ops] (
const char *
name)
724gdb::optional<std::string>
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"));
739 gdb::optional<gdb::char_vector>
744 auto fetch_another = [ops] (
const char *
name)
750 _(
"target description"),
751 tdesc_str->data (), fetch_another, 0))
753 warning (_(
"Could not load XML target description; ignoring"));
767 error (_(
"xincludes are unsupported with this method"));
768 return gdb::optional<gdb::char_vector> ();
static struct @5 attributes[]
enum gdb_osabi osabi_from_tdesc_string(const char *name)
static gdbpy_ref field_name(struct type *type, int field)
gdb::unique_xmalloc_ptr< void > value
struct tdesc_feature * current_feature
tdesc_type_with_fields * current_type
struct target_desc * tdesc
void tdesc_add_compatible(struct target_desc *target_desc, const struct bfd_arch_info *compatible)
void set_tdesc_architecture(struct target_desc *target_desc, const char *name)
void set_tdesc_osabi(struct target_desc *target_desc, const char *name)
struct tdesc_feature * tdesc_create_feature(struct target_desc *tdesc, const char *name)
target_desc_up allocate_target_description(void)
gdb::optional< gdb::char_vector > target_read_stralloc(struct target_ops *ops, enum target_object object, const char *annex)
@ TARGET_OBJECT_AVAILABLE_FEATURES
std::string ldirname(const char *filename)
gdb::optional< gdb::char_vector > xml_fetch_content_from_file(const char *filename, const char *dirname)
void gdb_xml_error(struct gdb_xml_parser *parser, const char *format,...)
int gdb_xml_parse_quick(const char *name, const char *dtd_name, const struct gdb_xml_element *elements, const char *document, void *user_data)
const struct gdb_xml_enum gdb_xml_enums_boolean[]
struct gdb_xml_value * xml_find_attribute(std::vector< gdb_xml_value > &attributes, const char *name)
bool xml_process_xincludes(std::string &result, const char *name, const char *text, xml_fetch_another fetcher, int depth)
gdb_xml_attribute_handler gdb_xml_parse_attr_ulongest
gdb::function_view< gdb::optional< gdb::char_vector >(const char *)> xml_fetch_another
gdb_xml_attribute_handler gdb_xml_parse_attr_enum
static void tdesc_start_target(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, std::vector< gdb_xml_value > &attributes)
static const struct gdb_xml_element struct_union_children[]
static struct target_desc * tdesc_parse_xml(const char *document, xml_fetch_another fetcher)
static const struct gdb_xml_element feature_children[]
static void tdesc_end_arch(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text)
static gdb::optional< gdb::char_vector > fetch_available_features_from_target(const char *name, target_ops *ops)
static const struct gdb_xml_attribute enum_value_attributes[]
const struct target_desc * string_read_description_xml(const char *xml)
static void tdesc_start_field(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, std::vector< gdb_xml_value > &attributes)
static std::unordered_map< std::string, target_desc_up > xml_cache
static const struct gdb_xml_element tdesc_elements[]
static void tdesc_start_flags(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, std::vector< gdb_xml_value > &attributes)
static const struct gdb_xml_attribute enum_attributes[]
const struct target_desc * target_read_description_xml(struct target_ops *ops)
static const struct gdb_xml_attribute field_attributes[]
static void tdesc_start_union(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, std::vector< gdb_xml_value > &attributes)
static void tdesc_start_vector(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, std::vector< gdb_xml_value > &attributes)
static const struct gdb_xml_attribute reg_attributes[]
static void tdesc_start_struct(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, std::vector< gdb_xml_value > &attributes)
static const struct gdb_xml_element enum_children[]
static void tdesc_start_reg(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, std::vector< gdb_xml_value > &attributes)
static void tdesc_start_enum(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, std::vector< gdb_xml_value > &attributes)
static void tdesc_start_enum_value(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, std::vector< gdb_xml_value > &attributes)
gdb::optional< std::string > target_fetch_description_xml(struct target_ops *ops)
static const struct gdb_xml_attribute flags_attributes[]
static const struct gdb_xml_element target_children[]
static const struct gdb_xml_attribute struct_union_attributes[]
static void tdesc_start_feature(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, std::vector< gdb_xml_value > &attributes)
#define MAX_FIELD_BITSIZE
static void tdesc_end_compatible(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text)
const struct target_desc * file_read_description_xml(const char *filename)
static const struct gdb_xml_attribute feature_attributes[]
static const struct gdb_xml_attribute target_attributes[]
static void tdesc_end_osabi(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text)
static const struct gdb_xml_attribute vector_attributes[]