Fix PR threads/19422 - show which thread caused stop
[deliverable/binutils-gdb.git] / gdb / xml-tdesc.c
index bccef11c195cec9be7d28d4b79f575fc400cd2fc..5eeda86a97517ebf37dc59f0c16da346eff7717f 100644 (file)
@@ -1,6 +1,6 @@
 /* XML target description support for GDB.
 
-   Copyright (C) 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2006-2016 Free Software Foundation, Inc.
 
    Contributed by CodeSourcery.
 
@@ -28,8 +28,6 @@
 
 #include "filenames.h"
 
-#include "gdb_assert.h"
-
 #if !defined(HAVE_LIBEXPAT)
 
 /* Parse DOCUMENT into a target description.  Or don't, since we don't have
@@ -103,7 +101,7 @@ tdesc_end_arch (struct gdb_xml_parser *parser,
                const struct gdb_xml_element *element,
                void *user_data, const char *body_text)
 {
-  struct tdesc_parsing_data *data = user_data;
+  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
   const struct bfd_arch_info *arch;
 
   arch = bfd_scan_arch (body_text);
@@ -120,7 +118,7 @@ tdesc_end_osabi (struct gdb_xml_parser *parser,
                 const struct gdb_xml_element *element,
                 void *user_data, const char *body_text)
 {
-  struct tdesc_parsing_data *data = user_data;
+  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
   enum gdb_osabi osabi;
 
   osabi = osabi_from_tdesc_string (body_text);
@@ -138,7 +136,7 @@ tdesc_end_compatible (struct gdb_xml_parser *parser,
                      const struct gdb_xml_element *element,
                      void *user_data, const char *body_text)
 {
-  struct tdesc_parsing_data *data = user_data;
+  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
   const struct bfd_arch_info *arch;
 
   arch = bfd_scan_arch (body_text);
@@ -152,7 +150,7 @@ tdesc_start_target (struct gdb_xml_parser *parser,
                    const struct gdb_xml_element *element,
                    void *user_data, VEC(gdb_xml_value_s) *attributes)
 {
-  char *version = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+  char *version = (char *) xml_find_attribute (attributes, "version")->value;
 
   if (strcmp (version, "1.0") != 0)
     gdb_xml_error (parser,
@@ -167,8 +165,8 @@ tdesc_start_feature (struct gdb_xml_parser *parser,
                     const struct gdb_xml_element *element,
                     void *user_data, VEC(gdb_xml_value_s) *attributes)
 {
-  struct tdesc_parsing_data *data = user_data;
-  char *name = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
+  char *name = (char *) xml_find_attribute (attributes, "name")->value;
 
   data->current_feature = tdesc_create_feature (data->tdesc, name);
 }
@@ -181,7 +179,7 @@ tdesc_start_reg (struct gdb_xml_parser *parser,
                 const struct gdb_xml_element *element,
                 void *user_data, VEC(gdb_xml_value_s) *attributes)
 {
-  struct tdesc_parsing_data *data = user_data;
+  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
   struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes);
   int ix = 0, length;
   char *name, *group, *type;
@@ -189,7 +187,7 @@ tdesc_start_reg (struct gdb_xml_parser *parser,
 
   length = VEC_length (gdb_xml_value_s, attributes);
 
-  name = attrs[ix++].value;
+  name = (char *) attrs[ix++].value;
   bitsize = * (ULONGEST *) attrs[ix++].value;
 
   if (ix < length && strcmp (attrs[ix].name, "regnum") == 0)
@@ -198,12 +196,12 @@ tdesc_start_reg (struct gdb_xml_parser *parser,
     regnum = data->next_regnum;
 
   if (ix < length && strcmp (attrs[ix].name, "type") == 0)
-    type = attrs[ix++].value;
+    type = (char *) attrs[ix++].value;
   else
     type = "int";
 
   if (ix < length && strcmp (attrs[ix].name, "group") == 0)
-    group = attrs[ix++].value;
+    group = (char *) attrs[ix++].value;
   else
     group = NULL;
 
@@ -232,8 +230,8 @@ tdesc_start_union (struct gdb_xml_parser *parser,
                   const struct gdb_xml_element *element,
                   void *user_data, VEC(gdb_xml_value_s) *attributes)
 {
-  struct tdesc_parsing_data *data = user_data;
-  char *id = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
+  char *id = (char *) xml_find_attribute (attributes, "id")->value;
 
   data->current_type = tdesc_create_union (data->current_feature, id);
   data->current_type_size = 0;
@@ -248,19 +246,20 @@ tdesc_start_struct (struct gdb_xml_parser *parser,
                   const struct gdb_xml_element *element,
                   void *user_data, VEC(gdb_xml_value_s) *attributes)
 {
-  struct tdesc_parsing_data *data = user_data;
-  char *id = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
+  char *id = (char *) xml_find_attribute (attributes, "id")->value;
   struct tdesc_type *type;
+  struct gdb_xml_value *attr;
 
   type = tdesc_create_struct (data->current_feature, id);
   data->current_type = type;
   data->current_type_size = 0;
   data->current_type_is_flags = 0;
 
-  if (VEC_length (gdb_xml_value_s, attributes) > 1)
+  attr = xml_find_attribute (attributes, "size");
+  if (attr != NULL)
     {
-      int size = (int) * (ULONGEST *)
-       VEC_index (gdb_xml_value_s, attributes, 1)->value;
+      int size = (int) * (ULONGEST *) attr->value;
 
       tdesc_set_struct_size (type, size);
       data->current_type_size = size;
@@ -272,10 +271,10 @@ 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_parsing_data *data = user_data;
-  char *id = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
+  char *id = (char *) xml_find_attribute (attributes, "id")->value;
   int length = (int) * (ULONGEST *)
-    VEC_index (gdb_xml_value_s, attributes, 1)->value;
+    xml_find_attribute (attributes, "size")->value;
   struct tdesc_type *type;
 
   type = tdesc_create_flags (data->current_feature, id, length);
@@ -293,29 +292,29 @@ tdesc_start_field (struct gdb_xml_parser *parser,
                   const struct gdb_xml_element *element,
                   void *user_data, VEC(gdb_xml_value_s) *attributes)
 {
-  struct tdesc_parsing_data *data = user_data;
-  int ix = 0, length;
-  struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes);
+  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
+  struct gdb_xml_value *attr;
   struct tdesc_type *field_type;
   char *field_name, *field_type_id;
   int start, end;
 
-  length = VEC_length (gdb_xml_value_s, attributes);
+  field_name = (char *) xml_find_attribute (attributes, "name")->value;
 
-  field_name = attrs[ix++].value;
-
-  if (ix < length && strcmp (attrs[ix].name, "type") == 0)
-    field_type_id = attrs[ix++].value;
+  attr = xml_find_attribute (attributes, "type");
+  if (attr != NULL)
+    field_type_id = (char *) attr->value;
   else
     field_type_id = NULL;
 
-  if (ix < length && strcmp (attrs[ix].name, "start") == 0)
-    start = * (ULONGEST *) attrs[ix++].value;
+  attr = xml_find_attribute (attributes, "start");
+  if (attr != NULL)
+    start = * (ULONGEST *) attr->value;
   else
     start = -1;
 
-  if (ix < length && strcmp (attrs[ix].name, "end") == 0)
-    end = * (ULONGEST *) attrs[ix++].value;
+  attr = xml_find_attribute (attributes, "end");
+  if (attr != NULL)
+    end = * (ULONGEST *) attr->value;
   else
     end = -1;
 
@@ -326,7 +325,8 @@ tdesc_start_field (struct gdb_xml_parser *parser,
                       field_name);
       if (data->current_type_size != 0)
        gdb_xml_error (parser,
-                      _("Explicitly sized type can not contain non-bitfield \"%s\""), 
+                      _("Explicitly sized type can not "
+                        "contain non-bitfield \"%s\""), 
                       field_name);
 
       field_type = tdesc_named_type (data->current_feature, field_type_id);
@@ -347,12 +347,14 @@ tdesc_start_field (struct gdb_xml_parser *parser,
        {
          if (data->current_type_size == 0)
            gdb_xml_error (parser,
-                          _("Implicitly sized type can not contain bitfield \"%s\""), 
+                          _("Implicitly sized type can "
+                            "not contain bitfield \"%s\""), 
                           field_name);
 
          if (end >= 64)
            gdb_xml_error (parser,
-                          _("Bitfield \"%s\" goes past 64 bits (unsupported)"),
+                          _("Bitfield \"%s\" goes past "
+                            "64 bits (unsupported)"),
                           field_name);
 
          /* Assume that the bit numbering in XML is "lsb-zero".  Most
@@ -364,7 +366,8 @@ tdesc_start_field (struct gdb_xml_parser *parser,
                           field_name);
 
          if (end >= data->current_type_size * TARGET_CHAR_BIT)
-           gdb_xml_error (parser, _("Bitfield \"%s\" does not fit in struct"));
+           gdb_xml_error (parser,
+                          _("Bitfield \"%s\" does not fit in struct"));
 
          tdesc_add_bitfield (t, field_name, start, end);
        }
@@ -382,14 +385,14 @@ tdesc_start_vector (struct gdb_xml_parser *parser,
                    const struct gdb_xml_element *element,
                    void *user_data, VEC(gdb_xml_value_s) *attributes)
 {
-  struct tdesc_parsing_data *data = user_data;
+  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
   struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes);
   struct tdesc_type *field_type;
   char *id, *field_type_id;
   int count;
 
-  id = attrs[0].value;
-  field_type_id = attrs[1].value;
+  id = (char *) attrs[0].value;
+  field_type_id = (char *) attrs[1].value;
   count = * (ULONGEST *) attrs[2].value;
 
   field_type = tdesc_named_type (data->current_feature, field_type_id);
@@ -501,7 +504,6 @@ tdesc_parse_xml (const char *document, xml_fetch_another fetcher,
                 void *fetcher_baton)
 {
   struct cleanup *back_to, *result_cleanup;
-  struct gdb_xml_parser *parser;
   struct tdesc_parsing_data data;
   struct tdesc_xml_cache *cache;
   char *expanded_text;
@@ -527,16 +529,14 @@ tdesc_parse_xml (const char *document, xml_fetch_another fetcher,
       }
 
   back_to = make_cleanup (null_cleanup, NULL);
-  parser = gdb_xml_create_parser_and_cleanup (_("target description"),
-                                             tdesc_elements, &data);
-  gdb_xml_use_dtd (parser, "gdb-target.dtd");
 
   memset (&data, 0, sizeof (struct tdesc_parsing_data));
   data.tdesc = allocate_target_description ();
   result_cleanup = make_cleanup_free_target_description (data.tdesc);
   make_cleanup (xfree, expanded_text);
 
-  if (gdb_xml_parse (parser, expanded_text) == 0)
+  if (gdb_xml_parse_quick (_("target description"), "gdb-target.dtd",
+                          tdesc_elements, expanded_text, &data) == 0)
     {
       /* Parsed successfully.  */
       struct tdesc_xml_cache new_cache;
@@ -598,7 +598,7 @@ file_read_description_xml (const char *filename)
 static char *
 fetch_available_features_from_target (const char *name, void *baton_)
 {
-  struct target_ops *ops = baton_;
+  struct target_ops *ops = (struct target_ops *) baton_;
 
   /* Read this object as a string.  This ensures that a NUL
      terminator is added.  */
This page took 0.029049 seconds and 4 git commands to generate.