gdb/copyright.py: Do not forget to remind about MULTIPLE_COPYRIGHT_HEADERS
[deliverable/binutils-gdb.git] / gdb / xml-tdesc.c
CommitLineData
23181151
DJ
1/* XML target description support for GDB.
2
61baf725 3 Copyright (C) 2006-2017 Free Software Foundation, Inc.
23181151
DJ
4
5 Contributed by CodeSourcery.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
23181151
DJ
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23181151
DJ
21
22#include "defs.h"
23#include "target.h"
24#include "target-descriptions.h"
25#include "xml-support.h"
26#include "xml-tdesc.h"
08d16641 27#include "osabi.h"
108546a0 28#include "filenames.h"
bd8a901f
PA
29#include <unordered_map>
30#include <string>
108546a0 31
54157a25
DE
32/* Maximum sizes.
33 This is just to catch obviously wrong values. */
34#define MAX_FIELD_SIZE 65536
35#define MAX_FIELD_BITSIZE (MAX_FIELD_SIZE * TARGET_CHAR_BIT)
36#define MAX_VECTOR_SIZE 65536
37
23181151
DJ
38#if !defined(HAVE_LIBEXPAT)
39
40/* Parse DOCUMENT into a target description. Or don't, since we don't have
41 an XML parser. */
42
43static struct target_desc *
108546a0
DJ
44tdesc_parse_xml (const char *document, xml_fetch_another fetcher,
45 void *fetcher_baton)
23181151
DJ
46{
47 static int have_warned;
48
49 if (!have_warned)
50 {
51 have_warned = 1;
52 warning (_("Can not parse XML target description; XML support was "
53 "disabled at compile time"));
54 }
55
56 return NULL;
57}
58
59#else /* HAVE_LIBEXPAT */
60
fc6e0168
DJ
61/* A record of every XML description we have parsed. We never discard
62 old descriptions, because we never discard gdbarches. As long as we
63 have a gdbarch referencing this description, we want to have a copy
64 of it here, so that if we parse the same XML document again we can
65 return the same "struct target_desc *"; if they are not singletons,
66 then we will create unnecessary duplicate gdbarches. See
67 gdbarch_list_lookup_by_info. */
68
bd8a901f 69static std::unordered_map<std::string, target_desc *> xml_cache;
fc6e0168 70
23181151
DJ
71/* Callback data for target description parsing. */
72
73struct tdesc_parsing_data
74{
75 /* The target description we are building. */
76 struct target_desc *tdesc;
123dc839
DJ
77
78 /* The target feature we are currently parsing, or last parsed. */
79 struct tdesc_feature *current_feature;
80
81 /* The register number to use for the next register we see, if
82 it does not have its own. This starts at zero. */
83 int next_regnum;
84
f5dff777 85 /* The struct or union we are currently parsing, or last parsed. */
d4a0e8b5 86 tdesc_type_with_fields *current_type;
f5dff777 87
81516450
DE
88 /* The byte size of the current struct/flags type, if specified. Zero
89 if not specified. Flags values must specify a size. */
f5dff777 90 int current_type_size;
23181151
DJ
91};
92
93/* Handle the end of an <architecture> element and its value. */
94
95static void
96tdesc_end_arch (struct gdb_xml_parser *parser,
97 const struct gdb_xml_element *element,
98 void *user_data, const char *body_text)
99{
19ba03f4 100 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
23181151
DJ
101 const struct bfd_arch_info *arch;
102
103 arch = bfd_scan_arch (body_text);
104 if (arch == NULL)
105 gdb_xml_error (parser, _("Target description specified unknown "
106 "architecture \"%s\""), body_text);
107 set_tdesc_architecture (data->tdesc, arch);
108}
109
08d16641
PA
110/* Handle the end of an <osabi> element and its value. */
111
112static void
113tdesc_end_osabi (struct gdb_xml_parser *parser,
114 const struct gdb_xml_element *element,
115 void *user_data, const char *body_text)
116{
19ba03f4 117 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
08d16641
PA
118 enum gdb_osabi osabi;
119
120 osabi = osabi_from_tdesc_string (body_text);
121 if (osabi == GDB_OSABI_UNKNOWN)
122 warning (_("Target description specified unknown osabi \"%s\""),
123 body_text);
124 else
125 set_tdesc_osabi (data->tdesc, osabi);
126}
127
e35359c5
UW
128/* Handle the end of a <compatible> element and its value. */
129
130static void
131tdesc_end_compatible (struct gdb_xml_parser *parser,
132 const struct gdb_xml_element *element,
133 void *user_data, const char *body_text)
134{
19ba03f4 135 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
e35359c5
UW
136 const struct bfd_arch_info *arch;
137
138 arch = bfd_scan_arch (body_text);
139 tdesc_add_compatible (data->tdesc, arch);
140}
141
1780a0ed
DJ
142/* Handle the start of a <target> element. */
143
144static void
145tdesc_start_target (struct gdb_xml_parser *parser,
146 const struct gdb_xml_element *element,
147 void *user_data, VEC(gdb_xml_value_s) *attributes)
148{
19ba03f4 149 char *version = (char *) xml_find_attribute (attributes, "version")->value;
1780a0ed
DJ
150
151 if (strcmp (version, "1.0") != 0)
152 gdb_xml_error (parser,
153 _("Target description has unsupported version \"%s\""),
154 version);
155}
156
123dc839
DJ
157/* Handle the start of a <feature> element. */
158
159static void
160tdesc_start_feature (struct gdb_xml_parser *parser,
161 const struct gdb_xml_element *element,
162 void *user_data, VEC(gdb_xml_value_s) *attributes)
163{
19ba03f4
SM
164 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
165 char *name = (char *) xml_find_attribute (attributes, "name")->value;
123dc839
DJ
166
167 data->current_feature = tdesc_create_feature (data->tdesc, name);
168}
169
170/* Handle the start of a <reg> element. Fill in the optional
171 attributes and attach it to the containing feature. */
172
173static void
174tdesc_start_reg (struct gdb_xml_parser *parser,
175 const struct gdb_xml_element *element,
176 void *user_data, VEC(gdb_xml_value_s) *attributes)
177{
19ba03f4 178 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
123dc839
DJ
179 struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes);
180 int ix = 0, length;
a121b7c1
PA
181 char *name, *group;
182 const char *type;
123dc839
DJ
183 int bitsize, regnum, save_restore;
184
185 length = VEC_length (gdb_xml_value_s, attributes);
186
19ba03f4 187 name = (char *) attrs[ix++].value;
123dc839
DJ
188 bitsize = * (ULONGEST *) attrs[ix++].value;
189
190 if (ix < length && strcmp (attrs[ix].name, "regnum") == 0)
191 regnum = * (ULONGEST *) attrs[ix++].value;
192 else
193 regnum = data->next_regnum;
194
195 if (ix < length && strcmp (attrs[ix].name, "type") == 0)
19ba03f4 196 type = (char *) attrs[ix++].value;
123dc839
DJ
197 else
198 type = "int";
199
200 if (ix < length && strcmp (attrs[ix].name, "group") == 0)
19ba03f4 201 group = (char *) attrs[ix++].value;
123dc839
DJ
202 else
203 group = NULL;
204
205 if (ix < length && strcmp (attrs[ix].name, "save-restore") == 0)
206 save_restore = * (ULONGEST *) attrs[ix++].value;
207 else
208 save_restore = 1;
209
210 if (strcmp (type, "int") != 0
211 && strcmp (type, "float") != 0
212 && tdesc_named_type (data->current_feature, type) == NULL)
213 gdb_xml_error (parser, _("Register \"%s\" has unknown type \"%s\""),
214 name, type);
215
216 tdesc_create_reg (data->current_feature, name, regnum, save_restore, group,
217 bitsize, type);
218
219 data->next_regnum = regnum + 1;
220}
221
222/* Handle the start of a <union> element. Initialize the type and
223 record it with the current feature. */
224
225static void
226tdesc_start_union (struct gdb_xml_parser *parser,
227 const struct gdb_xml_element *element,
228 void *user_data, VEC(gdb_xml_value_s) *attributes)
229{
19ba03f4
SM
230 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
231 char *id = (char *) xml_find_attribute (attributes, "id")->value;
123dc839 232
f5dff777
DJ
233 data->current_type = tdesc_create_union (data->current_feature, id);
234 data->current_type_size = 0;
f5dff777
DJ
235}
236
237/* Handle the start of a <struct> element. Initialize the type and
238 record it with the current feature. */
239
240static void
241tdesc_start_struct (struct gdb_xml_parser *parser,
242 const struct gdb_xml_element *element,
243 void *user_data, VEC(gdb_xml_value_s) *attributes)
244{
19ba03f4
SM
245 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
246 char *id = (char *) xml_find_attribute (attributes, "id")->value;
3d2c1d41 247 struct gdb_xml_value *attr;
f5dff777 248
d4a0e8b5
SM
249 tdesc_type_with_fields *type_with_fields
250 = tdesc_create_struct (data->current_feature, id);
251 data->current_type = type_with_fields;
f5dff777 252 data->current_type_size = 0;
f5dff777 253
3d2c1d41
PA
254 attr = xml_find_attribute (attributes, "size");
255 if (attr != NULL)
f5dff777 256 {
54157a25 257 ULONGEST size = * (ULONGEST *) attr->value;
a109c7c1 258
54157a25
DE
259 if (size > MAX_FIELD_SIZE)
260 {
261 gdb_xml_error (parser,
262 _("Struct size %s is larger than maximum (%d)"),
263 pulongest (size), MAX_FIELD_SIZE);
264 }
d4a0e8b5 265 tdesc_set_struct_size (type_with_fields, size);
f5dff777
DJ
266 data->current_type_size = size;
267 }
268}
269
270static void
271tdesc_start_flags (struct gdb_xml_parser *parser,
272 const struct gdb_xml_element *element,
273 void *user_data, VEC(gdb_xml_value_s) *attributes)
274{
19ba03f4
SM
275 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
276 char *id = (char *) xml_find_attribute (attributes, "id")->value;
54157a25 277 ULONGEST size = * (ULONGEST *)
3d2c1d41 278 xml_find_attribute (attributes, "size")->value;
f5dff777 279
54157a25
DE
280 if (size > MAX_FIELD_SIZE)
281 {
282 gdb_xml_error (parser,
283 _("Flags size %s is larger than maximum (%d)"),
284 pulongest (size), MAX_FIELD_SIZE);
285 }
f5dff777 286
d4a0e8b5 287 data->current_type = tdesc_create_flags (data->current_feature, id, size);
81516450
DE
288 data->current_type_size = size;
289}
290
291static void
292tdesc_start_enum (struct gdb_xml_parser *parser,
293 const struct gdb_xml_element *element,
294 void *user_data, VEC(gdb_xml_value_s) *attributes)
295{
bfeeb14b
DE
296 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
297 char *id = (char *) xml_find_attribute (attributes, "id")->value;
81516450
DE
298 int size = * (ULONGEST *)
299 xml_find_attribute (attributes, "size")->value;
81516450
DE
300
301 if (size > MAX_FIELD_SIZE)
302 {
303 gdb_xml_error (parser,
304 _("Enum size %s is larger than maximum (%d)"),
305 pulongest (size), MAX_FIELD_SIZE);
306 }
81516450 307
d4a0e8b5 308 data->current_type = tdesc_create_enum (data->current_feature, id, size);
f5dff777 309 data->current_type_size = 0;
123dc839
DJ
310}
311
312/* Handle the start of a <field> element. Attach the field to the
81516450 313 current struct, union or flags. */
123dc839
DJ
314
315static void
316tdesc_start_field (struct gdb_xml_parser *parser,
317 const struct gdb_xml_element *element,
318 void *user_data, VEC(gdb_xml_value_s) *attributes)
319{
19ba03f4 320 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
3d2c1d41 321 struct gdb_xml_value *attr;
ad068eab 322 struct tdesc_type *field_type;
123dc839 323 char *field_name, *field_type_id;
f5dff777 324 int start, end;
123dc839 325
19ba03f4 326 field_name = (char *) xml_find_attribute (attributes, "name")->value;
123dc839 327
3d2c1d41
PA
328 attr = xml_find_attribute (attributes, "type");
329 if (attr != NULL)
81516450
DE
330 {
331 field_type_id = (char *) attr->value;
332 field_type = tdesc_named_type (data->current_feature, field_type_id);
333 }
f5dff777 334 else
81516450
DE
335 {
336 field_type_id = NULL;
337 field_type = NULL;
338 }
f5dff777 339
3d2c1d41
PA
340 attr = xml_find_attribute (attributes, "start");
341 if (attr != NULL)
54157a25
DE
342 {
343 ULONGEST ul_start = * (ULONGEST *) attr->value;
344
345 if (ul_start > MAX_FIELD_BITSIZE)
346 {
347 gdb_xml_error (parser,
348 _("Field start %s is larger than maximum (%d)"),
349 pulongest (ul_start), MAX_FIELD_BITSIZE);
350 }
351 start = ul_start;
352 }
f5dff777
DJ
353 else
354 start = -1;
355
3d2c1d41
PA
356 attr = xml_find_attribute (attributes, "end");
357 if (attr != NULL)
54157a25
DE
358 {
359 ULONGEST ul_end = * (ULONGEST *) attr->value;
360
361 if (ul_end > MAX_FIELD_BITSIZE)
362 {
363 gdb_xml_error (parser,
364 _("Field end %s is larger than maximum (%d)"),
365 pulongest (ul_end), MAX_FIELD_BITSIZE);
366 }
367 end = ul_end;
368 }
f5dff777
DJ
369 else
370 end = -1;
371
81516450 372 if (start != -1)
f5dff777 373 {
d4a0e8b5 374 tdesc_type_with_fields *t = data->current_type;
f5dff777 375
ee8da4b8
DE
376 /* Older versions of gdb can't handle elided end values.
377 Stick with that for now, to help ensure backward compatibility.
378 E.g., If a newer gdbserver is talking to an older gdb. */
379 if (end == -1)
380 gdb_xml_error (parser, _("Missing end value"));
381
81516450
DE
382 if (data->current_type_size == 0)
383 gdb_xml_error (parser,
384 _("Bitfields must live in explicitly sized types"));
385
386 if (field_type_id != NULL
387 && strcmp (field_type_id, "bool") == 0
ee8da4b8 388 && start != end)
f5dff777 389 {
81516450
DE
390 gdb_xml_error (parser,
391 _("Boolean fields must be one bit in size"));
392 }
f5dff777 393
81516450
DE
394 if (end >= 64)
395 gdb_xml_error (parser,
396 _("Bitfield \"%s\" goes past "
397 "64 bits (unsupported)"),
398 field_name);
f5dff777 399
ee8da4b8
DE
400 /* Assume that the bit numbering in XML is "lsb-zero". Most
401 architectures other than PowerPC use this ordering. In the
402 future, we can add an XML tag to indicate "msb-zero" numbering. */
403 if (start > end)
404 gdb_xml_error (parser, _("Bitfield \"%s\" has start after end"),
405 field_name);
406 if (end >= data->current_type_size * TARGET_CHAR_BIT)
21047726
PA
407 gdb_xml_error (parser, _("Bitfield \"%s\" does not fit in struct"),
408 field_name);
f5dff777 409
ee8da4b8 410 if (field_type != NULL)
81516450 411 tdesc_add_typed_bitfield (t, field_name, start, end, field_type);
ee8da4b8
DE
412 else if (start == end)
413 tdesc_add_flag (t, start, field_name);
81516450
DE
414 else
415 tdesc_add_bitfield (t, field_name, start, end);
416 }
417 else if (start == -1 && end != -1)
418 gdb_xml_error (parser, _("End specified but not start"));
419 else if (field_type_id != NULL)
420 {
421 /* TDESC_TYPE_FLAGS values are explicitly sized, so the following test
422 catches adding non-bitfield types to flags as well. */
423 if (data->current_type_size != 0)
424 gdb_xml_error (parser,
425 _("Explicitly sized type cannot "
426 "contain non-bitfield \"%s\""),
427 field_name);
428
429 if (field_type == NULL)
430 gdb_xml_error (parser, _("Field \"%s\" references undefined "
431 "type \"%s\""),
432 field_name, field_type_id);
433
434 tdesc_add_field (data->current_type, field_name, field_type);
f5dff777
DJ
435 }
436 else
437 gdb_xml_error (parser, _("Field \"%s\" has neither type nor bit position"),
438 field_name);
123dc839
DJ
439}
440
81516450
DE
441/* Handle the start of an <evalue> element. Attach the value to the
442 current enum. */
443
444static void
445tdesc_start_enum_value (struct gdb_xml_parser *parser,
446 const struct gdb_xml_element *element,
447 void *user_data, VEC(gdb_xml_value_s) *attributes)
448{
449 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
450 struct gdb_xml_value *attr;
451 char *field_name;
452 ULONGEST ul_value;
453 int value;
454
455 field_name = (char *) xml_find_attribute (attributes, "name")->value;
456
457 attr = xml_find_attribute (attributes, "value");
458 ul_value = * (ULONGEST *) attr->value;
459 if (ul_value > INT_MAX)
460 {
461 gdb_xml_error (parser,
462 _("Enum value %s is larger than maximum (%d)"),
463 pulongest (ul_value), INT_MAX);
464 }
465 value = ul_value;
466
467 tdesc_add_enum_value (data->current_type, value, field_name);
468}
469
123dc839
DJ
470/* Handle the start of a <vector> element. Initialize the type and
471 record it with the current feature. */
472
473static void
474tdesc_start_vector (struct gdb_xml_parser *parser,
475 const struct gdb_xml_element *element,
476 void *user_data, VEC(gdb_xml_value_s) *attributes)
477{
19ba03f4 478 struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data;
123dc839 479 struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes);
ad068eab 480 struct tdesc_type *field_type;
123dc839 481 char *id, *field_type_id;
54157a25 482 ULONGEST count;
123dc839 483
19ba03f4
SM
484 id = (char *) attrs[0].value;
485 field_type_id = (char *) attrs[1].value;
123dc839
DJ
486 count = * (ULONGEST *) attrs[2].value;
487
54157a25
DE
488 if (count > MAX_VECTOR_SIZE)
489 {
490 gdb_xml_error (parser,
491 _("Vector size %s is larger than maximum (%d)"),
492 pulongest (count), MAX_VECTOR_SIZE);
493 }
494
123dc839
DJ
495 field_type = tdesc_named_type (data->current_feature, field_type_id);
496 if (field_type == NULL)
497 gdb_xml_error (parser, _("Vector \"%s\" references undefined type \"%s\""),
498 id, field_type_id);
499
ad068eab 500 tdesc_create_vector (data->current_feature, id, field_type, count);
123dc839
DJ
501}
502
23181151
DJ
503/* The elements and attributes of an XML target description. */
504
123dc839
DJ
505static const struct gdb_xml_attribute field_attributes[] = {
506 { "name", GDB_XML_AF_NONE, NULL, NULL },
f5dff777
DJ
507 { "type", GDB_XML_AF_OPTIONAL, NULL, NULL },
508 { "start", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
509 { "end", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
123dc839
DJ
510 { NULL, GDB_XML_AF_NONE, NULL, NULL }
511};
512
81516450
DE
513static const struct gdb_xml_attribute enum_value_attributes[] = {
514 { "name", GDB_XML_AF_NONE, NULL, NULL },
515 { "value", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
516 { NULL, GDB_XML_AF_NONE, NULL, NULL }
517};
518
f5dff777 519static const struct gdb_xml_element struct_union_children[] = {
123dc839
DJ
520 { "field", field_attributes, NULL, GDB_XML_EF_REPEATABLE,
521 tdesc_start_field, NULL },
522 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
523};
524
81516450
DE
525static const struct gdb_xml_element enum_children[] = {
526 { "evalue", enum_value_attributes, NULL, GDB_XML_EF_REPEATABLE,
527 tdesc_start_enum_value, NULL },
528 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
529};
530
123dc839
DJ
531static const struct gdb_xml_attribute reg_attributes[] = {
532 { "name", GDB_XML_AF_NONE, NULL, NULL },
533 { "bitsize", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
534 { "regnum", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
535 { "type", GDB_XML_AF_OPTIONAL, NULL, NULL },
536 { "group", GDB_XML_AF_OPTIONAL, NULL, NULL },
537 { "save-restore", GDB_XML_AF_OPTIONAL,
538 gdb_xml_parse_attr_enum, gdb_xml_enums_boolean },
539 { NULL, GDB_XML_AF_NONE, NULL, NULL }
540};
541
f5dff777 542static const struct gdb_xml_attribute struct_union_attributes[] = {
123dc839 543 { "id", GDB_XML_AF_NONE, NULL, NULL },
f5dff777
DJ
544 { "size", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL},
545 { NULL, GDB_XML_AF_NONE, NULL, NULL }
546};
547
548static const struct gdb_xml_attribute flags_attributes[] = {
549 { "id", GDB_XML_AF_NONE, NULL, NULL },
550 { "size", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL},
123dc839
DJ
551 { NULL, GDB_XML_AF_NONE, NULL, NULL }
552};
553
81516450
DE
554static const struct gdb_xml_attribute enum_attributes[] = {
555 { "id", GDB_XML_AF_NONE, NULL, NULL },
556 { "size", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL},
557 { NULL, GDB_XML_AF_NONE, NULL, NULL }
558};
559
123dc839
DJ
560static const struct gdb_xml_attribute vector_attributes[] = {
561 { "id", GDB_XML_AF_NONE, NULL, NULL },
562 { "type", GDB_XML_AF_NONE, NULL, NULL },
563 { "count", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
564 { NULL, GDB_XML_AF_NONE, NULL, NULL }
565};
566
567static const struct gdb_xml_attribute feature_attributes[] = {
568 { "name", GDB_XML_AF_NONE, NULL, NULL },
569 { NULL, GDB_XML_AF_NONE, NULL, NULL }
570};
571
572static const struct gdb_xml_element feature_children[] = {
573 { "reg", reg_attributes, NULL,
574 GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
575 tdesc_start_reg, NULL },
f5dff777
DJ
576 { "struct", struct_union_attributes, struct_union_children,
577 GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
578 tdesc_start_struct, NULL },
579 { "union", struct_union_attributes, struct_union_children,
123dc839 580 GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
ad068eab 581 tdesc_start_union, NULL },
f5dff777
DJ
582 { "flags", flags_attributes, struct_union_children,
583 GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
584 tdesc_start_flags, NULL },
81516450
DE
585 { "enum", enum_attributes, enum_children,
586 GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
587 tdesc_start_enum, NULL },
123dc839
DJ
588 { "vector", vector_attributes, NULL,
589 GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
590 tdesc_start_vector, NULL },
591 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
592};
593
1780a0ed
DJ
594static const struct gdb_xml_attribute target_attributes[] = {
595 { "version", GDB_XML_AF_NONE, NULL, NULL },
596 { NULL, GDB_XML_AF_NONE, NULL, NULL }
597};
598
123dc839 599static const struct gdb_xml_element target_children[] = {
23181151
DJ
600 { "architecture", NULL, NULL, GDB_XML_EF_OPTIONAL,
601 NULL, tdesc_end_arch },
08d16641
PA
602 { "osabi", NULL, NULL, GDB_XML_EF_OPTIONAL,
603 NULL, tdesc_end_osabi },
e35359c5
UW
604 { "compatible", NULL, NULL, GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
605 NULL, tdesc_end_compatible },
123dc839
DJ
606 { "feature", feature_attributes, feature_children,
607 GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
608 tdesc_start_feature, NULL },
23181151
DJ
609 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
610};
611
123dc839 612static const struct gdb_xml_element tdesc_elements[] = {
1780a0ed
DJ
613 { "target", target_attributes, target_children, GDB_XML_EF_NONE,
614 tdesc_start_target, NULL },
23181151
DJ
615 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
616};
617
618/* Parse DOCUMENT into a target description and return it. */
619
620static struct target_desc *
108546a0
DJ
621tdesc_parse_xml (const char *document, xml_fetch_another fetcher,
622 void *fetcher_baton)
23181151 623{
23181151
DJ
624 struct tdesc_parsing_data data;
625
108546a0 626 /* Expand all XInclude directives. */
bd8a901f
PA
627 std::string expanded_text;
628
629 if (!xml_process_xincludes (expanded_text,
630 _("target description"),
631 document, fetcher, fetcher_baton, 0))
108546a0
DJ
632 {
633 warning (_("Could not load XML target description; ignoring"));
634 return NULL;
635 }
23181151 636
fc6e0168 637 /* Check for an exact match in the list of descriptions we have
bd8a901f
PA
638 previously parsed. */
639 const auto it = xml_cache.find (expanded_text);
640 if (it != xml_cache.end ())
641 return it->second;
23181151 642
108546a0 643 memset (&data, 0, sizeof (struct tdesc_parsing_data));
23181151 644 data.tdesc = allocate_target_description ();
bd8a901f
PA
645 struct cleanup *result_cleanup
646 = make_cleanup_free_target_description (data.tdesc);
23181151 647
efc0eabd 648 if (gdb_xml_parse_quick (_("target description"), "gdb-target.dtd",
bd8a901f 649 tdesc_elements, expanded_text.c_str (), &data) == 0)
23181151
DJ
650 {
651 /* Parsed successfully. */
bd8a901f 652 xml_cache.emplace (std::move (expanded_text), data.tdesc);
23181151 653 discard_cleanups (result_cleanup);
23181151
DJ
654 return data.tdesc;
655 }
656 else
657 {
658 warning (_("Could not load XML target description; ignoring"));
bd8a901f 659 do_cleanups (result_cleanup);
23181151
DJ
660 return NULL;
661 }
662}
23181151
DJ
663#endif /* HAVE_LIBEXPAT */
664\f
665
23181151
DJ
666/* Read an XML target description from FILENAME. Parse it, and return
667 the parsed description. */
668
669const struct target_desc *
670file_read_description_xml (const char *filename)
671{
b7b030ad
TT
672 gdb::unique_xmalloc_ptr<char> tdesc_str
673 = xml_fetch_content_from_file (filename, NULL);
23181151 674 if (tdesc_str == NULL)
108546a0
DJ
675 {
676 warning (_("Could not open \"%s\""), filename);
677 return NULL;
678 }
23181151 679
b7b030ad
TT
680 return tdesc_parse_xml (tdesc_str.get (), xml_fetch_content_from_file,
681 (void *) ldirname (filename).c_str ());
23181151
DJ
682}
683
108546a0
DJ
684/* Read a string representation of available features from the target,
685 using TARGET_OBJECT_AVAILABLE_FEATURES. The returned string is
686 malloc allocated and NUL-terminated. NAME should be a non-NULL
687 string identifying the XML document we want; the top level document
688 is "target.xml". Other calls may be performed for the DTD or
689 for <xi:include>. */
690
b7b030ad 691static gdb::unique_xmalloc_ptr<char>
108546a0
DJ
692fetch_available_features_from_target (const char *name, void *baton_)
693{
19ba03f4 694 struct target_ops *ops = (struct target_ops *) baton_;
108546a0
DJ
695
696 /* Read this object as a string. This ensures that a NUL
697 terminator is added. */
698 return target_read_stralloc (ops,
699 TARGET_OBJECT_AVAILABLE_FEATURES,
700 name);
701}
702\f
703
23181151
DJ
704/* Read an XML target description using OPS. Parse it, and return the
705 parsed description. */
706
707const struct target_desc *
708target_read_description_xml (struct target_ops *ops)
709{
b7b030ad
TT
710 gdb::unique_xmalloc_ptr<char> tdesc_str
711 = fetch_available_features_from_target ("target.xml", ops);
23181151
DJ
712 if (tdesc_str == NULL)
713 return NULL;
714
b7b030ad
TT
715 return tdesc_parse_xml (tdesc_str.get (),
716 fetch_available_features_from_target,
717 ops);
23181151 718}
18d3cec5
MK
719
720/* Fetches an XML target description using OPS, processing
721 includes, but not parsing it. Used to dump whole tdesc
722 as a single XML file. */
723
bd8a901f 724gdb::optional<std::string>
18d3cec5
MK
725target_fetch_description_xml (struct target_ops *ops)
726{
d21b5f15
MK
727#if !defined(HAVE_LIBEXPAT)
728 static int have_warned;
729
730 if (!have_warned)
731 {
732 have_warned = 1;
733 warning (_("Can not fetch XML target description; XML support was "
734 "disabled at compile time"));
735 }
736
bd8a901f 737 return {};
d21b5f15 738#else
bd8a901f 739 gdb::unique_xmalloc_ptr<char>
b7b030ad 740 tdesc_str = fetch_available_features_from_target ("target.xml", ops);
18d3cec5 741 if (tdesc_str == NULL)
bd8a901f 742 return {};
18d3cec5 743
bd8a901f
PA
744 std::string output;
745 if (!xml_process_xincludes (output,
746 _("target description"),
747 tdesc_str.get (),
748 fetch_available_features_from_target, ops, 0))
18d3cec5
MK
749 {
750 warning (_("Could not load XML target description; ignoring"));
bd8a901f 751 return {};
18d3cec5 752 }
bd8a901f 753 return output;
d21b5f15 754#endif
18d3cec5 755}
This page took 1.323912 seconds and 4 git commands to generate.