From: Joel Brobecker <brobecker@adacore.com>
To: gdb-patches@sourceware.org
Subject: [commit+doco] Trust PAD types instead of using PAD___XVS.
Date: Mon, 18 Jan 2010 09:51:00 -0000 [thread overview]
Message-ID: <1263808271-10983-1-git-send-email-brobecker@adacore.com> (raw)
From: brobecke <brobecke@f8352e7e-cb20-0410-8ce7-b5d9e71c585c>
This change removes a work-around that was introduced due to a bug
in the debug info generated by the compiler. Eric fixed the problem
for us, and thus the workaround is no longer necessary. Removing
the workaround allows us to avoid a parallel-type lookup, so this
change is intersting on two levels.
The problem is that this change makes the assumption that the debugging
info is correct, which is only true for recent compilers. To help with
potential compatibility issues, this patch introduces a new setting
that allows the user to restore the older (less efficient) approach:
set/show ada trust-PAD-over-XVS.
Since there are new settings, NEWS and doco updates are attached.
gdb/ChangeLog:
* ada-lang.c (trust_pad_over_xvs): New static variable.
(ada_is_aligner_type): If !trust_pad_over_xvs and there is a
parallel XVS type, follow the XVS type instead of the PAD type.
(unwrap_value): Make sure that there is no parallel XVE type
before returning the value as is.
(set_ada_list, show_ada_list): New static variables.
(set_ada_command, show_ada_command): New functions.
(_initialize_ada_language): Add new "set/show ada" prefix commands.
Add new "set/show ada trust-PAD-over-XVS" setting.
* NEWS: Add entry for "set/show ada trust-PAD-over-XVS" commands.
gdb/doc/ChangeLog:
* gdb.texinfo (Ada Glitches): Document new settings
"set/show ada trust-PAD-over-XVS".
OK to commit the NEWS & doco bits?
Thanks,
--
Joel
---
gdb/NEWS | 9 +++++++
gdb/ada-lang.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++----
gdb/doc/gdb.texinfo | 28 +++++++++++++++++++++
3 files changed, 97 insertions(+), 6 deletions(-)
diff --git a/gdb/NEWS b/gdb/NEWS
index 4b88ee7..7d97a2f 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -163,6 +163,15 @@ show disconnected-tracing
loses its connection to GDB. If 0, the target is to stop tracing
upon disconnection.
+set ada trust-PAD-over-XVS on|off
+show ada trust-PAD-over-XVS
+ If off, activate a workaround against a bug in the debugging information
+ generated by the compiler for PAD types (see gcc/exp_dbug.ads in
+ the GCC sources for more information about the GNAT encoding and
+ PAD types in particular). It is always safe to set this option to
+ off, but this introduces a slight performance penalty. The default
+ is on.
+
* New remote packets
QTDV
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 2f16644..e63cf88 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -7727,6 +7727,16 @@ ada_is_string_type (struct type *type)
return 0;
}
+/* The compiler sometimes provides a parallel XVS type for a given
+ PAD type. Normally, it is safe to follow the PAD type directly,
+ but older versions of the compiler have a bug that causes the offset
+ of its "F" field to be wrong. Following that field in that case
+ would lead to incorrect results, but this can be worked around
+ by ignoring the PAD type and using the associated XVS type instead.
+
+ Set to True if the debugger should trust the contents of PAD types.
+ Otherwise, ignore the PAD type if there is a parallel XVS type. */
+static int trust_pad_over_xvs = 1;
/* True if TYPE is a struct type introduced by the compiler to force the
alignment of a value. Such types have a single field with a
@@ -7737,10 +7747,7 @@ ada_is_aligner_type (struct type *type)
{
type = ada_check_typedef (type);
- /* If we can find a parallel XVS type, then the XVS type should
- be used instead of this type. And hence, this is not an aligner
- type. */
- if (ada_find_parallel_type (type, "___XVS") != NULL)
+ if (!trust_pad_over_xvs && ada_find_parallel_type (type, "___XVS") != NULL)
return 0;
return (TYPE_CODE (type) == TYPE_CODE_STRUCT
@@ -7918,8 +7925,11 @@ unwrap_value (struct value *val)
struct type *raw_real_type =
ada_check_typedef (ada_get_base_type (type));
- if (type == raw_real_type)
- return val;
+ /* If there is no parallel XVS or XVE type, then the value is
+ already unwrapped. Return it without further modification. */
+ if ((type == raw_real_type)
+ && ada_find_parallel_type (type, "___XVE") == NULL)
+ return val;
return
coerce_unspec_val_to_type
@@ -11373,11 +11383,55 @@ const struct language_defn ada_language_defn = {
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_ada_language;
+/* Command-list for the "set/show ada" prefix command. */
+static struct cmd_list_element *set_ada_list;
+static struct cmd_list_element *show_ada_list;
+
+/* Implement the "set ada" prefix command. */
+
+static void
+set_ada_command (char *arg, int from_tty)
+{
+ printf_unfiltered (_(\
+"\"set ada\" must be followed by the name of a setting.\n"));
+ help_list (set_ada_list, "set ada ", -1, gdb_stdout);
+}
+
+/* Implement the "show ada" prefix command. */
+
+static void
+show_ada_command (char *args, int from_tty)
+{
+ cmd_show_list (show_ada_list, from_tty, "");
+}
+
void
_initialize_ada_language (void)
{
add_language (&ada_language_defn);
+ add_prefix_cmd ("ada", no_class, set_ada_command,
+ _("Prefix command for changing Ada-specfic settings"),
+ &set_ada_list, "set ada ", 0, &setlist);
+
+ add_prefix_cmd ("ada", no_class, show_ada_command,
+ _("Generic command for showing Ada-specific settings."),
+ &show_ada_list, "show ada ", 0, &showlist);
+
+ add_setshow_boolean_cmd ("trust-PAD-over-XVS", class_obscure,
+ &trust_pad_over_xvs, _("\
+Enable or disable an optimization trusting PAD types over XVS types"), _("\
+Show whether an optimization trusting PAD types over XVS types is activated"),
+ _("\
+This is related to the encoding used by the GNAT compiler. The debugger\n\
+should normally trust the contents of PAD types, but certain older versions\n\
+of GNAT have a bug that sometimes causes the information in the PAD type\n\
+to be incorrect. Turning this setting \"off\" allows the debugger to\n\
+work around this bug. It is always safe to turn this option \"off\", but\n\
+this incurs a slight performance penalty, so it is recommended to NOT change\n\
+this option to \"off\" unless necessary."),
+ NULL, NULL, &set_ada_list, &show_ada_list);
+
varsize_limit = 65536;
obstack_init (&symbol_list_obstack);
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 7cf1bb4..d3edcf8 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -12846,6 +12846,34 @@ by qualifying the problematic names with package
@code{Standard} explicitly.
@end itemize
+Older versions of the compiler sometimes generate erroneous debugging
+information, resulting in the debugger incorrectly printing the value
+of affected entities. In some cases, the debugger is able to work
+around an issue automatically. In other cases, the debugger is able
+to work around the issue, but the work-around has to be specifically
+enabled.
+
+@kindex set ada trust-PAD-over-XVS
+@kindex show ada trust-PAD-over-XVS
+@table @code
+
+@item set ada trust-PAD-over-XVS on
+Configure GDB to strictly follow the GNAT encoding when computing the
+value of Ada entities, particularly when @code{PAD} and @code{PAD___XVS}
+types are involved (see @code{ada/exp_dbug.ads} in the GCC sources for
+a complete description of the encoding used by the GNAT compiler).
+This is the default.
+
+@item set ada trust-PAD-over-XVS off
+This is related to the encoding using by the GNAT compiler. If @value{GDBN}
+sometimes prints the wrong value for certain entities, changing @code{ada
+trust-PAD-over-XVS} to @code{off} activates a work-around which may fix
+the issue. It is always safe to set @code{ada trust-PAD-over-XVS} to
+@code{off}, but this incurs a slight performance penalty, so it is
+recommended to leave this setting to @code{on} unless necessary.
+
+@end table
+
@node Unsupported Languages
@section Unsupported Languages
--
1.6.3.3
next reply other threads:[~2010-01-18 9:51 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-18 9:51 Joel Brobecker [this message]
2010-01-18 17:59 ` Eli Zaretskii
2010-01-19 10:42 ` Joel Brobecker
2010-01-19 16:40 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1263808271-10983-1-git-send-email-brobecker@adacore.com \
--to=brobecker@adacore.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox