gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / memory-map.c
index 4bb022bfdbb2f50f935fff985b9cc3ba9eca75a2..3eaddb18b9aa862cfcfd7195c3fd281501406651 100644 (file)
@@ -1,6 +1,6 @@
 /* Routines for handling XML memory maps provided by target.
 
-   Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2006-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
 #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<mem_region>
 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<mem_region> ();
 }
 
 #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<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 = 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 <memory> 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<gdb_xml_value> &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 <property> 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,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<mem_region>
 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 = { NULL };
-
-  back_to = make_cleanup (null_cleanup, NULL);
-  parser = gdb_xml_create_parser_and_cleanup (_("target memory map"),
-                                             memory_map_elements, &data);
+  std::vector<mem_region> 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<mem_region> ();
 }
 
 #endif /* HAVE_LIBEXPAT */
This page took 0.026138 seconds and 4 git commands to generate.