diff options
author | Schimpe, Christina <christina.schimpe@intel.com> | 2024-01-10 09:36:09 -0800 |
---|---|---|
committer | Ijaz, Abdul B <abdul.b.ijaz@intel.com> | 2024-06-25 12:42:29 +0200 |
commit | 2a56698523c840efa602aa7dbb70334c9074c177 (patch) | |
tree | ec74a4f4f817f30b35763ba6956d32b86c2c481e /gdb | |
parent | 22a8698b561094bd24d0bd620c486463ecceac2c (diff) | |
download | binutils-2a56698523c840efa602aa7dbb70334c9074c177.zip binutils-2a56698523c840efa602aa7dbb70334c9074c177.tar.gz binutils-2a56698523c840efa602aa7dbb70334c9074c177.tar.bz2 |
gdb: use alternative for demangled name for non-demangeable linkage names
In case a DIE contains a linkage name which cannot be demangled and
a source language name (DW_AT_NAME) exists then we want to display this name
instead of the non-demangeable linkage name.
dwarf2_physname returns the linkage name in case the linkage name
cannot be demangled. Before this patch we always set the returned physname
as demangled name. This patch changes this by comparing the value
of physname with the linkage name. Now after this change in case it is equals
to the linkage name and if DW_AT_NAME exists then this is set as the demangled
name otherwise like before still linkage name is used.
For the reproducer, using the test source file added in this change:
"gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.c"
Here is an example of the DWARF where wrong linkage name is emitted by the
compiler for the "func_demangled_test" function:
subprogram {
{MACRO_AT_range {func_demangled_test}}
{linkage_name "_FUNC_WRONG_MANGLED__"}
{name "func_demangled_test"}
{external 1 flag}
}
subprogram {
{MACRO_AT_range {main}}
{external 1 flag}
{name main}
{main_subprogram 1 flag}
}
Before this change for a function having both DIEs DW_AT_name and
DW_AT_LINKAGENAME but with the wrong linkage name info, the backtrace
command shows following:
(gdb) b func_demangled_test
(gdb) r
Breakpoint 1, 0x0000555555555131 in _FUNC_WRONG_MANGLED__ ()
(gdb) backtrace
\#0 0x0000555555555131 in _FUNC_WRONG_MANGLED__ ()
\#1 0x000055555555514a in main ()
After the change now GDB shows the name emitted by DW_AT_NAME:
(gdb) b func_demangled_test
(gdb) r
Breakpoint 1, 0x0000555555555131 in func_demangled_test ()
(gdb) backtrace
\#0 0x0000555555555131 in func_demangled_test ()
\#1 0x000055555555514a in main ()
A new test is added to verify this change.
Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/dwarf2/read.c | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.c | 30 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.exp | 70 |
3 files changed, 105 insertions, 1 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 01d1a6b..71237d0 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -18809,7 +18809,11 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, sym->set_linkage_name (physname); else { - sym->set_demangled_name (physname, &objfile->objfile_obstack); + if (physname == linkagename) + sym->set_demangled_name (name, &objfile->objfile_obstack); + else + sym->set_demangled_name (physname, &objfile->objfile_obstack); + sym->set_linkage_name (linkagename); } diff --git a/gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.c b/gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.c new file mode 100644 index 0000000..d93ce3f --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.c @@ -0,0 +1,30 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2024 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/>. */ + +int +func_demangled_test () +{ + asm ("func_demangled_test_label: .globl func_demangled_test_label"); + return 0; +} + +int +main () +{ + asm ("main_label: .globl main_label"); + return func_demangled_test (); +} diff --git a/gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.exp b/gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.exp new file mode 100644 index 0000000..1b81276 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.exp @@ -0,0 +1,70 @@ +# Copyright 2024 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/>. + +# Test the backtrace command for a function with wrong linkage name. It +# verifies the function name matches the name emitted by the compiler in +# the DIE "DW_AT_NAME". + +load_lib dwarf.exp + +require dwarf2_support + +# Only extended remote supports the 'run' command. +require !use_gdb_stub + +standard_testfile .c -dw.S + +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + declare_labels Llines + global srcdir subdir srcfile + + cu {} { + compile_unit { + {language @DW_LANG_C_plus_plus} + {name $srcfile} + } { + subprogram { + {MACRO_AT_range {func_demangled_test}} + {linkage_name "_FUNC_WRONG_MANGLED__"} + {name "func_demangled_test"} + {external 1 flag} + } + subprogram { + {MACRO_AT_range {main}} + {external 1 flag} + {name main} + {main_subprogram 1 flag} + } + } + } +} + +if {[prepare_for_testing "failed to prepare" ${testfile} \ + [list $srcfile $asm_file] {nodebug}]} { + return -1 +} + +if ![runto_main] { + return -1 +} + +gdb_breakpoint "func_demangled_test" +gdb_continue_to_breakpoint "func_demangled_test" + +gdb_test "backtrace" \ + [multi_line \ + "#0.*in func_demangled_test ()\[^\r\n\]+" \ + "#1.*in main ()\[^\r\n\]+" ] |