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