/* XML target description support for GDB.

   Copyright (C) 2006-2018 Free Software Foundation, Inc.

   Contributed by CodeSourcery.

   This file is part of GDB.

   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 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   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, see <http://www.gnu.org/licenses/>.  */

#include "defs.h"
#include "target.h"
#include "target-descriptions.h"
#include "xml-support.h"
#include "xml-tdesc.h"
#include "osabi.h"
#include "filenames.h"
#include <unordered_map>
#include <string>

/* Maximum sizes.
   This is just to catch obviously wrong values.  */
#define MAX_FIELD_SIZE 65536
#define MAX_FIELD_BITSIZE (MAX_FIELD_SIZE * TARGET_CHAR_BIT)
#define MAX_VECTOR_SIZE 65536

#if !defined(HAVE_LIBEXPAT)

/* Parse DOCUMENT into a target description.  Or don't, since we don't have
   an XML parser.  */

static struct target_desc *
tdesc_parse_xml (const char *document, xml_fetch_another fetcher,
		 void *fetcher_baton)
{
  static int have_warned;

  if (!have_warned)
    {
      have_warned = 1;
      warning (_("Can not parse XML target description; XML support was "
		 "disabled at compile time"));
    }

  return NULL;
}

#else /* HAVE_LIBEXPAT */

/* A record of every XML description we have parsed.  We never discard
   old descriptions, because we never discard gdbarches.  As long as we
   have a gdbarch referencing this description, we want to have a copy
   of it here, so that if we parse the same XML document again we can
   return the same "struct target_desc *"; if they are not singletons,
   then we will create unnecessary duplicate gdbarches.  See
   gdbarch_list_lookup_by_info.  */

static std::unordered_map<std::string, target_desc *> xml_cache;

/* Callback data for target description parsing.  */

struct tdesc_parsing_data
{
  /* The target description we are building.  */
  struct target_desc *tdesc;

  /* The target feature we are currently parsing, or last parsed.  */
  struct tdesc_feature *current_feature;

  /* The register number to use for the next register we see, if
     it does not have its own.  This starts at zero.  */
  int next_regnum;

  /* The struct or union we are currently parsing, or last parsed.  */
  tdesc_type_with_fields *current_type;

  /* The byte size of the current struct/flags type, if specified.  Zero
     if not specified.  Flags values must specify a size.  */
  int current_type_size;
};

/* Handle the end of an <architecture> element and its value.  */

static void
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 = (struct tdesc_parsing_data *) user_data;
  const struct bfd_arch_info *arch;

  arch = bfd_scan_arch (body_text);
  if (arch == NULL)
    gdb_xml_error (parser, _("Target description specified unknown "
			     "architecture \"%s\""), body_text);
  set_tdesc_architecture (data->tdesc, arch);
}

/* Handle the end of an <osabi> element and its value.  */

static void
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 = (struct tdesc_parsing_data *) user_data;
  enum gdb_osabi osabi;

  osabi = osabi_from_tdesc_string (body_text);
  if (osabi == GDB_OSABI_UNKNOWN)
    warning (_("Target description specified unknown osabi \"%s\""),
	     body_text);
  else
    set_tdesc_osabi (data->tdesc, osabi);
}

/* Handle the end of a <compatible> element and its value.  */

