New Ada maintenance command to ignore descriptive types (DWARF).
authorJoel Brobecker <brobecker@adacore.com>
Thu, 16 Jan 2014 11:08:16 +0000 (15:08 +0400)
committerJoel Brobecker <brobecker@adacore.com>
Tue, 28 Jan 2014 03:01:48 +0000 (07:01 +0400)
Currently, Ada debugging requires the use of certain GNAT-specific
encodings, which are generated by the compiler. These encodings
were created a long time ago to work around the fairly limited
capabilities of the stabs debugging format. With DWARF, the vast
majority of the encodings could be abandoned in favor of a pure
DWARF approach.

In order to make it easier to evaluate the quality of the DWARF
debugging information generated by the compiler, and how the debugger
handles it, we are introducing a small Ada-specific maintenance
setting which changes the debugger's behavior to ignore descriptive
types. Descriptive types are artificial types generated by the
compiler purely to give the debugger hints as to how to properly
decode certain properties of a type.  For instance, for array
types, it generates a parallel type whose name is the name of
the array suffixed with ___XA, whose contents tells us what
the array's index type is, and possibly its bounds. See GCC's
gcc/ada/exp_dbug.ads for the full description of all encodings.

This is only a first step, as this setting does not deactivate
all encodings; More settings dedicated to each type of encoding
will likely be implemented in the future, as we make progress.

gdb/ChangeLog:

        * ada-lang.c (maint_set_ada_cmdlist, maint_show_ada_cmdlist):
        New static globals.
        (maint_set_ada_cmd, maint_show_ada_cmd): New functions.
        (ada_ignore_descriptive_types_p): New static global.
        (find_parallel_type_by_descriptive_type): Return immediately
        if ada_ignore_descriptive_types_p is set.
        (_initialize_ada_language): Register new commands "maintenance
        set ada", "maintenance show ada", "maintenance set ada
        ignore-descriptive-types" and "maintenance show ada
        ignore-descriptive-types".
        * NEWS: Add entry for new "maint ada set/show
        ignore-descriptive-types" commands.

gdb/doc/ChangeLog:

        * gdb.texinfo (Ada Glitches): Document the new "maint ada set/show
        ignore-descriptive-types". commands.

gdb/ChangeLog
gdb/NEWS
gdb/ada-lang.c
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo

index 0c0a8b2656995cea1ec2ab1e04247404fabeac97..d6f5515ce5b76755fd6232ab8b16d528c389a545 100644 (file)
@@ -1,3 +1,18 @@
+2014-01-28  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-lang.c (maint_set_ada_cmdlist, maint_show_ada_cmdlist):
+       New static globals.
+       (maint_set_ada_cmd, maint_show_ada_cmd): New functions.
+       (ada_ignore_descriptive_types_p): New static global.
+       (find_parallel_type_by_descriptive_type): Return immediately
+       if ada_ignore_descriptive_types_p is set.
+       (_initialize_ada_language): Register new commands "maintenance
+       set ada", "maintenance show ada", "maintenance set ada
+       ignore-descriptive-types" and "maintenance show ada
+       ignore-descriptive-types".
+       * NEWS: Add entry for new "maint ada set/show
+       ignore-descriptive-types" commands.
+
 2014-01-27  Markus Metzger  <markus.t.metzger@intel.com>
 
        * record-btrace.c (record_btrace_close): Call btrace_teardown
index 6b1aacb731a97b95e903d5af4c793d79c51e54b2..5062e02e7acdd72b3bba31e2a7c28f61ff462d13 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -3,6 +3,15 @@
 
 *** Changes since GDB 7.7
 
+* New options
+
+maint ada set ignore-descriptive-types (on|off)
+maint ada show ignore-descriptive-types
+  Control whether the debugger should ignore descriptive types in Ada
+  programs.  The default is not to ignore the descriptive types.  See
+  the user manual for more details on descriptive types and the intended
+  usage of this option.
+
 * New features in the GDB remote stub, GDBserver
 
   ** New option --debug-format=option1[,option2,...] allows one to add
