# Specific regression driver for nvptx.
# Copyright (C) 2015-2022 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/>.

# GCC testsuite that uses the `dg.exp' driver.

# Exit immediately if this isn't a nvptx target.
if ![istarget nvptx*-*-*] then {
  return
}

# Load support procs.
load_lib gcc-dg.exp

# Return 1 if code by default compiles for at least PTX ISA version
# major.minor.
proc check_effective_target_default_ptx_isa_version_at_least { major minor } {
    set name default_ptx_isa_version_at_least_${major}_${minor}

    set supported_p \
	[concat \
	     "((__PTX_ISA_VERSION_MAJOR__ == $major" \
	     "  && __PTX_ISA_VERSION_MINOR__ >= $minor)" \
	     " || (__PTX_ISA_VERSION_MAJOR__ > $major))"]

    set src \
	[list \
	     "#if $supported_p" \
	     "#else" \
	     "#error unsupported" \
	     "#endif"]
    set src [join $src "\n"]
    
    set res [check_no_compiler_messages $name assembly $src ""]

    return $res
}

# Return 1 if code with PTX ISA version major.minor or higher can be run.
proc check_effective_target_runtime_ptx_isa_version_at_least { major minor } {
    set name runtime_ptx_isa_version_${major}_${minor}

    set default \
	[check_effective_target_default_ptx_isa_version_at_least \
	     ${major} ${minor}]

    if { $default } {
	set flag ""
    } else {
	set flag "-mptx=$major.$minor"
    }

    set res [check_runtime $name {
	int main (void) { return 0; }
    } $flag]

    return $res
}

# Return 1 if runtime environment support the PTX ISA directive .alias.
proc check_effective_target_runtime_ptx_alias { } {
    return [check_effective_target_runtime_ptx_isa_version_at_least 6 3]
}

# Add options to enable using PTX ISA directive .alias.
proc add_options_for_ptx_alias { flags } {
    append flags " -malias"

    if { ![check_effective_target_default_ptx_isa_version_at_least 6 3] } {
	append flags " -mptx=6.3"
    }

    return $flags
}

# 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"
}

# Initialize `dg'.
dg-init

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

# All done.
dg-finish