static void
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 = (struct tdesc_parsing_data *) user_data;
  const struct bfd_arch_info *arch;

  arch = bfd_scan_arch (body_text);
  tdesc_add_compatible (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, std::vector<gdb_xml_value> &attributes)
{
  char *version
    = (char *) xml_find_attribute (attributes, "version")->value.get ();

  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
tdesc_start_feature (struct gdb_xml_parser *parser,
		     const struct gdb_xml_element *element,
		     void *user_data, std::vector<gdb_xml_value> &attributes)
{
  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
  char *name = (char *) xml_find_attribute (attributes, "name")->value.get ();

  data->current_feature = tdesc_create_feature (data->tdesc, name);
}

/* Handle the start of a <reg> element.  Fill in the optional
   attributes and attach it to the containing feature.  */

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)
{
  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
  int ix = 0;
  char *name, *group;
  const char *type;
  int bitsize, regnum, save_restore;

  int length = attributes.size ();

  name = (char *) attributes[ix++].value.get ();
  bitsize = * (ULONGEST *) attributes[ix++].value.get ();

  if (ix < length && strcmp (attributes[ix].name, "regnum") == 0)
    regnum = * (ULONGEST *) attributes[ix++].value.get ();
  else
    regnum = data->next_regnum;

  if (ix < length && strcmp (attributes[ix].name, "type") == 0)
    type = (char *) attributes[ix++].value.get ();
  else
    type = "int";

  if (ix < length && strcmp (attributes[ix].name, "group") == 0)
    group = (char *) attributes[ix++].value.get ();
  else
    group = NULL;

  if (ix < length && strcmp (attributes[ix].name, "save-restore") == 0)
    save_restore = * (ULONGEST *) attributes[ix++].value.get ();
  else
    save_restore = 1;

  if (strcmp (type, "int") != 0
      && strcmp (type, "float") != 0
      && tdesc_named_type (data->current_feature, type) == NULL)
    gdb_xml_error (parser, _("Register \"%s\" has unknown type \"%s\""),
		   name, type);

  tdesc_create_reg (data->current_feature, name, regnum, save_restore, group,
		    bitsize, type);

  data->next_regnum = regnum + 1;
}

/* Handle the start of a <union> element.  Initialize the type and
   record it with the current feature.  */

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)
{
  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
  char *id = (char *) xml_find_attribute (attributes, "id")->value.get ();

  data->current_type = tdesc_create_union (data->current_feature, id);
  data->current_type_size = 0;
}

/* Handle the start of a <struct> element.  Initialize the type and
   record it with the current feature.  */

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)
{
  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
  char *id = (char *) xml_find_attribute (attributes, "id")->value.get ();
  struct gdb_xml_value *attr;

  tdesc_type_with_fields *type_with_fields
    = tdesc_create_struct (data->current_feature, id);
  data->current_type = type_with_fields;
  data->current_type_size = 0;

  attr = xml_find_attribute (attributes, "size");
  if (attr != NULL)
    {
      ULONGEST size = * (ULONGEST *) attr->value.get ();

      if (size > MAX_FIELD_SIZE)
	{
	  gdb_xml_error (parser,
			 _("Struct size %s is larger than maximum (%d)"),
			 pulongest (size), MAX_FIELD_SIZE);
	}
      tdesc_set_struct_size (type_with_fields, size);
      data->current_type_size = size;
    }
}

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)
{
  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
  char *id = (char *) xml_find_attribute (attributes, "id")->value.get ();
  ULONGEST size = * (ULONGEST *)
    xml_find_attribute (attributes, "size")->value.get ();

  if (size > MAX_FIELD_SIZE)
    {
      gdb_xml_error (parser,
		     _("Flags size %s is larger than maximum (%d)"),
		     pulongest (size), MAX_FIELD_SIZE);
    }

  data->current_type = tdesc_create_flags (data->current_feature, id, size);
  data->current_type_size = size;
}

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)
{
  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
  char *id = (char *) xml_find_attribute (attributes, "id")->value.get ();
  int size = * (ULONGEST *)
    xml_find_attribute (attributes, "size")->value.get ();

  if (size > MAX_FIELD_SIZE)
    {
      gdb_xml_error (parser,
		     _("Enum size %s is larger than maximum (%d)"),
		     pulongest (size), MAX_FIELD_SIZE);
    }

  data->current_type = tdesc_create_enum (data->current_feature, id, size);
  data->current_type_size = 0;
}

