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