index 2630456a72d4214444ac1cddad8ba4ef6bc44279..cad480f62fa6037bc6b41ac364fec34cd085e6e8 100644 (file)
@@ -308,6 +308,31 @@ static const char *known_auxiliary_function_name_patterns[] = {
 /* Space for allocating results of ada_lookup_symbol_list.  */
 static struct obstack symbol_list_obstack;
 
+/* Maintenance-related settings for this module.  */
+
+static struct cmd_list_element *maint_set_ada_cmdlist;
+static struct cmd_list_element *maint_show_ada_cmdlist;
+
+/* Implement the "maintenance set ada" (prefix) command.  */
+
+static void
+maint_set_ada_cmd (char *args, int from_tty)
+{
+  help_list (maint_set_ada_cmdlist, "maintenance set ada ", -1, gdb_stdout);
+}
+
+/* Implement the "maintenance show ada" (prefix) command.  */
+
+static void
+maint_show_ada_cmd (char *args, int from_tty)
+{
+  cmd_show_list (maint_show_ada_cmdlist, from_tty, "");
+}
+
+/* The "maintenance ada set/show ignore-descriptive-type" value.  */
+
+static int ada_ignore_descriptive_types_p = 0;
+
                        /* Inferior-specific data.  */
 
 /* Per-inferior data for this module.  */
@@ -7422,6 +7447,9 @@ find_parallel_type_by_descriptive_type (struct type *type, const char *name)
 {
   struct type *result;
 
+  if (ada_ignore_descriptive_types_p)
+    return NULL;
+
   /* If there no descriptive-type info, then there is no parallel type
      to be found.  */
   if (!HAVE_GNAT_AUX_INFO (type))
@@ -13321,6 +13349,26 @@ List all Ada exception names.\n\
 If a regular expression is passed as an argument, only those matching\n\
 the regular expression are listed."));
 
+  add_prefix_cmd ("ada", class_maintenance, maint_set_ada_cmd,
+                 _("Set Ada maintenance-related variables."),
+                  &maint_set_ada_cmdlist, "maintenance set ada ",
+                  0/*allow-unknown*/, &maintenance_set_cmdlist);
+
+  add_prefix_cmd ("ada", class_maintenance, maint_show_ada_cmd,
+                 _("Show Ada maintenance-related variables"),
+                  &maint_show_ada_cmdlist, "maintenance show ada ",
+                  0/*allow-unknown*/, &maintenance_show_cmdlist);
+
+  add_setshow_boolean_cmd
+    ("ignore-descriptive-types", class_maintenance,
+     &ada_ignore_descriptive_types_p,
+     _("Set whether descriptive types generated by GNAT should be ignored."),
+     _("Show whether descriptive types generated by GNAT should be ignored."),
+     _("\
+When enabled, the debugger will stop using the DW_AT_GNAT_descriptive_type\n\
+DWARF attribute."),
+     NULL, NULL, &maint_set_ada_cmdlist, &maint_show_ada_cmdlist);
+
   obstack_init (&symbol_list_obstack);
 
   decoded_names_store = htab_create_alloc
index 0ccad7e9a34501a809387cbdf05fadbb7016bc1b..7ccabc4633b51c15da7e17cbaf0c8a7b350d1f55 100644 (file)
@@ -1,3 +1,8 @@
+2014-01-28  Joel Brobecker  <brobecker@adacore.com>
+
+       * gdb.texinfo (Ada Glitches): Document the new "maint ada set/show
+       ignore-descriptive-types". commands.
+
 2014-01-22  Doug Evans  <dje@google.com>
 
        * gdb.texinfo (Server): Mention --debug-format=all|none|timestamp.
index a990d2ae00cc65eb0a4276b0cddab3aa7257fc5e..af142868b1d820de3221cdf88d3565e76a996a89 100644 (file)
@@ -15712,6 +15712,37 @@ recommended to leave this setting to @code{on} unless necessary.
 
 @end table
 
+@cindex GNAT descriptive types
+@cindex GNAT encoding
+Internally, the debugger also relies on the compiler following a number
+of conventions known as the @samp{GNAT Encoding}, all documented in
+@file{gcc/ada/exp_dbug.ads} in the GCC sources. This encoding describes
+how the debugging information should be generated for certain types.
+In particular, this convention makes use of @dfn{descriptive types},
+which are artificial types generated purely to help the debugger.
+
+These encodings were defined at a time when the debugging information
+format used was not powerful enough to describe some of the more complex
+types available in Ada.  Since DWARF allows us to express nearly all
+Ada features, the long-term goal is to slowly replace these descriptive
+types by their pure DWARF equivalent.  To facilitate that transition,
+a new maintenance option is available to force the debugger to ignore
+those descriptive types.  It allows the user to quickly evaluate how
+well @value{GDBN} works without them.
+
+@table @code
+
+@kindex maint ada set ignore-descriptive-types
+@item maintenance ada set ignore-descriptive-types [on|off]
+Control whether the debugger should ignore descriptive types.
+The default is not to ignore descriptives types (@code{off}).
+
+@kindex maint ada show ignore-descriptive-types
+@item maintenance ada show ignore-descriptive-types
+Show if descriptive types are ignored by @value{GDBN}.
+
+@end table
+
 @node Unsupported Languages
 @section Unsupported Languages