# This whole file adapted from libgomp.c++/c++.exp.

load_lib libgomp-dg.exp
load_gcc_lib gcc-dg.exp
load_gcc_lib torture-options.exp

proc check_effective_target_c { } {
    return 0
}
proc check_effective_target_c++ { } {
    return 1
}

if { $blddir != "" } {
    set libstdc++_library_path "../libstdc++-v3/src/.libs"
    set shlib_ext [get_shlib_extension]
    if { ![file exists "${blddir}/${libstdc++_library_path}/libstdc++.a"]
	 && ![file exists "${blddir}/${libstdc++_library_path}/libstdc++.${shlib_ext}"] } {
        verbose -log "No libstdc++ library found, will not execute c++ tests"
	unset libstdc++_library_path
	return
    }
    lappend lang_library_paths ${libstdc++_library_path}
} elseif { ![info exists GXX_UNDER_TEST] } {
    verbose -log "GXX_UNDER_TEST not defined, will not execute c++ tests"
    return
}
if { $blddir != "" } {
    set lang_source_re {^.*\.[cC]$}
    set lang_include_flags [exec sh ${blddir}/../libstdc++-v3/scripts/testsuite_flags --build-includes]
}
lappend ALWAYS_CFLAGS "compiler=$GXX_UNDER_TEST"

# Initialize dg.
dg-init
torture-init

# Turn on OpenACC.
lappend ALWAYS_CFLAGS "additional_flags=-fopenacc"

# Gather a list of all tests.
set tests [lsort [concat \
		      [find $srcdir/$subdir *.C] \
		      [find $srcdir/$subdir/../libgomp.oacc-c-c++-common *.c]]]

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

# Test with all available offload targets, and with offloading disabled.
foreach offload_target [concat [split $offload_targets ","] "disable"] {
    global openacc_device_type
    set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
    set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"

    switch $openacc_device_type {
	"" {
	    unsupported "$subdir $offload_target offloading"
	    continue
	}
	host {
	    set acc_mem_shared 1
	}
	nvidia {
	    if { ![check_effective_target_openacc_nvidia_accel_present] } {
		# Don't bother; execution testing is going to FAIL.
		untested "$subdir $offload_target offloading: supported, but hardware not accessible"
		continue
	    }

	    # Copy ptx file (TEMPORARY)
	    remote_download host $srcdir/libgomp.oacc-c-c++-common/subr.ptx

	    # Where timer.h lives
	    lappend ALWAYS_CFLAGS "additional_flags=-I${srcdir}/libgomp.oacc-c-c++-common"

	    set acc_mem_shared 0
	}
	radeon {
	    if { ![check_effective_target_openacc_radeon_accel_present] } {
		# Don't bother; execution testing is going to FAIL.
		untested "$subdir $offload_target offloading: supported, but hardware not accessible"
		continue
	    }

	    set acc_mem_shared 0
	}
	default {
	    error "Unknown OpenACC device type: $openacc_device_type (offload target: $offload_target)"
	}
    }
    set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"

    # To avoid compilation overhead, and to keep simple '-foffload=[...]'
    # handling in test cases, by default only build for the offload target
    # that we're actually going to test.
    set tagopt "$tagopt -foffload=$offload_target"
    # Force usage of the corresponding OpenACC device type.
    setenv ACC_DEVICE_TYPE $openacc_device_type

    # To get better test coverage for device-specific code that is only
    # ever used in offloading configurations, we'd like more thorough
    # testing for test cases that deal with offloading, which most of all
    # OpenACC test cases are.  We enable torture testing, but limit it to
    # -O0 and -O2 only, to avoid testing times exploding too much, under
    # the assumption that between -O0 and -O[something] there is the
    # biggest difference in the overall structure of the generated code.
    switch -glob $offload_target {
	disable {
	    set-torture-options [list \
				     { -O2 } ]
	}
	default {
	    set-torture-options [list \
				     { -O0 } \
				     { -O2 } ]
	}
    }

    gcc-dg-runtest $tests "$tagopt" ""
}
unset offload_target

if { $blddir != "" } {
    unset lang_source_re
    unset lang_include_flags
    unset libstdc++_library_path
    unset lang_library_paths
}

# All done.
torture-finish
dg-finish
