# Damn dejagnu for not having proper library search paths for load_lib.
# We have to explicitly load everything that gcc-dg.exp wants to load.

proc load_gcc_lib { filename } {
    global srcdir loaded_libs

    load_file $srcdir/../../gcc/testsuite/lib/$filename
    set loaded_libs($filename) ""
}

load_lib dg.exp

# Required to use gcc-dg.exp - however, the latter should NOT be
# loaded until ${tool}_target_compile is defined since it uses that
# to determine default LTO options.

load_gcc_lib multiline.exp
load_gcc_lib prune.exp
load_gcc_lib target-libpath.exp
load_gcc_lib wrapper.exp
load_gcc_lib target-supports.exp
load_gcc_lib target-utils.exp
load_gcc_lib gcc-defs.exp
load_gcc_lib timeout.exp
load_gcc_lib file-format.exp
load_gcc_lib target-supports-dg.exp
load_gcc_lib scanasm.exp
load_gcc_lib scandump.exp
load_gcc_lib scanlang.exp
load_gcc_lib scanrtl.exp
load_gcc_lib scantree.exp
load_gcc_lib scanltranstree.exp
load_gcc_lib scanoffload.exp
load_gcc_lib scanoffloadtree.exp
load_gcc_lib scanoffloadrtl.exp
load_gcc_lib scanipa.exp
load_gcc_lib scanwpaipa.exp
load_gcc_lib timeout-dg.exp
load_gcc_lib torture-options.exp
load_gcc_lib fortran-modules.exp

# Try to load a test support file, built during libgomp configuration.
load_file libgomp-test-support.exp

set dg-do-what-default run

#
# GCC_UNDER_TEST is the compiler under test.
#

set libgomp_compile_options ""

#
# libgomp_init
#

if [info exists TOOL_OPTIONS] {
    set multilibs [get_multilibs $TOOL_OPTIONS]
} else {
    set multilibs [get_multilibs]
}

