From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24722 invoked by alias); 18 Jan 2010 09:51:49 -0000 Received: (qmail 24708 invoked by uid 22791); 18 Jan 2010 09:51:47 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00,SPF_PASS X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 18 Jan 2010 09:51:30 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id C3ED92BABEA for ; Mon, 18 Jan 2010 04:51:28 -0500 (EST) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id tAcV3J7yRLwY for ; Mon, 18 Jan 2010 04:51:28 -0500 (EST) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 8376D2BABDF for ; Mon, 18 Jan 2010 04:51:27 -0500 (EST) Received: by joel.gnat.com (Postfix, from userid 1000) id DFFA1F5970; Mon, 18 Jan 2010 13:51:13 +0400 (RET) From: Joel Brobecker 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 Message-Id: <1263808271-10983-1-git-send-email-brobecker@adacore.com> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-01/txt/msg00449.txt.bz2 From: brobecke 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