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;
72struct tdesc_parsing_data
78 struct tdesc_feature *current_feature;
89 int current_type_size;
95tdesc_end_arch (
struct gdb_xml_parser *parser,
97 void *user_data,
const char *body_text)
99 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
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);
112tdesc_end_osabi (
struct gdb_xml_parser *parser,
114 void *user_data,
const char *body_text)
116 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
121 warning (_(
"Target description specified unknown osabi \"%s\""),
130tdesc_end_compatible (
struct gdb_xml_parser *parser,
132 void *user_data,
const char *body_text)
134 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
135 const struct bfd_arch_info *arch;
137 arch = bfd_scan_arch (body_text);
144tdesc_start_target (
struct gdb_xml_parser *parser,
146 void *user_data, std::vector<gdb_xml_value> &
attributes)
151 if (strcmp (
version,
"1.0") != 0)
153 _(
"Target description has unsupported version \"%s\""),
160tdesc_start_feature (
struct gdb_xml_parser *parser,
162 void *user_data, std::vector<gdb_xml_value> &
attributes)
164 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
174tdesc_start_reg (
struct gdb_xml_parser *parser,
176 void *user_data, std::vector<gdb_xml_value> &
attributes)
178 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
182 int bitsize,
regnum, save_restore;
200 group = (
char *)
attributes[ix++].value.get ();
204 if (ix < length && strcmp (
attributes[ix].
name,
"save-restore") == 0)
205 save_restore = * (ULONGEST *)
attributes[ix++].value.get ();
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,
225tdesc_start_union (
struct gdb_xml_parser *parser,
227 void *user_data, std::vector<gdb_xml_value> &
attributes)
229 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
232 data->current_type = tdesc_create_union (
data->current_feature,
id);
233 data->current_type_size = 0;
240tdesc_start_struct (
struct gdb_xml_parser *parser,
242 void *user_data, std::vector<gdb_xml_value> &
attributes)
244 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
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);
270tdesc_start_flags (
struct gdb_xml_parser *parser,
272 void *user_data, std::vector<gdb_xml_value> &
attributes)
274 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
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);
291tdesc_start_enum (
struct gdb_xml_parser *parser,
293 void *user_data, std::vector<gdb_xml_value> &
attributes)
295 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
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;
315tdesc_start_field (
struct gdb_xml_parser *parser,
317 void *user_data, std::vector<gdb_xml_value> &
attributes)
319 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
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 "
436 gdb_xml_error (parser, _(
"Field \"%s\" has neither type nor bit position"),
444tdesc_start_enum_value (
struct gdb_xml_parser *parser,
446 void *user_data, std::vector<gdb_xml_value> &
attributes)
448 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
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);
473tdesc_start_vector (
struct gdb_xml_parser *parser,
475 void *user_data, std::vector<gdb_xml_value> &
attributes)
477 struct tdesc_parsing_data *
data = (
struct tdesc_parsing_data *) user_data;
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);
519 tdesc_start_field, NULL },
525 tdesc_start_enum_value, NULL },
571 {
"reg", reg_attributes, NULL,
573 tdesc_start_reg, NULL },
574 {
"struct", struct_union_attributes, struct_union_children,
576 tdesc_start_struct, NULL },
577 {
"union", struct_union_attributes, struct_union_children,
579 tdesc_start_union, NULL },
580 {
"flags", flags_attributes, struct_union_children,
582 tdesc_start_flags, NULL },
583 {
"enum", enum_attributes, enum_children,
585 tdesc_start_enum, NULL },
586 {
"vector", vector_attributes, NULL,
588 tdesc_start_vector, NULL },
599 NULL, tdesc_end_arch },
601 NULL, tdesc_end_osabi },
603 NULL, tdesc_end_compatible },
604 {
"feature", feature_attributes, feature_children,
606 tdesc_start_feature, NULL },
612 tdesc_start_target, NULL },
621 struct tdesc_parsing_data
data;
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);
637 if (it != xml_cache.end ())
638 return it->second.get ();
640 memset (&data, 0,
sizeof (
struct tdesc_parsing_data));
642 data.tdesc = description.get ();
645 tdesc_elements, expanded_text.c_str (), &data) == 0)
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 struct type * current_type
static gdbpy_ref field_name(struct type *type, int field)
gdb::unique_xmalloc_ptr< void > value
value(struct type *type_)
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 void gdb_xml_error(struct gdb_xml_parser *parser, const char *format,...) ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF(2
void void struct gdb_xml_value * xml_find_attribute(std::vector< gdb_xml_value > &attributes, const char *name)
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[]
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
bool xml_process_xincludes(std::string &result, const char *name, const char *text, xml_fetch_another fetcher, int depth)
static struct target_desc * tdesc_parse_xml(const char *document, xml_fetch_another fetcher)
static gdb::optional< gdb::char_vector > fetch_available_features_from_target(const char *name, target_ops *ops)
const struct target_desc * string_read_description_xml(const char *xml)
const struct target_desc * target_read_description_xml(struct target_ops *ops)
gdb::optional< std::string > target_fetch_description_xml(struct target_ops *ops)
#define MAX_FIELD_BITSIZE
const struct target_desc * file_read_description_xml(const char *filename)