windows-nat: Don't change current_event.dwThreadId in handle_output_debug_string()
[deliverable/binutils-gdb.git] / gdb / memory-map.c
CommitLineData
fd79ecee
DJ
1/* Routines for handling XML memory maps provided by target.
2
32d0add0 3 Copyright (C) 2006-2015 Free Software Foundation, Inc.
fd79ecee
DJ
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
fd79ecee
DJ
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fd79ecee
DJ
19
20#include "defs.h"
21#include "memory-map.h"
fd79ecee 22
fd79ecee
DJ
23#if !defined(HAVE_LIBEXPAT)
24
25VEC(mem_region_s) *
26parse_memory_map (const char *memory_map)
27{
28 static int have_warned;
29
30 if (!have_warned)
31 {
32 have_warned = 1;
33 warning (_("Can not parse XML memory map; XML support was disabled "
34 "at compile time"));
35 }
36
37 return NULL;
38}
39
40#else /* HAVE_LIBEXPAT */
41
42#include "xml-support.h"
fd79ecee 43
e776119f 44/* Internal parsing data passed to all XML callbacks. */
fd79ecee
DJ
45struct memory_map_parsing_data
46 {
47 VEC(mem_region_s) **memory_map;
e776119f 48 char property_name[32];
fd79ecee
DJ
49 };
50
e776119f
DJ
51/* Handle the start of a <memory> element. */
52
fd79ecee 53static void
e776119f
DJ
54memory_map_start_memory (struct gdb_xml_parser *parser,
55 const struct gdb_xml_element *element,
56 void *user_data, VEC(gdb_xml_value_s) *attributes)
fd79ecee 57{
e776119f
DJ
58 struct memory_map_parsing_data *data = user_data;
59 struct mem_region *r = VEC_safe_push (mem_region_s, *data->memory_map, NULL);
60 ULONGEST *start_p, *length_p, *type_p;
61
3d2c1d41
PA
62 start_p = xml_find_attribute (attributes, "start")->value;
63 length_p = xml_find_attribute (attributes, "length")->value;
64 type_p = xml_find_attribute (attributes, "type")->value;
e776119f
DJ
65
66 mem_region_init (r);
67 r->lo = *start_p;
68 r->hi = r->lo + *length_p;
69 r->attrib.mode = *type_p;
70 r->attrib.blocksize = -1;
fd79ecee
DJ
71}
72
e776119f
DJ
73/* Handle the end of a <memory> element. Verify that any necessary
74 children were present. */
fd79ecee
DJ
75
76static void
e776119f
DJ
77memory_map_end_memory (struct gdb_xml_parser *parser,
78 const struct gdb_xml_element *element,
79 void *user_data, const char *body_text)
fd79ecee 80{
e776119f
DJ
81 struct memory_map_parsing_data *data = user_data;
82 struct mem_region *r = VEC_last (mem_region_s, *data->memory_map);
fd79ecee 83
e776119f
DJ
84 if (r->attrib.mode == MEM_FLASH && r->attrib.blocksize == -1)
85 gdb_xml_error (parser, _("Flash block size is not set"));
fd79ecee
DJ
86}
87
e776119f
DJ
88/* Handle the start of a <property> element by saving the name
89 attribute for later. */
fd79ecee
DJ
90
91static void
e776119f
DJ
92memory_map_start_property (struct gdb_xml_parser *parser,
93 const struct gdb_xml_element *element,
94 void *user_data, VEC(gdb_xml_value_s) *attributes)
fd79ecee 95{
e776119f
DJ
96 struct memory_map_parsing_data *data = user_data;
97 char *name;
fd79ecee 98
3d2c1d41 99 name = xml_find_attribute (attributes, "name")->value;
e776119f 100 snprintf (data->property_name, sizeof (data->property_name), "%s", name);
fd79ecee
DJ
101}
102
e776119f 103/* Handle the end of a <property> element and its value. */
fd79ecee 104
fd79ecee 105static void
e776119f
DJ
106memory_map_end_property (struct gdb_xml_parser *parser,
107 const struct gdb_xml_element *element,
108 void *user_data, const char *body_text)
fd79ecee 109{
e776119f
DJ
110 struct memory_map_parsing_data *data = user_data;
111 char *name = data->property_name;
fd79ecee 112
e776119f 113 if (strcmp (name, "blocksize") == 0)
fd79ecee 114 {
e776119f 115 struct mem_region *r = VEC_last (mem_region_s, *data->memory_map);
fd79ecee 116
e776119f
DJ
117 r->attrib.blocksize = gdb_xml_parse_ulongest (parser, body_text);
118 }
119 else
120 gdb_xml_debug (parser, _("Unknown property \"%s\""), name);
fd79ecee
DJ
121}
122
e776119f
DJ
123/* Discard the constructed memory map (if an error occurs). */
124
fd79ecee
DJ
125static void
126clear_result (void *p)
127{
128 VEC(mem_region_s) **result = p;
129 VEC_free (mem_region_s, *result);
130 *result = NULL;
131}
132
e776119f
DJ
133/* The allowed elements and attributes for an XML memory map. */
134
135const struct gdb_xml_attribute property_attributes[] = {
136 { "name", GDB_XML_AF_NONE, NULL, NULL },
137 { NULL, GDB_XML_AF_NONE, NULL, NULL }
138};
139
140const struct gdb_xml_element memory_children[] = {
141 { "property", property_attributes, NULL,
142 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
143 memory_map_start_property, memory_map_end_property },
144 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
145};
146
147const struct gdb_xml_enum memory_type_enum[] = {
148 { "ram", MEM_RW },
149 { "rom", MEM_RO },
150 { "flash", MEM_FLASH },
151 { NULL, 0 }
152};
153
154const struct gdb_xml_attribute memory_attributes[] = {
155 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
156 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
157 { "type", GDB_XML_AF_NONE, gdb_xml_parse_attr_enum, &memory_type_enum },
158 { NULL, GDB_XML_AF_NONE, NULL, NULL }
159};
160
161const struct gdb_xml_element memory_map_children[] = {
162 { "memory", memory_attributes, memory_children, GDB_XML_EF_REPEATABLE,
163 memory_map_start_memory, memory_map_end_memory },
164 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
165};
166
167const struct gdb_xml_element memory_map_elements[] = {
168 { "memory-map", NULL, memory_map_children, GDB_XML_EF_NONE,
169 NULL, NULL },
170 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
171};
172
fd79ecee
DJ
173VEC(mem_region_s) *
174parse_memory_map (const char *memory_map)
175{
176 VEC(mem_region_s) *result = NULL;
efc0eabd 177 struct cleanup *back_to;
f6071bfa 178 struct memory_map_parsing_data data = { NULL };
fd79ecee 179
fd79ecee 180 data.memory_map = &result;
efc0eabd
PA
181 back_to = make_cleanup (clear_result, &result);
182 if (gdb_xml_parse_quick (_("target memory map"), NULL, memory_map_elements,
183 memory_map, &data) == 0)
184 {
185 /* Parsed successfully, keep the result. */
186 discard_cleanups (back_to);
187 return result;
188 }
fd79ecee 189
fd79ecee 190 do_cleanups (back_to);
efc0eabd 191 return NULL;
fd79ecee
DJ
192}
193
194#endif /* HAVE_LIBEXPAT */
This page took 0.913417 seconds and 4 git commands to generate.