proc libgomp_init { args } {
    global srcdir blddir objdir tool_root_dir
    global libgomp_initialized
    global tmpdir
    global blddir
    global gluefile wrap_flags
    global ALWAYS_CFLAGS
    global CFLAGS
    global TOOL_EXECUTABLE TOOL_OPTIONS
    global GCC_UNDER_TEST
    global TESTING_IN_BUILD_TREE
    global target_triplet
    global always_ld_library_path

    set blddir [lookfor_file [get_multilibs] libgomp]

    # We set LC_ALL and LANG to C so that we get the same error
    # messages as expected.
    setenv LC_ALL C
    setenv LANG C

    # Many hosts now default to a non-ASCII C locale, however, so
    # they can set a charset encoding here if they need.
    if { [ishost "*-*-cygwin*"] } {
      setenv LC_ALL C.ASCII
      setenv LANG C.ASCII
    }

    if ![info exists GCC_UNDER_TEST] then {
	if [info exists TOOL_EXECUTABLE] {
	    set GCC_UNDER_TEST $TOOL_EXECUTABLE
	} else {
	    set GCC_UNDER_TEST "[find_gcc]"
	}
    }

    if ![info exists tmpdir] {
	set tmpdir "/tmp"
    }

    if [info exists gluefile] {
	unset gluefile
    }

    if {![info exists CFLAGS]} {
	set CFLAGS ""
    }

    # Locate libgcc.a so we don't need to account for different values of
    # SHLIB_EXT on different platforms
    set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
    if {$gccdir != ""} {
        set gccdir [file dirname $gccdir]
    }

    # Compute what needs to be put into LD_LIBRARY_PATH
    set always_ld_library_path ".:${blddir}/.libs"

    # Add liboffloadmic build directory in LD_LIBRARY_PATH to support
    # Intel MIC offloading testing.
    global offload_plugins
    if { [string match "*,intelmic,*" ",$offload_plugins,"] } {
	append always_ld_library_path ":${blddir}/../liboffloadmic/.libs"
	append always_ld_library_path ":${blddir}/../liboffloadmic/plugin/.libs"
	# libstdc++ is required by liboffloadmic
	append always_ld_library_path ":${blddir}/../libstdc++-v3/src/.libs"
	# libgcc_s is required by libstdc++
	append always_ld_library_path ":${blddir}/../libgcc"
    }

    global offload_additional_lib_paths
    if { $offload_additional_lib_paths != "" } {
	append always_ld_library_path "${offload_additional_lib_paths}"
    }

    # Compute what needs to be added to the existing LD_LIBRARY_PATH.
    if {$gccdir != ""} {
	# Add AIX pthread directory first.
	if { [llength [glob -nocomplain ${gccdir}/pthread/libgcc_s*.a]] >= 1 } {
	    append always_ld_library_path ":${gccdir}/pthread"
	}
	append always_ld_library_path ":${gccdir}"
	set compiler [lindex $GCC_UNDER_TEST 0]

	if { [is_remote host] == 0 && [which $compiler] != 0 } {
	  foreach i "[exec $compiler --print-multi-lib]" {
	    set mldir ""
	    regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir
	    set mldir [string trimright $mldir "\;@"]
	    if { "$mldir" == "." } {
	      continue
	    }
	    if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } {
	      append always_ld_library_path ":${gccdir}/${mldir}"
	    }
	  }
	}
    }

    set ALWAYS_CFLAGS ""
    if { $blddir != "" } {
        lappend ALWAYS_CFLAGS "additional_flags=-B${blddir}/"
        # targets that use libgomp.a%s in their specs need a -B option
        # for uninstalled testing.
        lappend ALWAYS_CFLAGS "additional_flags=-B${blddir}/.libs"
        lappend ALWAYS_CFLAGS "additional_flags=-I${blddir}"
        lappend ALWAYS_CFLAGS "ldflags=-L${blddir}/.libs"
    }
    # The top-level include directory, for gomp-constants.h.
    lappend ALWAYS_CFLAGS "additional_flags=-I${srcdir}/../../include"
    lappend ALWAYS_CFLAGS "additional_flags=-I${srcdir}/.."

    # For build-tree testing, also consider the library paths used for builing.
    # For installed testing, we assume all that to be provided in the sysroot.
    if { $blddir != "" } {
	# The `-fopenacc' and `-fopenmp' options imply `-pthread', and
	# that implies `-latomic' on some hosts, so wire in libatomic
	# build directories.
	if [ishost "riscv*-*-linux*"] {
	    set shlib_ext [get_shlib_extension]
	    set atomic_library_path "${blddir}/../libatomic/.libs"
	    if { [file exists "${atomic_library_path}/libatomic.a"]
		 || [file exists \
		     "${atomic_library_path}/libatomic.${shlib_ext}"] } {
		lappend ALWAYS_CFLAGS \
		    "additional_flags=-L${atomic_library_path}"
		append always_ld_library_path ":${atomic_library_path}"
	    }
	}
	global cuda_driver_include
	global cuda_driver_lib
	if { $cuda_driver_include != "" } {
	    # Stop gfortran from freaking out:
	    # Warning: Nonexistent include directory "[...]"
	    if {[file exists $cuda_driver_include]} {
		lappend ALWAYS_CFLAGS "additional_flags=-I$cuda_driver_include"
	    }
	}
	if { $cuda_driver_lib != "" } {
	    lappend ALWAYS_CFLAGS "additional_flags=-L$cuda_driver_lib"
	    append always_ld_library_path ":$cuda_driver_lib"
	}
	global hsa_runtime_lib
	if { $hsa_runtime_lib != "" } {
	    append always_ld_library_path ":$hsa_runtime_lib"
	}
    }

    # We use atomic operations in the testcases to validate results.
    if { ([istarget i?86-*-*] || [istarget x86_64-*-*])
	 && [check_effective_target_ia32]
	 && ![check_effective_target_cas_char] } {
	lappend ALWAYS_CFLAGS "additional_flags=-march=i486"
    }

    if [istarget *-*-darwin*] {
	lappend ALWAYS_CFLAGS "additional_flags=-shared-libgcc"
    }

    if [istarget sparc*-*-*] {
	lappend ALWAYS_CFLAGS "additional_flags=-mcpu=v9"
    }

    if [info exists TOOL_OPTIONS] {
	lappend ALWAYS_CFLAGS "additional_flags=$TOOL_OPTIONS"
    }

    # Make sure that lines are not wrapped.  That can confuse the
    # error-message parsing machinery.
    lappend ALWAYS_CFLAGS "additional_flags=-fmessage-length=0"

    # Disable caret
    lappend ALWAYS_CFLAGS "additional_flags=-fno-diagnostics-show-caret"

    # Disable color diagnostics
    lappend ALWAYS_CFLAGS "additional_flags=-fdiagnostics-color=never"

    # Help GCC to find offload compilers' 'mkoffload'.
    global offload_additional_options
    if { $offload_additional_options != "" } {
	lappend ALWAYS_CFLAGS "additional_flags=${offload_additional_options}"
    }

    # Tell warning from error diagnostics.  This fits for C, C++, and Fortran.
    global gcc_warning_prefix
    set gcc_warning_prefix "\[Ww\]arning:"
    global gcc_error_prefix
    set gcc_error_prefix "(\[Ff\]atal )?\[Ee\]rror:"
}

