PR22431, powerpc64 ld segfault when .plt discarded
[deliverable/binutils-gdb.git] / gdb / memory-map.c
CommitLineData
fd79ecee
DJ
1/* Routines for handling XML memory maps provided by target.
2
61baf725 3 Copyright (C) 2006-2017 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
a664f67e 25std::vector<mem_region>
fd79ecee
DJ
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
a664f67e 37 return std::vector<mem_region> ();
fd79ecee
DJ
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 45struct memory_map_parsing_data
6e17c565 46{
a664f67e
SM
47 memory_map_parsing_data (std::vector<mem_region> *memory_map_)
48 : memory_map (memory_map_)
49 {}
50
51 std::vector<mem_region> *memory_map;
6e17c565
SM
52
53 std::string property_name;
54};
fd79ecee 55
e776119f
DJ
56/* Handle the start of a <memory> element. */
57
fd79ecee 58static void
e776119f
DJ
59memory_map_start_memory (struct gdb_xml_parser *parser,
60 const struct gdb_xml_element *element,
61 void *user_data, VEC(gdb_xml_value_s) *attributes)
fd79ecee 62{
19ba03f4
SM
63 struct memory_map_parsing_data *data
64 = (struct memory_map_parsing_data *) user_data;
e776119f
DJ
65 ULONGEST *start_p, *length_p, *type_p;
66
19ba03f4 67 start_p
bc84451b 68 = (ULONGEST *) xml_find_attribute (attributes, "start")->value;
19ba03f4 69 length_p
bc84451b 70 = (ULONGEST *) xml_find_attribute (attributes, "length")->value;
19ba03f4 71 type_p
bc84451b 72 = (ULONGEST *) xml_find_attribute (attributes, "type")->value;
e776119f 73
a664f67e
SM
74 data->memory_map->emplace_back (*start_p, *length_p,
75 (enum mem_access_mode) *type_p);
fd79ecee
DJ
76}
77
e776119f
DJ
78/* Handle the end of a <memory> element. Verify that any necessary
79 children were present. */
fd79ecee
DJ
80
81static void
e776119f
DJ
82memory_map_end_memory (struct gdb_xml_parser *parser,
83 const struct gdb_xml_element *element,
84 void *user_data, const char *body_text)
fd79ecee 85{
19ba03f4
SM
86 struct memory_map_parsing_data *data
87 = (struct memory_map_parsing_data *) user_data;
a664f67e 88 const mem_region &r = data->memory_map->back ();
fd79ecee 89
a664f67e 90 if (r.attrib.mode == MEM_FLASH && r.attrib.blocksize == -1)
e776119f 91 gdb_xml_error (parser, _("Flash block size is not set"));
fd79ecee
DJ
92}
93
e776119f
DJ
94/* Handle the start of a <property> element by saving the name
95 attribute for later. */
fd79ecee
DJ
96
97static void
e776119f
DJ
98memory_map_start_property (struct gdb_xml_parser *parser,
99 const struct gdb_xml_element *element,
100 void *user_data, VEC(gdb_xml_value_s) *attributes)
fd79ecee 101{
19ba03f4
SM
102 struct memory_map_parsing_data *data
103 = (struct memory_map_parsing_data *) user_data;
e776119f 104 char *name;
fd79ecee 105
19ba03f4 106 name = (char *) xml_find_attribute (attributes, "name")->value;
6e17c565 107 data->property_name.assign (name);
fd79ecee
DJ
108}
109
e776119f 110/* Handle the end of a <property> element and its value. */
fd79ecee 111
fd79ecee 112static void
e776119f
DJ
113memory_map_end_property (struct gdb_xml_parser *parser,
114 const struct gdb_xml_element *element,
115 void *user_data, const char *body_text)
fd79ecee 116{
19ba03f4
SM
117 struct memory_map_parsing_data *data
118 = (struct memory_map_parsing_data *) user_data;
fd79ecee 119
6e17c565 120 if (data->property_name == "blocksize")
fd79ecee 121 {
a664f67e 122 mem_region &r = data->memory_map->back ();
fd79ecee 123
a664f67e 124 r.attrib.blocksize = gdb_xml_parse_ulongest (parser, body_text);
e776119f
DJ
125 }
126 else
6e17c565
SM
127 gdb_xml_debug (parser, _("Unknown property \"%s\""),
128 data->property_name.c_str ());
fd79ecee
DJ
129}
130
e776119f
DJ
131/* The allowed elements and attributes for an XML memory map. */
132
133const struct gdb_xml_attribute property_attributes[] = {
134 { "name", GDB_XML_AF_NONE, NULL, NULL },
135 { NULL, GDB_XML_AF_NONE, NULL, NULL }
136};
137
138const struct gdb_xml_element memory_children[] = {
139 { "property", property_attributes, NULL,
140 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
141 memory_map_start_property, memory_map_end_property },
142 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
143};
144
145const struct gdb_xml_enum memory_type_enum[] = {
146 { "ram", MEM_RW },
147 { "rom", MEM_RO },
148 { "flash", MEM_FLASH },
149 { NULL, 0 }
150};
151
152const struct gdb_xml_attribute memory_attributes[] = {
153 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
154 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
155 { "type", GDB_XML_AF_NONE, gdb_xml_parse_attr_enum, &memory_type_enum },
156 { NULL, GDB_XML_AF_NONE, NULL, NULL }
157};
158
159const struct gdb_xml_element memory_map_children[] = {
160 { "memory", memory_attributes, memory_children, GDB_XML_EF_REPEATABLE,
161 memory_map_start_memory, memory_map_end_memory },
162 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
163};
164
165const struct gdb_xml_element memory_map_elements[] = {
166 { "memory-map", NULL, memory_map_children, GDB_XML_EF_NONE,
167 NULL, NULL },
168 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
169};
170
a664f67e 171std::vector<mem_region>
fd79ecee
DJ
172parse_memory_map (const char *memory_map)
173{
a664f67e
SM
174 std::vector<mem_region> ret;
175 memory_map_parsing_data data (&ret);
fd79ecee 176
efc0eabd
PA
177 if (gdb_xml_parse_quick (_("target memory map"), NULL, memory_map_elements,
178 memory_map, &data) == 0)
179 {
180 /* Parsed successfully, keep the result. */
a664f67e 181 return ret;
efc0eabd 182 }
fd79ecee 183
a664f67e 184 return std::vector<mem_region> ();
fd79ecee
DJ
185}
186
187#endif /* HAVE_LIBEXPAT */
This page took 1.624428 seconds and 4 git commands to generate.