29 #include "filenames.h"
31 #if !defined(HAVE_LIBEXPAT)
40 static int have_warned;
45 warning (
_(
"Can not parse XML target description; XML support was "
46 "disabled at compile time"));
74 struct tdesc_parsing_data
91 int current_type_size;
94 int current_type_is_flags;
102 void *user_data,
const char *body_text)
104 struct tdesc_parsing_data *data = user_data;
105 const struct bfd_arch_info *arch;
107 arch = bfd_scan_arch (body_text);
110 "architecture \"%s\""), body_text);
119 void *user_data,
const char *body_text)
121 struct tdesc_parsing_data *data = user_data;
126 warning (
_(
"Target description specified unknown osabi \"%s\""),
137 void *user_data,
const char *body_text)
139 struct tdesc_parsing_data *data = user_data;
140 const struct bfd_arch_info *arch;
142 arch = bfd_scan_arch (body_text);
155 if (strcmp (version,
"1.0") != 0)
157 _(
"Target description has unsupported version \"%s\""),
168 struct tdesc_parsing_data *data = user_data;
182 struct tdesc_parsing_data *data = user_data;
186 int bitsize,
regnum, save_restore;
190 name = attrs[ix++].
value;
193 if (ix < length && strcmp (attrs[ix].name,
"regnum") == 0)
196 regnum = data->next_regnum;
198 if (ix < length && strcmp (attrs[ix].name,
"type") == 0)
199 type = attrs[ix++].
value;
203 if (ix < length && strcmp (attrs[ix].name,
"group") == 0)
204 group = attrs[ix++].
value;
208 if (ix < length && strcmp (attrs[ix].name,
"save-restore") == 0)
213 if (strcmp (type,
"int") != 0
214 && strcmp (type,
"float") != 0
216 gdb_xml_error (parser,
_(
"Register \"%s\" has unknown type \"%s\""),
222 data->next_regnum = regnum + 1;
233 struct tdesc_parsing_data *data = user_data;
237 data->current_type_size = 0;
238 data->current_type_is_flags = 0;
249 struct tdesc_parsing_data *data = user_data;
255 data->current_type =
type;
256 data->current_type_size = 0;
257 data->current_type_is_flags = 0;
265 data->current_type_size =
size;
274 struct tdesc_parsing_data *data = user_data;
282 data->current_type =
type;
283 data->current_type_size = 0;
284 data->current_type_is_flags = 1;
295 struct tdesc_parsing_data *data = user_data;
305 field_type_id = attr->
value;
307 field_type_id = NULL;
321 if (field_type_id != NULL)
323 if (data->current_type_is_flags)
324 gdb_xml_error (parser,
_(
"Cannot add typed field \"%s\" to flags"),
326 if (data->current_type_size != 0)
328 _(
"Explicitly sized type can not "
329 "contain non-bitfield \"%s\""),
333 if (field_type == NULL)
336 field_name, field_type_id);
340 else if (start != -1 && end != -1)
344 if (data->current_type_is_flags)
348 if (data->current_type_size == 0)
350 _(
"Implicitly sized type can "
351 "not contain bitfield \"%s\""),
356 _(
"Bitfield \"%s\" goes past "
357 "64 bits (unsupported)"),
370 _(
"Bitfield \"%s\" does not fit in struct"));
376 gdb_xml_error (parser,
_(
"Field \"%s\" has neither type nor bit position"),
388 struct tdesc_parsing_data *data = user_data;
391 char *id, *field_type_id;
395 field_type_id = attrs[1].
value;
399 if (field_type == NULL)
400 gdb_xml_error (parser,
_(
"Vector \"%s\" references undefined type \"%s\""),
506 struct cleanup *back_to, *result_cleanup;
507 struct tdesc_parsing_data data;
514 document, fetcher, fetcher_baton, 0);
515 if (expanded_text == NULL)
517 warning (
_(
"Could not load XML target description; ignoring"));
527 xfree (expanded_text);
533 memset (&data, 0,
sizeof (
struct tdesc_parsing_data));
539 tdesc_elements, expanded_text, &data) == 0)
545 new_cache.
tdesc = data.tdesc;
553 warning (
_(
"Could not load XML target description; ignoring"));
573 if (tdesc_str == NULL)
575 warning (
_(
"Could not open \"%s\""), filename);
622 if (tdesc_str == NULL)
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 target_desc * tdesc
struct tdesc_type * tdesc_create_union(struct tdesc_feature *feature, const char *name)
static const struct gdb_xml_attribute vector_attributes[]
static void tdesc_end_osabi(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text)
char *(* xml_fetch_another)(const char *href, void *baton)
void warning(const char *fmt,...)
static char * fetch_available_features_from_target(const char *name, void *baton_)
gdb_xml_attribute_handler gdb_xml_parse_attr_enum
static struct type * current_type
static const struct gdb_xml_attribute reg_attributes[]
char * ldirname(const char *filename)
DEF_VEC_O(tdesc_xml_cache_s)
static const struct gdb_xml_attribute feature_attributes[]
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)
#define VEC_safe_push(T, V, O)
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)
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)
enum gdb_osabi osabi_from_tdesc_string(const char *name)
void null_cleanup(void *arg)
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)
void tdesc_add_field(struct tdesc_type *type, const char *field_name, struct tdesc_type *field_type)
struct cleanup * make_cleanup_free_target_description(struct target_desc *target_desc)
#define VEC_iterate(T, V, I, P)
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)
struct tdesc_type * tdesc_create_struct(struct tdesc_feature *feature, 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)
void tdesc_create_reg(struct tdesc_feature *feature, const char *name, int regnum, int save_restore, const char *group, int bitsize, const char *type)
struct tdesc_type * tdesc_create_flags(struct tdesc_feature *feature, const char *name, LONGEST size)
void tdesc_add_bitfield(struct tdesc_type *type, const char *field_name, int start, int end)
struct cleanup * make_cleanup(make_cleanup_ftype *function, void *arg)
struct target_desc * allocate_target_description(void)
char * target_read_stralloc(struct target_ops *ops, enum target_object object, const char *annex)
static const struct gdb_xml_attribute field_attributes[]
static const struct gdb_xml_attribute flags_attributes[]
char * xml_fetch_content_from_file(const char *filename, void *baton)
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 VEC(tdesc_xml_cache_s)
static const struct gdb_xml_attribute struct_union_attributes[]
void tdesc_add_flag(struct tdesc_type *type, int start, const char *flag_name)
void gdb_xml_error(struct gdb_xml_parser *parser, const char *format,...)
const struct gdb_xml_enum gdb_xml_enums_boolean[]
const struct target_desc * file_read_description_xml(const char *filename)
const char const char int
struct gdb_xml_value * xml_find_attribute(VEC(gdb_xml_value_s)*attributes, const char *name)
void discard_cleanups(struct cleanup *old_chain)
struct tdesc_type * tdesc_named_type(const struct tdesc_feature *feature, const char *id)
const struct target_desc * target_read_description_xml(struct target_ops *ops)
static const struct gdb_xml_element feature_children[]
#define VEC_address(T, V)
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)
gdb_xml_attribute_handler gdb_xml_parse_attr_ulongest
unsigned long long ULONGEST
static PyObject * field_name(struct type *type, int field)
void tdesc_set_struct_size(struct tdesc_type *type, LONGEST size)
static void tdesc_end_arch(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text)
void set_tdesc_osabi(struct target_desc *target_desc, enum gdb_osabi osabi)
static void tdesc_end_compatible(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text)
void set_tdesc_architecture(struct target_desc *target_desc, const struct bfd_arch_info *arch)
void tdesc_add_compatible(struct target_desc *target_desc, const struct bfd_arch_info *compatible)
static const struct gdb_xml_element target_children[]
char * xml_process_xincludes(const char *name, const char *text, xml_fetch_another fetcher, void *fetcher_baton, int depth)
static const struct gdb_xml_element struct_union_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)
void do_cleanups(struct cleanup *old_chain)
const char * xml_document