diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 10 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/ada-linkage-name.c | 41 | ||||
-rw-r--r-- | 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 +} |