#   Copyright (C) 2009-2021 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
}
