public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb: use alternative for demangled name for non-demangeable linkage names
@ 2024-06-25 10:45 Abdul Basit Ijaz
  0 siblings, 0 replies; only message in thread
From: Abdul Basit Ijaz @ 2024-06-25 10:45 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2a56698523c840efa602aa7dbb70334c9074c177

commit 2a56698523c840efa602aa7dbb70334c9074c177
Author: Schimpe, Christina <christina.schimpe@intel.com>
Date:   Wed Jan 10 09:36:09 2024 -0800

    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>

Diff:
---
 gdb/dwarf2/read.c                                  |  6 +-
 gdb/testsuite/gdb.dwarf2/dw2-wrong-mangled-name.c  | 30 ++++++++++
 .../gdb.dwarf2/dw2-wrong-mangled-name.exp          | 70 ++++++++++++++++++++++
 3 files changed, 105 insertions(+), 1 deletion(-)

diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 01d1a6bcb3a..71237d0fba8 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 00000000000..d93ce3fedf7
--- /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 00000000000..1b81276d793
--- /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\]+" ]

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-06-25 10:45 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-25 10:45 [binutils-gdb] gdb: use alternative for demangled name for non-demangeable linkage names Abdul Basit Ijaz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).