# Copyright (C) 2011-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 2 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

load_lib libitm-dg.exp
load_gcc_lib gcc-dg.exp

global shlib_ext

set shlib_ext [get_shlib_extension]
# The C++ tests should be linked with g++, which defaults to -shared-libgcc.
# Doing that is currently too intrusive, so hardcode here.
set lang_link_flags "-shared-libgcc -lstdc++"
set lang_test_file_found 0
set lang_library_path "../libstdc++-v3/src/.libs"

# Initialize dg.
dg-init

set blddir [lookfor_file [get_multilibs] libitm]


if { $blddir != "" } {
    # Look for a static libstdc++ first.
    if [file exists "${blddir}/${lang_library_path}/libstdc++.a"] {
	set lang_test_file "${lang_library_path}/libstdc++.a"
	set lang_test_file_found 1
	# We may have a shared only build, so look for a shared libstdc++.
    } elseif [file exists "${blddir}/${lang_library_path}/libstdc++.${shlib_ext}"] {
	set lang_test_file "${lang_library_path}/libstdc++.${shlib_ext}"
	set lang_test_file_found 1
    } else {
	puts "No libstdc++ library found, will not execute c++ tests"
    }
} elseif { [info exists GXX_UNDER_TEST] } {
    set lang_test_file_found 1
    # Needs to exist for libitm.exp.
    set lang_test_file ""
} else {
    puts "GXX_UNDER_TEST not defined, will not execute c++ tests"
}

if { $lang_test_file_found } {
    # Gather a list of all tests.
    set tests [lsort [glob -nocomplain $srcdir/$subdir/*.C]]

    if { $blddir != "" } {
	set ld_library_path "$always_ld_library_path:${blddir}/${lang_library_path}"
    } else {
	set ld_library_path "$always_ld_library_path"
    }
    append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
    set_ld_library_path_env_vars

    set flags_file "${blddir}/../libstdc++-v3/scripts/testsuite_flags"
    if { [file exists $flags_file] } {
	set libstdcxx_includes [exec sh $flags_file --build-includes]
    } else {
	set libstdcxx_includes ""
    }

    # Main loop.
    dg-runtest $tests "" $libstdcxx_includes
}

# All done.
dg-finish