#
# libgomp_target_compile -- compile a source file
#

proc libgomp_target_compile { source dest type options } {
    global blddir
    global libgomp_compile_options
    global gluefile wrap_flags
    global ALWAYS_CFLAGS
    global GCC_UNDER_TEST
    global lang_test_file
    global lang_library_path
    global lang_link_flags
    global lang_include_flags
    global lang_source_re

    if { [info exists lang_test_file] } {
        if { $blddir != "" } {
            # Some targets use libgfortran.a%s in their specs, so they need
            # a -B option for uninstalled testing.
            lappend options "additional_flags=-B${blddir}/${lang_library_path}"
            lappend options "ldflags=-L${blddir}/${lang_library_path}"
        }
        lappend options "ldflags=${lang_link_flags}"
	if { [info exists lang_include_flags] \
	     && [regexp ${lang_source_re} ${source}] } {
	    lappend options "additional_flags=${lang_include_flags}"
	}
    }

    if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
	lappend options "libs=${gluefile}"
	lappend options "ldflags=${wrap_flags}"
    }

    lappend options "additional_flags=[libio_include_flags]"
    lappend options "timeout=[timeout_value]"
    lappend options "compiler=$GCC_UNDER_TEST"

    set options [concat $libgomp_compile_options $options]

    if [info exists ALWAYS_CFLAGS] {
	set options [concat "$ALWAYS_CFLAGS" $options]
    }

    set options [dg-additional-files-options $options $source]

    set result [target_compile $source $dest $type $options]

    return $result
}

proc libgomp_option_help { } {
    send_user " --additional_options,OPTIONS\t\tUse OPTIONS to compile the testcase files. OPTIONS should be comma-separated.\n"
}

proc libgomp_option_proc { option } {
    if [regexp "^--additional_options," $option] {
	global libgomp_compile_options
	regsub "--additional_options," $option "" option
	foreach x [split $option ","] {
	    lappend libgomp_compile_options "additional_flags=$x"
	}
	return 1
    } else {
	return 0
    }
}

# Translate offload target to OpenACC device type.  Return the empty string if
# not supported, and 'host' for offload target 'disable'.
proc offload_target_to_openacc_device_type { offload_target } {
    switch -glob $offload_target {
	amdgcn* {
	    return "radeon"
	}
	disable {
	    return "host"
	}
	*-intelmic* {
	    return ""
	}
	nvptx* {
	    return "nvidia"
	}
	default {
	    error "Unknown offload target: $offload_target"
	}
    }
}

# Return 1 if compiling for the specified offload target
# Takes -foffload=... into account by checking OFFLOAD_TARGET_NAMES=
# in the -v compiler output.
proc libgomp_check_effective_target_offload_target { target_name } {
    # Consider all actual options, including the flags passed to
    # 'gcc-dg-runtest', or 'gfortran-dg-runtest' (see the 'libgomp.*/*.exp'
    # files; in particular, '-foffload', 'libgomp.oacc-*/*.exp'), which don't
    # get passed on to 'check_effective_target_*' functions.  (Not caching the
    # result due to that.)
    set options [list "additional_flags=[concat "-v" [current_compiler_flags]]"]
    # Instead of inspecting command-line options, look what the compiler driver
    # decides.  This is somewhat modelled after
    # 'gcc/testsuite/lib/target-supports.exp:check_configured_with'.
    set gcc_output [libgomp_target_compile "" "" "none" $options]
    if [regexp "(?n)^OFFLOAD_TARGET_NAMES=(.*)" $gcc_output dummy gcc_offload_targets] {
	verbose "compiling for offload targets: $gcc_offload_targets"
	return [string match "*:$target_name*:*" ":$gcc_offload_targets:"]
    }

    verbose "not compiling for $target_name offload target"
    return 0
}

# Return 1 if compiling for offload target nvptx.
proc check_effective_target_offload_target_nvptx { } {
    return [libgomp_check_effective_target_offload_target "nvptx"]
}

# Return 1 if compiling for offload target amdgcn
proc check_effective_target_offload_target_amdgcn { } {
    return [libgomp_check_effective_target_offload_target "amdgcn"]
}

# Return 1 if offload device is available.
proc check_effective_target_offload_device { } {
    return [check_runtime_nocache offload_device_available_ {
      #include <omp.h>
      int main ()
	{
	  int a;
	  #pragma omp target map(from: a)
	    a = omp_is_initial_device ();
	  return a;
	}
    } ]
}

