* value.c (set_internalvar): Use value_free, not xfree.
[binutils-gdb.git] / gdb / xml-tdesc.c
index 31db9c35bda4ed2e80d2da43ce3ef3c19df40a38..1d4e12cacc59cd7ae5817db1da4b69992ac18eef 100644 (file)
@@ -1,7 +1,6 @@
 /* XML target description support for GDB.
 
-   Copyright (C) 2006
-   Free Software Foundation, Inc.
+   Copyright (C) 2006, 2008, 2009 Free Software Foundation, Inc.
 
    Contributed by CodeSourcery.
 
@@ -9,7 +8,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -18,9 +17,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "gdbtypes.h"
@@ -109,6 +106,22 @@ tdesc_end_arch (struct gdb_xml_parser *parser,
   set_tdesc_architecture (data->tdesc, arch);
 }
 
+/* Handle the start of a <target> element.  */
+
+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)
+{
+  struct tdesc_parsing_data *data = user_data;
+  char *version = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+
+  if (strcmp (version, "1.0") != 0)
+    gdb_xml_error (parser,
+                  _("Target description has unsupported version \"%s\""),
+                  version);
+}
+
 /* Handle the start of a <feature> element.  */
 
 static void
@@ -209,7 +222,7 @@ tdesc_end_union (struct gdb_xml_parser *parser,
   for (i = 0; i < TYPE_NFIELDS (data->current_union); i++)
     if (TYPE_VECTOR (TYPE_FIELD_TYPE (data->current_union, i)))
       {
-        TYPE_FLAGS (data->current_union) |= TYPE_FLAG_VECTOR;
+        TYPE_VECTOR (data->current_union) = 1;
         break;
       }
 }
@@ -263,13 +276,9 @@ tdesc_start_vector (struct gdb_xml_parser *parser,
     gdb_xml_error (parser, _("Vector \"%s\" references undefined type \"%s\""),
                   id, field_type_id);
 
-  /* A vector is just an array plus a special flag.  */
-  range_type = create_range_type (NULL, builtin_type_int, 0, count - 1);
-  type = create_array_type (NULL, field_type, range_type);
+  type = init_vector_type (field_type, count);
   TYPE_NAME (type) = xstrdup (id);
 
-  TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR;
-
   tdesc_record_type (data->current_feature, type);
 }
 
@@ -328,6 +337,11 @@ static const struct gdb_xml_element feature_children[] = {
   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
 };
 
+static const struct gdb_xml_attribute target_attributes[] = {
+  { "version", GDB_XML_AF_NONE, NULL, NULL },
+  { NULL, GDB_XML_AF_NONE, NULL, NULL }
+};
+
 static const struct gdb_xml_element target_children[] = {
   { "architecture", NULL, NULL, GDB_XML_EF_OPTIONAL,
     NULL, tdesc_end_arch },
@@ -338,8 +352,8 @@ static const struct gdb_xml_element target_children[] = {
 };
 
 static const struct gdb_xml_element tdesc_elements[] = {
-  { "target", NULL, target_children, GDB_XML_EF_NONE,
-    NULL, NULL },
+  { "target", target_attributes, target_children, GDB_XML_EF_NONE,
+    tdesc_start_target, NULL },
   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
 };
 
@@ -407,14 +421,6 @@ tdesc_parse_xml (const char *document, xml_fetch_another fetcher,
 #endif /* HAVE_LIBEXPAT */
 \f
 
-/* Close FILE.  */
-
-static void
-do_cleanup_fclose (void *file)
-{
-  fclose (file);
-}
-
 /* Open FILENAME, read all its text into memory, close it, and return
    the text.  If something goes wrong, return NULL and warn.  */
 
@@ -429,7 +435,7 @@ fetch_xml_from_file (const char *filename, void *baton)
 
   if (dirname && *dirname)
     {
-      char *fullname = concat (dirname, "/", filename, NULL);
+      char *fullname = concat (dirname, "/", filename, (char *) NULL);
       if (fullname == NULL)
        nomem (0);
       file = fopen (fullname, FOPEN_RT);
@@ -441,7 +447,7 @@ fetch_xml_from_file (const char *filename, void *baton)
   if (file == NULL)
     return NULL;
 
-  back_to = make_cleanup (do_cleanup_fclose, file);
+  back_to = make_cleanup_fclose (file);
 
   /* Read in the whole file, one chunk at a time.  */
   len = 4096;