# Copyright (C) 2009-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/>.

#
# go support library routines
#
load_lib prune.exp
load_lib gcc-defs.exp
load_lib timeout.exp
load_lib target-libpath.exp

#
# GOC_UNDER_TEST is the compiler under test.
#


set gpp_compile_options ""


#
# go_version -- extract and print the version number of the compiler
#

proc go_version { } {
    global GOC_UNDER_TEST
    
    go_init

    # ignore any arguments after the command
    set compiler [lindex $GOC_UNDER_TEST 0]
    
    # verify that the compiler exists
    if { [is_remote host] || [which $compiler] != 0 } then {
	set tmp [remote_exec host "$compiler -v"]
	set status [lindex $tmp 0]
	set output [lindex $tmp 1]
	regexp " version \[^\n\r\]*" $output version
	if { $status == 0 && [info exists version] } then {
	    if [is_remote host] {
		clone_output "$compiler $version\n"
	    } else {
		clone_output "[which $compiler] $version\n"
	    }
	} else {
	    clone_output "Couldn't determine version of [which $compiler]\n"
	}
    } else {
	# compiler does not exist (this should have already been detected)
	warning "$compiler does not exist"
    }
}

#
# go_include_flags -- include flags for the gcc tree structure
#

proc go_include_flags { paths } {
    global srcdir
    global TESTING_IN_BUILD_TREE

    set flags ""

    if { [is_remote host] || ![info exists TESTING_IN_BUILD_TREE] } {
	return "${flags}"
    }

    set gccpath ${paths}

    if { $gccpath != "" } {
	if [file exists "${gccpath}/libgo/os.gox"] {
	    append flags "-I${gccpath}/libgo "
	}
    }
}

#
# go_link_flags -- linker flags for the gcc tree structure
#

proc go_link_flags { paths } {
    global srcdir
    global ld_library_path
    global GOC_UNDER_TEST
    global shlib_ext

    set gccpath ${paths}
    set libio_dir ""
    set flags ""
    set ld_library_path "."
    set shlib_ext [get_shlib_extension]
    verbose "shared lib extension: $shlib_ext"

    if { $gccpath != "" } {
      if [file exists "${gccpath}/libgo/libgobegin.a"] {
	  append flags "-L${gccpath}/libgo "
      }
      if { [file exists "${gccpath}/libgo/.libs/libgo.a"] \
	   || [file exists "${gccpath}/libgo/.libs/libgo.${shlib_ext}"] } {
          append flags "-L${gccpath}/libgo/.libs "
          append ld_library_path ":${gccpath}/libgo/.libs"
      }
      if [file exists "${gccpath}/libiberty/libiberty.a"] {
          append flags "-L${gccpath}/libiberty "
      }
      append ld_library_path \
	[gcc-set-multilib-library-path $GOC_UNDER_TEST]
    }

    set_ld_library_path_env_vars

    return "$flags"
}

#
# go_init -- called at the start of each subdir of tests
#

proc go_init { args } {
    global subdir
    global gpp_initialized
    global base_dir
    global tmpdir
    global libdir
    global gluefile wrap_flags
    global objdir srcdir
    global ALWAYS_GOCFLAGS
    global TOOL_EXECUTABLE TOOL_OPTIONS
    global GOC_UNDER_TEST
    global TESTING_IN_BUILD_TREE
    global TEST_ALWAYS_FLAGS

    # 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

    if ![info exists GOC_UNDER_TEST] then {
	if [info exists TOOL_EXECUTABLE] {
	    set GOC_UNDER_TEST $TOOL_EXECUTABLE
	} else {
	    if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
		set GOC_UNDER_TEST [transform gccgo]
	    } else {
		set GOC_UNDER_TEST [findfile $base_dir/../../gccgo "$base_dir/../../gccgo -B$base_dir/../../" [findfile $base_dir/gccgo "$base_dir/gccgo -B$base_dir/" [transform gccgo]]]
	    }
	}
    }

    if ![is_remote host] {
	if { [which $GOC_UNDER_TEST] == 0 } then {
	    perror "GOC_UNDER_TEST ($GOC_UNDER_TEST) does not exist"
	    exit 1
	}
    }
    if ![info exists tmpdir] {
	set tmpdir "/tmp"
    }

    if [info exists gluefile] {
	unset gluefile
    }

    go_maybe_build_wrapper "${tmpdir}/go-testglue.o"

    set ALWAYS_GOCFLAGS ""

    # TEST_ALWAYS_FLAGS are flags that should be passed to every
    # compilation.  They are passed first to allow individual
    # tests to override them.
    if [info exists TEST_ALWAYS_FLAGS] {
	lappend ALWAYS_GOCFLAGS "additional_flags=$TEST_ALWAYS_FLAGS"
    }

    if ![is_remote host] {
	if [info exists TOOL_OPTIONS] {
	    lappend ALWAYS_GOCFLAGS "additional_flags=[go_include_flags [get_multilibs ${TOOL_OPTIONS}] ]"
	    lappend ALWAYS_GOCFLAGS "ldflags=[go_link_flags [get_multilibs ${TOOL_OPTIONS}] ]"
	} else {
	    lappend ALWAYS_GOCFLAGS "additional_flags=[go_include_flags [get_multilibs] ]"
	    lappend ALWAYS_GOCFLAGS "ldflags=[go_link_flags [get_multilibs] ]"
	}
    }

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

    verbose -log "ALWAYS_GOCFLAGS set to $ALWAYS_GOCFLAGS"

    verbose "go is initialized" 3
}

#
# go_target_compile -- compile a source file
#

proc go_target_compile { source dest type options } {
    global tmpdir
    global gluefile wrap_flags
    global ALWAYS_GOCFLAGS
    global GOC_UNDER_TEST

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

    lappend options "timeout=[timeout_value]"
    lappend options "compiler=$GOC_UNDER_TEST"

    set options [concat "$ALWAYS_GOCFLAGS" $options]
    set options [dg-additional-files-options $options $source]
    return [target_compile $source $dest $type $options]
}
