aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/lib/plugin-support.exp
blob: 9be919b713a0a8b5a6bc27cc6d74be2bfbb91f2a (plain)
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-2014 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
}