Skip to content

Commit

Permalink
gdb: use alternative for demangled name for non-demangeable linkage n…
Browse files Browse the repository at this point in the history
…ames

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 <[email protected]>
  • Loading branch information
SchChristina authored and abijaz committed Jun 25, 2024
1 parent 22a8698 commit 2a56698
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 1 deletion.
6 changes: 5 additions & 1 deletion gdb/dwarf2/read.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
30 changes: 30 additions & 0 deletions gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.c
Original file line number Diff line number Diff line change
@@ -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 ();
}
70 changes: 70 additions & 0 deletions gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.exp
Original file line number Diff line number Diff line change
@@ -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\]+" ]

0 comments on commit 2a56698

Please sign in to comment.