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

#
# atomic_link_flags -- compute library path and flags to find libatomic.
# (originally from g++.exp)
#

proc atomic_link_flags { paths } {
    global srcdir
    global ld_library_path
    global shlib_ext

    set gccpath ${paths}
    set flags ""

    set shlib_ext [get_shlib_extension]

    if { $gccpath != "" } {
      if { [file exists "${gccpath}/libatomic/.libs/libatomic.a"]
	   || [file exists "${gccpath}/libatomic/.libs/libatomic.${shlib_ext}"] } {
	  append flags " -B${gccpath}/libatomic/ "
	  append flags " -L${gccpath}/libatomic/.libs"
	  append ld_library_path ":${gccpath}/libatomic/.libs"
      }
    } else {
      global tool_root_dir

      set libatomic [lookfor_file ${tool_root_dir} libatomic]
      if { $libatomic != "" } {
	  append flags "-L${libatomic} "
	  append ld_library_path ":${libatomic}"
      }
    }

    set_ld_library_path_env_vars

    return "$flags"
}

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

proc atomic_init { args } {
    global TEST_ALWAYS_FLAGS
    global ALWAYS_CXXFLAGS
    global TOOL_OPTIONS
    global atomic_saved_TEST_ALWAYS_FLAGS
    global atomic_saved_ALWAYS_CXXFLAGS

    set link_flags ""
    if ![is_remote host] {
	if [info exists TOOL_OPTIONS] {
	    set link_flags "[atomic_link_flags [get_multilibs ${TOOL_OPTIONS}]]"
	} else {
	    set link_flags "[atomic_link_flags [get_multilibs]]"
	}
    }

    append link_flags " -latomic "

    if [info exists TEST_ALWAYS_FLAGS] {
	set atomic_saved_TEST_ALWAYS_FLAGS $TEST_ALWAYS_FLAGS
    }
    if [info exists ALWAYS_CXXFLAGS] {
	set atomic_saved_ALWAYS_CXXFLAGS $ALWAYS_CXXFLAGS
	set ALWAYS_CXXFLAGS [concat "{ldflags=$link_flags}" $ALWAYS_CXXFLAGS]
    } else {
	if [info exists TEST_ALWAYS_FLAGS] {
	    set TEST_ALWAYS_FLAGS "$link_flags $TEST_ALWAYS_FLAGS"
	} else {
	    set TEST_ALWAYS_FLAGS "$link_flags"
	}
    }
    return [check_no_compiler_messages_nocache libatomic_available executable {
	int main (void) { return 0; }
    }]
}

#
# atomic_finish -- called at the end of each subdir of tests
#

proc atomic_finish { args } {
    global TEST_ALWAYS_FLAGS
    global atomic_saved_TEST_ALWAYS_FLAGS
    global atomic_saved_ALWAYS_CXXFLAGS

    if [info exists atomic_saved_ALWAYS_CXXFLAGS] {
	set ALWAYS_CXXFLAGS $atomic_saved_ALWAYS_CXXFLAGS
    } else {
	if [info exists atomic_saved_TEST_ALWAYS_FLAGS] {
	  set TEST_ALWAYS_FLAGS $atomic_saved_TEST_ALWAYS_FLAGS
	} else {
	  unset TEST_ALWAYS_FLAGS
	}
    }
    clear_effective_target_cache
}
