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