diff options
author | Joel Brobecker <brobecker@gnat.com> | 2010-01-18 10:24:26 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2010-01-18 10:24:26 +0000 |
commit | 5bf03f13872d723bf34d63d622cf277eb76523e7 (patch) | |
tree | fa9be116ce54a329f63737618d59592197cfd2cf /gdb/ada-lang.c | |
parent | 22eb4b1d8df44f40787b7814dfd2724cb12e3a5b (diff) | |
download | gdb-5bf03f13872d723bf34d63d622cf277eb76523e7.zip gdb-5bf03f13872d723bf34d63d622cf277eb76523e7.tar.gz gdb-5bf03f13872d723bf34d63d622cf277eb76523e7.tar.bz2 |
Trust PAD types instead of using PAD___XVS.
* 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.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r-- | gdb/ada-lang.c | 66 |
1 files changed, 60 insertions, 6 deletions
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); |