diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/symtab.c | 37 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/int_deref.exp | 5 |
4 files changed, 53 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f8790e7..d9e492f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2013-12-10 Joel Brobecker <brobecker@adacore.com> + * symtab.c (symbol_find_demangled_name): Add handling of + Ada symbols. + +2013-12-10 Joel Brobecker <brobecker@adacore.com> + * mi/mi-main.c (mi_cmd_list_features): add "exec-run-start-option". * NEWS: Expand the entry documenting the new -exec-run --start option to mention the corresponding new entry in the output of diff --git a/gdb/symtab.c b/gdb/symtab.c index 8fac0be..aa1e14b 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -60,6 +60,7 @@ #include "solist.h" #include "macrotab.h" #include "macroscope.h" +#include "ada-lang.h" #include "psymtab.h" #include "parser-defs.h" @@ -692,6 +693,42 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol, symbols). Just the mangling standard is not standardized across compilers and there is no DW_AT_producer available for inferiors with only the ELF symbols to check the mangling kind. */ + + /* Check for Ada symbols last. See comment below explaining why. */ + + if (gsymbol->language == language_auto) + { + const char *demangled = ada_decode (mangled); + + if (demangled != mangled && demangled != NULL && demangled[0] != '<') + { + /* Set the gsymbol language to Ada, but still return NULL. + Two reasons for that: + + 1. For Ada, we prefer computing the symbol's decoded name + on the fly rather than pre-compute it, in order to save + memory (Ada projects are typically very large). + + 2. There are some areas in the definition of the GNAT + encoding where, with a bit of bad luck, we might be able + to decode a non-Ada symbol, generating an incorrect + demangled name (Eg: names ending with "TB" for instance + are identified as task bodies and so stripped from + the decoded name returned). + + Returning NULL, here, helps us get a little bit of + the best of both worlds. Because we're last, we should + not affect any of the other languages that were able to + demangle the symbol before us; we get to correctly tag + Ada symbols as such; and even if we incorrectly tagged + a non-Ada symbol, which should be rare, any routing + through the Ada language should be transparent (Ada + tries to behave much like C/C++ with non-Ada symbols). */ + gsymbol->language = language_ada; + return NULL; + } + } + return NULL; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 08f6b27..0e1e785 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2013-12-10 Joel Brobecker <brobecker@adacore.com> + * gdb.ada/int_deref.exp: Add test verifying that we print + the decoded symbol name when printing the address of Ada + symbols. + +2013-12-10 Joel Brobecker <brobecker@adacore.com> + * gdb.mi/mi-start.exp: Add test verifying that -list-features contains "exec-run-start-option". diff --git a/gdb/testsuite/gdb.ada/int_deref.exp b/gdb/testsuite/gdb.ada/int_deref.exp index 7b8f426..ea61d4a 100644 --- a/gdb/testsuite/gdb.ada/int_deref.exp +++ b/gdb/testsuite/gdb.ada/int_deref.exp @@ -26,6 +26,11 @@ clean_restart ${testfile} set bp_location [gdb_get_line_number "Pck.Watch" ${testdir}/foo.adb] runto "foo.adb:$bp_location" +# Hijack a bit this testcase, to verify that name decoding works +# when doing symbolic address printing. +gdb_test "print watch'address" \ + " = \\(system\\.address\\) $hex <pck\\.watch>" + gdb_test "print *long_integer(watch'address)" \ " = 4874" |