X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fmemory-map.c;h=3eaddb18b9aa862cfcfd7195c3fd281501406651;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=b9323f705b6f37e487bf5fc6ee60409d81eb02f3;hpb=e776119fdc2ba0eed3639762bb210095b0405549;p=deliverable%2Fbinutils-gdb.git
diff --git a/gdb/memory-map.c b/gdb/memory-map.c
index b9323f705b..3eaddb18b9 100644
--- a/gdb/memory-map.c
+++ b/gdb/memory-map.c
@@ -1,13 +1,12 @@
/* Routines for handling XML memory maps provided by target.
- Copyright (C) 2006
- Free Software Foundation, Inc.
+ Copyright (C) 2006-2020 Free Software Foundation, Inc.
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 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,
@@ -16,20 +15,14 @@
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 . */
#include "defs.h"
#include "memory-map.h"
-#include "gdb_assert.h"
-#include "exceptions.h"
-
-#include "gdb_string.h"
#if !defined(HAVE_LIBEXPAT)
-VEC(mem_region_s) *
+std::vector
parse_memory_map (const char *memory_map)
{
static int have_warned;
@@ -41,7 +34,7 @@ parse_memory_map (const char *memory_map)
"at compile time"));
}
- return NULL;
+ return std::vector ();
}
#else /* HAVE_LIBEXPAT */
@@ -50,31 +43,37 @@ parse_memory_map (const char *memory_map)
/* 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 *memory_map_)
+ : memory_map (memory_map_)
+ {}
+
+ std::vector *memory_map;
+
+ std::string property_name;
+};
/* Handle the start of a 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 &attributes)
{
- struct memory_map_parsing_data *data = user_data;
- struct mem_region *r = VEC_safe_push (mem_region_s, *data->memory_map, NULL);
+ struct memory_map_parsing_data *data
+ = (struct memory_map_parsing_data *) user_data;
ULONGEST *start_p, *length_p, *type_p;
- start_p = VEC_index (gdb_xml_value_s, attributes, 0)->value;
- length_p = VEC_index (gdb_xml_value_s, attributes, 1)->value;
- type_p = VEC_index (gdb_xml_value_s, attributes, 2)->value;
+ start_p
+ = (ULONGEST *) xml_find_attribute (attributes, "start")->value.get ();
+ length_p
+ = (ULONGEST *) xml_find_attribute (attributes, "length")->value.get ();
+ type_p
+ = (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 = *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 element. Verify that any necessary
@@ -85,10 +84,11 @@ memory_map_end_memory (struct gdb_xml_parser *parser,
const struct gdb_xml_element *element,
void *user_data, const char *body_text)
{
- struct memory_map_parsing_data *data = user_data;
- struct mem_region *r = VEC_last (mem_region_s, *data->memory_map);
+ struct memory_map_parsing_data *data
+ = (struct memory_map_parsing_data *) user_data;
+ 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"));
}
@@ -98,13 +98,15 @@ memory_map_end_memory (struct gdb_xml_parser *parser,
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 &attributes)
{
- struct memory_map_parsing_data *data = user_data;
+ struct memory_map_parsing_data *data
+ = (struct memory_map_parsing_data *) user_data;
char *name;
- name = VEC_index (gdb_xml_value_s, attributes, 0)->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 element and its value. */
@@ -114,27 +116,18 @@ memory_map_end_property (struct gdb_xml_parser *parser,
const struct gdb_xml_element *element,
void *user_data, const char *body_text)
{
- struct memory_map_parsing_data *data = user_data;
- char *name = data->property_name;
+ struct memory_map_parsing_data *data
+ = (struct memory_map_parsing_data *) user_data;
- 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 = 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. */
@@ -177,28 +170,20 @@ const struct gdb_xml_element memory_map_elements[] = {
{ NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
};
-VEC(mem_region_s) *
+std::vector
parse_memory_map (const char *memory_map)
{
- struct gdb_xml_parser *parser;
- VEC(mem_region_s) *result = NULL;
- struct cleanup *before_deleting_result, *back_to;
- struct memory_map_parsing_data data = {};
-
- back_to = make_cleanup (null_cleanup, NULL);
- parser = gdb_xml_create_parser_and_cleanup (_("target memory map"),
- memory_map_elements, &data);
+ std::vector ret;
+ memory_map_parsing_data data (&ret);
- /* Note: 'clear_result' will zero 'result'. */
- before_deleting_result = make_cleanup (clear_result, &result);
- data.memory_map = &result;
-
- if (gdb_xml_parse (parser, memory_map) == 0)
- /* Parsed successfully, don't need to delete the result. */
- discard_cleanups (before_deleting_result);
+ if (gdb_xml_parse_quick (_("target memory map"), NULL, memory_map_elements,
+ memory_map, &data) == 0)
+ {
+ /* Parsed successfully, keep the result. */
+ return ret;
+ }
- do_cleanups (back_to);
- return result;
+ return std::vector ();
}
#endif /* HAVE_LIBEXPAT */