From 53342f27db8e8a418ac202335ac2e55af50c1c2f Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 12 Nov 2012 17:26:21 +0000 Subject: [PATCH] * NEWS: Update. * c-typeprint.c (c_type_print_base): Handle print_method and print_typedefs flags. * gdbcmd.h (setprinttypelist, showprinttypelist): Declare. * python/py-type.c (typy_str): Use LA_PRINT_TYPE and raw options. * typeprint.c (type_print_raw_options, default_ptype_flags): Update for new field.s (whatis_exp): Parse flags. Use LA_PRINT_TYPE. (setprinttypelist, showprinttypelist, print_methods, print_typedefs): New globals. (set_print_type, show_print_type, set_print_type_methods, show_print_type_methods, set_print_type_typedefs, show_print_type_typedefs): New functions. (_initialize_typeprint): Update documentation. Add "print type methods" and "print type typedefs" parameters. * typeprint.h (struct type_print_options) : New fields. doc * gdb.texinfo (Symbols): Document "set print type methods", "set print type typedefs", and flags to ptype and whatis. --- gdb/ChangeLog | 21 +++++++ gdb/NEWS | 15 +++++ gdb/c-typeprint.c | 4 +- gdb/doc/ChangeLog | 5 ++ gdb/doc/gdb.texinfo | 66 ++++++++++++++++++++- gdb/gdbcmd.h | 4 ++ gdb/python/py-type.c | 4 +- gdb/typeprint.c | 133 +++++++++++++++++++++++++++++++++++++++++-- gdb/typeprint.h | 6 ++ 9 files changed, 250 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5fd248f9098..2b0af1af0d7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,24 @@ +2012-11-12 Tom Tromey + + * NEWS: Update. + * c-typeprint.c (c_type_print_base): Handle print_method and + print_typedefs flags. + * gdbcmd.h (setprinttypelist, showprinttypelist): Declare. + * python/py-type.c (typy_str): Use LA_PRINT_TYPE and raw + options. + * typeprint.c (type_print_raw_options, default_ptype_flags): + Update for new field.s + (whatis_exp): Parse flags. Use LA_PRINT_TYPE. + (setprinttypelist, showprinttypelist, print_methods, + print_typedefs): New globals. + (set_print_type, show_print_type, set_print_type_methods, + show_print_type_methods, set_print_type_typedefs, + show_print_type_typedefs): New functions. + (_initialize_typeprint): Update documentation. Add "print + type methods" and "print type typedefs" parameters. + * typeprint.h (struct type_print_options) : New fields. + 2012-11-12 Tom Tromey * c-typeprint.c (cp_type_print_method_args): Add flags diff --git a/gdb/NEWS b/gdb/NEWS index 4a1988db0e5..b7a92720efc 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -8,6 +8,9 @@ -nh Disables auto-loading of ~/.gdbinit, but still executes all the other initialization files, unlike -nx which disables all of them. +* The 'ptype' and 'whatis' commands now accept an argument to control + type formatting. + * Python scripting ** Vectors can be created with gdb.Type.vector. @@ -54,6 +57,18 @@ py [command] (has been deprecated in GDB 7.5), and "info all-registers" should be used instead. +* New options + +set print type methods (on|off) +show print type methods + Control whether method declarations are displayed by "ptype". + The default is to show them. + +set print type typedefs (on|off) +show print type typedefs + Control whether typedef definitions are displayed by "ptype". + The default is to show them. + * MI changes ** Command parameter changes are now notified using new async record diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c index cb44bb08695..6c4737657df 100644 --- a/gdb/c-typeprint.c +++ b/gdb/c-typeprint.c @@ -970,6 +970,8 @@ c_type_print_base (struct type *type, struct ui_file *stream, between them. Make sure to count only method that we will display; artificial methods will be hidden. */ len = TYPE_NFN_FIELDS (type); + if (!flags->print_methods) + len = 0; real_len = 0; for (i = 0; i < len; i++) { @@ -1136,7 +1138,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, /* Print typedefs defined in this class. */ - if (TYPE_TYPEDEF_FIELD_COUNT (type) != 0) + if (TYPE_TYPEDEF_FIELD_COUNT (type) != 0 && flags->print_typedefs) { if (TYPE_NFIELDS (type) != 0 || TYPE_NFN_FIELDS (type) != 0) fprintf_filtered (stream, "\n"); diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 2fc837b901b..f59b001e3f6 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2012-11-12 Tom Tromey + + * gdb.texinfo (Symbols): Document "set print type methods", + "set print type typedefs", and flags to ptype and whatis. + 2012-11-09 Andrew Burgess * gdb.texinfo (GDB/MI Data Manipulation): Add fullname field to diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index ce5415d56c8..6f9d3f654d2 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -14990,6 +14990,42 @@ case-insensitive matches. This command shows the current setting of case sensitivity for symbols lookups. +@kindex set print type methods +@item set print type methods +@itemx set print type methods on +@itemx set print type methods off +Normally, when @value{GDBN} prints a class, it displays any methods +declared in that class. You can control this behavior either by +passing the appropriate flag to @code{ptype}, or using @command{set +print type methods}. Specifying @code{on} will cause @value{GDBN} to +display the methods; this is the default. Specifying @code{off} will +cause @value{GDBN} to omit the methods. + +@kindex show print type methods +@item show print type methods +This command shows the current setting of method display when printing +classes. + +@kindex set print type typedefs +@item set print type typedefs +@itemx set print type typedefs on +@itemx set print type typedefs off + +Normally, when @value{GDBN} prints a class, it displays any typedefs +defined in that class. You can control this behavior either by +passing the appropriate flag to @code{ptype}, or using @command{set +print type typedefs}. Specifying @code{on} will cause @value{GDBN} to +display the typedef definitions; this is the default. Specifying +@code{off} will cause @value{GDBN} to omit the typedef definitions. +Note that this controls whether the typedef definition itself is +printed, not whether typedef names are substituted when printing other +types. + +@kindex show print type typedefs +@item show print type typedefs +This command shows the current setting of typedef display when +printing classes. + @kindex info address @cindex address of a symbol @item info address @var{symbol} @@ -15030,7 +15066,7 @@ __read_nocancel + 6 in section .text of /usr/lib64/libc.so.6 @end smallexample @kindex whatis -@item whatis [@var{arg}] +@item whatis[/@var{flags}] [@var{arg}] Print the data type of @var{arg}, which can be either an expression or a name of a data type. With no argument, print the data type of @code{$}, the last value in the value history. @@ -15060,8 +15096,34 @@ For C code, the type names may also have the form @samp{class @var{class-name}}, @samp{struct @var{struct-tag}}, @samp{union @var{union-tag}} or @samp{enum @var{enum-tag}}. +@var{flags} can be used to modify how the type is displayed. +Available flags are: + +@table @code +@item r +Display in ``raw'' form. Normally, @value{GDBN} substitutes template +parameters and typedefs defined in a class when printing the class' +members. The @code{/r} flag disables this. + +@item m +Do not print methods defined in the class. + +@item M +Print methods defined in the class. This is the default, but the flag +exists in case you change the default with @command{set print type methods}. + +@item t +Do not print typedefs defined in the class. Note that this controls +whether the typedef definition itself is printed, not whether typedef +names are substituted when printing other types. + +@item T +Print typedefs defined in the class. This is the default, but the flag +exists in case you change the default with @command{set print type typedefs}. +@end table + @kindex ptype -@item ptype [@var{arg}] +@item ptype[/@var{flags}] [@var{arg}] @code{ptype} accepts the same arguments as @code{whatis}, but prints a detailed description of the type, instead of just the name of the type. @xref{Expressions, ,Expressions}. diff --git a/gdb/gdbcmd.h b/gdb/gdbcmd.h index c7e3a277583..b64d29499d6 100644 --- a/gdb/gdbcmd.h +++ b/gdb/gdbcmd.h @@ -112,6 +112,10 @@ extern struct cmd_list_element *setprintlist; extern struct cmd_list_element *showprintlist; +extern struct cmd_list_element *setprinttypelist; + +extern struct cmd_list_element *showprinttypelist; + extern struct cmd_list_element *setdebuglist; extern struct cmd_list_element *showdebuglist; diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index f20f97400ce..1f4e72c71ca 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -30,6 +30,7 @@ #include "vec.h" #include "bcache.h" #include "dwarf2loc.h" +#include "typeprint.h" typedef struct pyty_type_object { @@ -954,7 +955,8 @@ typy_str (PyObject *self) stb = mem_fileopen (); old_chain = make_cleanup_ui_file_delete (stb); - type_print (type_object_to_type (self), "", stb, -1); + LA_PRINT_TYPE (type_object_to_type (self), "", stb, -1, 0, + &type_print_raw_options); thetype = ui_file_xstrdup (stb, &length); do_cleanups (old_chain); diff --git a/gdb/typeprint.c b/gdb/typeprint.c index cc51497746f..509b3ee3632 100644 --- a/gdb/typeprint.c +++ b/gdb/typeprint.c @@ -36,6 +36,8 @@ #include "exceptions.h" #include "valprint.h" #include +#include +#include "cli/cli-utils.h" extern void _initialize_typeprint (void); @@ -47,16 +49,22 @@ static void whatis_exp (char *, int); const struct type_print_options type_print_raw_options = { - 1 /* raw */ + 1, /* raw */ + 1, /* print_methods */ + 1 /* print_typedefs */ }; /* The default flags for 'ptype' and 'whatis'. */ static struct type_print_options default_ptype_flags = { - 0 /* raw */ + 0, /* raw */ + 1, /* print_methods */ + 1 /* print_typedefs */ }; + + /* Print a description of a type in the format of a typedef for the current language. NEW is the new name for a type TYPE. */ @@ -132,9 +140,46 @@ whatis_exp (char *exp, int show) int top = -1; int using_enc = 0; struct value_print_options opts; + struct type_print_options flags = default_ptype_flags; if (exp) { + if (*exp == '/') + { + int seen_one = 0; + + for (++exp; *exp && !isspace (*exp); ++exp) + { + switch (*exp) + { + case 'r': + flags.raw = 1; + break; + case 'm': + flags.print_methods = 0; + break; + case 'M': + flags.print_methods = 1; + break; + case 't': + flags.print_typedefs = 0; + break; + case 'T': + flags.print_typedefs = 1; + break; + default: + error (_("unrecognized flag '%c'"), *exp); + } + seen_one = 1; + } + + if (!*exp && !seen_one) + error (_("flag expected")); + if (!isspace (*exp)) + error (_("expected space after format")); + exp = skip_spaces (exp); + } + expr = parse_expression (exp); old_chain = make_cleanup (free_current_contents, &expr); val = evaluate_type (expr); @@ -166,7 +211,7 @@ whatis_exp (char *exp, int show) printf_filtered (" */\n"); } - type_print (type, "", gdb_stdout, show); + LA_PRINT_TYPE (type, "", gdb_stdout, show, 0, &flags); printf_filtered ("\n"); if (exp) @@ -310,17 +355,97 @@ maintenance_print_type (char *typename, int from_tty) } +struct cmd_list_element *setprinttypelist; + +struct cmd_list_element *showprinttypelist; + +static void +set_print_type (char *arg, int from_tty) +{ + printf_unfiltered ( + "\"set print type\" must be followed by the name of a subcommand.\n"); + help_list (setprintlist, "set print type ", -1, gdb_stdout); +} + +static void +show_print_type (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) +{ + default_ptype_flags.print_methods = print_methods; +} + +static void +show_print_type_methods (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + fprintf_filtered (file, _("Printing of methods defined in a class in %s\n"), + value); +} + +static int print_typedefs = 1; + +static void +set_print_type_typedefs (char *args, int from_tty, struct cmd_list_element *c) +{ + default_ptype_flags.print_typedefs = print_typedefs; +} + +static void +show_print_type_typedefs (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + fprintf_filtered (file, _("Printing of typedefs defined in a class in %s\n"), + value); +} + void _initialize_typeprint (void) { add_com ("ptype", class_vars, ptype_command, _("\ Print definition of type TYPE.\n\ +Usage: ptype[/FLAGS] TYPE-NAME | EXPRESSION\n\ Argument may be a type name defined by typedef, or \"struct STRUCT-TAG\"\n\ or \"class CLASS-NAME\" or \"union UNION-TAG\" or \"enum ENUM-TAG\".\n\ The selected stack frame's lexical context is used to look up the name.\n\ -Contrary to \"whatis\", \"ptype\" always unrolls any typedefs.")); +Contrary to \"whatis\", \"ptype\" always unrolls any typedefs.\n\ +\n\ +Available FLAGS are:\n\ + /r print in \"raw\" form; do not substitute typedefs\n\ + /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")); add_com ("whatis", class_vars, whatis_command, _("Print data type of expression EXP.\n\ Only one level of typedefs is unrolled. See also \"ptype\".")); + + add_prefix_cmd ("type", no_class, show_print_type, + _("Generic command for showing type-printing settings."), + &showprinttypelist, "show print type ", 0, &showprintlist); + add_prefix_cmd ("type", no_class, set_print_type, + _("Generic command for setting how types print."), + &setprinttypelist, "show print type ", 0, &setprintlist); + + add_setshow_boolean_cmd ("methods", no_class, &print_methods, + _("\ +Set printing of methods defined in classes."), _("\ +Show printing of methods defined in classes."), NULL, + set_print_type_methods, + show_print_type_methods, + &setprinttypelist, &showprinttypelist); + add_setshow_boolean_cmd ("typedefs", no_class, &print_typedefs, + _("\ +Set printing of typedefs defined in classes."), _("\ +Show printing of typedefs defined in classes."), NULL, + set_print_type_typedefs, + show_print_type_typedefs, + &setprinttypelist, &showprinttypelist); } diff --git a/gdb/typeprint.h b/gdb/typeprint.h index c57c75e45f4..1e1509782f9 100644 --- a/gdb/typeprint.h +++ b/gdb/typeprint.h @@ -27,6 +27,12 @@ struct type_print_options { /* True means that no special printing flags should apply. */ unsigned int raw : 1; + + /* True means print methods in a class. */ + unsigned int print_methods : 1; + + /* True means print typedefs in a class. */ + unsigned int print_typedefs : 1; }; extern const struct type_print_options type_print_raw_options; -- 2.30.2