/* Routines for handling XML memory maps provided by target.
- Copyright (C) 2006-2017 Free Software Foundation, Inc.
+ Copyright (C) 2006-2019 Free Software Foundation, Inc.
This file is part of GDB.
#if !defined(HAVE_LIBEXPAT)
-VEC(mem_region_s) *
+std::vector<mem_region>
parse_memory_map (const char *memory_map)
{
static int have_warned;
"at compile time"));
}
- return NULL;
+ return std::vector<mem_region> ();
}
#else /* HAVE_LIBEXPAT */
/* Internal parsing data passed to all XML callbacks. */
struct memory_map_parsing_data
- {
- VEC(mem_region_s) **memory_map;
- char property_name[32];
- };
+{
+ memory_map_parsing_data (std::vector<mem_region> *memory_map_)
+ : memory_map (memory_map_)
+ {}
+
+ std::vector<mem_region> *memory_map;
+
+ std::string property_name;
+};
/* Handle the start of a <memory> element. */
static void
memory_map_start_memory (struct gdb_xml_parser *parser,
const struct gdb_xml_element *element,
- void *user_data, VEC(gdb_xml_value_s) *attributes)
+ void *user_data,
+ std::vector<gdb_xml_value> &attributes)
{
struct memory_map_parsing_data *data
= (struct memory_map_parsing_data *) user_data;
- struct mem_region *r = VEC_safe_push (mem_region_s, *data->memory_map, NULL);
ULONGEST *start_p, *length_p, *type_p;
start_p
- = (ULONGEST *) xml_find_attribute (attributes, "start")->value;
+ = (ULONGEST *) xml_find_attribute (attributes, "start")->value.get ();
length_p
- = (ULONGEST *) xml_find_attribute (attributes, "length")->value;
+ = (ULONGEST *) xml_find_attribute (attributes, "length")->value.get ();
type_p
- = (ULONGEST *) xml_find_attribute (attributes, "type")->value;
+ = (ULONGEST *) xml_find_attribute (attributes, "type")->value.get ();
- mem_region_init (r);
- r->lo = *start_p;
- r->hi = r->lo + *length_p;
- r->attrib.mode = (enum mem_access_mode) *type_p;
- r->attrib.blocksize = -1;
+ data->memory_map->emplace_back (*start_p, *start_p + *length_p,
+ (enum mem_access_mode) *type_p);
}
/* Handle the end of a <memory> element. Verify that any necessary
{
struct memory_map_parsing_data *data
= (struct memory_map_parsing_data *) user_data;
- struct mem_region *r = VEC_last (mem_region_s, *data->memory_map);
+ const mem_region &r = data->memory_map->back ();
- if (r->attrib.mode == MEM_FLASH && r->attrib.blocksize == -1)
+ if (r.attrib.mode == MEM_FLASH && r.attrib.blocksize == -1)
gdb_xml_error (parser, _("Flash block size is not set"));
}
static void
memory_map_start_property (struct gdb_xml_parser *parser,
const struct gdb_xml_element *element,
- void *user_data, VEC(gdb_xml_value_s) *attributes)
+ void *user_data,
+ std::vector<gdb_xml_value> &attributes)
{
struct memory_map_parsing_data *data
= (struct memory_map_parsing_data *) user_data;
char *name;
- name = (char *) xml_find_attribute (attributes, "name")->value;
- snprintf (data->property_name, sizeof (data->property_name), "%s", name);
+ name = (char *) xml_find_attribute (attributes, "name")->value.get ();
+ data->property_name.assign (name);
}
/* Handle the end of a <property> element and its value. */
{
struct memory_map_parsing_data *data
= (struct memory_map_parsing_data *) user_data;
- char *name = data->property_name;
- if (strcmp (name, "blocksize") == 0)
+ if (data->property_name == "blocksize")
{
- struct mem_region *r = VEC_last (mem_region_s, *data->memory_map);
+ mem_region &r = data->memory_map->back ();
- r->attrib.blocksize = gdb_xml_parse_ulongest (parser, body_text);
+ r.attrib.blocksize = gdb_xml_parse_ulongest (parser, body_text);
}
else
- gdb_xml_debug (parser, _("Unknown property \"%s\""), name);
-}
-
-/* Discard the constructed memory map (if an error occurs). */
-
-static void
-clear_result (void *p)
-{
- VEC(mem_region_s) **result = (VEC(mem_region_s) **) p;
- VEC_free (mem_region_s, *result);
- *result = NULL;
+ gdb_xml_debug (parser, _("Unknown property \"%s\""),
+ data->property_name.c_str ());
}
/* The allowed elements and attributes for an XML memory map. */
{ NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
};
-VEC(mem_region_s) *
+std::vector<mem_region>
parse_memory_map (const char *memory_map)
{
- VEC(mem_region_s) *result = NULL;
- struct cleanup *back_to;
- struct memory_map_parsing_data data = { NULL };
+ std::vector<mem_region> ret;
+ memory_map_parsing_data data (&ret);
- data.memory_map = &result;
- back_to = make_cleanup (clear_result, &result);
if (gdb_xml_parse_quick (_("target memory map"), NULL, memory_map_elements,
memory_map, &data) == 0)
{
/* Parsed successfully, keep the result. */
- discard_cleanups (back_to);
- return result;
+ return ret;
}
- do_cleanups (back_to);
- return NULL;
+ return std::vector<mem_region> ();
}
#endif /* HAVE_LIBEXPAT */