# 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 scanrtl.exp
load_gcc_lib scantree.exp
load_gcc_lib scanipa.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

# Populate offload_targets_s (offloading targets separated by a space), and
# offload_targets_s_openacc (the same, but with OpenACC names; OpenACC spells
# some of them a little differently).
set offload_targets_s [split $offload_targets ","]
set offload_targets_s_openacc {}
foreach offload_target_openacc $offload_targets_s {
    # Translate to OpenACC names, or skip if not yet supported.
    switch $offload_target_openacc {
	intelmic {
	    continue
	}
	nvptx {
	    set offload_target_openacc "nvidia"
	}
	hsa {
	    continue
	}
    }
    lappend offload_targets_s_openacc "$offload_target_openacc"
}
lappend offload_targets_s_openacc "host"

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
    # non-fallback testing for Intel MIC targets
    global offload_targets
    if { [string match "*,intelmic,*" ",$offload_targets,"] } {
	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 != "" } {
	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] } {
	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 HSA warnings by default.
    lappend ALWAYS_CFLAGS "additional_flags=-Wno-hsa"

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

    # Used for support non-fallback offloading.
    # Help GCC to find target mkoffload.
    global offload_additional_options
    if { $offload_additional_options != "" } {
	lappend ALWAYS_CFLAGS "additional_flags=${offload_additional_options}"
    }
}

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

# 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 at least one nvidia board is present.

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 board is present, and the nvidia device type
# is selected by default by means of setting the environment variable
# ACC_DEVICE_TYPE.

proc check_effective_target_openacc_nvidia_accel_selected { } {
    if { ![check_effective_target_openacc_nvidia_accel_present] } {
	return 0;
    }
    global offload_target_openacc
    if { $offload_target_openacc == "nvidia" } {
        return 1;
    }
    return 0;
}

# Return 1 if the host target is selected for offloaded

proc check_effective_target_openacc_host_selected { } {
    global offload_target_openacc
    if { $offload_target_openacc == "host" } {
        return 1;
    }
    return 0;
}

# Return 1 if the selected OMP device is actually a HSA device

proc check_effective_target_hsa_offloading_selected_nocache {} {
    global tool

    set src {
	int main () {
	    int v = 1;
	    #pragma omp target map(from:v)
	    v = 0;
	    return v;
	}
    }
    
    set result [check_compile hsa_offloading_src executable $src]
    set lines [lindex $result 0]
    set exe [lindex $result 1]

    set ok 0
    if { [string match "" $lines] } {
	# No error messages, let us switch on HSA debugging output and run it
	set prev_HSA_DEBUG [getenv HSA_DEBUG]
	setenv HSA_DEBUG "1"
	set result [remote_load target "./$exe"]
	if { [string match "" $prev_HSA_DEBUG] } {
	    unsetenv HSA_DEBUG
	} else {
	    setenv HSA_DEBUG $prev_HSA_DEBUG
	}
	set status [lindex $result 0]
	if { $status != "pass" } {
	    remote_file build delete $exe
	    verbose "HSA availability test failed"
	    return 0
	}
	set output [lindex $result 1]
	if { [string match "*HSA debug: Going to dispatch kernel*" $output] } {
	    verbose "HSA availability detected"
	    set ok 1
	}
    }
    remote_file build delete $exe
    return $ok
}

# Return 1 if the selected OMP device is actually a HSA device and
# cache the result

proc check_effective_target_hsa_offloading_selected {} {
    return [check_cached_effective_target hsa_offloading_selected {
	check_effective_target_hsa_offloading_selected_nocache
    }]
}