/* Handle the start of a <field> element.  Attach the field to the
   current struct, union or flags.  */

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)
{
  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;

  field_name = (char *) xml_find_attribute (attributes, "name")->value.get ();

  attr = xml_find_attribute (attributes, "type");
  if (attr != NULL)
    {
      field_type_id = (char *) attr->value.get ();
      field_type = tdesc_named_type (data->current_feature, field_type_id);
    }
  else
    {
      field_type_id = NULL;
      field_type = NULL;
    }

  attr = xml_find_attribute (attributes, "start");
  if (attr != NULL)
    {
      ULONGEST ul_start = * (ULONGEST *) attr->value.get ();

      if (ul_start > MAX_FIELD_BITSIZE)
	{
	  gdb_xml_error (parser,
			 _("Field start %s is larger than maximum (%d)"),
			 pulongest (ul_start), MAX_FIELD_BITSIZE);
	}
      start = ul_start;
    }
  else
    start = -1;

  attr = xml_find_attribute (attributes, "end");
  if (attr != NULL)
    {
      ULONGEST ul_end = * (ULONGEST *) attr->value.get ();

      if (ul_end > MAX_FIELD_BITSIZE)
	{
	  gdb_xml_error (parser,
			 _("Field end %s is larger than maximum (%d)"),
			 pulongest (ul_end), MAX_FIELD_BITSIZE);
	}
      end = ul_end;
    }
  else
    end = -1;

  if (start != -1)
    {
      tdesc_type_with_fields *t = data->current_type;

      /* Older versions of gdb can't handle elided end values.
         Stick with that for now, to help ensure backward compatibility.
	 E.g., If a newer gdbserver is talking to an older gdb.  */
      if (end == -1)
	gdb_xml_error (parser, _("Missing end value"));

      if (data->current_type_size == 0)
	gdb_xml_error (parser,
		       _("Bitfields must live in explicitly sized types"));

      if (field_type_id != NULL
	  && strcmp (field_type_id, "bool") == 0
	  && start != end)
	{
	  gdb_xml_error (parser,
			 _("Boolean fields must be one bit in size"));
	}

      if (end >= 64)
	gdb_xml_error (parser,
		       _("Bitfield \"%s\" goes past "
			 "64 bits (unsupported)"),
		       field_name);

      /* Assume that the bit numbering in XML is "lsb-zero".  Most
	 architectures other than PowerPC use this ordering.  In the
	 future, we can add an XML tag to indicate "msb-zero" numbering.  */
      if (start > end)
	gdb_xml_error (parser, _("Bitfield \"%s\" has start after end"),
		       field_name);
      if (end >= data->current_type_size * TARGET_CHAR_BIT)
	gdb_xml_error (parser, _("Bitfield \"%s\" does not fit in struct"),
		       field_name);

      if (field_type != NULL)
	tdesc_add_typed_bitfield (t, field_name, start, end, field_type);
      else if (start == end)
	tdesc_add_flag (t, start, field_name);
      else
	tdesc_add_bitfield (t, field_name, start, end);
    }
  else if (start == -1 && end != -1)
    gdb_xml_error (parser, _("End specified but not start"));
  else if (field_type_id != NULL)
    {
      /* TDESC_TYPE_FLAGS values are explicitly sized, so the following test
	 catches adding non-bitfield types to flags as well.  */
      if (data->current_type_size != 0)
	gdb_xml_error (parser,
		       _("Explicitly sized type cannot "
			 "contain non-bitfield \"%s\""),
		       field_name);

      if (field_type == NULL)
	gdb_xml_error (parser, _("Field \"%s\" references undefined "
				 "type \"%s\""),
		       field_name, field_type_id);

      tdesc_add_field (data->current_type, field_name, field_type);
    }
  else
    gdb_xml_error (parser, _("Field \"%s\" has neither type nor bit position"),
		   field_name);
}

/* Handle the start of an <evalue> element.  Attach the value to the
   current enum.  */

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)
{
  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
  struct gdb_xml_value *attr;
  char *field_name;
  ULONGEST ul_value;
  int value;

  field_name = (char *) xml_find_attribute (attributes, "name")->value.get ();

  attr = xml_find_attribute (attributes, "value");
  ul_value = * (ULONGEST *) attr->value.get ();
  if (ul_value > INT_MAX)
    {
      gdb_xml_error (parser,
		     _("Enum value %s is larger than maximum (%d)"),
		     pulongest (ul_value), INT_MAX);
    }
  value = ul_value;

  tdesc_add_enum_value (data->current_type, value, field_name);
}

