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