# Handlers for additional dg-xxx keywords in tests.

# Copyright (C) 2004-2019 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 this program; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

proc dg-require-c-std { args } {
    if { ![ check_v3_target_c_std ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-debug-mode { args } {
    if { ![ check_v3_target_debug_mode ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-profile-mode { args } {
    if { ![ check_v3_target_profile_mode ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-normal-mode { args } {
    if { ![ check_v3_target_normal_mode ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-normal-namespace { args } {
    if { ![ check_v3_target_normal_namespace ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-parallel-mode { args } {
    if { ![ check_v3_target_parallel_mode ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-fileio { args } {
    if { ![ check_v3_target_fileio ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-namedlocale { args } {
    if { ![ check_v3_target_namedlocale [lindex $args 1] ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-sharedlib { args } {
    if { ![ check_v3_target_sharedlib ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-time { args } {
    if { ![ check_v3_target_time ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-cstdint { args } {
    if { ![ check_v3_target_cstdint ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-cmath { args } {
    if { ![ check_v3_target_cmath ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-thread-fence { args } {
    if { ![ check_v3_target_thread_fence ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-atomic-builtins { args } {
    if { ![ check_v3_target_atomic_builtins ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-gthreads { args } {
    if { ![ check_v3_target_gthreads ] } {
        upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
        return
    }
    return
}

proc dg-require-gthreads-timed { args } {
    if { ![ check_v3_target_gthreads_timed ] } {
        upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
        return
    }
    return
}

proc dg-require-sleep { args } {
    if { ![ check_v3_target_sleep ] } {
        upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
        return
    }
    return
}

proc dg-require-sched-yield { args } {
    if { ![ check_v3_target_sched_yield ] } {
        upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
        return
    }
    return
}

proc dg-require-string-conversions { args } {
    if { ![ check_v3_target_string_conversions ] } {
        upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
        return
    }
    return
}

proc dg-require-swprintf { args } {
    if { ![ check_v3_target_swprintf ] } {
        upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
        return
    }
    return
}

proc dg-require-binary-io { args } {
    if { ![ check_v3_target_binary_io ] } {
        upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
        return
    }
    return
}

proc dg-require-nprocs { args } {
    if { ![ check_v3_target_nprocs ] } {
        upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
        return
    }
    return
}

proc dg-require-static-libstdcxx { args } {
    if { ![ check_v3_target_static_libstdcxx ] } {
        upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
        return
    }
    return
}

proc dg-require-little-endian { args } {
    if { ![ check_v3_target_little_endian ] } {
        upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
        return
    }
    return
}

proc dg-require-filesystem-ts { args } {
    if { ![ check_v3_target_filesystem_ts ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc add_options_for_no_pch { flags } {
    # This forces any generated and possibly included PCH to be invalid.
    return "-D__GLIBCXX__=99999999"
}

# Add to FLAGS all the target-specific flags needed for networking.

proc add_options_for_net_ts { flags } {
    # Before they were integrated into libc in Solaris 11.4, Solaris needs
    # libsocket and libnsl for networking applications.
    if { [istarget *-*-solaris2*] } {
	return "$flags -lsocket -lnsl"
    }
    return $flags
}

# Add to FLAGS all the target-specific flags to link to libatomic, if required.

proc add_options_for_libatomic { flags } {
    if { [istarget hppa*-*-hpux*] || [istarget riscv*-*-*] } {
	return "$flags -L../../libatomic/.libs -latomic"
    }
    return $flags
}

# Like dg-options, but adds to the default options rather than replacing them.

proc dg-additional-options { args } {
    upvar dg-extra-tool-flags extra-tool-flags

    if { [llength $args] > 3 } {
        error "[lindex $args 0]: too many arguments"
        return
    }

    if { [llength $args] >= 3 } {
        switch [dg-process-target [lindex $args 2]] {
            "S" { eval lappend extra-tool-flags [lindex $args 1] }
            "N" { }
            "F" { error "[lindex $args 0]: `xfail' not allowed here" }
            "P" { error "[lindex $args 0]: `xfail' not allowed here" }
        }
    } else {
        eval lappend extra-tool-flags [lindex $args 1]
    }
}