/* Handle the start of a <vector> element.  Initialize the type and
   record it with the current feature.  */

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)
{
  struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
  struct tdesc_type *field_type;
  char *id, *field_type_id;
  ULONGEST count;

  id = (char *) attributes[0].value.get ();
  field_type_id = (char *) attributes[1].value.get ();
  count = * (ULONGEST *) attributes[2].value.get ();

  if (count > MAX_VECTOR_SIZE)
    {
      gdb_xml_error (parser,
		     _("Vector size %s is larger than maximum (%d)"),
		     pulongest (count), MAX_VECTOR_SIZE);
    }

  field_type = tdesc_named_type (data->current_feature, field_type_id);
  if (field_type == NULL)
    gdb_xml_error (parser, _("Vector \"%s\" references undefined type \"%s\""),
		   id, field_type_id);

  tdesc_create_vector (data->current_feature, id, field_type, count);
}

/* The elements and attributes of an XML target description.  */

static const struct gdb_xml_attribute field_attributes[] = {
  { "name", GDB_XML_AF_NONE, NULL, NULL },
  { "type", GDB_XML_AF_OPTIONAL, NULL, NULL },
  { "start", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
  { "end", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
};

static const struct gdb_xml_attribute enum_value_attributes[] = {
  { "name", GDB_XML_AF_NONE, NULL, NULL },
  { "value", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
};

static const struct gdb_xml_element struct_union_children[] = {
  { "field", field_attributes, NULL, GDB_XML_EF_REPEATABLE,
    tdesc_start_field, NULL },
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
};

static const struct gdb_xml_element enum_children[] = {
  { "evalue", enum_value_attributes, NULL, GDB_XML_EF_REPEATABLE,
    tdesc_start_enum_value, NULL },
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
};

static const struct gdb_xml_attribute reg_attributes[] = {
  { "name", GDB_XML_AF_NONE, NULL, NULL },
  { "bitsize", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
  { "regnum", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
  { "type", GDB_XML_AF_OPTIONAL, NULL, NULL },
  { "group", GDB_XML_AF_OPTIONAL, NULL, NULL },
  { "save-restore", GDB_XML_AF_OPTIONAL,
    gdb_xml_parse_attr_enum, gdb_xml_enums_boolean },
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
};

static const struct gdb_xml_attribute struct_union_attributes[] = {
  { "id", GDB_XML_AF_NONE, NULL, NULL },
  { "size", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL},
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
};

static const struct gdb_xml_attribute flags_attributes[] = {
  { "id", GDB_XML_AF_NONE, NULL, NULL },
  { "size", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL},
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
};

static const struct gdb_xml_attribute enum_attributes[] = {
  { "id", GDB_XML_AF_NONE, NULL, NULL },
  { "size", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL},
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
};

static const struct gdb_xml_attribute vector_attributes[] = {
  { "id", GDB_XML_AF_NONE, NULL, NULL },
  { "type", GDB_XML_AF_NONE, NULL, NULL },
  { "count", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
};

static const struct gdb_xml_attribute feature_attributes[] = {
  { "name", GDB_XML_AF_NONE, NULL, NULL },
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
};

static const struct gdb_xml_element feature_children[] = {
  { "reg", reg_attributes, NULL,
    GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
    tdesc_start_reg, NULL },
  { "struct", struct_union_attributes, struct_union_children,
    GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
    tdesc_start_struct, NULL },
  { "union", struct_union_attributes, struct_union_children,
    GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
    tdesc_start_union, NULL },
  { "flags", flags_attributes, struct_union_children,
    GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
    tdesc_start_flags, NULL },    
  { "enum", enum_attributes, enum_children,
    GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
    tdesc_start_enum, NULL },
  { "vector", vector_attributes, NULL,
    GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
    tdesc_start_vector, NULL },
  { 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 },
  { "osabi", NULL, NULL, GDB_XML_EF_OPTIONAL,
    NULL, tdesc_end_osabi },
  { "compatible", NULL, NULL, GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
    NULL, tdesc_end_compatible },
  { "feature", feature_attributes, feature_children,
    GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
    tdesc_start_feature, NULL },
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
};

static const struct gdb_xml_element tdesc_elements[] = {
  { "target", target_attributes, target_children, GDB_XML_EF_NONE,
    tdesc_start_target, NULL },
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
};

/* Parse DOCUMENT into a target description and return it.  */

static struct target_desc *
tdesc_parse_xml (const char *document, xml_fetch_another fetcher,
		 void *fetcher_baton)
{
  struct tdesc_parsing_data data;

  /* Expand all XInclude directives.  */
  std::string expanded_text;

  if (!xml_process_xincludes (expanded_text,
			      _("target description"),
			      document, fetcher, fetcher_baton, 0))
    {
      warning (_("Could not load XML target description; ignoring"));
      return NULL;
    }

  /* Check for an exact match in the list of descriptions we have
     previously parsed.  */
  const auto it = xml_cache.find (expanded_text);
  if (it != xml_cache.end ())
    return it->second;

  memset (&data, 0, sizeof (struct tdesc_parsing_data));
  data.tdesc = allocate_target_description ();
  struct cleanup *result_cleanup
    = make_cleanup_free_target_description (data.tdesc);

  if (gdb_xml_parse_quick (_("target description"), "gdb-target.dtd",
			   tdesc_elements, expanded_text.c_str (), &data) == 0)
    {
      /* Parsed successfully.  */
      xml_cache.emplace (std::move (expanded_text), data.tdesc);
      discard_cleanups (result_cleanup);
      return data.tdesc;
    }
  else
    {
      warning (_("Could not load XML target description; ignoring"));
      do_cleanups (result_cleanup);
      return NULL;
    }
}
#endif /* HAVE_LIBEXPAT */


/* Read an XML target description from FILENAME.  Parse it, and return
   the parsed description.  */

const struct target_desc *
file_read_description_xml (const char *filename)
{
  gdb::optional<gdb::char_vector> tdesc_str
    = xml_fetch_content_from_file (filename, NULL);
  if (!tdesc_str)
    {
      warning (_("Could not open \"%s\""), filename);
      return NULL;
    }

  return tdesc_parse_xml (tdesc_str->data (), xml_fetch_content_from_file,
			  (void *) ldirname (filename).c_str ());
}

/* Read a string representation of available features from the target,
   using TARGET_OBJECT_AVAILABLE_FEATURES.  The returned string is
   malloc allocated and NUL-terminated.  NAME should be a non-NULL
   string identifying the XML document we want; the top level document
   is "target.xml".  Other calls may be performed for the DTD or
   for <xi:include>.  */

static gdb::optional<gdb::char_vector>
fetch_available_features_from_target (const char *name, void *baton_)
{
  struct target_ops *ops = (struct target_ops *) baton_;

  /* Read this object as a string.  This ensures that a NUL
     terminator is added.  */
  return target_read_stralloc (ops,
			       TARGET_OBJECT_AVAILABLE_FEATURES,
			       name);
}


/* Read an XML target description using OPS.  Parse it, and return the
   parsed description.  */

const struct target_desc *
target_read_description_xml (struct target_ops *ops)
{
  gdb::optional<gdb::char_vector> tdesc_str
    = fetch_available_features_from_target ("target.xml", ops);
  if (!tdesc_str)
    return NULL;

  return tdesc_parse_xml (tdesc_str->data (),
			  fetch_available_features_from_target,
			  ops);
}

/* Fetches an XML target description using OPS,  processing
   includes, but not parsing it.  Used to dump whole tdesc
   as a single XML file.  */

gdb::optional<std::string>
target_fetch_description_xml (struct target_ops *ops)
{
#if !defined(HAVE_LIBEXPAT)
  static int have_warned;

  if (!have_warned)
    {
      have_warned = 1;
      warning (_("Can not fetch XML target description; XML support was "
		 "disabled at compile time"));
    }

  return {};
#else
  gdb::optional<gdb::char_vector>
    tdesc_str = fetch_available_features_from_target ("target.xml", ops);
  if (!tdesc_str)
    return {};

  std::string output;
  if (!xml_process_xincludes (output,
			      _("target description"),
			      tdesc_str->data (),
			      fetch_available_features_from_target, ops, 0))
    {
      warning (_("Could not load XML target description; ignoring"));
      return {};
    }
  return output;
#endif
}

/* See xml-tdesc.h.  */

const struct target_desc *
string_read_description_xml (const char *xml)
{
  return tdesc_parse_xml (xml, [] (const char *href, void *baton)
    {
      error (_("xincludes are unsupported with this method"));
      return gdb::optional<gdb::char_vector> ();
    }, nullptr);
}
