1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
# Copyright (C) 2009-2022 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 GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
#
# This file contains the support procedures for testing the plugin mechanism.
load_lib dg.exp
load_lib gcc.exp
#
# plugin-get-options -- process test directives
#
# SRC is the full pathname of the plugin source file.
#
proc plugin-get-options { src } {
# dg-options sets a variable called dg-extra-tool-flags.
set dg-extra-tool-flags ""
# dg-require-* sets dg-do-what.
upvar dg-do-what dg-do-what
set tmp [dg-get-options $src]
foreach op $tmp {
set cmd [lindex $op 0]
if { ![string compare "dg-options" $cmd] } {
set status [catch "$op" errmsg]
if { $status != 0 } {
perror "src: $errmsg for \"$op\"\n"
unresolved "$src: $errmsg for \"$op\""
return
}
} else {
# Ignore unrecognized dg- commands, but warn about them.
warning "plugin.exp does not support $cmd"
}
}
# Return flags to use for compiling the plugin source file
return ${dg-extra-tool-flags}
}
#
# plugin-test-execute -- build the plugin first and then compile the
# test files with the plugin.
#
# PLUGIN_SRC is the full pathname of the plugin source file.
# PLUGIN_TESTS is a list of input test source files.
#
proc plugin-test-execute { plugin_src plugin_tests } {
global srcdir objdir
global verbose
global GMPINC
global PLUGINCC
global PLUGINCFLAGS
set basename [file tail $plugin_src]
set base [file rootname $basename]
set plugin_lib $base.so
set testcase [dg-trim-dirname $srcdir $plugin_src]
verbose "Test the plugin $testcase" 1
# Build the plugin itself
set extra_flags [plugin-get-options $plugin_src]
# Note that the plugin test support currently only works when the GCC
# build tree is available. (We make sure that is the case in plugin.exp.)
# Once we have figured out how/where to package/install GCC header files
# for general plugin support, we should modify the following include paths
# accordingly.
set gcc_srcdir "$srcdir/../.."
set gcc_objdir "$objdir/../../.."
set includes "-I. -I${srcdir} -I${gcc_srcdir}/gcc -I${gcc_objdir}/gcc \
-I${gcc_srcdir}/include -I${gcc_srcdir}/libcpp/include \
$GMPINC -I${gcc_objdir}/intl"
if { [ ishost *-*-darwin* ] } {
# -mdynamic-no-pic is incompatible with -fPIC.
set plug_cflags ""
foreach op $PLUGINCFLAGS {
if { [string compare "-mdynamic-no-pic" $op] } {
set plug_cflags [concat $plug_cflags " $op"]
}
}
set optstr "$includes"
foreach op $extra_flags {
if { [string compare "-mdynamic-no-pic" $op] } {
set optstr [concat $optstr " $op"]
}
}
set optstr [concat $optstr "-DIN_GCC -fPIC -shared -fno-rtti -undefined dynamic_lookup"]
} else {
set plug_cflags $PLUGINCFLAGS
set optstr "$includes $extra_flags -DIN_GCC -fPIC -shared -fno-rtti"
}
# Temporarily switch to the environment for the plugin compiler.
restore_ld_library_path_env_vars
set status [remote_exec build "$PLUGINCC $plug_cflags $plugin_src $optstr -o $plugin_lib"]
set status [lindex $status 0]
set_ld_library_path_env_vars
if { $status != 0 } then {
fail "$testcase compilation"
# Strictly, this is wrong: the tests compiled with the plugin should
# become unresolved instead.
return
} else {
pass "$testcase compilation"
}
# Compile the input source files with the plugin
global default_flags
set plugin_enabling_flags "-fplugin=./$plugin_lib"
dg-runtest $plugin_tests $plugin_enabling_flags $default_flags
# Clean up
remote_file build delete $plugin_lib
}
|