This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 6/9] add ptype/r to the cli


This adds flags to ptype and whatis.  It also adds "set print type
methods" and "set print type typedefs" parameters.

The new flags are:

  /r  raw - do not print typedefs, and (later) disable Python printing
  /m  do not print methods declared in the class
  /M  print methods.  this is an option in case the user disables
      method printing globally with set print type methods off
  /t  do not print typedefs defined in the class
  /T  print typedefs.  this is an option in case the user disables
      typedef printing globally with set print type typedefs off

The flags work a little right now, but not fully.  I split the patch
up both to make it simpler to understand, and also to make it easier
to change the flag spellings should the need arise.

We could add new flags, too.  I've considered adding one to disable
printing of static fields, or another to act something like "pahole".

I have only updated the C type printer because that is the one where
this feature is most important; besides which I don't actually know
most of the other languages.  (I may update the Java printer, too --
but as Java doesn't have typedefs, most of this feature isn't as
interesting there.)

Built and regtested on x86-64 F16.

	* 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) <print_methods,
	print_typedefs>: New fields.

	* gdb.texinfo (Symbols): Document "set print type methods",
	"set print type typedefs", and flags to ptype and whatis.
---
 gdb/c-typeprint.c    |    4 +-
 gdb/doc/gdb.texinfo  |   63 +++++++++++++++++++++++-
 gdb/gdbcmd.h         |    4 ++
 gdb/python/py-type.c |    4 +-
 gdb/typeprint.c      |  133 ++++++++++++++++++++++++++++++++++++++++++++++++--
 gdb/typeprint.h      |    6 ++
 6 files changed, 206 insertions(+), 8 deletions(-)

diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c
index 661ce09..371f002 100644
--- a/gdb/c-typeprint.c
+++ b/gdb/c-typeprint.c
@@ -967,6 +967,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++)
 	    {
@@ -1133,7 +1135,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/gdb.texinfo b/gdb/doc/gdb.texinfo
index 2d49e13..2c047a5 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -14978,6 +14978,39 @@ 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 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 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.
+
+@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}
@@ -15018,7 +15051,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.
@@ -15048,8 +15081,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 c7e3a27..b64d294 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 f20f974..1f4e72c 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 cc51497..509b3ee 100644
--- a/gdb/typeprint.c
+++ b/gdb/typeprint.c
@@ -36,6 +36,8 @@
 #include "exceptions.h"
 #include "valprint.h"
 #include <errno.h>
+#include <ctype.h>
+#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 c57c75e..1e15097 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;
-- 
1.7.7.6


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]