sim: Add bfd include path for common testsuite tools
[deliverable/binutils-gdb.git] / gdb / target-descriptions.c
CommitLineData
424163ea
DJ
1/* Target description support for GDB.
2
3666a048 3 Copyright (C) 2006-2021 Free Software Foundation, Inc.
424163ea
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
424163ea
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/>. */
424163ea
DJ
21
22#include "defs.h"
23#include "arch-utils.h"
23181151 24#include "gdbcmd.h"
123dc839
DJ
25#include "gdbtypes.h"
26#include "reggroups.h"
424163ea
DJ
27#include "target.h"
28#include "target-descriptions.h"
123dc839 29#include "xml-support.h"
23181151 30#include "xml-tdesc.h"
c3f08eb7 31#include "osabi.h"
424163ea 32
123dc839
DJ
33#include "gdb_obstack.h"
34#include "hashtab.h"
6ecd4729 35#include "inferior.h"
25aa13e5 36#include <algorithm>
27d41eac
YQ
37#include "completer.h"
38#include "readline/tilde.h" /* tilde_expand */
424163ea
DJ
39
40/* Types. */
41
129c10bc 42struct property
29709017 43{
129c10bc
SM
44 property (const std::string &key_, const std::string &value_)
45 : key (key_), value (value_)
46 {}
47
48 std::string key;
49 std::string value;
50};
29709017 51
b8df6ca7
AH
52/* Convert a tdesc_type to a gdb type. */
53
54static type *
55make_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *ttype)
56{
57 class gdb_type_creator : public tdesc_element_visitor
27d41eac 58 {
b8df6ca7
AH
59 public:
60 gdb_type_creator (struct gdbarch *gdbarch)
61 : m_gdbarch (gdbarch)
62 {}
d4a0e8b5 63
b8df6ca7
AH
64 type *get_type ()
65 {
66 return m_type;
67 }
d4a0e8b5 68
b8df6ca7
AH
69 void visit (const tdesc_type_builtin *e) override
70 {
71 switch (e->kind)
72 {
73 /* Predefined types. */
74 case TDESC_TYPE_BOOL:
75 m_type = builtin_type (m_gdbarch)->builtin_bool;
76 return;
77 case TDESC_TYPE_INT8:
78 m_type = builtin_type (m_gdbarch)->builtin_int8;
79 return;
80 case TDESC_TYPE_INT16:
81 m_type = builtin_type (m_gdbarch)->builtin_int16;
82 return;
83 case TDESC_TYPE_INT32:
84 m_type = builtin_type (m_gdbarch)->builtin_int32;
85 return;
86 case TDESC_TYPE_INT64:
87 m_type = builtin_type (m_gdbarch)->builtin_int64;
88 return;
89 case TDESC_TYPE_INT128:
90 m_type = builtin_type (m_gdbarch)->builtin_int128;
91 return;
92 case TDESC_TYPE_UINT8:
93 m_type = builtin_type (m_gdbarch)->builtin_uint8;
94 return;
95 case TDESC_TYPE_UINT16:
96 m_type = builtin_type (m_gdbarch)->builtin_uint16;
97 return;
98 case TDESC_TYPE_UINT32:
99 m_type = builtin_type (m_gdbarch)->builtin_uint32;
100 return;
101 case TDESC_TYPE_UINT64:
102 m_type = builtin_type (m_gdbarch)->builtin_uint64;
103 return;
104 case TDESC_TYPE_UINT128:
105 m_type = builtin_type (m_gdbarch)->builtin_uint128;
106 return;
107 case TDESC_TYPE_CODE_PTR:
108 m_type = builtin_type (m_gdbarch)->builtin_func_ptr;
109 return;
110 case TDESC_TYPE_DATA_PTR:
111 m_type = builtin_type (m_gdbarch)->builtin_data_ptr;
112 return;
113 }
d4a0e8b5 114
b8df6ca7
AH
115 m_type = tdesc_find_type (m_gdbarch, e->name.c_str ());
116 if (m_type != NULL)
117 return;
27d41eac 118
b8df6ca7
AH
119 switch (e->kind)
120 {
a6d0f249
AH
121 case TDESC_TYPE_IEEE_HALF:
122 m_type = arch_float_type (m_gdbarch, -1, "builtin_type_ieee_half",
123 floatformats_ieee_half);
124 return;
125
b8df6ca7
AH
126 case TDESC_TYPE_IEEE_SINGLE:
127 m_type = arch_float_type (m_gdbarch, -1, "builtin_type_ieee_single",
128 floatformats_ieee_single);
129 return;
130
131 case TDESC_TYPE_IEEE_DOUBLE:
132 m_type = arch_float_type (m_gdbarch, -1, "builtin_type_ieee_double",
133 floatformats_ieee_double);
134 return;
135 case TDESC_TYPE_ARM_FPA_EXT:
136 m_type = arch_float_type (m_gdbarch, -1, "builtin_type_arm_ext",
137 floatformats_arm_ext);
138 return;
139
140 case TDESC_TYPE_I387_EXT:
141 m_type = arch_float_type (m_gdbarch, -1, "builtin_type_i387_ext",
142 floatformats_i387_ext);
143 return;
2a67f09d
FW
144
145 case TDESC_TYPE_BFLOAT16:
146 m_type = arch_float_type (m_gdbarch, -1, "builtin_type_bfloat16",
147 floatformats_bfloat16);
148 return;
b8df6ca7 149 }
d4a0e8b5 150
b8df6ca7
AH
151 internal_error (__FILE__, __LINE__,
152 "Type \"%s\" has an unknown kind %d",
153 e->name.c_str (), e->kind);
154 }
d4a0e8b5 155
b8df6ca7
AH
156 void visit (const tdesc_type_vector *e) override
157 {
158 m_type = tdesc_find_type (m_gdbarch, e->name.c_str ());
159 if (m_type != NULL)
160 return;
161
162 type *element_gdb_type = make_gdb_type (m_gdbarch, e->element_type);
163 m_type = init_vector_type (element_gdb_type, e->count);
d0e39ea2 164 m_type->set_name (xstrdup (e->name.c_str ()));
b8df6ca7
AH
165 return;
166 }
53c934e9 167
b8df6ca7
AH
168 void visit (const tdesc_type_with_fields *e) override
169 {
170 m_type = tdesc_find_type (m_gdbarch, e->name.c_str ());
171 if (m_type != NULL)
172 return;
d4a0e8b5 173
b8df6ca7
AH
174 switch (e->kind)
175 {
176 case TDESC_TYPE_STRUCT:
177 make_gdb_type_struct (e);
178 return;
179 case TDESC_TYPE_UNION:
180 make_gdb_type_union (e);
181 return;
182 case TDESC_TYPE_FLAGS:
183 make_gdb_type_flags (e);
184 return;
185 case TDESC_TYPE_ENUM:
186 make_gdb_type_enum (e);
187 return;
188 }
d4a0e8b5 189
b8df6ca7
AH
190 internal_error (__FILE__, __LINE__,
191 "Type \"%s\" has an unknown kind %d",
192 e->name.c_str (), e->kind);
193 }
d4a0e8b5 194
b8df6ca7 195 private:
d4a0e8b5 196
b8df6ca7
AH
197 void make_gdb_type_struct (const tdesc_type_with_fields *e)
198 {
199 m_type = arch_composite_type (m_gdbarch, NULL, TYPE_CODE_STRUCT);
d0e39ea2 200 m_type->set_name (xstrdup (e->name.c_str ()));
d4a0e8b5 201
b8df6ca7
AH
202 for (const tdesc_type_field &f : e->fields)
203 {
204 if (f.start != -1 && f.end != -1)
205 {
206 /* Bitfield. */
207 struct field *fld;
208 struct type *field_gdb_type;
209 int bitsize, total_size;
210
211 /* This invariant should be preserved while creating types. */
212 gdb_assert (e->size != 0);
213 if (f.type != NULL)
214 field_gdb_type = make_gdb_type (m_gdbarch, f.type);
215 else if (e->size > 4)
216 field_gdb_type = builtin_type (m_gdbarch)->builtin_uint64;
217 else
218 field_gdb_type = builtin_type (m_gdbarch)->builtin_uint32;
219
220 fld = append_composite_type_field_raw
221 (m_type, xstrdup (f.name.c_str ()), field_gdb_type);
222
223 /* For little-endian, BITPOS counts from the LSB of
224 the structure and marks the LSB of the field. For
225 big-endian, BITPOS counts from the MSB of the
226 structure and marks the MSB of the field. Either
227 way, it is the number of bits to the "left" of the
228 field. To calculate this in big-endian, we need
229 the total size of the structure. */
230 bitsize = f.end - f.start + 1;
231 total_size = e->size * TARGET_CHAR_BIT;
d5a22e77 232 if (gdbarch_byte_order (m_gdbarch) == BFD_ENDIAN_BIG)
b8df6ca7
AH
233 SET_FIELD_BITPOS (fld[0], total_size - f.start - bitsize);
234 else
235 SET_FIELD_BITPOS (fld[0], f.start);
236 FIELD_BITSIZE (fld[0]) = bitsize;
237 }
238 else
239 {
240 gdb_assert (f.start == -1 && f.end == -1);
241 type *field_gdb_type = make_gdb_type (m_gdbarch, f.type);
242 append_composite_type_field (m_type,
d4a0e8b5 243 xstrdup (f.name.c_str ()),
b8df6ca7
AH
244 field_gdb_type);
245 }
246 }
d4a0e8b5 247
b8df6ca7
AH
248 if (e->size != 0)
249 TYPE_LENGTH (m_type) = e->size;
250 }
d4a0e8b5 251
b8df6ca7
AH
252 void make_gdb_type_union (const tdesc_type_with_fields *e)
253 {
254 m_type = arch_composite_type (m_gdbarch, NULL, TYPE_CODE_UNION);
d0e39ea2 255 m_type->set_name (xstrdup (e->name.c_str ()));
d4a0e8b5 256
b8df6ca7
AH
257 for (const tdesc_type_field &f : e->fields)
258 {
259 type* field_gdb_type = make_gdb_type (m_gdbarch, f.type);
260 append_composite_type_field (m_type, xstrdup (f.name.c_str ()),
261 field_gdb_type);
262
263 /* If any of the children of a union are vectors, flag the
264 union as a vector also. This allows e.g. a union of two
265 vector types to show up automatically in "info vector". */
bd63c870 266 if (field_gdb_type->is_vector ())
2062087b 267 m_type->set_is_vector (true);
b8df6ca7
AH
268 }
269 }
d4a0e8b5 270
b8df6ca7 271 void make_gdb_type_flags (const tdesc_type_with_fields *e)
d4a0e8b5 272 {
b8df6ca7
AH
273 m_type = arch_flags_type (m_gdbarch, e->name.c_str (),
274 e->size * TARGET_CHAR_BIT);
275
276 for (const tdesc_type_field &f : e->fields)
277 {
278 int bitsize = f.end - f.start + 1;
279
280 gdb_assert (f.type != NULL);
281 type *field_gdb_type = make_gdb_type (m_gdbarch, f.type);
282 append_flags_type_field (m_type, f.start, bitsize,
283 field_gdb_type, f.name.c_str ());
284 }
d4a0e8b5
SM
285 }
286
b8df6ca7
AH
287 void make_gdb_type_enum (const tdesc_type_with_fields *e)
288 {
289 m_type = arch_type (m_gdbarch, TYPE_CODE_ENUM, e->size * TARGET_CHAR_BIT,
290 e->name.c_str ());
d4a0e8b5 291
653223d3
SM
292 m_type->set_is_unsigned (true);
293
b8df6ca7
AH
294 for (const tdesc_type_field &f : e->fields)
295 {
296 struct field *fld
297 = append_composite_type_field_raw (m_type,
298 xstrdup (f.name.c_str ()),
299 NULL);
d4a0e8b5 300
b8df6ca7
AH
301 SET_FIELD_BITPOS (fld[0], f.start);
302 }
303 }
304
305 /* The gdbarch used. */
306 struct gdbarch *m_gdbarch;
307
308 /* The type created. */
309 type *m_type;
310 };
311
312 gdb_type_creator gdb_type (gdbarch);
313 ttype->accept (gdb_type);
314 return gdb_type.get_type ();
315}
123dc839 316
fbf42f4e
AB
317/* Wrapper around bfd_arch_info_type. A class with this name is used in
318 the API that is shared between gdb and gdbserver code, but gdbserver
319 doesn't use compatibility information, so its version of this class is
320 empty. */
321
322class tdesc_compatible_info
323{
324public:
325 /* Constructor. */
326 explicit tdesc_compatible_info (const bfd_arch_info_type *arch)
327 : m_arch (arch)
328 { /* Nothing. */ }
329
330 /* Access the contained pointer. */
331 const bfd_arch_info_type *arch () const
332 { return m_arch; }
333
334private:
335 /* Architecture information looked up from the <compatible> entity within
336 a target description. */
337 const bfd_arch_info_type *m_arch;
338};
339
123dc839
DJ
340/* A target description. */
341
6eb1e6a8 342struct target_desc : tdesc_element
424163ea 343{
b468ff4c
YQ
344 target_desc ()
345 {}
346
3eea796c 347 virtual ~target_desc () = default;
b468ff4c
YQ
348
349 target_desc (const target_desc &) = delete;
350 void operator= (const target_desc &) = delete;
351
23181151 352 /* The architecture reported by the target, if any. */
b468ff4c 353 const struct bfd_arch_info *arch = NULL;
23181151 354
08d16641
PA
355 /* The osabi reported by the target, if any; GDB_OSABI_UNKNOWN
356 otherwise. */
b468ff4c 357 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
08d16641 358
e35359c5 359 /* The list of compatible architectures reported by the target. */
fbf42f4e 360 std::vector<tdesc_compatible_info_up> compatible;
e35359c5 361
29709017 362 /* Any architecture-specific properties specified by the target. */
129c10bc 363 std::vector<property> properties;
123dc839
DJ
364
365 /* The features associated with this target. */
858c9d13 366 std::vector<tdesc_feature_up> features;
6eb1e6a8 367
e98577a9
AH
368 /* Used to cache the generated xml version of the target description. */
369 mutable char *xmltarget = nullptr;
370
6eb1e6a8
YQ
371 void accept (tdesc_element_visitor &v) const override
372 {
373 v.visit_pre (this);
374
3eea796c 375 for (const tdesc_feature_up &feature : features)
6eb1e6a8
YQ
376 feature->accept (v);
377
378 v.visit_post (this);
379 }
27d41eac
YQ
380
381 bool operator== (const target_desc &other) const
382 {
383 if (arch != other.arch)
384 return false;
385
386 if (osabi != other.osabi)
387 return false;
388
3eea796c 389 if (features.size () != other.features.size ())
27d41eac
YQ
390 return false;
391
3eea796c 392 for (int ix = 0; ix < features.size (); ix++)
27d41eac 393 {
3eea796c
SM
394 const tdesc_feature_up &feature1 = features[ix];
395 const tdesc_feature_up &feature2 = other.features[ix];
27d41eac 396
3eea796c 397 if (feature1 != feature2 && *feature1 != *feature2)
27d41eac
YQ
398 return false;
399 }
400
401 return true;
402 }
403
404 bool operator!= (const target_desc &other) const
405 {
406 return !(*this == other);
407 }
123dc839
DJ
408};
409
410/* Per-architecture data associated with a target description. The
411 target description may be shared by multiple architectures, but
412 this data is private to one gdbarch. */
413
f0cddbef 414struct tdesc_arch_reg
ad068eab 415{
f0cddbef
SM
416 tdesc_arch_reg (tdesc_reg *reg_, struct type *type_)
417 : reg (reg_), type (type_)
418 {}
419
ad068eab
UW
420 struct tdesc_reg *reg;
421 struct type *type;
f0cddbef 422};
ad068eab 423
123dc839
DJ
424struct tdesc_arch_data
425{
ad068eab 426 /* A list of register/type pairs, indexed by GDB's internal register number.
123dc839
DJ
427 During initialization of the gdbarch this list is used to store
428 registers which the architecture assigns a fixed register number.
429 Registers which are NULL in this array, or off the end, are
430 treated as zero-sized and nameless (i.e. placeholders in the
431 numbering). */
f0cddbef 432 std::vector<tdesc_arch_reg> arch_regs;
123dc839
DJ
433
434 /* Functions which report the register name, type, and reggroups for
435 pseudo-registers. */
f0cddbef
SM
436 gdbarch_register_name_ftype *pseudo_register_name = NULL;
437 gdbarch_register_type_ftype *pseudo_register_type = NULL;
438 gdbarch_register_reggroup_p_ftype *pseudo_register_reggroup_p = NULL;
424163ea
DJ
439};
440
6ecd4729
PA
441/* Info about an inferior's target description. There's one of these
442 for each inferior. */
424163ea 443
6ecd4729
PA
444struct target_desc_info
445{
446 /* A flag indicating that a description has already been fetched
447 from the target, so it should not be queried again. */
448
449 int fetched;
424163ea 450
6ecd4729
PA
451 /* The description fetched from the target, or NULL if the target
452 did not supply any description. Only valid when
453 target_desc_fetched is set. Only the description initialization
454 code should access this; normally, the description should be
455 accessed through the gdbarch object. */
424163ea 456
6ecd4729 457 const struct target_desc *tdesc;
424163ea 458
6ecd4729
PA
459 /* The filename to read a target description from, as set by "set
460 tdesc filename ..." */
424163ea 461
6ecd4729
PA
462 char *filename;
463};
23181151 464
6ecd4729
PA
465/* Get the inferior INF's target description info, allocating one on
466 the stop if necessary. */
23181151 467
6ecd4729
PA
468static struct target_desc_info *
469get_tdesc_info (struct inferior *inf)
470{
471 if (inf->tdesc_info == NULL)
472 inf->tdesc_info = XCNEW (struct target_desc_info);
473 return inf->tdesc_info;
474}
23181151 475
123dc839
DJ
476/* A handle for architecture-specific data associated with the
477 target description (see struct tdesc_arch_data). */
478
479static struct gdbarch_data *tdesc_data;
480
6ecd4729
PA
481/* See target-descriptions.h. */
482
483int
484target_desc_info_from_user_p (struct target_desc_info *info)
485{
486 return info != NULL && info->filename != NULL;
487}
488
489/* See target-descriptions.h. */
490
491void
492copy_inferior_target_desc_info (struct inferior *destinf, struct inferior *srcinf)
493{
494 struct target_desc_info *src = get_tdesc_info (srcinf);
495 struct target_desc_info *dest = get_tdesc_info (destinf);
496
497 dest->fetched = src->fetched;
498 dest->tdesc = src->tdesc;
499 dest->filename = src->filename != NULL ? xstrdup (src->filename) : NULL;
500}
501
502/* See target-descriptions.h. */
503
504void
505target_desc_info_free (struct target_desc_info *tdesc_info)
506{
507 if (tdesc_info != NULL)
508 {
509 xfree (tdesc_info->filename);
510 xfree (tdesc_info);
511 }
512}
513
514/* Convenience helper macros. */
515
516#define target_desc_fetched \
517 get_tdesc_info (current_inferior ())->fetched
518#define current_target_desc \
519 get_tdesc_info (current_inferior ())->tdesc
520#define target_description_filename \
521 get_tdesc_info (current_inferior ())->filename
522
523/* The string manipulated by the "set tdesc filename ..." command. */
524
525static char *tdesc_filename_cmd_string;
526
424163ea
DJ
527/* Fetch the current target's description, and switch the current
528 architecture to one which incorporates that description. */
529
530void
531target_find_description (void)
532{
533 /* If we've already fetched a description from the target, don't do
534 it again. This allows a target to fetch the description early,
535 during its to_open or to_create_inferior, if it needs extra
536 information about the target to initialize. */
537 if (target_desc_fetched)
538 return;
539
540 /* The current architecture should not have any target description
541 specified. It should have been cleared, e.g. when we
542 disconnected from the previous target. */
f5656ead 543 gdb_assert (gdbarch_target_desc (target_gdbarch ()) == NULL);
424163ea 544
23181151
DJ
545 /* First try to fetch an XML description from the user-specified
546 file. */
547 current_target_desc = NULL;
548 if (target_description_filename != NULL
549 && *target_description_filename != '\0')
550 current_target_desc
551 = file_read_description_xml (target_description_filename);
552
553 /* Next try to read the description from the current target using
554 target objects. */
555 if (current_target_desc == NULL)
328d42d8
SM
556 current_target_desc = target_read_description_xml
557 (current_inferior ()->top_target ());
23181151
DJ
558
559 /* If that failed try a target-specific hook. */
560 if (current_target_desc == NULL)
328d42d8
SM
561 current_target_desc = target_read_description
562 (current_inferior ()->top_target ());
424163ea
DJ
563
564 /* If a non-NULL description was returned, then update the current
565 architecture. */
566 if (current_target_desc)
567 {
568 struct gdbarch_info info;
569
570 gdbarch_info_init (&info);
571 info.target_desc = current_target_desc;
572 if (!gdbarch_update_p (info))
123dc839
DJ
573 warning (_("Architecture rejected target-supplied description"));
574 else
575 {
576 struct tdesc_arch_data *data;
577
19ba03f4
SM
578 data = ((struct tdesc_arch_data *)
579 gdbarch_data (target_gdbarch (), tdesc_data));
123dc839 580 if (tdesc_has_registers (current_target_desc)
f0cddbef 581 && data->arch_regs.empty ())
123dc839
DJ
582 warning (_("Target-supplied registers are not supported "
583 "by the current architecture"));
584 }
424163ea
DJ
585 }
586
587 /* Now that we know this description is usable, record that we
588 fetched it. */
589 target_desc_fetched = 1;
590}
591
592/* Discard any description fetched from the current target, and switch
593 the current architecture to one with no target description. */
594
595void
596target_clear_description (void)
597{
598 struct gdbarch_info info;
599
600 if (!target_desc_fetched)
601 return;
602
603 target_desc_fetched = 0;
604 current_target_desc = NULL;
605
606 gdbarch_info_init (&info);
607 if (!gdbarch_update_p (info))
608 internal_error (__FILE__, __LINE__,
609 _("Could not remove target-supplied description"));
610}
611
612/* Return the global current target description. This should only be
613 used by gdbarch initialization code; most access should be through
614 an existing gdbarch. */
615
616const struct target_desc *
617target_current_description (void)
618{
619 if (target_desc_fetched)
620 return current_target_desc;
621
622 return NULL;
623}
e35359c5
UW
624
625/* Return non-zero if this target description is compatible
626 with the given BFD architecture. */
627
628int
629tdesc_compatible_p (const struct target_desc *target_desc,
630 const struct bfd_arch_info *arch)
631{
fbf42f4e 632 for (const tdesc_compatible_info_up &compat : target_desc->compatible)
e35359c5 633 {
fbf42f4e
AB
634 if (compat->arch () == arch
635 || arch->compatible (arch, compat->arch ())
636 || compat->arch ()->compatible (compat->arch (), arch))
e35359c5
UW
637 return 1;
638 }
639
640 return 0;
641}
23181151
DJ
642\f
643
123dc839 644/* Direct accessors for target descriptions. */
424163ea 645
29709017
DJ
646/* Return the string value of a property named KEY, or NULL if the
647 property was not specified. */
648
649const char *
650tdesc_property (const struct target_desc *target_desc, const char *key)
651{
129c10bc
SM
652 for (const property &prop : target_desc->properties)
653 if (prop.key == key)
654 return prop.value.c_str ();
29709017
DJ
655
656 return NULL;
657}
658
23181151
DJ
659/* Return the BFD architecture associated with this target
660 description, or NULL if no architecture was specified. */
661
662const struct bfd_arch_info *
663tdesc_architecture (const struct target_desc *target_desc)
664{
665 return target_desc->arch;
666}
08d16641 667
268a13a5 668/* See gdbsupport/tdesc.h. */
d278f585
AH
669
670const char *
671tdesc_architecture_name (const struct target_desc *target_desc)
672{
caa7fd04
AB
673 if (target_desc->arch != NULL)
674 return target_desc->arch->printable_name;
675 return NULL;
d278f585
AH
676}
677
fbf42f4e
AB
678/* See gdbsupport/tdesc.h. */
679
680const std::vector<tdesc_compatible_info_up> &
681tdesc_compatible_info_list (const target_desc *target_desc)
682{
683 return target_desc->compatible;
684}
685
686/* See gdbsupport/tdesc.h. */
687
688const char *
689tdesc_compatible_info_arch_name (const tdesc_compatible_info_up &compatible)
690{
691 return compatible->arch ()->printable_name;
692}
693
08d16641
PA
694/* Return the OSABI associated with this target description, or
695 GDB_OSABI_UNKNOWN if no osabi was specified. */
696
697enum gdb_osabi
698tdesc_osabi (const struct target_desc *target_desc)
699{
700 return target_desc->osabi;
701}
702
268a13a5 703/* See gdbsupport/tdesc.h. */
d278f585
AH
704
705const char *
706tdesc_osabi_name (const struct target_desc *target_desc)
707{
708 enum gdb_osabi osabi = tdesc_osabi (target_desc);
709 if (osabi > GDB_OSABI_UNKNOWN && osabi < GDB_OSABI_INVALID)
710 return gdbarch_osabi_name (osabi);
711 return nullptr;
712}
23181151 713
123dc839
DJ
714/* Return 1 if this target description includes any registers. */
715
716int
717tdesc_has_registers (const struct target_desc *target_desc)
718{
123dc839
DJ
719 if (target_desc == NULL)
720 return 0;
721
3eea796c 722 for (const tdesc_feature_up &feature : target_desc->features)
c9c895b9 723 if (!feature->registers.empty ())
123dc839
DJ
724 return 1;
725
726 return 0;
727}
728
729/* Return the feature with the given name, if present, or NULL if
730 the named feature is not found. */
731
732const struct tdesc_feature *
733tdesc_find_feature (const struct target_desc *target_desc,
734 const char *name)
735{
3eea796c 736 for (const tdesc_feature_up &feature : target_desc->features)
f65ff9f9 737 if (feature->name == name)
3eea796c 738 return feature.get ();
123dc839
DJ
739
740 return NULL;
741}
742
743/* Return the name of FEATURE. */
744
745const char *
746tdesc_feature_name (const struct tdesc_feature *feature)
747{
f65ff9f9 748 return feature->name.c_str ();
123dc839
DJ
749}
750
9fd3625f
L
751/* Lookup type associated with ID. */
752
753struct type *
754tdesc_find_type (struct gdbarch *gdbarch, const char *id)
755{
f0cddbef
SM
756 tdesc_arch_data *data
757 = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data);
9fd3625f 758
f0cddbef 759 for (const tdesc_arch_reg &reg : data->arch_regs)
9fd3625f 760 {
f0cddbef
SM
761 if (reg.reg
762 && reg.reg->tdesc_type
763 && reg.type
764 && reg.reg->tdesc_type->name == id)
765 return reg.type;
9fd3625f
L
766 }
767
768 return NULL;
769}
770
123dc839
DJ
771/* Support for registers from target descriptions. */
772
773/* Construct the per-gdbarch data. */
774
775static void *
776tdesc_data_init (struct obstack *obstack)
777{
284a0e3c 778 return obstack_new<tdesc_arch_data> (obstack);
123dc839
DJ
779}
780
781/* Similar, but for the temporary copy used during architecture
782 initialization. */
783
c1e1314d 784tdesc_arch_data_up
123dc839
DJ
785tdesc_data_alloc (void)
786{
c1e1314d 787 return tdesc_arch_data_up (new tdesc_arch_data ());
123dc839
DJ
788}
789
c1e1314d 790/* See target-descriptions.h. */
123dc839
DJ
791
792void
c1e1314d 793tdesc_arch_data_deleter::operator() (struct tdesc_arch_data *data) const
123dc839 794{
f0cddbef 795 delete data;
123dc839
DJ
796}
797
798/* Search FEATURE for a register named NAME. */
799
7cc46491
DJ
800static struct tdesc_reg *
801tdesc_find_register_early (const struct tdesc_feature *feature,
802 const char *name)
123dc839 803{
c9c895b9 804 for (const tdesc_reg_up &reg : feature->registers)
a8142ee1 805 if (strcasecmp (reg->name.c_str (), name) == 0)
c9c895b9 806 return reg.get ();
123dc839 807
7cc46491
DJ
808 return NULL;
809}
810
811/* Search FEATURE for a register named NAME. Assign REGNO to it. */
812
813int
814tdesc_numbered_register (const struct tdesc_feature *feature,
815 struct tdesc_arch_data *data,
816 int regno, const char *name)
817{
818 struct tdesc_reg *reg = tdesc_find_register_early (feature, name);
819
820 if (reg == NULL)
821 return 0;
822
823 /* Make sure the vector includes a REGNO'th element. */
f0cddbef
SM
824 while (regno >= data->arch_regs.size ())
825 data->arch_regs.emplace_back (nullptr, nullptr);
826
827 data->arch_regs[regno] = tdesc_arch_reg (reg, NULL);
ad068eab 828
7cc46491 829 return 1;
123dc839
DJ
830}
831
58d6951d
DJ
832/* Search FEATURE for a register named NAME, but do not assign a fixed
833 register number to it. */
834
835int
836tdesc_unnumbered_register (const struct tdesc_feature *feature,
837 const char *name)
838{
839 struct tdesc_reg *reg = tdesc_find_register_early (feature, name);
840
841 if (reg == NULL)
842 return 0;
843
844 return 1;
845}
846
7cc46491
DJ
847/* Search FEATURE for a register whose name is in NAMES and assign
848 REGNO to it. */
123dc839
DJ
849
850int
851tdesc_numbered_register_choices (const struct tdesc_feature *feature,
852 struct tdesc_arch_data *data,
853 int regno, const char *const names[])
854{
855 int i;
856
857 for (i = 0; names[i] != NULL; i++)
858 if (tdesc_numbered_register (feature, data, regno, names[i]))
859 return 1;
860
861 return 0;
862}
863
7cc46491
DJ
864/* Search FEATURE for a register named NAME, and return its size in
865 bits. The register must exist. */
866
867int
12863263 868tdesc_register_bitsize (const struct tdesc_feature *feature, const char *name)
7cc46491
DJ
869{
870 struct tdesc_reg *reg = tdesc_find_register_early (feature, name);
871
872 gdb_assert (reg != NULL);
873 return reg->bitsize;
874}
875
123dc839
DJ
876/* Look up a register by its GDB internal register number. */
877
ad068eab
UW
878static struct tdesc_arch_reg *
879tdesc_find_arch_register (struct gdbarch *gdbarch, int regno)
123dc839 880{
123dc839
DJ
881 struct tdesc_arch_data *data;
882
19ba03f4 883 data = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data);
f0cddbef
SM
884 if (regno < data->arch_regs.size ())
885 return &data->arch_regs[regno];
123dc839
DJ
886 else
887 return NULL;
888}
889
ad068eab
UW
890static struct tdesc_reg *
891tdesc_find_register (struct gdbarch *gdbarch, int regno)
892{
893 struct tdesc_arch_reg *reg = tdesc_find_arch_register (gdbarch, regno);
5d502164 894
ad068eab
UW
895 return reg? reg->reg : NULL;
896}
897
f8b73d13
DJ
898/* Return the name of register REGNO, from the target description or
899 from an architecture-provided pseudo_register_name method. */
900
901const char *
d93859e2 902tdesc_register_name (struct gdbarch *gdbarch, int regno)
123dc839 903{
d93859e2
UW
904 struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno);
905 int num_regs = gdbarch_num_regs (gdbarch);
123dc839
DJ
906
907 if (reg != NULL)
a8142ee1 908 return reg->name.c_str ();
123dc839 909
f6efe3f8 910 if (regno >= num_regs && regno < gdbarch_num_cooked_regs (gdbarch))
123dc839 911 {
19ba03f4
SM
912 struct tdesc_arch_data *data
913 = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data);
5d502164 914
123dc839 915 gdb_assert (data->pseudo_register_name != NULL);
d93859e2 916 return data->pseudo_register_name (gdbarch, regno);
123dc839
DJ
917 }
918
919 return "";
920}
921
58d6951d 922struct type *
123dc839
DJ
923tdesc_register_type (struct gdbarch *gdbarch, int regno)
924{
ad068eab
UW
925 struct tdesc_arch_reg *arch_reg = tdesc_find_arch_register (gdbarch, regno);
926 struct tdesc_reg *reg = arch_reg? arch_reg->reg : NULL;
123dc839
DJ
927 int num_regs = gdbarch_num_regs (gdbarch);
928 int num_pseudo_regs = gdbarch_num_pseudo_regs (gdbarch);
929
930 if (reg == NULL && regno >= num_regs && regno < num_regs + num_pseudo_regs)
931 {
19ba03f4
SM
932 struct tdesc_arch_data *data
933 = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data);
5d502164 934
123dc839
DJ
935 gdb_assert (data->pseudo_register_type != NULL);
936 return data->pseudo_register_type (gdbarch, regno);
937 }
938
939 if (reg == NULL)
940 /* Return "int0_t", since "void" has a misleading size of one. */
df4df182 941 return builtin_type (gdbarch)->builtin_int0;
123dc839 942
ad068eab 943 if (arch_reg->type == NULL)
123dc839 944 {
ad068eab
UW
945 /* First check for a predefined or target defined type. */
946 if (reg->tdesc_type)
b8df6ca7 947 arch_reg->type = make_gdb_type (gdbarch, reg->tdesc_type);
ad068eab
UW
948
949 /* Next try size-sensitive type shortcuts. */
a8142ee1 950 else if (reg->type == "float")
ad068eab
UW
951 {
952 if (reg->bitsize == gdbarch_float_bit (gdbarch))
953 arch_reg->type = builtin_type (gdbarch)->builtin_float;
954 else if (reg->bitsize == gdbarch_double_bit (gdbarch))
955 arch_reg->type = builtin_type (gdbarch)->builtin_double;
956 else if (reg->bitsize == gdbarch_long_double_bit (gdbarch))
957 arch_reg->type = builtin_type (gdbarch)->builtin_long_double;
958 else
959 {
960 warning (_("Register \"%s\" has an unsupported size (%d bits)"),
a8142ee1 961 reg->name.c_str (), reg->bitsize);
ad068eab
UW
962 arch_reg->type = builtin_type (gdbarch)->builtin_double;
963 }
964 }
a8142ee1 965 else if (reg->type == "int")
ad068eab
UW
966 {
967 if (reg->bitsize == gdbarch_long_bit (gdbarch))
968 arch_reg->type = builtin_type (gdbarch)->builtin_long;
969 else if (reg->bitsize == TARGET_CHAR_BIT)
970 arch_reg->type = builtin_type (gdbarch)->builtin_char;
971 else if (reg->bitsize == gdbarch_short_bit (gdbarch))
972 arch_reg->type = builtin_type (gdbarch)->builtin_short;
973 else if (reg->bitsize == gdbarch_int_bit (gdbarch))
974 arch_reg->type = builtin_type (gdbarch)->builtin_int;
975 else if (reg->bitsize == gdbarch_long_long_bit (gdbarch))
976 arch_reg->type = builtin_type (gdbarch)->builtin_long_long;
977 else if (reg->bitsize == gdbarch_ptr_bit (gdbarch))
c378eb4e 978 /* A bit desperate by this point... */
ad068eab
UW
979 arch_reg->type = builtin_type (gdbarch)->builtin_data_ptr;
980 else
981 {
982 warning (_("Register \"%s\" has an unsupported size (%d bits)"),
a8142ee1 983 reg->name.c_str (), reg->bitsize);
ad068eab
UW
984 arch_reg->type = builtin_type (gdbarch)->builtin_long;
985 }
986 }
987
988 if (arch_reg->type == NULL)
989 internal_error (__FILE__, __LINE__,
990 "Register \"%s\" has an unknown type \"%s\"",
a8142ee1 991 reg->name.c_str (), reg->type.c_str ());
123dc839 992 }
123dc839 993
ad068eab 994 return arch_reg->type;
123dc839
DJ
995}
996
997static int
998tdesc_remote_register_number (struct gdbarch *gdbarch, int regno)
999{
1000 struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno);
1001
1002 if (reg != NULL)
1003 return reg->target_regnum;
1004 else
1005 return -1;
1006}
1007
1008/* Check whether REGNUM is a member of REGGROUP. Registers from the
cef0f868
SH
1009 target description may be classified as general, float, vector or other
1010 register groups registered with reggroup_add(). Unlike a gdbarch
1011 register_reggroup_p method, this function will return -1 if it does not
1012 know; the caller should handle registers with no specified group.
1013
1014 The names of containing features are not used. This might be extended
1015 to display registers in some more useful groupings.
123dc839
DJ
1016
1017 The save-restore flag is also implemented here. */
1018
f8b73d13
DJ
1019int
1020tdesc_register_in_reggroup_p (struct gdbarch *gdbarch, int regno,
1021 struct reggroup *reggroup)
123dc839 1022{
123dc839
DJ
1023 struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno);
1024
440cf44e
LM
1025 if (reg != NULL && !reg->group.empty ()
1026 && (reg->group == reggroup_name (reggroup)))
cef0f868 1027 return 1;
123dc839 1028
440cf44e
LM
1029 if (reg != NULL
1030 && (reggroup == save_reggroup || reggroup == restore_reggroup))
1031 return reg->save_restore;
123dc839 1032
f8b73d13
DJ
1033 return -1;
1034}
1035
1036/* Check whether REGNUM is a member of REGGROUP. Registers with no
1037 group specified go to the default reggroup function and are handled
1038 by type. */
1039
1040static int
1041tdesc_register_reggroup_p (struct gdbarch *gdbarch, int regno,
1042 struct reggroup *reggroup)
1043{
1044 int num_regs = gdbarch_num_regs (gdbarch);
1045 int num_pseudo_regs = gdbarch_num_pseudo_regs (gdbarch);
1046 int ret;
1047
1048 if (regno >= num_regs && regno < num_regs + num_pseudo_regs)
1049 {
19ba03f4
SM
1050 struct tdesc_arch_data *data
1051 = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data);
5d502164 1052
58d6951d
DJ
1053 if (data->pseudo_register_reggroup_p != NULL)
1054 return data->pseudo_register_reggroup_p (gdbarch, regno, reggroup);
1055 /* Otherwise fall through to the default reggroup_p. */
f8b73d13
DJ
1056 }
1057
1058 ret = tdesc_register_in_reggroup_p (gdbarch, regno, reggroup);
1059 if (ret != -1)
1060 return ret;
1061
123dc839
DJ
1062 return default_register_reggroup_p (gdbarch, regno, reggroup);
1063}
1064
1065/* Record architecture-specific functions to call for pseudo-register
1066 support. */
1067
1068void
1069set_tdesc_pseudo_register_name (struct gdbarch *gdbarch,
1070 gdbarch_register_name_ftype *pseudo_name)
1071{
19ba03f4
SM
1072 struct tdesc_arch_data *data
1073 = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data);
123dc839
DJ
1074
1075 data->pseudo_register_name = pseudo_name;
1076}
1077
1078void
1079set_tdesc_pseudo_register_type (struct gdbarch *gdbarch,
1080 gdbarch_register_type_ftype *pseudo_type)
1081{
19ba03f4
SM
1082 struct tdesc_arch_data *data
1083 = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data);
123dc839
DJ
1084
1085 data->pseudo_register_type = pseudo_type;
1086}
1087
1088void
1089set_tdesc_pseudo_register_reggroup_p
1090 (struct gdbarch *gdbarch,
1091 gdbarch_register_reggroup_p_ftype *pseudo_reggroup_p)
1092{
19ba03f4
SM
1093 struct tdesc_arch_data *data
1094 = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data);
123dc839
DJ
1095
1096 data->pseudo_register_reggroup_p = pseudo_reggroup_p;
1097}
1098
1099/* Update GDBARCH to use the target description for registers. */
1100
1101void
1102tdesc_use_registers (struct gdbarch *gdbarch,
7cc46491 1103 const struct target_desc *target_desc,
c1e1314d 1104 tdesc_arch_data_up &&early_data,
be64fd07 1105 tdesc_unknown_register_ftype unk_reg_cb)
123dc839
DJ
1106{
1107 int num_regs = gdbarch_num_regs (gdbarch);
123dc839 1108 struct tdesc_arch_data *data;
123dc839 1109
123dc839
DJ
1110 /* We can't use the description for registers if it doesn't describe
1111 any. This function should only be called after validating
1112 registers, so the caller should know that registers are
1113 included. */
1114 gdb_assert (tdesc_has_registers (target_desc));
1115
19ba03f4 1116 data = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data);
c1e1314d 1117 data->arch_regs = std::move (early_data->arch_regs);
123dc839
DJ
1118
1119 /* Build up a set of all registers, so that we can assign register
1120 numbers where needed. The hash table expands as necessary, so
1121 the initial size is arbitrary. */
eb53f105
TT
1122 htab_up reg_hash (htab_create (37, htab_hash_pointer, htab_eq_pointer,
1123 NULL));
3eea796c 1124 for (const tdesc_feature_up &feature : target_desc->features)
c9c895b9 1125 for (const tdesc_reg_up &reg : feature->registers)
123dc839 1126 {
eb53f105 1127 void **slot = htab_find_slot (reg_hash.get (), reg.get (), INSERT);
123dc839 1128
c9c895b9 1129 *slot = reg.get ();
cef0f868
SH
1130 /* Add reggroup if its new. */
1131 if (!reg->group.empty ())
1132 if (reggroup_find (gdbarch, reg->group.c_str ()) == NULL)
1133 reggroup_add (gdbarch, reggroup_gdbarch_new (gdbarch,
1134 reg->group.c_str (),
1135 USER_REGGROUP));
123dc839
DJ
1136 }
1137
1138 /* Remove any registers which were assigned numbers by the
1139 architecture. */
f0cddbef
SM
1140 for (const tdesc_arch_reg &arch_reg : data->arch_regs)
1141 if (arch_reg.reg != NULL)
eb53f105 1142 htab_remove_elt (reg_hash.get (), arch_reg.reg);
123dc839
DJ
1143
1144 /* Assign numbers to the remaining registers and add them to the
f57d151a 1145 list of registers. The new numbers are always above gdbarch_num_regs.
123dc839
DJ
1146 Iterate over the features, not the hash table, so that the order
1147 matches that in the target description. */
1148
f0cddbef
SM
1149 gdb_assert (data->arch_regs.size () <= num_regs);
1150 while (data->arch_regs.size () < num_regs)
1151 data->arch_regs.emplace_back (nullptr, nullptr);
1152
be64fd07
AB
1153 /* First we give the target a chance to number previously unknown
1154 registers. This allows targets to record the numbers assigned based
1155 on which feature the register was from. */
1156 if (unk_reg_cb != NULL)
1157 {
1158 for (const tdesc_feature_up &feature : target_desc->features)
1159 for (const tdesc_reg_up &reg : feature->registers)
eb53f105 1160 if (htab_find (reg_hash.get (), reg.get ()) != NULL)
be64fd07
AB
1161 {
1162 int regno = unk_reg_cb (gdbarch, feature.get (),
1163 reg->name.c_str (), num_regs);
1164 gdb_assert (regno == -1 || regno >= num_regs);
1165 if (regno != -1)
1166 {
1167 while (regno >= data->arch_regs.size ())
1168 data->arch_regs.emplace_back (nullptr, nullptr);
1169 data->arch_regs[regno] = tdesc_arch_reg (reg.get (), NULL);
1170 num_regs = regno + 1;
eb53f105 1171 htab_remove_elt (reg_hash.get (), reg.get ());
be64fd07
AB
1172 }
1173 }
1174 }
1175
1176 /* Ensure the array was sized correctly above. */
1177 gdb_assert (data->arch_regs.size () == num_regs);
1178
1179 /* Now in a final pass we assign register numbers to any remaining
1180 unnumbered registers. */
3eea796c 1181 for (const tdesc_feature_up &feature : target_desc->features)
c9c895b9 1182 for (const tdesc_reg_up &reg : feature->registers)
eb53f105 1183 if (htab_find (reg_hash.get (), reg.get ()) != NULL)
123dc839 1184 {
f0cddbef 1185 data->arch_regs.emplace_back (reg.get (), nullptr);
123dc839
DJ
1186 num_regs++;
1187 }
1188
123dc839
DJ
1189 /* Update the architecture. */
1190 set_gdbarch_num_regs (gdbarch, num_regs);
1191 set_gdbarch_register_name (gdbarch, tdesc_register_name);
1192 set_gdbarch_register_type (gdbarch, tdesc_register_type);
1193 set_gdbarch_remote_register_number (gdbarch,
1194 tdesc_remote_register_number);
1195 set_gdbarch_register_reggroup_p (gdbarch, tdesc_register_reggroup_p);
1196}
123dc839 1197
268a13a5 1198/* See gdbsupport/tdesc.h. */
f49ff000 1199
123dc839 1200struct tdesc_feature *
3b74854b 1201tdesc_create_feature (struct target_desc *tdesc, const char *name)
123dc839 1202{
72ddacb7 1203 struct tdesc_feature *new_feature = new tdesc_feature (name);
123dc839 1204
3eea796c
SM
1205 tdesc->features.emplace_back (new_feature);
1206
123dc839
DJ
1207 return new_feature;
1208}
1209
0e267416
AB
1210/* See gdbsupport/tdesc.h. */
1211
51a948fd 1212target_desc_up
424163ea
DJ
1213allocate_target_description (void)
1214{
51a948fd 1215 return target_desc_up (new target_desc ());
424163ea 1216}
29709017 1217
0e267416
AB
1218/* See gdbsupport/tdesc.h. */
1219
c55d06ec
TT
1220void
1221target_desc_deleter::operator() (struct target_desc *target_desc) const
23181151 1222{
b468ff4c 1223 delete target_desc;
23181151
DJ
1224}
1225
e35359c5
UW
1226void
1227tdesc_add_compatible (struct target_desc *target_desc,
1228 const struct bfd_arch_info *compatible)
1229{
e35359c5
UW
1230 /* If this instance of GDB is compiled without BFD support for the
1231 compatible architecture, simply ignore it -- we would not be able
1232 to handle it anyway. */
1233 if (compatible == NULL)
1234 return;
1235
fbf42f4e
AB
1236 for (const tdesc_compatible_info_up &compat : target_desc->compatible)
1237 if (compat->arch () == compatible)
e35359c5
UW
1238 internal_error (__FILE__, __LINE__,
1239 _("Attempted to add duplicate "
1240 "compatible architecture \"%s\""),
1241 compatible->printable_name);
1242
fbf42f4e
AB
1243 target_desc->compatible.push_back
1244 (std::unique_ptr<tdesc_compatible_info>
1245 (new tdesc_compatible_info (compatible)));
e35359c5
UW
1246}
1247
29709017
DJ
1248void
1249set_tdesc_property (struct target_desc *target_desc,
1250 const char *key, const char *value)
1251{
29709017
DJ
1252 gdb_assert (key != NULL && value != NULL);
1253
129c10bc
SM
1254 if (tdesc_property (target_desc, key) != NULL)
1255 internal_error (__FILE__, __LINE__,
1256 _("Attempted to add duplicate property \"%s\""), key);
29709017 1257
129c10bc 1258 target_desc->properties.emplace_back (key, value);
29709017 1259}
23181151 1260
268a13a5 1261/* See gdbsupport/tdesc.h. */
5f035c07
YQ
1262
1263void
1264set_tdesc_architecture (struct target_desc *target_desc,
1265 const char *name)
1266{
1267 set_tdesc_architecture (target_desc, bfd_scan_arch (name));
1268}
1269
23181151
DJ
1270void
1271set_tdesc_architecture (struct target_desc *target_desc,
1272 const struct bfd_arch_info *arch)
1273{
1274 target_desc->arch = arch;
1275}
08d16641 1276
268a13a5 1277/* See gdbsupport/tdesc.h. */
5f035c07
YQ
1278
1279void
1280set_tdesc_osabi (struct target_desc *target_desc, const char *name)
1281{
1282 set_tdesc_osabi (target_desc, osabi_from_tdesc_string (name));
1283}
1284
08d16641
PA
1285void
1286set_tdesc_osabi (struct target_desc *target_desc, enum gdb_osabi osabi)
1287{
1288 target_desc->osabi = osabi;
1289}
23181151
DJ
1290\f
1291
1292static struct cmd_list_element *tdesc_set_cmdlist, *tdesc_show_cmdlist;
1293static struct cmd_list_element *tdesc_unset_cmdlist;
1294
1295/* Helper functions for the CLI commands. */
1296
23181151 1297static void
eb4c3f4a 1298set_tdesc_filename_cmd (const char *args, int from_tty,
23181151
DJ
1299 struct cmd_list_element *c)
1300{
6ecd4729
PA
1301 xfree (target_description_filename);
1302 target_description_filename = xstrdup (tdesc_filename_cmd_string);
1303
23181151
DJ
1304 target_clear_description ();
1305 target_find_description ();
1306}
1307
1308static void
1309show_tdesc_filename_cmd (struct ui_file *file, int from_tty,
1310 struct cmd_list_element *c,
1311 const char *value)
1312{
6ecd4729
PA
1313 value = target_description_filename;
1314
23181151 1315 if (value != NULL && *value != '\0')
3e43a32a 1316 printf_filtered (_("The target description will be read from \"%s\".\n"),
23181151
DJ
1317 value);
1318 else
3e43a32a
MS
1319 printf_filtered (_("The target description will be "
1320 "read from the target.\n"));
23181151
DJ
1321}
1322
1323static void
e100df1a 1324unset_tdesc_filename_cmd (const char *args, int from_tty)
23181151
DJ
1325{
1326 xfree (target_description_filename);
1327 target_description_filename = NULL;
1328 target_clear_description ();
1329 target_find_description ();
1330}
1331
6eb1e6a8
YQ
1332/* Print target description in C. */
1333
1334class print_c_tdesc : public tdesc_element_visitor
1335{
1336public:
1337 print_c_tdesc (std::string &filename_after_features)
1338 : m_filename_after_features (filename_after_features)
1339 {
1340 const char *inp;
1341 char *outp;
1342 const char *filename = lbasename (m_filename_after_features.c_str ());
1343
1344 m_function = (char *) xmalloc (strlen (filename) + 1);
1345 for (inp = filename, outp = m_function; *inp != '\0'; inp++)
1346 if (*inp == '.')
1347 break;
1348 else if (*inp == '-')
1349 *outp++ = '_';
20821f4e
AB
1350 else if (*inp == ' ')
1351 *outp++ = '_';
6eb1e6a8
YQ
1352 else
1353 *outp++ = *inp;
1354 *outp = '\0';
1355
1356 /* Standard boilerplate. */
1357 printf_unfiltered ("/* THIS FILE IS GENERATED. "
1358 "-*- buffer-read-only: t -*- vi"
1359 ":set ro:\n");
6eb1e6a8
YQ
1360 }
1361
1362 ~print_c_tdesc ()
1363 {
1364 xfree (m_function);
1365 }
1366
1367 void visit_pre (const target_desc *e) override
1368 {
25aa13e5
YQ
1369 printf_unfiltered (" Original: %s */\n\n",
1370 lbasename (m_filename_after_features.c_str ()));
1371
6eb1e6a8
YQ
1372 printf_unfiltered ("#include \"defs.h\"\n");
1373 printf_unfiltered ("#include \"osabi.h\"\n");
1374 printf_unfiltered ("#include \"target-descriptions.h\"\n");
1375 printf_unfiltered ("\n");
1376
1377 printf_unfiltered ("struct target_desc *tdesc_%s;\n", m_function);
1378 printf_unfiltered ("static void\n");
1379 printf_unfiltered ("initialize_tdesc_%s (void)\n", m_function);
1380 printf_unfiltered ("{\n");
1381 printf_unfiltered
51a948fd 1382 (" target_desc_up result = allocate_target_description ();\n");
6eb1e6a8
YQ
1383
1384 if (tdesc_architecture (e) != NULL)
1385 {
1386 printf_unfiltered
51a948fd 1387 (" set_tdesc_architecture (result.get (), bfd_scan_arch (\"%s\"));\n",
6eb1e6a8
YQ
1388 tdesc_architecture (e)->printable_name);
1389 printf_unfiltered ("\n");
1390 }
1391 if (tdesc_osabi (e) > GDB_OSABI_UNKNOWN
1392 && tdesc_osabi (e) < GDB_OSABI_INVALID)
1393 {
1394 printf_unfiltered
51a948fd 1395 (" set_tdesc_osabi (result.get (), osabi_from_tdesc_string (\"%s\"));\n",
6eb1e6a8
YQ
1396 gdbarch_osabi_name (tdesc_osabi (e)));
1397 printf_unfiltered ("\n");
1398 }
1399
fbf42f4e 1400 for (const tdesc_compatible_info_up &compatible : e->compatible)
40e2a983 1401 printf_unfiltered
51a948fd 1402 (" tdesc_add_compatible (result.get (), bfd_scan_arch (\"%s\"));\n",
fbf42f4e 1403 compatible->arch ()->printable_name);
6eb1e6a8 1404
40e2a983 1405 if (!e->compatible.empty ())
6eb1e6a8
YQ
1406 printf_unfiltered ("\n");
1407
129c10bc 1408 for (const property &prop : e->properties)
51a948fd 1409 printf_unfiltered (" set_tdesc_property (result.get (), \"%s\", \"%s\");\n",
129c10bc
SM
1410 prop.key.c_str (), prop.value.c_str ());
1411
6eb1e6a8
YQ
1412 printf_unfiltered (" struct tdesc_feature *feature;\n");
1413 }
1414
25aa13e5 1415 void visit_pre (const tdesc_feature *e) override
6eb1e6a8 1416 {
51a948fd 1417 printf_unfiltered ("\n feature = tdesc_create_feature (result.get (), \"%s\");\n",
f65ff9f9 1418 e->name.c_str ());
6eb1e6a8
YQ
1419 }
1420
25aa13e5
YQ
1421 void visit_post (const tdesc_feature *e) override
1422 {}
1423
6eb1e6a8
YQ
1424 void visit_post (const target_desc *e) override
1425 {
51a948fd 1426 printf_unfiltered ("\n tdesc_%s = result.release ();\n", m_function);
6eb1e6a8
YQ
1427 printf_unfiltered ("}\n");
1428 }
1429
d4a0e8b5
SM
1430 void visit (const tdesc_type_builtin *type) override
1431 {
1432 error (_("C output is not supported type \"%s\"."), type->name.c_str ());
1433 }
1434
1435 void visit (const tdesc_type_vector *type) override
6eb1e6a8 1436 {
d4a0e8b5 1437 if (!m_printed_element_type)
6eb1e6a8 1438 {
d4a0e8b5
SM
1439 printf_unfiltered (" tdesc_type *element_type;\n");
1440 m_printed_element_type = true;
6eb1e6a8
YQ
1441 }
1442
d4a0e8b5
SM
1443 printf_unfiltered
1444 (" element_type = tdesc_named_type (feature, \"%s\");\n",
1445 type->element_type->name.c_str ());
1446 printf_unfiltered
1447 (" tdesc_create_vector (feature, \"%s\", element_type, %d);\n",
1448 type->name.c_str (), type->count);
1449
1450 printf_unfiltered ("\n");
1451 }
1452
1453 void visit (const tdesc_type_with_fields *type) override
1454 {
1455 if (!m_printed_type_with_fields)
6eb1e6a8 1456 {
d4a0e8b5
SM
1457 printf_unfiltered (" tdesc_type_with_fields *type_with_fields;\n");
1458 m_printed_type_with_fields = true;
1459 }
1460
6eb1e6a8
YQ
1461 switch (type->kind)
1462 {
6eb1e6a8
YQ
1463 case TDESC_TYPE_STRUCT:
1464 case TDESC_TYPE_FLAGS:
1465 if (type->kind == TDESC_TYPE_STRUCT)
1466 {
1467 printf_unfiltered
d4a0e8b5 1468 (" type_with_fields = tdesc_create_struct (feature, \"%s\");\n",
082b9140 1469 type->name.c_str ());
d4a0e8b5 1470 if (type->size != 0)
6eb1e6a8 1471 printf_unfiltered
d4a0e8b5 1472 (" tdesc_set_struct_size (type_with_fields, %d);\n", type->size);
6eb1e6a8
YQ
1473 }
1474 else
1475 {
1476 printf_unfiltered
d4a0e8b5
SM
1477 (" type_with_fields = tdesc_create_flags (feature, \"%s\", %d);\n",
1478 type->name.c_str (), type->size);
6eb1e6a8 1479 }
d4a0e8b5 1480 for (const tdesc_type_field &f : type->fields)
6eb1e6a8
YQ
1481 {
1482 const char *type_name;
1483
d05200d1
SM
1484 gdb_assert (f.type != NULL);
1485 type_name = f.type->name.c_str ();
6eb1e6a8
YQ
1486
1487 /* To minimize changes to generated files, don't emit type
1488 info for fields that have defaulted types. */
d05200d1 1489 if (f.start != -1)
6eb1e6a8 1490 {
d05200d1
SM
1491 gdb_assert (f.end != -1);
1492 if (f.type->kind == TDESC_TYPE_BOOL)
6eb1e6a8 1493 {
d05200d1 1494 gdb_assert (f.start == f.end);
6eb1e6a8 1495 printf_unfiltered
d4a0e8b5 1496 (" tdesc_add_flag (type_with_fields, %d, \"%s\");\n",
d05200d1 1497 f.start, f.name.c_str ());
6eb1e6a8 1498 }
d4a0e8b5
SM
1499 else if ((type->size == 4 && f.type->kind == TDESC_TYPE_UINT32)
1500 || (type->size == 8
d05200d1 1501 && f.type->kind == TDESC_TYPE_UINT64))
6eb1e6a8
YQ
1502 {
1503 printf_unfiltered
d4a0e8b5 1504 (" tdesc_add_bitfield (type_with_fields, \"%s\", %d, %d);\n",
d05200d1 1505 f.name.c_str (), f.start, f.end);
6eb1e6a8
YQ
1506 }
1507 else
1508 {
a8d2e585
SM
1509 printf_field_type_assignment
1510 ("tdesc_named_type (feature, \"%s\");\n",
6eb1e6a8
YQ
1511 type_name);
1512 printf_unfiltered
d4a0e8b5 1513 (" tdesc_add_typed_bitfield (type_with_fields, \"%s\","
6eb1e6a8 1514 " %d, %d, field_type);\n",
d05200d1 1515 f.name.c_str (), f.start, f.end);
6eb1e6a8
YQ
1516 }
1517 }
1518 else /* Not a bitfield. */
1519 {
d05200d1 1520 gdb_assert (f.end == -1);
6eb1e6a8 1521 gdb_assert (type->kind == TDESC_TYPE_STRUCT);
a8d2e585
SM
1522 printf_field_type_assignment
1523 ("tdesc_named_type (feature, \"%s\");\n", type_name);
6eb1e6a8 1524 printf_unfiltered
d4a0e8b5 1525 (" tdesc_add_field (type_with_fields, \"%s\", field_type);\n",
d05200d1 1526 f.name.c_str ());
6eb1e6a8
YQ
1527 }
1528 }
1529 break;
1530 case TDESC_TYPE_UNION:
1531 printf_unfiltered
d4a0e8b5 1532 (" type_with_fields = tdesc_create_union (feature, \"%s\");\n",
082b9140 1533 type->name.c_str ());
d4a0e8b5 1534 for (const tdesc_type_field &f : type->fields)
6eb1e6a8 1535 {
a8d2e585
SM
1536 printf_field_type_assignment
1537 ("tdesc_named_type (feature, \"%s\");\n", f.type->name.c_str ());
6eb1e6a8 1538 printf_unfiltered
d4a0e8b5 1539 (" tdesc_add_field (type_with_fields, \"%s\", field_type);\n",
d05200d1 1540 f.name.c_str ());
6eb1e6a8
YQ
1541 }
1542 break;
1543 case TDESC_TYPE_ENUM:
1544 printf_unfiltered
d4a0e8b5
SM
1545 (" type_with_fields = tdesc_create_enum (feature, \"%s\", %d);\n",
1546 type->name.c_str (), type->size);
1547 for (const tdesc_type_field &f : type->fields)
6eb1e6a8 1548 printf_unfiltered
d4a0e8b5 1549 (" tdesc_add_enum_value (type_with_fields, %d, \"%s\");\n",
d05200d1 1550 f.start, f.name.c_str ());
6eb1e6a8
YQ
1551 break;
1552 default:
082b9140 1553 error (_("C output is not supported type \"%s\"."), type->name.c_str ());
6eb1e6a8 1554 }
d4a0e8b5 1555
6eb1e6a8
YQ
1556 printf_unfiltered ("\n");
1557 }
1558
1559 void visit (const tdesc_reg *reg) override
1560 {
1561 printf_unfiltered (" tdesc_create_reg (feature, \"%s\", %ld, %d, ",
a8142ee1
SM
1562 reg->name.c_str (), reg->target_regnum,
1563 reg->save_restore);
1564 if (!reg->group.empty ())
1565 printf_unfiltered ("\"%s\", ", reg->group.c_str ());
6eb1e6a8
YQ
1566 else
1567 printf_unfiltered ("NULL, ");
a8142ee1 1568 printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type.c_str ());
6eb1e6a8
YQ
1569 }
1570
25aa13e5
YQ
1571protected:
1572 std::string m_filename_after_features;
1573
6eb1e6a8 1574private:
a8d2e585
SM
1575
1576 /* Print an assignment to the field_type variable. Print the declaration
1577 of field_type if that has not been done yet. */
6e8c24fe 1578 ATTRIBUTE_PRINTF (2, 3)
a8d2e585
SM
1579 void printf_field_type_assignment (const char *fmt, ...)
1580 {
1581 if (!m_printed_field_type)
1582 {
1583 printf_unfiltered (" tdesc_type *field_type;\n");
1584 m_printed_field_type = true;
1585 }
1586
1587 printf_unfiltered (" field_type = ");
1588
1589 va_list args;
1590 va_start (args, fmt);
1591 vprintf_unfiltered (fmt, args);
1592 va_end (args);
1593 }
1594
6eb1e6a8 1595 char *m_function;
d4a0e8b5
SM
1596
1597 /* Did we print "struct tdesc_type *element_type;" yet? */
1598 bool m_printed_element_type = false;
1599
1600 /* Did we print "struct tdesc_type_with_fields *element_type;" yet? */
1601 bool m_printed_type_with_fields = false;
1602
1603 /* Did we print "struct tdesc_type *field_type;" yet? */
6eb1e6a8 1604 bool m_printed_field_type = false;
6eb1e6a8
YQ
1605};
1606
25aa13e5
YQ
1607/* Print target description feature in C. */
1608
1609class print_c_feature : public print_c_tdesc
1610{
1611public:
1612 print_c_feature (std::string &file)
1613 : print_c_tdesc (file)
1614 {
1615 /* Trim ".tmp". */
1616 auto const pos = m_filename_after_features.find_last_of ('.');
1617
1618 m_filename_after_features = m_filename_after_features.substr (0, pos);
1619 }
1620
1621 void visit_pre (const target_desc *e) override
1622 {
1623 printf_unfiltered (" Original: %s */\n\n",
1624 lbasename (m_filename_after_features.c_str ()));
1625
268a13a5 1626 printf_unfiltered ("#include \"gdbsupport/tdesc.h\"\n");
25aa13e5
YQ
1627 printf_unfiltered ("\n");
1628 }
1629
1630 void visit_post (const target_desc *e) override
1631 {}
1632
1633 void visit_pre (const tdesc_feature *e) override
1634 {
1635 std::string name (m_filename_after_features);
1636
1637 auto pos = name.find_first_of ('.');
1638
1639 name = name.substr (0, pos);
1640 std::replace (name.begin (), name.end (), '/', '_');
1641 std::replace (name.begin (), name.end (), '-', '_');
1642
1643 printf_unfiltered ("static int\n");
1644 printf_unfiltered ("create_feature_%s ", name.c_str ());
1645 printf_unfiltered ("(struct target_desc *result, long regnum)\n");
1646
1647 printf_unfiltered ("{\n");
1648 printf_unfiltered (" struct tdesc_feature *feature;\n");
0abe8a89
YQ
1649
1650 printf_unfiltered
3b74854b
AH
1651 ("\n feature = tdesc_create_feature (result, \"%s\");\n",
1652 e->name.c_str ());
25aa13e5
YQ
1653 }
1654
1655 void visit_post (const tdesc_feature *e) override
1656 {
1657 printf_unfiltered (" return regnum;\n");
1658 printf_unfiltered ("}\n");
1659 }
1660
1661 void visit (const tdesc_reg *reg) override
1662 {
ea03d0d3
YQ
1663 /* Most "reg" in XML target descriptions don't have "regnum"
1664 attribute, so the register number is allocated sequentially.
1665 In case that reg has "regnum" attribute, register number
1666 should be set by that explicitly. */
1667
1668 if (reg->target_regnum < m_next_regnum)
1669 {
1670 /* The integrity check, it can catch some errors on register
1671 number collision, like this,
1672
1673 <reg name="x0" bitsize="32"/>
1674 <reg name="x1" bitsize="32"/>
1675 <reg name="x2" bitsize="32"/>
1676 <reg name="x3" bitsize="32"/>
1677 <reg name="ps" bitsize="32" regnum="3"/>
1678
1679 but it also has false negatives. The target description
1680 below is correct,
1681
1682 <reg name="x1" bitsize="32" regnum="1"/>
1683 <reg name="x3" bitsize="32" regnum="3"/>
1684 <reg name="x2" bitsize="32" regnum="2"/>
1685 <reg name="x4" bitsize="32" regnum="4"/>
1686
1687 but it is not a good practice, so still error on this,
1688 and also print the message so that it can be saved in the
1689 generated c file. */
1690
1691 printf_unfiltered ("ERROR: \"regnum\" attribute %ld ",
1692 reg->target_regnum);
1693 printf_unfiltered ("is not the largest number (%d).\n",
1694 m_next_regnum);
1695 error (_("\"regnum\" attribute %ld is not the largest number (%d)."),
1696 reg->target_regnum, m_next_regnum);
1697 }
1698
1699 if (reg->target_regnum > m_next_regnum)
1700 {
1701 printf_unfiltered (" regnum = %ld;\n", reg->target_regnum);
1702 m_next_regnum = reg->target_regnum;
1703 }
1704
25aa13e5 1705 printf_unfiltered (" tdesc_create_reg (feature, \"%s\", regnum++, %d, ",
a8142ee1
SM
1706 reg->name.c_str (), reg->save_restore);
1707 if (!reg->group.empty ())
1708 printf_unfiltered ("\"%s\", ", reg->group.c_str ());
25aa13e5
YQ
1709 else
1710 printf_unfiltered ("NULL, ");
a8142ee1 1711 printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type.c_str ());
ea03d0d3
YQ
1712
1713 m_next_regnum++;
25aa13e5
YQ
1714 }
1715
ea03d0d3
YQ
1716private:
1717 /* The register number to use for the next register we see. */
1718 int m_next_regnum = 0;
25aa13e5
YQ
1719};
1720
268a13a5 1721/* See gdbsupport/tdesc.h. */
e98577a9
AH
1722
1723const char *
1724tdesc_get_features_xml (const target_desc *tdesc)
1725{
1726 if (tdesc->xmltarget == nullptr)
1727 {
1728 std::string buffer ("@");
1729 print_xml_feature v (&buffer);
1730 tdesc->accept (v);
1731 tdesc->xmltarget = xstrdup (buffer.c_str ());
1732 }
1733 return tdesc->xmltarget;
1734}
1735
ab33b152
AB
1736/* Data structures and functions to setup the option flags for 'maintenance
1737 print c-tdesc command. */
1738
1739struct maint_print_c_tdesc_options
1740{
1741 /* True when the '-single-feature' flag was passed. */
1742 bool single_feature = false;
1743};
1744
1745using maint_print_c_tdesc_opt_def
1746 = gdb::option::flag_option_def<maint_print_c_tdesc_options>;
1747
1748static const gdb::option::option_def maint_print_c_tdesc_opt_defs[] = {
1749 maint_print_c_tdesc_opt_def {
1750 "single-feature",
1751 [] (maint_print_c_tdesc_options *opt) { return &opt->single_feature; },
1752 N_("Print C description of just a single feature.")
1753 },
1754};
1755
1756static inline gdb::option::option_def_group
1757make_maint_print_c_tdesc_options_def_group (maint_print_c_tdesc_options *opts)
1758{
1759 return {{maint_print_c_tdesc_opt_defs}, opts};
1760}
1761
1762/* Implement 'maintenance print c-tdesc' command. */
1763
81adfced 1764static void
e100df1a 1765maint_print_c_tdesc_cmd (const char *args, int from_tty)
81adfced
DJ
1766{
1767 const struct target_desc *tdesc;
6eb1e6a8 1768 const char *filename;
81adfced 1769
ab33b152
AB
1770 maint_print_c_tdesc_options opts;
1771 auto grp = make_maint_print_c_tdesc_options_def_group (&opts);
1772 gdb::option::process_options
1773 (&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp);
1774
8e2141c6
YQ
1775 if (args == NULL)
1776 {
1777 /* Use the global target-supplied description, not the current
1778 architecture's. This lets a GDB for one architecture generate C
1779 for another architecture's description, even though the gdbarch
1780 initialization code will reject the new description. */
1781 tdesc = current_target_desc;
1782 filename = target_description_filename;
1783 }
1784 else
1785 {
1786 /* Use the target description from the XML file. */
1787 filename = args;
1788 tdesc = file_read_description_xml (filename);
1789 }
1790
81adfced
DJ
1791 if (tdesc == NULL)
1792 error (_("There is no target description to print."));
1793
8e2141c6 1794 if (filename == NULL)
20821f4e 1795 filename = "fetched from target";
81adfced 1796
6eb1e6a8
YQ
1797 std::string filename_after_features (filename);
1798 auto loc = filename_after_features.rfind ("/features/");
4e2f8df6 1799
6eb1e6a8
YQ
1800 if (loc != std::string::npos)
1801 filename_after_features = filename_after_features.substr (loc + 10);
4e2f8df6 1802
25aa13e5
YQ
1803 /* Print c files for target features instead of target descriptions,
1804 because c files got from target features are more flexible than the
1805 counterparts. */
ab33b152 1806 if (opts.single_feature)
25aa13e5 1807 {
ab33b152
AB
1808 if (tdesc->features.size () != 1)
1809 error (_("only target descriptions with 1 feature can be used "
1810 "with -single-feature option"));
1811
25aa13e5 1812 print_c_feature v (filename_after_features);
81adfced 1813
25aa13e5
YQ
1814 tdesc->accept (v);
1815 }
1816 else
1817 {
1818 print_c_tdesc v (filename_after_features);
1819
1820 tdesc->accept (v);
1821 }
81adfced
DJ
1822}
1823
ab33b152
AB
1824/* Completer for the "backtrace" command. */
1825
1826static void
1827maint_print_c_tdesc_cmd_completer (struct cmd_list_element *ignore,
1828 completion_tracker &tracker,
1829 const char *text, const char *word)
1830{
1831 auto grp = make_maint_print_c_tdesc_options_def_group (nullptr);
1832 if (gdb::option::complete_options
1833 (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp))
1834 return;
1835
1836 word = advance_to_filename_complete_word_point (tracker, text);
1837 filename_completer (ignore, tracker, text, word);
1838}
1839
caa7fd04
AB
1840/* Implement the maintenance print xml-tdesc command. */
1841
1842static void
1843maint_print_xml_tdesc_cmd (const char *args, int from_tty)
1844{
1845 const struct target_desc *tdesc;
1846
1847 if (args == NULL)
1848 {
1849 /* Use the global target-supplied description, not the current
1850 architecture's. This lets a GDB for one architecture generate XML
1851 for another architecture's description, even though the gdbarch
1852 initialization code will reject the new description. */
1853 tdesc = current_target_desc;
1854 }
1855 else
1856 {
1857 /* Use the target description from the XML file. */
1858 tdesc = file_read_description_xml (args);
1859 }
1860
1861 if (tdesc == NULL)
1862 error (_("There is no target description to print."));
1863
1864 std::string buf;
1865 print_xml_feature v (&buf);
1866 tdesc->accept (v);
1867 puts_unfiltered (buf.c_str ());
1868}
1869
27d41eac
YQ
1870namespace selftests {
1871
1c28969e
SM
1872/* A reference target description, used for testing (see record_xml_tdesc). */
1873
1874struct xml_test_tdesc
1875{
1876 xml_test_tdesc (const char *name, std::unique_ptr<const target_desc> &&tdesc)
1877 : name (name), tdesc (std::move (tdesc))
1878 {}
1879
1880 const char *name;
1881 std::unique_ptr<const target_desc> tdesc;
1882};
1883
1884static std::vector<xml_test_tdesc> xml_tdesc;
27d41eac
YQ
1885
1886#if GDB_SELF_TEST
1887
405feb71 1888/* See target-descriptions.h. */
27d41eac
YQ
1889
1890void
1891record_xml_tdesc (const char *xml_file, const struct target_desc *tdesc)
1892{
1c28969e 1893 xml_tdesc.emplace_back (xml_file, std::unique_ptr<const target_desc> (tdesc));
27d41eac
YQ
1894}
1895#endif
1896
1897}
1898
85102364 1899/* Test the conversion process of a target description to/from xml: Take a target
e98577a9
AH
1900 description TDESC, convert to xml, back to a description, and confirm the new
1901 tdesc is identical to the original. */
1902static bool
1903maintenance_check_tdesc_xml_convert (const target_desc *tdesc, const char *name)
1904{
1905 const char *xml = tdesc_get_features_xml (tdesc);
1906
1907 if (xml == nullptr || *xml != '@')
1908 {
1909 printf_filtered (_("Could not convert description for %s to xml.\n"),
1910 name);
1911 return false;
1912 }
1913
1914 const target_desc *tdesc_trans = string_read_description_xml (xml + 1);
1915
1916 if (tdesc_trans == nullptr)
1917 {
1918 printf_filtered (_("Could not convert description for %s from xml.\n"),
1919 name);
1920 return false;
1921 }
1922 else if (*tdesc != *tdesc_trans)
1923 {
1924 printf_filtered (_("Converted description for %s does not match.\n"),
1925 name);
1926 return false;
1927 }
1928 return true;
1929}
1930
1931
27d41eac
YQ
1932/* Check that the target descriptions created dynamically by
1933 architecture-specific code equal the descriptions created from XML files
1934 found in the specified directory DIR. */
1935
1936static void
e100df1a 1937maintenance_check_xml_descriptions (const char *dir, int from_tty)
27d41eac
YQ
1938{
1939 if (dir == NULL)
1940 error (_("Missing dir name"));
1941
1942 gdb::unique_xmalloc_ptr<char> dir1 (tilde_expand (dir));
1943 std::string feature_dir (dir1.get ());
1944 unsigned int failed = 0;
1945
1946 for (auto const &e : selftests::xml_tdesc)
1947 {
1c28969e 1948 std::string tdesc_xml = (feature_dir + SLASH_STRING + e.name);
27d41eac
YQ
1949 const target_desc *tdesc
1950 = file_read_description_xml (tdesc_xml.data ());
1951
1c28969e 1952 if (tdesc == NULL || *tdesc != *e.tdesc)
e98577a9 1953 {
1c28969e 1954 printf_filtered ( _("Descriptions for %s do not match.\n"), e.name);
e98577a9
AH
1955 failed++;
1956 }
1c28969e
SM
1957 else if (!maintenance_check_tdesc_xml_convert (tdesc, e.name)
1958 || !maintenance_check_tdesc_xml_convert (e.tdesc.get (), e.name))
27d41eac
YQ
1959 failed++;
1960 }
1961 printf_filtered (_("Tested %lu XML files, %d failed\n"),
1962 (long) selftests::xml_tdesc.size (), failed);
1963}
1964
6c265988 1965void _initialize_target_descriptions ();
23181151 1966void
6c265988 1967_initialize_target_descriptions ()
23181151 1968{
20821f4e
AB
1969 cmd_list_element *cmd;
1970
123dc839
DJ
1971 tdesc_data = gdbarch_data_register_pre_init (tdesc_data_init);
1972
0743fc83 1973 add_basic_prefix_cmd ("tdesc", class_maintenance, _("\
23181151 1974Set target description specific variables."),
0743fc83
TT
1975 &tdesc_set_cmdlist, "set tdesc ",
1976 0 /* allow-unknown */, &setlist);
1977 add_show_prefix_cmd ("tdesc", class_maintenance, _("\
23181151 1978Show target description specific variables."),
0743fc83
TT
1979 &tdesc_show_cmdlist, "show tdesc ",
1980 0 /* allow-unknown */, &showlist);
1981 add_basic_prefix_cmd ("tdesc", class_maintenance, _("\
23181151 1982Unset target description specific variables."),
0743fc83
TT
1983 &tdesc_unset_cmdlist, "unset tdesc ",
1984 0 /* allow-unknown */, &unsetlist);
23181151
DJ
1985
1986 add_setshow_filename_cmd ("filename", class_obscure,
6ecd4729 1987 &tdesc_filename_cmd_string,
23181151 1988 _("\
590042fc
PW
1989Set the file to read for an XML target description."), _("\
1990Show the file to read for an XML target description."), _("\
23181151
DJ
1991When set, GDB will read the target description from a local\n\
1992file instead of querying the remote target."),
1993 set_tdesc_filename_cmd,
1994 show_tdesc_filename_cmd,
1995 &tdesc_set_cmdlist, &tdesc_show_cmdlist);
1996
1997 add_cmd ("filename", class_obscure, unset_tdesc_filename_cmd, _("\
590042fc
PW
1998Unset the file to read for an XML target description.\n\
1999When unset, GDB will read the description from the target."),
23181151 2000 &tdesc_unset_cmdlist);
81adfced 2001
ab33b152
AB
2002 auto grp = make_maint_print_c_tdesc_options_def_group (nullptr);
2003 static std::string help_text
2004 = gdb::option::build_help (_("\
2005Print the current target description as a C source file.\n\
2006Usage: maintenance print c-tdesc [OPTION] [FILENAME]\n\
2007\n\
2008Options:\n\
2009%OPTIONS%\n\
2010\n\
2011When FILENAME is not provided then print the current target\n\
2012description, otherwise an XML target description is read from\n\
2013FILENAME and printed as a C function.\n\
2014\n\
2015When '-single-feature' is used then the target description should\n\
2016contain a single feature and the generated C code will only create\n\
2017that feature within an already existing target_desc object."), grp);
2018 cmd = add_cmd ("c-tdesc", class_maintenance, maint_print_c_tdesc_cmd,
2019 help_text.c_str (), &maintenanceprintlist);
2020 set_cmd_completer_handle_brkchars (cmd, maint_print_c_tdesc_cmd_completer);
27d41eac 2021
caa7fd04
AB
2022 cmd = add_cmd ("xml-tdesc", class_maintenance, maint_print_xml_tdesc_cmd, _("\
2023Print the current target description as an XML file."),
2024 &maintenanceprintlist);
2025 set_cmd_completer (cmd, filename_completer);
2026
27d41eac
YQ
2027 cmd = add_cmd ("xml-descriptions", class_maintenance,
2028 maintenance_check_xml_descriptions, _("\
590042fc 2029Check equality of GDB target descriptions and XML created descriptions.\n\
27d41eac
YQ
2030Check the target descriptions created in GDB equal the descriptions\n\
2031created from XML files in the directory.\n\
2032The parameter is the directory name."),
2033 &maintenancechecklist);
2034 set_cmd_completer (cmd, filename_completer);
23181151 2035}
This page took 2.537392 seconds and 4 git commands to generate.