#
# Expect driver script for GCC Regression Tests
#   Copyright (C) 1993-2019 Free Software Foundation, Inc.
#
# This file 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/>.
#
# Written by Jeffrey Wheat (cassidy@cygnus.com)
#

# Load support procs.
load_lib gcc-dg.exp
load_lib torture-options.exp
load_lib c-torture.exp

# These tests come from Torbjorn Granlund's (tege@cygnus.com)
# C torture test suite, and other contributors.

# Disable tests on machines with no hardware support for IEEE arithmetic.
if { [istarget "vax-*-*"] || [ istarget "powerpc-*-*spe"] || [istarget "pdp11-*-*"] } { return }

if $tracelevel then {
    strace $tracelevel
}

torture-init
set-torture-options $C_TORTURE_OPTIONS {{}} $LTO_TORTURE_OPTIONS

set additional_flags "-fno-inline"

# We must use -ffloat-store/-mieee to ensure that excess precision on some
# machines does not cause problems
if { ([istarget "i?86-*-*"] || [istarget "x86_64-*-*"])
     && [check_effective_target_ia32] } then {
  lappend additional_flags "-ffloat-store"
}
if [istarget "m68k-*-*"] then {
  lappend additional_flags "-ffloat-store"
}
if { [istarget "alpha*-*-*"]
     || [istarget "sh*-*-*"] } then {
  lappend additional_flags "-mieee"
}

if { ![check_effective_target_signal] } {
    lappend additional_flags "-DSIGNAL_SUPPRESS"
}

# load support procs
load_lib c-torture.exp

# initialize harness
gcc_init

#
# main test loop
#

foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] {
    # If we're only testing specific files and this isn't one of them, skip it.
    if ![runtest_file_p $runtests $src] then {
	continue
    }

    c-torture-execute $src $additional_flags
}

# All done.
torture-finish
gcc_finish
