#include "extension.h"
#include "completer.h"
-static void ptype_command (char *, int);
-
-static void whatis_command (char *, int);
-
-static void whatis_exp (char *, int);
-
const struct type_print_options type_print_raw_options =
{
1, /* raw */
1, /* print_methods */
1, /* print_typedefs */
+ 0, /* print_offsets */
+ 0, /* print_nested_type_limit */
NULL, /* local_typedefs */
NULL, /* global_table */
NULL /* global_printers */
0, /* raw */
1, /* print_methods */
1, /* print_typedefs */
+ 0, /* print_offsets */
+ 0, /* print_nested_type_limit */
NULL, /* local_typedefs */
NULL, /* global_table */
NULL /* global_printers */
static hashval_t
hash_typedef_field (const void *p)
{
- const struct typedef_field *tf = (const struct typedef_field *) p;
+ const struct decl_field *tf = (const struct decl_field *) p;
struct type *t = check_typedef (tf->type);
return htab_hash_string (TYPE_SAFE_NAME (t));
static int
eq_typedef_field (const void *a, const void *b)
{
- const struct typedef_field *tfa = (const struct typedef_field *) a;
- const struct typedef_field *tfb = (const struct typedef_field *) b;
+ const struct decl_field *tfa = (const struct decl_field *) a;
+ const struct decl_field *tfb = (const struct decl_field *) b;
return types_equal (tfa->type, tfb->type);
}
for (i = 0; i < TYPE_TYPEDEF_FIELD_COUNT (t); ++i)
{
- struct typedef_field *tdef = &TYPE_TYPEDEF_FIELD (t, i);
+ struct decl_field *tdef = &TYPE_TYPEDEF_FIELD (t, i);
void **slot;
slot = htab_find_slot (table->table, tdef, INSERT);
for (i = 0; i < TYPE_N_TEMPLATE_ARGUMENTS (t); ++i)
{
- struct typedef_field *tf;
+ struct decl_field *tf;
void **slot;
/* We only want type-valued template parameters in the hash. */
if (SYMBOL_CLASS (TYPE_TEMPLATE_ARGUMENT (t, i)) != LOC_TYPEDEF)
continue;
- tf = XOBNEW (&table->storage, struct typedef_field);
+ tf = XOBNEW (&table->storage, struct decl_field);
tf->name = SYMBOL_LINKAGE_NAME (TYPE_TEMPLATE_ARGUMENT (t, i));
tf->type = SYMBOL_TYPE (TYPE_TEMPLATE_ARGUMENT (t, i));
{
char *applied;
void **slot;
- struct typedef_field tf, *new_tf;
+ struct decl_field tf, *new_tf;
if (flags->global_typedefs == NULL)
return NULL;
slot = htab_find_slot (flags->global_typedefs->table, &tf, INSERT);
if (*slot != NULL)
{
- new_tf = (struct typedef_field *) *slot;
+ new_tf = (struct decl_field *) *slot;
return new_tf->name;
}
/* Put an entry into the hash table now, in case
apply_ext_lang_type_printers recurses. */
- new_tf = XOBNEW (&flags->global_typedefs->storage, struct typedef_field);
+ new_tf = XOBNEW (&flags->global_typedefs->storage, struct decl_field);
new_tf->name = NULL;
new_tf->type = t;
{
if (flags->local_typedefs != NULL)
{
- struct typedef_field tf, *found;
+ struct decl_field tf, *found;
tf.name = NULL;
tf.type = t;
- found = (struct typedef_field *) htab_find (flags->local_typedefs->table,
- &tf);
+ found = (struct decl_field *) htab_find (flags->local_typedefs->table,
+ &tf);
if (found != NULL)
return found->name;
show is passed to type_print. */
static void
-whatis_exp (char *exp, int show)
+whatis_exp (const char *exp, int show)
{
struct value *val;
struct cleanup *old_chain;
case 'T':
flags.print_typedefs = 1;
break;
+ case 'o':
+ {
+ /* Filter out languages which don't implement the
+ feature. */
+ if (show > 0
+ && (current_language->la_language == language_c
+ || current_language->la_language == language_cplus))
+ {
+ flags.print_offsets = 1;
+ flags.print_typedefs = 0;
+ flags.print_methods = 0;
+ }
+ break;
+ }
default:
error (_("unrecognized flag '%c'"), *exp);
}
real_type = value_rtti_type (val, &full, &top, &using_enc);
}
+ if (flags.print_offsets
+ && (TYPE_CODE (type) == TYPE_CODE_STRUCT
+ || TYPE_CODE (type) == TYPE_CODE_UNION))
+ fprintf_filtered (gdb_stdout, "/* offset | size */ ");
+
printf_filtered ("type = ");
if (!flags.raw)
}
static void
-whatis_command (char *exp, int from_tty)
+whatis_command (const char *exp, int from_tty)
{
/* Most of the time users do not want to see all the fields
in a structure. If they do they can use the "ptype" command.
/* TYPENAME is either the name of a type, or an expression. */
static void
-ptype_command (char *type_name, int from_tty)
+ptype_command (const char *type_name, int from_tty)
{
whatis_exp (type_name, 1);
}
and whatis_command(). */
void
-maintenance_print_type (char *type_name, int from_tty)
+maintenance_print_type (const char *type_name, int from_tty)
{
struct value *val;
struct type *type;
struct cmd_list_element *showprinttypelist;
static void
-set_print_type (char *arg, int from_tty)
+set_print_type (const char *arg, int from_tty)
{
printf_unfiltered (
"\"set print type\" must be followed by the name of a subcommand.\n");
}
static void
-show_print_type (char *args, int from_tty)
+show_print_type (const char *args, int from_tty)
{
cmd_show_list (showprinttypelist, from_tty, "");
}
static int print_methods = 1;
static void
-set_print_type_methods (char *args, int from_tty, struct cmd_list_element *c)
+set_print_type_methods (const char *args,
+ int from_tty, struct cmd_list_element *c)
{
default_ptype_flags.print_methods = print_methods;
}
static int print_typedefs = 1;
static void
-set_print_type_typedefs (char *args, int from_tty, struct cmd_list_element *c)
+set_print_type_typedefs (const char *args,
+ int from_tty, struct cmd_list_element *c)
{
default_ptype_flags.print_typedefs = print_typedefs;
}
value);
}
+/* Limit on the number of nested type definitions to print or -1 to print
+ all nested type definitions in a class. By default, we do not print
+ nested definitions. */
+
+static int print_nested_type_limit = 0;
+
+/* Set how many nested type definitions should be printed by the type
+ printer. */
+
+static void
+set_print_type_nested_types (const char *args, int from_tty,
+ struct cmd_list_element *c)
+{
+ default_ptype_flags.print_nested_type_limit = print_nested_type_limit;
+}
+
+/* Show how many nested type definitions the type printer will print. */
+
+static void
+show_print_type_nested_types (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ if (*value == '0')
+ {
+ fprintf_filtered (file,
+ _("Will not print nested types defined in a class\n"));
+ }
+ else
+ {
+ fprintf_filtered (file,
+ _("Will print %s nested types defined in a class\n"),
+ value);
+ }
+}
+
void
_initialize_typeprint (void)
{
/m do not print methods defined in a class\n\
/M print methods defined in a class\n\
/t do not print typedefs defined in a class\n\
- /T print typedefs defined in a class"));
+ /T print typedefs defined in a class\n\
+ /o print offsets and sizes of fields in a struct (like pahole)\n"));
set_cmd_completer (c, expression_completer);
c = add_com ("whatis", class_vars, whatis_command,
set_print_type_typedefs,
show_print_type_typedefs,
&setprinttypelist, &showprinttypelist);
+
+ add_setshow_zuinteger_unlimited_cmd ("nested-type-limit", no_class,
+ &print_nested_type_limit,
+ _("\
+Set the number of recursive nested type definitions to print \
+(\"unlimited\" or -1 to show all)."), _("\
+Show the number of recursive nested type definitions to print."), NULL,
+ set_print_type_nested_types,
+ show_print_type_nested_types,
+ &setprinttypelist, &showprinttypelist);
}
/* Print <not allocated> status to stream STREAM. */