aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorSchimpe, Christina <christina.schimpe@intel.com>2024-01-10 09:36:09 -0800
committerIjaz, Abdul B <abdul.b.ijaz@intel.com>2024-06-25 12:42:29 +0200
commit2a56698523c840efa602aa7dbb70334c9074c177 (patch)
treeec74a4f4f817f30b35763ba6956d32b86c2c481e /gdb
parent22a8698b561094bd24d0bd620c486463ecceac2c (diff)
downloadbinutils-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.c6
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.c30
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.exp70
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\]+" ]