]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/typeprint.c
Update copyright year range in header of all files managed by GDB
[thirdparty/binutils-gdb.git] / gdb / typeprint.c
CommitLineData
c906108c 1/* Language independent support for printing types for GDB, the GNU debugger.
1bac305b 2
1d506c26 3 Copyright (C) 1986-2024 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
bf31fd38 21#include "gdbsupport/gdb_obstack.h"
ef0f16cc 22#include "bfd.h"
c906108c
SS
23#include "symtab.h"
24#include "gdbtypes.h"
25#include "expression.h"
26#include "value.h"
27#include "gdbcore.h"
28#include "command.h"
29#include "gdbcmd.h"
30#include "target.h"
31#include "language.h"
015a42b4 32#include "cp-abi.h"
b9362cc7 33#include "typeprint.h"
79a45b7d 34#include "valprint.h"
53342f27
TT
35#include <ctype.h>
36#include "cli/cli-utils.h"
6dddc817 37#include "extension.h"
4fc5d43e 38#include "completer.h"
7f6aba03 39#include "cli/cli-style.h"
c906108c 40
79d43c61
TT
41const struct type_print_options type_print_raw_options =
42{
53342f27
TT
43 1, /* raw */
44 1, /* print_methods */
bd69fc68 45 1, /* print_typedefs */
7c161838 46 0, /* print_offsets */
fbb46296 47 0, /* print_in_hex */
883fd55a 48 0, /* print_nested_type_limit */
18a9fc12
TT
49 NULL, /* local_typedefs */
50 NULL, /* global_table */
51 NULL /* global_printers */
79d43c61
TT
52};
53
54/* The default flags for 'ptype' and 'whatis'. */
55
56static struct type_print_options default_ptype_flags =
57{
53342f27
TT
58 0, /* raw */
59 1, /* print_methods */
bd69fc68 60 1, /* print_typedefs */
7c161838 61 0, /* print_offsets */
fbb46296 62 0, /* print_in_hex */
883fd55a 63 0, /* print_nested_type_limit */
18a9fc12
TT
64 NULL, /* local_typedefs */
65 NULL, /* global_table */
66 NULL /* global_printers */
79d43c61 67};
5c6ce71d 68
53342f27
TT
69\f
70
e0c547d1
TT
71/* See typeprint.h. */
72
fbb46296 73const int print_offset_data::indentation = 27;
e0c547d1 74
fbb46296
LS
75/* See typeprint.h. */
76
77print_offset_data::print_offset_data (const struct type_print_options *flags)
78{
79 if (flags != nullptr)
80 print_in_hex = flags->print_in_hex;
81}
e0c547d1
TT
82
83/* See typeprint.h. */
84
85void
86print_offset_data::maybe_print_hole (struct ui_file *stream,
87 unsigned int bitpos,
88 const char *for_what)
89{
90 /* We check for END_BITPOS > 0 because there is a specific
91 scenario when END_BITPOS can be zero and BITPOS can be >
92 0: when we are dealing with a struct/class with a virtual method.
93 Because of the vtable, the first field of the struct/class will
94 have an offset of sizeof (void *) (the size of the vtable). If
95 we do not check for END_BITPOS > 0 here, GDB will report
96 a hole before the first field, which is not accurate. */
97 if (end_bitpos > 0 && end_bitpos < bitpos)
98 {
99 /* If END_BITPOS is smaller than the current type's
100 bitpos, it means there's a hole in the struct, so we report
101 it here. */
102 unsigned int hole = bitpos - end_bitpos;
103 unsigned int hole_byte = hole / TARGET_CHAR_BIT;
104 unsigned int hole_bit = hole % TARGET_CHAR_BIT;
105
106 if (hole_bit > 0)
334381ea
TT
107 {
108 fprintf_styled (stream, highlight_style.style (),
109 "/* XXX %2u-bit %-7s */", hole_bit, for_what);
0426ad51 110 gdb_puts ("\n", stream);
334381ea 111 }
e0c547d1
TT
112
113 if (hole_byte > 0)
334381ea
TT
114 {
115 fprintf_styled (stream, highlight_style.style (),
116 "/* XXX %2u-byte %-7s */", hole_byte, for_what);
0426ad51 117 gdb_puts ("\n", stream);
334381ea 118 }
e0c547d1
TT
119 }
120}
121
122/* See typeprint.h. */
123
124void
125print_offset_data::update (struct type *type, unsigned int field_idx,
126 struct ui_file *stream)
127{
c819a338 128 if (type->field (field_idx).is_static ())
e0c547d1 129 {
d0b1020b 130 print_spaces (indentation, stream);
e0c547d1
TT
131 return;
132 }
133
940da03e 134 struct type *ftype = check_typedef (type->field (field_idx).type ());
78134374 135 if (type->code () == TYPE_CODE_UNION)
e0c547d1
TT
136 {
137 /* Since union fields don't have the concept of offsets, we just
138 print their sizes. */
6cb06a8c
TT
139 gdb_printf (stream, "/* %6s */",
140 (print_in_hex ?
df86565b
SM
141 hex_string_custom (ftype->length (), 4) :
142 pulongest (ftype->length ())));
e0c547d1
TT
143 return;
144 }
145
b610c045 146 unsigned int bitpos = type->field (field_idx).loc_bitpos ();
df86565b 147 unsigned int fieldsize_byte = ftype->length ();
e0c547d1
TT
148 unsigned int fieldsize_bit = fieldsize_byte * TARGET_CHAR_BIT;
149
150 maybe_print_hole (stream, bitpos, "hole");
151
8c329d5c 152 if (type->field (field_idx).is_packed ()
9d3421af 153 || offset_bitpos % TARGET_CHAR_BIT != 0)
e0c547d1 154 {
9d3421af 155 /* We're dealing with a bitfield. Print the bit offset. */
3757d2d4 156 fieldsize_bit = type->field (field_idx).bitsize ();
e0c547d1 157
9d3421af
TT
158 unsigned real_bitpos = bitpos + offset_bitpos;
159
6cb06a8c
TT
160 gdb_printf (stream,
161 (print_in_hex ? "/* 0x%04x: 0x%x" : "/* %6u:%2u "),
162 real_bitpos / TARGET_CHAR_BIT,
163 real_bitpos % TARGET_CHAR_BIT);
e0c547d1
TT
164 }
165 else
166 {
167 /* The position of the field, relative to the beginning of the
168 struct. */
6cb06a8c
TT
169 gdb_printf (stream, (print_in_hex ? "/* 0x%04x" : "/* %6u"),
170 (bitpos + offset_bitpos) / TARGET_CHAR_BIT);
e0c547d1 171
6cb06a8c 172 gdb_printf (stream, " ");
e0c547d1
TT
173 }
174
6cb06a8c
TT
175 gdb_printf (stream, (print_in_hex ? " | 0x%04x */" : " | %6u */"),
176 fieldsize_byte);
e0c547d1
TT
177
178 end_bitpos = bitpos + fieldsize_bit;
179}
180
181/* See typeprint.h. */
182
183void
184print_offset_data::finish (struct type *type, int level,
185 struct ui_file *stream)
186{
df86565b 187 unsigned int bitpos = type->length () * TARGET_CHAR_BIT;
e0c547d1
TT
188 maybe_print_hole (stream, bitpos, "padding");
189
0426ad51 190 gdb_puts ("\n", stream);
d0b1020b 191 print_spaces (level + 4 + print_offset_data::indentation, stream);
6cb06a8c 192 gdb_printf (stream, "/* total size (bytes): %4s */\n",
df86565b 193 pulongest (type->length ()));
e0c547d1
TT
194}
195
196\f
197
bd69fc68
TT
198/* A hash function for a typedef_field. */
199
200static hashval_t
201hash_typedef_field (const void *p)
202{
883fd55a 203 const struct decl_field *tf = (const struct decl_field *) p;
bd69fc68 204
e8db8031 205 return htab_hash_string (TYPE_SAFE_NAME (tf->type));
bd69fc68
TT
206}
207
208/* An equality function for a typedef field. */
209
210static int
211eq_typedef_field (const void *a, const void *b)
212{
883fd55a
KS
213 const struct decl_field *tfa = (const struct decl_field *) a;
214 const struct decl_field *tfb = (const struct decl_field *) b;
bd69fc68
TT
215
216 return types_equal (tfa->type, tfb->type);
217}
218
c819b2c0 219/* See typeprint.h. */
bd69fc68
TT
220
221void
c819b2c0 222typedef_hash_table::recursively_update (struct type *t)
bd69fc68
TT
223{
224 int i;
225
bd69fc68
TT
226 for (i = 0; i < TYPE_TYPEDEF_FIELD_COUNT (t); ++i)
227 {
883fd55a 228 struct decl_field *tdef = &TYPE_TYPEDEF_FIELD (t, i);
bd69fc68
TT
229 void **slot;
230
fa9b1164 231 slot = htab_find_slot (m_table.get (), tdef, INSERT);
bd69fc68
TT
232 /* Only add a given typedef name once. Really this shouldn't
233 happen; but it is safe enough to do the updates breadth-first
234 and thus use the most specific typedef. */
235 if (*slot == NULL)
236 *slot = tdef;
237 }
238
239 /* Recurse into superclasses. */
240 for (i = 0; i < TYPE_N_BASECLASSES (t); ++i)
c819b2c0 241 recursively_update (TYPE_BASECLASS (t, i));
bd69fc68
TT
242}
243
c819b2c0 244/* See typeprint.h. */
bd69fc68
TT
245
246void
c819b2c0 247typedef_hash_table::add_template_parameters (struct type *t)
bd69fc68
TT
248{
249 int i;
250
bd69fc68
TT
251 for (i = 0; i < TYPE_N_TEMPLATE_ARGUMENTS (t); ++i)
252 {
883fd55a 253 struct decl_field *tf;
bd69fc68
TT
254 void **slot;
255
256 /* We only want type-valued template parameters in the hash. */
66d7f48f 257 if (TYPE_TEMPLATE_ARGUMENT (t, i)->aclass () != LOC_TYPEDEF)
bd69fc68
TT
258 continue;
259
c819b2c0 260 tf = XOBNEW (&m_storage, struct decl_field);
987012b8 261 tf->name = TYPE_TEMPLATE_ARGUMENT (t, i)->linkage_name ();
5f9c5a63 262 tf->type = TYPE_TEMPLATE_ARGUMENT (t, i)->type ();
bd69fc68 263
fa9b1164 264 slot = htab_find_slot (m_table.get (), tf, INSERT);
bd69fc68
TT
265 if (*slot == NULL)
266 *slot = tf;
267 }
268}
269
c819b2c0 270/* See typeprint.h. */
bd69fc68 271
c819b2c0 272typedef_hash_table::typedef_hash_table ()
fa9b1164
TT
273 : m_table (htab_create_alloc (10, hash_typedef_field, eq_typedef_field,
274 NULL, xcalloc, xfree))
bd69fc68 275{
bd69fc68
TT
276}
277
c819b2c0 278/* Helper function for typedef_hash_table::copy. */
bd69fc68
TT
279
280static int
281copy_typedef_hash_element (void **slot, void *nt)
282{
19ba03f4 283 htab_t new_table = (htab_t) nt;
bd69fc68
TT
284 void **new_slot;
285
286 new_slot = htab_find_slot (new_table, *slot, INSERT);
287 if (*new_slot == NULL)
288 *new_slot = *slot;
289
290 return 1;
291}
292
c819b2c0 293/* See typeprint.h. */
18a9fc12 294
c819b2c0 295typedef_hash_table::typedef_hash_table (const typedef_hash_table &table)
18a9fc12 296{
fa9b1164
TT
297 m_table.reset (htab_create_alloc (10, hash_typedef_field, eq_typedef_field,
298 NULL, xcalloc, xfree));
299 htab_traverse_noresize (table.m_table.get (), copy_typedef_hash_element,
300 m_table.get ());
18a9fc12
TT
301}
302
303/* Look up the type T in the global typedef hash. If it is found,
304 return the typedef name. If it is not found, apply the
6dddc817 305 type-printers, if any, given by start_script_type_printers and return the
18a9fc12
TT
306 result. A NULL return means that the name was not found. */
307
c819b2c0
TT
308const char *
309typedef_hash_table::find_global_typedef (const struct type_print_options *flags,
310 struct type *t)
18a9fc12 311{
18a9fc12 312 void **slot;
883fd55a 313 struct decl_field tf, *new_tf;
18a9fc12
TT
314
315 if (flags->global_typedefs == NULL)
316 return NULL;
317
318 tf.name = NULL;
319 tf.type = t;
320
fa9b1164 321 slot = htab_find_slot (flags->global_typedefs->m_table.get (), &tf, INSERT);
18a9fc12
TT
322 if (*slot != NULL)
323 {
883fd55a 324 new_tf = (struct decl_field *) *slot;
18a9fc12
TT
325 return new_tf->name;
326 }
327
9b94fcf1
DE
328 /* Put an entry into the hash table now, in case
329 apply_ext_lang_type_printers recurses. */
c819b2c0 330 new_tf = XOBNEW (&flags->global_typedefs->m_storage, struct decl_field);
18a9fc12
TT
331 new_tf->name = NULL;
332 new_tf->type = t;
333
334 *slot = new_tf;
335
55af06a7
TT
336 gdb::unique_xmalloc_ptr<char> applied
337 = apply_ext_lang_type_printers (flags->global_printers, t);
18a9fc12 338
55af06a7
TT
339 if (applied != nullptr)
340 new_tf->name = obstack_strdup (&flags->global_typedefs->m_storage,
341 applied.get ());
18a9fc12
TT
342
343 return new_tf->name;
344}
345
c819b2c0 346/* See typeprint.h. */
bd69fc68
TT
347
348const char *
c819b2c0
TT
349typedef_hash_table::find_typedef (const struct type_print_options *flags,
350 struct type *t)
bd69fc68 351{
18a9fc12
TT
352 if (flags->local_typedefs != NULL)
353 {
883fd55a 354 struct decl_field tf, *found;
bd69fc68 355
18a9fc12
TT
356 tf.name = NULL;
357 tf.type = t;
fa9b1164
TT
358 htab_t table = flags->local_typedefs->m_table.get ();
359 found = (struct decl_field *) htab_find (table, &tf);
bd69fc68 360
18a9fc12
TT
361 if (found != NULL)
362 return found->name;
363 }
bd69fc68 364
18a9fc12 365 return find_global_typedef (flags, t);
bd69fc68
TT
366}
367
368\f
369
a5238fbc
PM
370/* Print a description of a type in the format of a
371 typedef for the current language.
c378eb4e 372 NEW is the new name for a type TYPE. */
a5238fbc
PM
373
374void
fe978cb0 375typedef_print (struct type *type, struct symbol *newobj, struct ui_file *stream)
a5238fbc 376{
d3b67c56 377 current_language->print_typedef (type, newobj, stream);
5c6ce71d
TT
378}
379
c906108c
SS
380/* Print a description of a type TYPE in the form of a declaration of a
381 variable named VARSTRING. (VARSTRING is demangled if necessary.)
382 Output goes to STREAM (via stdio).
383 If SHOW is positive, we show the contents of the outermost level
384 of structure even if there is a type name that could be used instead.
385 If SHOW is negative, we never show the details of elements' types. */
386
387void
0d5cff50 388type_print (struct type *type, const char *varstring, struct ui_file *stream,
fba45db2 389 int show)
c906108c 390{
13eb081a
TT
391 current_language->print_type (type, varstring, stream, show, 0,
392 &default_ptype_flags);
c906108c
SS
393}
394
ae6a3a4c
TJB
395/* Print TYPE to a string, returning it. The caller is responsible for
396 freeing the string. */
397
2f408ecb 398std::string
ae6a3a4c
TJB
399type_to_string (struct type *type)
400{
a70b8144 401 try
ae6a3a4c 402 {
d7e74731
PA
403 string_file stb;
404
405 type_print (type, "", &stb, -1);
5d10a204 406 return stb.release ();
ae6a3a4c 407 }
230d2906 408 catch (const gdb_exception &except)
492d29ea 409 {
492d29ea 410 }
ae6a3a4c 411
d7e74731 412 return {};
ae6a3a4c
TJB
413}
414
7022349d
PA
415/* See typeprint.h. */
416
417void
418type_print_unknown_return_type (struct ui_file *stream)
419{
7f6aba03
TT
420 fprintf_styled (stream, metadata_style.style (),
421 _("<unknown return type>"));
7022349d
PA
422}
423
46a4882b
PA
424/* See typeprint.h. */
425
426void
427error_unknown_type (const char *sym_print_name)
428{
429 error (_("'%s' has unknown type; cast it to its declared type"),
430 sym_print_name);
431}
432
c906108c
SS
433/* Print type of EXP, or last thing in value history if EXP == NULL.
434 show is passed to type_print. */
435
436static void
0b39b52e 437whatis_exp (const char *exp, int show)
c906108c 438{
3d6d86c6 439 struct value *val;
c5aa993b 440 struct type *real_type = NULL;
070ad9f0 441 struct type *type;
c906108c 442 int full = 0;
6b850546 443 LONGEST top = -1;
c906108c 444 int using_enc = 0;
79a45b7d 445 struct value_print_options opts;
53342f27 446 struct type_print_options flags = default_ptype_flags;
c906108c
SS
447
448 if (exp)
449 {
53342f27
TT
450 if (*exp == '/')
451 {
452 int seen_one = 0;
453
454 for (++exp; *exp && !isspace (*exp); ++exp)
455 {
456 switch (*exp)
457 {
458 case 'r':
459 flags.raw = 1;
460 break;
461 case 'm':
462 flags.print_methods = 0;
463 break;
464 case 'M':
465 flags.print_methods = 1;
466 break;
467 case 't':
468 flags.print_typedefs = 0;
469 break;
470 case 'T':
471 flags.print_typedefs = 1;
472 break;
7c161838
SDJ
473 case 'o':
474 {
475 /* Filter out languages which don't implement the
476 feature. */
46afe196 477 if (show > 0
97e20099 478 && current_language->can_print_type_offsets ())
7c161838
SDJ
479 {
480 flags.print_offsets = 1;
481 flags.print_typedefs = 0;
482 flags.print_methods = 0;
483 }
484 break;
485 }
fbb46296
LS
486 case 'x':
487 flags.print_in_hex = 1;
488 break;
489 case 'd':
490 flags.print_in_hex = 0;
491 break;
53342f27
TT
492 default:
493 error (_("unrecognized flag '%c'"), *exp);
494 }
495 seen_one = 1;
496 }
497
498 if (!*exp && !seen_one)
499 error (_("flag expected"));
500 if (!isspace (*exp))
501 error (_("expected space after format"));
502 exp = skip_spaces (exp);
503 }
504
4d01a485 505 expression_up expr = parse_expression (exp);
c973d0aa
PA
506
507 /* The behavior of "whatis" depends on whether the user
508 expression names a type directly, or a language expression
509 (including variable names). If the former, then "whatis"
510 strips one level of typedefs, only. If an expression,
511 "whatis" prints the type of the expression without stripping
512 any typedef level. "ptype" always strips all levels of
513 typedefs. */
ba71385e 514 val = expr->evaluate_type ();
d0c97917 515 type = val->type ();
a6f3c8a1 516
2adab65c 517 if (show == -1 && expr->first_opcode () == OP_TYPE)
c973d0aa
PA
518 {
519 /* The user expression names a type directly. */
c973d0aa
PA
520
521 /* If this is a typedef, then find its immediate target.
522 Use check_typedef to resolve stubs, but ignore its result
523 because we do not want to dig past all typedefs. */
524 check_typedef (type);
78134374 525 if (type->code () == TYPE_CODE_TYPEDEF)
27710edb 526 type = type->target_type ();
5c319bb2
PA
527
528 /* If the expression is actually a type, then there's no
529 value to fetch the dynamic type from. */
530 val = NULL;
c973d0aa 531 }
c906108c
SS
532 }
533 else
c973d0aa
PA
534 {
535 val = access_value_history (0);
d0c97917 536 type = val->type ();
c973d0aa 537 }
070ad9f0 538
0c1aa2a0
TT
539 if (flags.print_offsets && is_dynamic_type (type))
540 {
541 warning (_("ptype/o does not work with dynamic types; disabling '/o'"));
542 flags.print_offsets = 0;
543 }
544
79a45b7d 545 get_user_print_options (&opts);
5c319bb2 546 if (val != NULL && opts.objectprint)
070ad9f0 547 {
809f3be1 548 if (type->is_pointer_or_reference ()
27710edb 549 && (type->target_type ()->code () == TYPE_CODE_STRUCT))
dda83cd7 550 real_type = value_rtti_indirect_type (val, &full, &top, &using_enc);
78134374 551 else if (type->code () == TYPE_CODE_STRUCT)
41808ebe 552 real_type = value_rtti_type (val, &full, &top, &using_enc);
070ad9f0 553 }
c906108c 554
7c161838 555 if (flags.print_offsets
78134374
SM
556 && (type->code () == TYPE_CODE_STRUCT
557 || type->code () == TYPE_CODE_UNION))
6cb06a8c 558 gdb_printf ("/* offset | size */ ");
7c161838 559
6cb06a8c 560 gdb_printf ("type = ");
c906108c 561
c819b2c0
TT
562 std::unique_ptr<typedef_hash_table> table_holder;
563 std::unique_ptr<ext_lang_type_printers> printer_holder;
18a9fc12 564 if (!flags.raw)
c819b2c0
TT
565 {
566 table_holder.reset (new typedef_hash_table);
567 flags.global_typedefs = table_holder.get ();
568
569 printer_holder.reset (new ext_lang_type_printers);
570 flags.global_printers = printer_holder.get ();
571 }
18a9fc12 572
070ad9f0
DB
573 if (real_type)
574 {
6cb06a8c 575 gdb_printf ("/* real type = ");
070ad9f0
DB
576 type_print (real_type, "", gdb_stdout, -1);
577 if (! full)
6cb06a8c
TT
578 gdb_printf (" (incomplete object)");
579 gdb_printf (" */\n");
070ad9f0 580 }
c906108c 581
13eb081a 582 current_language->print_type (type, "", gdb_stdout, show, 0, &flags);
6cb06a8c 583 gdb_printf ("\n");
c906108c
SS
584}
585
c906108c 586static void
0b39b52e 587whatis_command (const char *exp, int from_tty)
c906108c
SS
588{
589 /* Most of the time users do not want to see all the fields
590 in a structure. If they do they can use the "ptype" command.
591 Hence the "-1" below. */
592 whatis_exp (exp, -1);
593}
594
c906108c
SS
595/* TYPENAME is either the name of a type, or an expression. */
596
c906108c 597static void
0b39b52e 598ptype_command (const char *type_name, int from_tty)
c906108c 599{
fe978cb0 600 whatis_exp (type_name, 1);
c906108c
SS
601}
602
603/* Print integral scalar data VAL, of type TYPE, onto stdio stream STREAM.
604 Used to print data from type structures in a specified type. For example,
605 array bounds may be characters or booleans in some languages, and this
606 allows the ranges to be printed in their "natural" form rather than as
607 decimal integer values.
608
609 FIXME: This is here simply because only the type printing routines
610 currently use it, and it wasn't clear if it really belonged somewhere
611 else (like printcmd.c). There are a lot of other gdb routines that do
612 something similar, but they are generally concerned with printing values
41808ebe 613 that come from the inferior in target byte order and target size. */
c906108c
SS
614
615void
fba45db2 616print_type_scalar (struct type *type, LONGEST val, struct ui_file *stream)
c906108c
SS
617{
618 unsigned int i;
619 unsigned len;
620
f168693b 621 type = check_typedef (type);
c906108c 622
78134374 623 switch (type->code ())
c906108c
SS
624 {
625
626 case TYPE_CODE_ENUM:
1f704f76 627 len = type->num_fields ();
c906108c
SS
628 for (i = 0; i < len; i++)
629 {
970db518 630 if (type->field (i).loc_enumval () == val)
c906108c
SS
631 {
632 break;
633 }
634 }
635 if (i < len)
636 {
0426ad51 637 gdb_puts (type->field (i).name (), stream);
c906108c
SS
638 }
639 else
640 {
641 print_longest (stream, 'd', 0, val);
642 }
643 break;
644
645 case TYPE_CODE_INT:
c6d940a9 646 print_longest (stream, type->is_unsigned () ? 'u' : 'd', 0, val);
c906108c
SS
647 break;
648
649 case TYPE_CODE_CHAR:
362501dc 650 current_language->printchar ((unsigned char) val, type, stream);
c906108c
SS
651 break;
652
653 case TYPE_CODE_BOOL:
6cb06a8c 654 gdb_printf (stream, val ? "TRUE" : "FALSE");
c906108c
SS
655 break;
656
657 case TYPE_CODE_RANGE:
27710edb 658 print_type_scalar (type->target_type (), val, stream);
c906108c
SS
659 return;
660
4afa9fd9
JB
661 case TYPE_CODE_FIXED_POINT:
662 print_type_fixed_point (type, stream);
663 break;
664
c906108c
SS
665 case TYPE_CODE_UNDEF:
666 case TYPE_CODE_PTR:
667 case TYPE_CODE_ARRAY:
668 case TYPE_CODE_STRUCT:
669 case TYPE_CODE_UNION:
670 case TYPE_CODE_FUNC:
671 case TYPE_CODE_FLT:
672 case TYPE_CODE_VOID:
673 case TYPE_CODE_SET:
674 case TYPE_CODE_STRING:
675 case TYPE_CODE_ERROR:
0d5de010
DJ
676 case TYPE_CODE_MEMBERPTR:
677 case TYPE_CODE_METHODPTR:
c906108c
SS
678 case TYPE_CODE_METHOD:
679 case TYPE_CODE_REF:
aa006118 680 case TYPE_CODE_RVALUE_REF:
5c4e30ca 681 case TYPE_CODE_NAMESPACE:
8a3fe4f8 682 error (_("internal error: unhandled type in print_type_scalar"));
c906108c
SS
683 break;
684
685 default:
8a3fe4f8 686 error (_("Invalid type code in symbol table."));
c906108c 687 }
c906108c
SS
688}
689
0c9150e4
JB
690/* See typeprint.h. */
691
692void
693print_type_fixed_point (struct type *type, struct ui_file *stream)
694{
e6fcee3a 695 std::string small_img = type->fixed_point_scaling_factor ().str ();
0c9150e4 696
6cb06a8c 697 gdb_printf (stream, "%s-byte fixed point (small = %s)",
df86565b 698 pulongest (type->length ()), small_img.c_str ());
0c9150e4
JB
699}
700
c906108c
SS
701/* Dump details of a type specified either directly or indirectly.
702 Uses the same sort of type lookup mechanism as ptype_command()
41808ebe 703 and whatis_command(). */
c906108c
SS
704
705void
58971144 706maintenance_print_type (const char *type_name, int from_tty)
c906108c 707{
fe978cb0 708 if (type_name != NULL)
c5aa993b 709 {
4d01a485 710 expression_up expr = parse_expression (type_name);
ba71385e 711 struct value *val = expr->evaluate_type ();
d0c97917 712 struct type *type = val->type ();
a6f3c8a1
TT
713
714 if (type != nullptr)
715 recursive_dump_type (type, 0);
c5aa993b 716 }
c906108c 717}
c906108c 718\f
c5aa993b 719
53342f27
TT
720struct cmd_list_element *setprinttypelist;
721
722struct cmd_list_element *showprinttypelist;
723
491144b5 724static bool print_methods = true;
53342f27
TT
725
726static void
eb4c3f4a
TT
727set_print_type_methods (const char *args,
728 int from_tty, struct cmd_list_element *c)
53342f27
TT
729{
730 default_ptype_flags.print_methods = print_methods;
731}
732
733static void
734show_print_type_methods (struct ui_file *file, int from_tty,
735 struct cmd_list_element *c, const char *value)
736{
6cb06a8c
TT
737 gdb_printf (file, _("Printing of methods defined in a class in %s\n"),
738 value);
53342f27
TT
739}
740
491144b5 741static bool print_typedefs = true;
53342f27
TT
742
743static void
eb4c3f4a
TT
744set_print_type_typedefs (const char *args,
745 int from_tty, struct cmd_list_element *c)
53342f27
TT
746{
747 default_ptype_flags.print_typedefs = print_typedefs;
748}
749
750static void
751show_print_type_typedefs (struct ui_file *file, int from_tty,
752 struct cmd_list_element *c, const char *value)
753{
6cb06a8c
TT
754 gdb_printf (file, _("Printing of typedefs defined in a class in %s\n"),
755 value);
53342f27
TT
756}
757
883fd55a
KS
758/* Limit on the number of nested type definitions to print or -1 to print
759 all nested type definitions in a class. By default, we do not print
760 nested definitions. */
761
762static int print_nested_type_limit = 0;
763
764/* Set how many nested type definitions should be printed by the type
765 printer. */
766
767static void
768set_print_type_nested_types (const char *args, int from_tty,
769 struct cmd_list_element *c)
770{
771 default_ptype_flags.print_nested_type_limit = print_nested_type_limit;
772}
773
774/* Show how many nested type definitions the type printer will print. */
775
776static void
777show_print_type_nested_types (struct ui_file *file, int from_tty,
778 struct cmd_list_element *c, const char *value)
779{
780 if (*value == '0')
781 {
6cb06a8c
TT
782 gdb_printf (file,
783 _("Will not print nested types defined in a class\n"));
883fd55a
KS
784 }
785 else
786 {
6cb06a8c
TT
787 gdb_printf (file,
788 _("Will print %s nested types defined in a class\n"),
789 value);
883fd55a
KS
790 }
791}
792
fbb46296
LS
793/* When printing structs, offsets and sizes of members can be displayed using
794 decimal notation or hexadecimal notation. By default, Decimal notation is
795 used. */
796
797static bool print_offsets_and_sizes_in_hex = false;
798
799/* Set the flags that instructs if sizes and offsets of struct members are
800 displayed in hexadecimal or decimal notation. */
801
802static void
803set_print_offsets_and_sizes_in_hex (const char *args,
804 int from_tty, struct cmd_list_element *c)
805{
806 default_ptype_flags.print_in_hex = print_offsets_and_sizes_in_hex;
807}
808
809/* Display whether struct members sizes and offsets are printed
810 using decimal or hexadecimal notation. */
811
812static void
813show_print_offsets_and_sizes_in_hex (struct ui_file *file, int from_tty,
814 struct cmd_list_element *c,
815 const char *value)
816{
6cb06a8c 817 gdb_printf (file, _("\
fbb46296 818Display of struct members offsets and sizes in hexadecimal is %s\n"),
6cb06a8c 819 value);
fbb46296
LS
820}
821
6c265988 822void _initialize_typeprint ();
c906108c 823void
6c265988 824_initialize_typeprint ()
c906108c 825{
4fc5d43e
TT
826 struct cmd_list_element *c;
827
828 c = add_com ("ptype", class_vars, ptype_command, _("\
1bedd215 829Print definition of type TYPE.\n\
a9375afe
DE
830Usage: ptype[/FLAGS] TYPE | EXPRESSION\n\
831Argument may be any type (for example a type name defined by typedef,\n\
832or \"struct STRUCT-TAG\" or \"class CLASS-NAME\" or \"union UNION-TAG\"\n\
833or \"enum ENUM-TAG\") or an expression.\n\
11081198 834The selected stack frame's lexical context is used to look up the name.\n\
53342f27
TT
835Contrary to \"whatis\", \"ptype\" always unrolls any typedefs.\n\
836\n\
837Available FLAGS are:\n\
838 /r print in \"raw\" form; do not substitute typedefs\n\
839 /m do not print methods defined in a class\n\
840 /M print methods defined in a class\n\
841 /t do not print typedefs defined in a class\n\
7c161838 842 /T print typedefs defined in a class\n\
fbb46296
LS
843 /o print offsets and sizes of fields in a struct (like pahole)\n\
844 /x use hexadecimal notation when displaying sizes and offsets\n\
287de656 845 of struct members\n\
fbb46296 846 /d use decimal notation when displaying sizes and offsets\n\
287de656 847 of struct members "));
4fc5d43e 848 set_cmd_completer (c, expression_completer);
c906108c 849
4fc5d43e
TT
850 c = add_com ("whatis", class_vars, whatis_command,
851 _("Print data type of expression EXP.\n\
11081198 852Only one level of typedefs is unrolled. See also \"ptype\"."));
4fc5d43e 853 set_cmd_completer (c, expression_completer);
53342f27 854
f54bdb6d
SM
855 add_setshow_prefix_cmd ("type", no_class,
856 _("Generic command for showing type-printing settings."),
857 _("Generic command for setting how types print."),
858 &setprinttypelist, &showprinttypelist,
859 &setprintlist, &showprintlist);
53342f27
TT
860
861 add_setshow_boolean_cmd ("methods", no_class, &print_methods,
862 _("\
863Set printing of methods defined in classes."), _("\
864Show printing of methods defined in classes."), NULL,
865 set_print_type_methods,
866 show_print_type_methods,
867 &setprinttypelist, &showprinttypelist);
868 add_setshow_boolean_cmd ("typedefs", no_class, &print_typedefs,
869 _("\
870Set printing of typedefs defined in classes."), _("\
871Show printing of typedefs defined in classes."), NULL,
872 set_print_type_typedefs,
873 show_print_type_typedefs,
874 &setprinttypelist, &showprinttypelist);
883fd55a
KS
875
876 add_setshow_zuinteger_unlimited_cmd ("nested-type-limit", no_class,
877 &print_nested_type_limit,
878 _("\
879Set the number of recursive nested type definitions to print \
880(\"unlimited\" or -1 to show all)."), _("\
881Show the number of recursive nested type definitions to print."), NULL,
882 set_print_type_nested_types,
883 show_print_type_nested_types,
884 &setprinttypelist, &showprinttypelist);
fbb46296
LS
885
886 add_setshow_boolean_cmd ("hex", no_class, &print_offsets_and_sizes_in_hex,
887 _("\
888Set printing of struct members sizes and offsets using hex notation."), _("\
889Show whether sizes and offsets of struct members are printed using hex \
890notation."), nullptr, set_print_offsets_and_sizes_in_hex,
891 show_print_offsets_and_sizes_in_hex,
892 &setprinttypelist, &showprinttypelist);
c906108c 893}
3f2f83dd
KB
894
895/* Print <not allocated> status to stream STREAM. */
896
897void
898val_print_not_allocated (struct ui_file *stream)
899{
7f6aba03 900 fprintf_styled (stream, metadata_style.style (), _("<not allocated>"));
3f2f83dd
KB
901}
902
903/* Print <not associated> status to stream STREAM. */
904
905void
906val_print_not_associated (struct ui_file *stream)
907{
7f6aba03 908 fprintf_styled (stream, metadata_style.style (), _("<not associated>"));
3f2f83dd 909}