X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fmemory-map.c;h=8c3918f366a6c286be81d676e22a600a5f0743e4;hb=13c9c48599ebc8ad2f3a1fb9f672740219cd3841;hp=b4e032281419564862b5761526576918b7fc4d80;hpb=28e7fd62340426746f9c896cbc40c5d374ec47aa;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/memory-map.c b/gdb/memory-map.c index b4e0322814..8c3918f366 100644 --- a/gdb/memory-map.c +++ b/gdb/memory-map.c @@ -1,6 +1,6 @@ /* Routines for handling XML memory maps provided by target. - Copyright (C) 2006-2013 Free Software Foundation, Inc. + Copyright (C) 2006-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -19,14 +19,10 @@ #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; @@ -38,7 +34,7 @@ parse_memory_map (const char *memory_map) "at compile time")); } - return NULL; + return std::vector (); } #else /* HAVE_LIBEXPAT */ @@ -47,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 = xml_find_attribute (attributes, "start")->value; - length_p = xml_find_attribute (attributes, "length")->value; - type_p = xml_find_attribute (attributes, "type")->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 @@ -82,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")); } @@ -95,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 = 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 element and its value. */ @@ -111,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. */ @@ -174,25 +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) { - VEC(mem_region_s) *result = NULL; - struct cleanup *back_to; - struct memory_map_parsing_data data = { NULL }; + std::vector 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 (); } #endif /* HAVE_LIBEXPAT */