diff options
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/compile/compile-object-load.c | 7 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 29 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/c-linkage-name.exp | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/print-demangle.exp | 32 | ||||
-rw-r--r-- | gdb/testsuite/gdb.guile/scm-symbol.exp | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-symbol.exp | 2 |
8 files changed, 80 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5544993..829c077 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ 2020-04-24 Tom Tromey <tom@tromey.com> + PR symtab/12707: + * dwarf2/read.c (add_partial_symbol): Use the linkage name if it + exists. + (new_symbol): Likewise. + * compile/compile-object-load.c (get_out_value_type): Use + symbol_matches_search_name. + +2020-04-24 Tom Tromey <tom@tromey.com> + * dwarf2/read.c (add_partial_symbol): Do not call compute_and_set_names. diff --git a/gdb/compile/compile-object-load.c b/gdb/compile/compile-object-load.c index 3fe9518..be4fa76 100644 --- a/gdb/compile/compile-object-load.c +++ b/gdb/compile/compile-object-load.c @@ -402,6 +402,9 @@ get_out_value_type (struct symbol *func_sym, struct objfile *objfile, int nblocks = 0; int block_loop = 0; + lookup_name_info func_matcher (GCC_FE_WRAPPER_FUNCTION, + symbol_name_match_type::SEARCH_NAME); + bv = SYMTAB_BLOCKVECTOR (func_sym->owner.symtab); nblocks = BLOCKVECTOR_NBLOCKS (bv); @@ -433,9 +436,7 @@ get_out_value_type (struct symbol *func_sym, struct objfile *objfile, if (function != NULL && (BLOCK_SUPERBLOCK (function_block) == BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) - && (strcmp_iw (function->linkage_name (), - GCC_FE_WRAPPER_FUNCTION) - == 0)) + && symbol_matches_search_name (function, func_matcher)) break; } if (block_loop == nblocks) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index d71bf91..613c3cd 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -8378,7 +8378,14 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) { if (built_actual_name != nullptr) actual_name = objfile->intern (actual_name); - psymbol.ginfo.set_linkage_name (actual_name); + if (pdi->linkage_name == nullptr || cu->language == language_ada) + psymbol.ginfo.set_linkage_name (actual_name); + else + { + psymbol.ginfo.set_demangled_name (actual_name, + &objfile->objfile_obstack); + psymbol.ginfo.set_linkage_name (pdi->linkage_name); + } add_psymbol_to_list (psymbol, *where, objfile); } } @@ -20546,7 +20553,6 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, name = dwarf2_name (die, cu); if (name) { - const char *linkagename; int suppress_add = 0; if (space) @@ -20557,14 +20563,21 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, /* Cache this symbol's name and the name's demangled form (if any). */ sym->set_language (cu->language, &objfile->objfile_obstack); - linkagename = dwarf2_physname (name, die, cu); - sym->compute_and_set_names (linkagename, false, objfile->per_bfd); - /* Fortran does not have mangling standard and the mangling does differ between gfortran, iFort etc. */ - if (cu->language == language_fortran - && symbol_get_demangled_name (sym) == NULL) - sym->set_demangled_name (dwarf2_full_name (name, die, cu), NULL); + const char *physname + = (cu->language == language_fortran + ? dwarf2_full_name (name, die, cu) + : dwarf2_physname (name, die, cu)); + const char *linkagename = dw2_linkage_name (die, cu); + + if (linkagename == nullptr || cu->language == language_ada) + sym->set_linkage_name (physname); + else + { + sym->set_demangled_name (physname, &objfile->objfile_obstack); + sym->set_linkage_name (linkagename); + } /* Default assumptions. Use the passed type or decode it from the die. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 5c4dc6e..03c42bd 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,15 @@ 2020-04-24 Tom Tromey <tom@tromey.com> + PR symtab/12707: + * gdb.python/py-symbol.exp: Update expected results for + linkage_name test. + * gdb.cp/print-demangle.exp: New file. + * gdb.base/c-linkage-name.exp: Fix test. + * gdb.guile/scm-symbol.exp: Update expected results for + linkage_name test. + +2020-04-24 Tom Tromey <tom@tromey.com> + * gdb.dwarf2/dw2-namespaceless-anonymous.S: Remove. * gdb.dwarf2/dw2-namespaceless-anonymous.c: New file. * gdb.dwarf2/dw2-namespaceless-anonymous.exp: Use DWARF diff --git a/gdb/testsuite/gdb.base/c-linkage-name.exp b/gdb/testsuite/gdb.base/c-linkage-name.exp index 8afd8ce..6b0a014 100644 --- a/gdb/testsuite/gdb.base/c-linkage-name.exp +++ b/gdb/testsuite/gdb.base/c-linkage-name.exp @@ -46,8 +46,8 @@ if { $readnow } { # Try to print MUNDANE, but using its linkage name. gdb_test "print symada__cS" \ - "'symada__cS' has unknown type; cast it to its declared type" \ - $test + " = {a = 100829103}" \ + "print symada__cS before partial symtab expansion" } # Force the symbols to be expanded for the unit that contains diff --git a/gdb/testsuite/gdb.cp/print-demangle.exp b/gdb/testsuite/gdb.cp/print-demangle.exp new file mode 100644 index 0000000..9e0f706 --- /dev/null +++ b/gdb/testsuite/gdb.cp/print-demangle.exp @@ -0,0 +1,32 @@ +# Copyright (C) 2013, 2020 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +if { [skip_cplus_tests] } { continue } + +standard_testfile bool.cc + +if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} { + return -1 +} + +runto_main + +gdb_breakpoint "return_true" + +gdb_continue_to_breakpoint "return_true" + +gdb_test_no_output "set print demangle off" + +gdb_test "frame" " _Z11return_truev .*" diff --git a/gdb/testsuite/gdb.guile/scm-symbol.exp b/gdb/testsuite/gdb.guile/scm-symbol.exp index 4addc0d..486fc8f 100644 --- a/gdb/testsuite/gdb.guile/scm-symbol.exp +++ b/gdb/testsuite/gdb.guile/scm-symbol.exp @@ -169,10 +169,8 @@ gdb_test "guile (print (symbol-name cplusfunc))" \ "= SimpleClass::valueofi().*" "test method.name" gdb_test "guile (print (symbol-print-name cplusfunc))" \ "= SimpleClass::valueofi().*" "test method.print_name" -# FIXME: GDB is broken here and we're verifying broken behaviour. -# (linkage-name should be the mangled name) gdb_test "guile (print (symbol-linkage-name cplusfunc))" \ - "SimpleClass::valueofi().*" "test method.linkage_name" + "_ZN11SimpleClass8valueofiEv.*" "test method.linkage_name" gdb_test "guile (print (= (symbol-addr-class cplusfunc) SYMBOL_LOC_BLOCK))" "= #t" # Test is_valid when the objfile is unloaded. This must be the last diff --git a/gdb/testsuite/gdb.python/py-symbol.exp b/gdb/testsuite/gdb.python/py-symbol.exp index c4bae9f..caa7ddc 100644 --- a/gdb/testsuite/gdb.python/py-symbol.exp +++ b/gdb/testsuite/gdb.python/py-symbol.exp @@ -211,7 +211,7 @@ gdb_test "python print (cplusfunc.is_function)" \ gdb_test "python print (cplusfunc.name)" "SimpleClass::valueofi().*" "test method.name" gdb_test "python print (cplusfunc.print_name)" "SimpleClass::valueofi().*" "test method.print_name" -gdb_test "python print (cplusfunc.linkage_name)" "SimpleClass::valueofi().*" "test method.linkage_name" +gdb_test "python print (cplusfunc.linkage_name)" "_ZN11SimpleClass8valueofiEv.*" "test method.linkage_name" gdb_test "python print (cplusfunc.addr_class == gdb.SYMBOL_LOC_BLOCK)" "True" "test method.addr_class" # Test is_valid when the objfile is unloaded. This must be the last |