public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] Handle either order of name and linkage name
@ 2019-06-28 14:40 Tom Tromey
  0 siblings, 0 replies; only message in thread
From: Tom Tromey @ 2019-06-28 14:40 UTC (permalink / raw)
  To: gdb-cvs

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

commit 10d06d821919474afaf59fa24cb10450d2349131
Author: Tom Tromey <tromey@adacore.com>
Date:   Thu Jun 20 13:50:15 2019 -0600

    Handle either order of name and linkage name
    
    We discovered that the Ada support in gdb depends on the order of the
    DW_AT_name and DW_AT_linkage_name attributes in the DWARF.  In
    particular, if they are emitted in the "wrong" order for some system
    symbols, "catch exception" will not work.
    
    This patch fixes this problem by arranging to always prefer the
    linkage name if both exist.  This seems to be what the full symbol
    reader already does -- that is, this is another bug arising from
    having two different DWARF readers.
    
    Another possible issue here is that gdb still doesn't really preserve
    mangled names properly.  There's a PR open about this.  However, this
    seems to be somewhat involved to fix, which is why this patch
    continues to work around the bigger issue.
    
    gdb/ChangeLog
    2019-06-28  Tom Tromey  <tromey@adacore.com>
    
    	* dwarf2read.c (partial_die_info::read): Prefer the linkage name
    	for Ada.
    
    gdb/testsuite/ChangeLog
    2019-06-28  Tom Tromey  <tromey@adacore.com>
    
    	* gdb.dwarf2/ada-linkage-name.c: New file.
    	* gdb.dwarf2/ada-linkage-name.exp: New file.

Diff:
---
 gdb/ChangeLog                                 |  5 ++
 gdb/dwarf2read.c                              | 10 ++-
 gdb/testsuite/ChangeLog                       |  5 ++
 gdb/testsuite/gdb.dwarf2/ada-linkage-name.c   | 41 ++++++++++++
 gdb/testsuite/gdb.dwarf2/ada-linkage-name.exp | 95 +++++++++++++++++++++++++++
 5 files changed, 154 insertions(+), 2 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index add3da8..077ab5e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-28  Tom Tromey  <tromey@adacore.com>
+
+	* dwarf2read.c (partial_die_info::read): Prefer the linkage name
+	for Ada.
+
 2019-06-27  Tom Tromey  <tromey@adacore.com>
 
 	* arm-tdep.c (arm_objfile_data_key): Move lower.  Change type to
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 85f2b1d..d004863 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -18653,8 +18653,6 @@ partial_die_info::read (const struct die_reader_specs *reader,
 	  /* Note that both forms of linkage name might appear.  We
 	     assume they will be the same, and we only store the last
 	     one we see.  */
-	  if (cu->language == language_ada)
-	    name = DW_STRING (&attr);
 	  linkage_name = DW_STRING (&attr);
 	  break;
 	case DW_AT_low_pc:
@@ -18787,6 +18785,14 @@ partial_die_info::read (const struct die_reader_specs *reader,
 	}
     }
 
+  /* For Ada, if both the name and the linkage name appear, we prefer
+     the latter.  This lets "catch exception" work better, regardless
+     of the order in which the name and linkage name were emitted.
+     Really, though, this is just a workaround for the fact that gdb
+     doesn't store both the name and the linkage name.  */
+  if (cu->language == language_ada && linkage_name != nullptr)
+    name = linkage_name;
+
   if (high_pc_relative)
     highpc += lowpc;
 
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 2347a4a..8b52d44 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-28  Tom Tromey  <tromey@adacore.com>
+
+	* gdb.dwarf2/ada-linkage-name.c: New file.
+	* gdb.dwarf2/ada-linkage-name.exp: New file.
+
 2019-06-27  Tom Tromey  <tromey@adacore.com>
 
 	* gdb.cp/constexpr-field.exp: Use setup_xfail.
diff --git a/gdb/testsuite/gdb.dwarf2/ada-linkage-name.c b/gdb/testsuite/gdb.dwarf2/ada-linkage-name.c
new file mode 100644
index 0000000..97e908d
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/ada-linkage-name.c
@@ -0,0 +1,41 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2019 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
+main (void)
+{
+  asm ("main_label: .globl main_label");
+  return 0;
+}
+
+/* First dummy function.  */
+
+int
+first (char *x)
+{
+  asm ("first_label: .globl first_label");
+  return 0;
+}
+
+/* Second dummy function.  */
+
+int
+second (char *x)
+{
+  asm ("second_label: .globl second_label");
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.dwarf2/ada-linkage-name.exp b/gdb/testsuite/gdb.dwarf2/ada-linkage-name.exp
new file mode 100644
index 0000000..293d650
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/ada-linkage-name.exp
@@ -0,0 +1,95 @@
+# Copyright 2019 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/>.
+
+# Regression test to ensure that the order of DW_AT_name and
+# DW_AT_linkage_name does not affect Ada.
+
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+    return 0
+}
+
+standard_testfile ada-linkage-name.c ada-linkage-name-debug.S
+
+# Set up the DWARF for the test.
+
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+    global srcdir subdir srcfile
+
+    lassign [function_range first ${srcdir}/${subdir}/${srcfile}] \
+	first_start first_length
+
+    lassign [function_range second ${srcdir}/${subdir}/${srcfile}] \
+	second_start second_length
+
+    cu {} {
+	DW_TAG_compile_unit {
+                {DW_AT_language @DW_LANG_Ada95}
+                {DW_AT_name     ada-linkage-name.c}
+                {DW_AT_comp_dir /tmp}
+
+        } {
+	    declare_labels b_l
+
+	    b_l: DW_TAG_base_type {
+		{DW_AT_byte_size 1 DW_FORM_sdata}
+		{DW_AT_encoding  @DW_ATE_signed}
+		{DW_AT_name      bool}
+	    }
+	    # Here the name comes first and the linkage name second.
+            DW_TAG_subprogram {
+                {name system__namefirst}
+		{linkage_name __gnat_namefirst}
+                {low_pc $first_start addr}
+                {high_pc "$first_start + $first_length" addr}
+                {type :$b_l}
+	    }
+	    # Here the linkage name comes first and the name second.
+            DW_TAG_subprogram {
+		{linkage_name __gnat_namesecond}
+                {name system__namesecond}
+                {low_pc $second_start addr}
+                {high_pc "$second_start + $second_length" addr}
+                {type :$b_l}
+	    }
+	}
+    }
+}
+
+if { [prepare_for_testing "failed to prepare" ${testfile} \
+	  [list $srcfile $asm_file] {nodebug}] } {
+    return -1
+}
+
+with_test_prefix "first first" {
+    gdb_test_no_output "set language ada"
+    gdb_breakpoint "<__gnat_namefirst>" message
+    gdb_breakpoint "<__gnat_namesecond>" message
+}
+
+# Run the test again, but this time check the symbols in the other
+# order.  This ensures we are really testing all the paths --
+# otherwise if the first symbol is found, it will cause symtab
+# expansion, which might cause the other symbol to be found.
+clean_restart ${testfile}
+
+with_test_prefix "second first" {
+    gdb_test_no_output "set language ada"
+    gdb_breakpoint "<__gnat_namesecond>" message
+    gdb_breakpoint "<__gnat_namefirst>" message
+}


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

only message in thread, other threads:[~2019-06-28 14:40 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-28 14:40 [binutils-gdb] Handle either order of name and linkage name Tom Tromey

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).