# Return 1 if offload device is available and it has non-shared address space.
proc check_effective_target_offload_device_nonshared_as { } {
    return [check_runtime_nocache offload_device_nonshared_as {
      int main ()
	{
	  int a = 8;
	  #pragma omp target map(to: a)
	    a++;
	  return a != 8;
	}
    } ]
}
  
# Return 1 if offload device is available and it has shared address space.
proc check_effective_target_offload_device_shared_as { } {
    return [check_runtime_nocache offload_device_shared_as {
      int main ()
	{
	  int x = 10;
	  #pragma omp target map(to: x)
	    x++;
	  return x == 10;
	}
    } ]
}

# Return 1 if using nvptx offload device.
proc check_effective_target_offload_device_nvptx { } {
    return [check_runtime_nocache offload_device_nvptx {
      #include <omp.h>
      #include "testsuite/libgomp.c-c++-common/on_device_arch.h"
      int main ()
	{
	  return !on_device_arch_nvptx ();
	}
    } ]
}

# Return 1 if at least one Nvidia GPU is accessible.

proc check_effective_target_openacc_nvidia_accel_present { } {
    return [check_runtime openacc_nvidia_accel_present {
	#include <openacc.h>
	int main () {
	return !(acc_get_num_devices (acc_device_nvidia) > 0);
	}
    } "" ]
}

# Return 1 if at least one Nvidia GPU is accessible, and the OpenACC 'nvidia'
# device type is selected.

proc check_effective_target_openacc_nvidia_accel_selected { } {
    if { ![check_effective_target_openacc_nvidia_accel_present] } {
	return 0;
    }
    global openacc_device_type
    return [string match "nvidia" $openacc_device_type]
}

# Return 1 if using Intel MIC offload device.
proc check_effective_target_offload_device_intel_mic { } {
    return [check_runtime_nocache offload_device_intel_mic {
      #include <omp.h>
      #include "testsuite/libgomp.c-c++-common/on_device_arch.h"
      int main ()
	{
	  return !on_device_arch_intel_mic ();
	}
    } ]
}

# Return 1 if the OpenACC 'host' device type is selected.

proc check_effective_target_openacc_host_selected { } {
    global openacc_device_type
    return [string match "host" $openacc_device_type]
}

# Return 1 if at least one AMD GPU is accessible.

proc check_effective_target_openacc_radeon_accel_present { } {
    return [check_runtime openacc_radeon_accel_present {
	#include <openacc.h>
	int main () {
	return !(acc_get_num_devices (acc_device_radeon) > 0);
	}
    } "" ]
}

# Return 1 if at least one AMD GPU is accessible, and the OpenACC 'radeon'
# device type is selected.

proc check_effective_target_openacc_radeon_accel_selected { } {
    if { ![check_effective_target_openacc_radeon_accel_present] } {
	return 0;
    }
    global openacc_device_type
    return [string match "radeon" $openacc_device_type]
}

# Return 1 if cuda.h and -lcuda are available.

proc check_effective_target_openacc_cuda { } {
    return [check_no_compiler_messages openacc_cuda executable {
#include <cuda.h>
int main() {
    CUdevice dev;
    CUresult r = cuDeviceGet (&dev, 0);
    if (r != CUDA_SUCCESS)
	return 1;
    return 0;
} } "-lcuda" ]
}

# Return 1 if cublas_v2.h and -lcublas are available.

proc check_effective_target_openacc_cublas { } {
    return [check_no_compiler_messages openacc_cublas executable {
#include <cuda.h>
#include <cublas_v2.h>
int main() {
    cublasStatus_t s;
    cublasHandle_t h;
    CUdevice dev;
    CUresult r = cuDeviceGet (&dev, 0);
    if (r != CUDA_SUCCESS)
	return 1;
    s = cublasCreate (&h);
    if (s != CUBLAS_STATUS_SUCCESS)
	return 1;
    return 0;
} } "-lcuda -lcublas" ]
}

# Return 1 if cuda_runtime_api.h and -lcudart are available.

proc check_effective_target_openacc_cudart { } {
    return [check_no_compiler_messages openacc_cudart executable {
#include <cuda.h>
#include <cuda_runtime_api.h>
int main() {
    cudaError_t e;
    int devn;
    CUdevice dev;
    CUresult r = cuDeviceGet (&dev, 0);
    if (r != CUDA_SUCCESS)
	return 1;
    e = cudaGetDevice (&devn);
    if (e != cudaSuccess)
	return 1;
    return 0;
} } "-lcuda -lcudart" ]
}
