binutils-gdb/gdb/testsuite/lib/ada.exp
Tom Tromey 2ff0a94739 Fix "catch exception" with dynamic linking
When an Ada program is dynamically linked against libgnat, and when
one of the standard exceptions is used, the exception object may be
referenced by the main executable using a copy relocation.

In this situation, a "catch exception" for those exceptions will not
manage to stop.  This happens because, under the hood, "catch
exception" creates an expression object that examines the object
addresses -- but in this case, the address will be incorrect.

This patch fixes the problem by arranging for these filter expressions
to examine all the relevant minimal symbols.  This way, the object
from libgnat will be found as well.

Tested on x86-64 Fedora 29.

gdb/ChangeLog
2019-04-30  Tom Tromey  <tromey@adacore.com>

	* ada-lang.c (ada_lookup_simple_minsyms): New function.
	(create_excep_cond_exprs): Iterate over program spaces.
	(ada_exception_catchpoint_cond_string): Examine all minimal
	symbols for exception types.

gdb/testsuite/ChangeLog
2019-04-30  Tom Tromey  <tromey@adacore.com>

	* lib/ada.exp (find_ada_tool): New proc.
	* lib/gdb.exp (gdb_compile_shlib): Allow .o files as inputs.
	* gdb.ada/catch_ex_std.exp: New file.
	* gdb.ada/catch_ex_std/foo.adb: New file.
	* gdb.ada/catch_ex_std/some_package.adb: New file.
	* gdb.ada/catch_ex_std/some_package.ads: New file.
2019-04-30 07:32:11 -06:00

108 lines
3.5 KiB
Plaintext

# Copyright 2004-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/>.
# Call target_compile with SOURCE DEST TYPE and OPTIONS as argument,
# after having temporarily changed the current working directory to
# BUILDDIR.
proc target_compile_ada_from_dir {builddir source dest type options} {
set saved_cwd [pwd]
catch {
cd $builddir
return [target_compile $source $dest $type $options]
} result options
cd $saved_cwd
return -options $options $result
}
# Compile some Ada code.
proc gdb_compile_ada {source dest type options} {
set srcdir [file dirname $source]
set gprdir [file dirname $srcdir]
set objdir [file dirname $dest]
# Although strictly not necessary, we force the recompilation
# of all units (additional_flags=-f). This is what is done
# when using GCC to build programs in the other languages,
# and it avoids using a stray objfile file from a long-past
# run, for instance.
append options " ada"
append options " additional_flags=-f"
append options " additional_flags=-I$srcdir"
set result [target_compile_ada_from_dir \
$objdir [file tail $source] $dest $type $options]
# The Ada build always produces some output, even when the build
# succeeds. Thus, we can not use the output the same way we do in
# gdb_compile to determine whether the build has succeeded or not.
# We therefore simply check whether the dest file has been created
# or not. Unless not present, the build has succeeded.
if [file exists $dest] { set result "" }
gdb_compile_test $source $result
return $result
}
# Like standard_testfile, but for Ada. Historically the Ada tests
# used a different naming convention from many of the other gdb tests,
# and this difference was preserved during the conversion to
# standard_testfile. DIR defaults to the base name of the test case;
# but can be overridden to find sources in a different subdirectory of
# gdb.ada.
proc standard_ada_testfile {base_file {dir ""}} {
global gdb_test_file_name srcdir subdir
global testdir testfile srcfile binfile
if {$dir == ""} {
set testdir $gdb_test_file_name
} else {
set testdir $dir
}
set testfile $base_file
set srcfile $srcdir/$subdir/$testdir/$testfile.adb
set binfile [standard_output_file $testfile]
}
# A helper function to find the appropriate version of a tool.
# TOOL is the tool's name, e.g., "gnatbind" or "gnatlink".
proc find_ada_tool {tool} {
set upper [string toupper $tool]
set targname ${upper}_FOR_TARGET
global $targname
if {[info exists $targname]} {
return $targname
}
global tool_root_dir
set root "$tool_root_dir/gcc"
set result ""
if {![is_remote host]} {
set result [lookfor_file $root $tool]
}
if {$result == ""} {
set result [transform $tool]
}
return $result
}