#   Copyright (C) 2009-2013 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/>.

# Test the functionality of the GCC plugin support

load_lib target-supports.exp
load_lib gcc-dg.exp

global TESTING_IN_BUILD_TREE
global ENABLE_PLUGIN

# The plugin testcases currently only work when the build tree is available.
# Also check whether the host supports plugins.
if { ![info exists TESTING_IN_BUILD_TREE] || ![info exists ENABLE_PLUGIN] } {
    return
}

# If a testcase doesn't have special options, use these.
global DEFAULT_CFLAGS
if ![info exists DEFAULT_CFLAGS] then {
    set DEFAULT_CFLAGS " -ansi -pedantic-errors"
}

# The procedures in plugin-support.exp need these parameters.
set default_flags $DEFAULT_CFLAGS

if $tracelevel then {
    strace $tracelevel
}

# Load support procs.
load_lib plugin-support.exp

# Specify the plugin source file and the associated test files in a list.
# plugin_test_list={ {plugin1 test1 test2 ...} {plugin2 test1 ...} ... }
set plugin_test_list [list \
    { selfassign.c self-assign-test-1.c self-assign-test-2.c } \
    { ggcplug.c ggcplug-test-1.c } \
    { one_time_plugin.c one_time-test-1.c } \
    { start_unit_plugin.c start_unit-test-1.c } \
    { finish_unit_plugin.c finish_unit-test-1.c } \
]

foreach plugin_test $plugin_test_list {
    # Replace each source file with its full-path name
    for {set i 0} {$i < [llength $plugin_test]} {incr i} {
	set basename [lindex $plugin_test $i]
	set plugin_test [lreplace $plugin_test $i $i $srcdir/$subdir/$basename]
    }
    set plugin_src [lindex $plugin_test 0]
    # If we're only testing specific files and this isn't one of them, skip it.
    if ![runtest_file_p $runtests $plugin_src] then {
        continue
    }
    set plugin_input_tests [lreplace $plugin_test 0 0]
    plugin-test-execute $plugin_src $plugin_input_tests
}

# run the plugindir tests

# Initialize `dg'.
dg-init

# Main loop.
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/plugindir*.\[cSi\]]] \
	"" $DEFAULT_CFLAGS

# All done.
dg-finish
