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

# This file was written by Rob Savoye (rob@cygnus.com)
# Many modifications by Jeffrey Wheat (cassidy@cygnus.com)
# With modifications by Mike Stump <mrs@cygnus.com>.

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

#
# GXX_UNDER_TEST is the compiler under test.
#


set gpp_compile_options ""
set gpp_std_list { }
if [info exists env(GXX_TESTSUITE_STDS)] {
    set gpp_std_list [split $env(GXX_TESTSUITE_STDS) ","]
}

#
# g++_version -- extract and print the version number of the compiler
#

proc g++_version { } {
    global GXX_UNDER_TEST
    
    g++_init

    # ignore any arguments after the command
    set compiler [lindex $GXX_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"
    }
}

#
# g++_include_flags -- provide new version of g++_include_flags
# (originally from libgloss.exp) which knows about the gcc tree structure
#
proc g++_include_flags { paths } {
    global srcdir
    global HAVE_LIBSTDCXX_V3
    global TESTING_IN_BUILD_TREE

    set flags ""

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

    set gccpath ${paths}

    set odir [lookfor_file ${gccpath} libstdc++-v3]
    if { ${odir} != "" } {
      append flags [exec sh ${odir}/scripts/testsuite_flags --build-includes]  
    }

    return "$flags"
}

#
# g++_link_flags -- provide new version of g++_link_flags
# (originally from libgloss.exp) which knows about the gcc tree structure
#

proc g++_link_flags { paths } {
    global srcdir
    global ld_library_path
    global GXX_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}/lib/libstdc++.a"] {
          append ld_library_path ":${gccpath}/lib"
      }
      if [file exists "${gccpath}/libg++/libg++.a"] {
          append flags "-L${gccpath}/libg++ "
          append ld_library_path ":${gccpath}/libg++"
      }
      if [file exists "${gccpath}/libstdc++/libstdc++.a"] {
          append flags "-L${gccpath}/libstdc++ "
          append ld_library_path ":${gccpath}/libstdc++"
      }
      if [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.a"] {
          append flags " -L${gccpath}/libstdc++-v3/src/.libs "
          # Some targets use libstdc++.a%s in their specs, so they need a
          # -B option for uninstalled testing.
          append flags " -B${gccpath}/libstdc++-v3/src/.libs "
          append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
      }
      # Look for libstdc++.${shlib_ext}.
      if [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.${shlib_ext}"] {
	  append flags " -L${gccpath}/libstdc++-v3/src/.libs "
	  append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
      }

      if [file exists "${gccpath}/libiberty/libiberty.a"] {
          append flags "-L${gccpath}/libiberty "
      }
      if [file exists "${gccpath}/librx/librx.a"] {
          append flags "-L${gccpath}/librx "
      }
      if [file exists "${gccpath}/libitm/libitm.spec"] {
	  append flags "-B${gccpath}/libitm/ -L${gccpath}/libitm/.libs"
	  append ld_library_path ":${gccpath}/libitm/.libs"
      }
      append ld_library_path [gcc-set-multilib-library-path $GXX_UNDER_TEST]
    } else {
      global tool_root_dir

      set libgpp [lookfor_file ${tool_root_dir} libg++]
      if { $libgpp != "" } {
          append flags "-L${libgpp} "
          append ld_library_path ":${libgpp}"
      }
      set libstdcpp [lookfor_file ${tool_root_dir} libstdc++]
      if { $libstdcpp != "" } {
          append flags "-L${libstdcpp} "
          append ld_library_path ":${libstdcpp}"
      }
      set libiberty [lookfor_file ${tool_root_dir} libiberty]
      if { $libiberty != "" } {
          append flags "-L${libiberty} "
      }
      set librx [lookfor_file ${tool_root_dir} librx]
      if { $librx != "" } {
          append flags "-L${librx} "
      }
    }

    set_ld_library_path_env_vars

    return "$flags"
}

#
# g++_init -- called at the start of each subdir of tests
#

proc g++_init { args } {
    global subdir
    global gpp_initialized
    global base_dir
    global tmpdir
    global libdir
    global gluefile wrap_flags
    global objdir srcdir
    global ALWAYS_CXXFLAGS
    global CXXFLAGS
    global TOOL_EXECUTABLE TOOL_OPTIONS
    global GXX_UNDER_TEST
    global TESTING_IN_BUILD_TREE
    global gcc_warning_prefix
    global gcc_error_prefix
    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

    # 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 GXX_UNDER_TEST] then {
	if [info exists TOOL_EXECUTABLE] {
	    set GXX_UNDER_TEST $TOOL_EXECUTABLE
	} else {
	    if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
		set GXX_UNDER_TEST [transform c++]
	    } else {
		set GXX_UNDER_TEST [findfile $base_dir/../../xg++ "$base_dir/../../xg++ -B$base_dir/../../" [findfile $base_dir/xg++ "$base_dir/xg++ -B$base_dir/" [transform c++]]]
	    }
	}
    }

    # Bleah, nasty. Bad taste.
    if [ishost "*-dos-*" ] {
	regsub "c\\+\\+" "$GXX_UNDER_TEST" "gcc" GXX_UNDER_TEST
    }

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

    if [info exists gluefile] {
	unset gluefile
    }

    g++_maybe_build_wrapper "${tmpdir}/g++-testglue.o" "-fexceptions"

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

    set ALWAYS_CXXFLAGS ""

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

    if ![is_remote host] {
	if [info exists TOOL_OPTIONS] {
	    lappend ALWAYS_CXXFLAGS "additional_flags=[g++_include_flags [get_multilibs ${TOOL_OPTIONS}] ]"
	    lappend ALWAYS_CXXFLAGS "ldflags=[g++_link_flags [get_multilibs ${TOOL_OPTIONS}] ]"
	} else {
	    lappend ALWAYS_CXXFLAGS "additional_flags=[g++_include_flags [get_multilibs] ]"
	    lappend ALWAYS_CXXFLAGS "ldflags=[g++_link_flags [get_multilibs] ]"
	}
    }

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

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

    set gcc_warning_prefix "warning:"
    set gcc_error_prefix "(fatal )?error:"

    if { [istarget *-*-darwin*] } {
	lappend ALWAYS_CXXFLAGS "ldflags=-multiply_defined suppress"
       }

    verbose -log "ALWAYS_CXXFLAGS set to $ALWAYS_CXXFLAGS"

    verbose "g++ is initialized" 3
}

#
# g++_target_compile -- compile a source file
#

proc g++_target_compile { source dest type options } {
    global tmpdir
    global gpp_compile_options
    global gluefile wrap_flags
    global ALWAYS_CXXFLAGS
    global GXX_UNDER_TEST
    global flags_to_postpone
    global board_info

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

    global TEST_EXTRA_LIBS
    if [info exists TEST_EXTRA_LIBS] {
	lappend options "ldflags=$TEST_EXTRA_LIBS"
    }

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

    set options [concat $gpp_compile_options $options]

    set options [concat "$ALWAYS_CXXFLAGS" $options]

    # bind_pic_locally adds -fpie/-fPIE flags to flags_to_postpone and it is
    # appended here to multilib_flags as it can be overridden by the latter
    # if it was added earlier. After the target_compile, multilib_flags is
    # restored to its orignal content.
    set tboard [target_info name]
    if {[board_info $tboard exists multilib_flags]} {
        set orig_multilib_flags "[board_info [target_info name] multilib_flags]"
        append board_info($tboard,multilib_flags) " $flags_to_postpone"
    }

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

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

    if {[board_info $tboard exists multilib_flags]} {
        set board_info($tboard,multilib_flags) $orig_multilib_flags
        set flags_to_postpone ""
    }

    return $result
}

#
# ${tool}_option_help
#
# Changed "additional" to "extra" because runtest.exp treats --a* as --all.
#
# This shouldn't be necessary at all; it should be entirely redundant with
# --tool_opts, except that --tool_opts currently breaks multilib: see
# http://lists.gnu.org/archive/html/dejagnu/2002-10/msg00007.html

proc ${tool}_option_help { } {
    send_user " --extra_opts,OPTIONS\t\tUse OPTIONS to compile the testcase files. OPTIONS should be comma-separated.\n"
}

#
# ${tool}_option_proc
#

proc ${tool}_option_proc { option } {
    if [regexp "^--extra_opts," $option] {
	global gpp_compile_options
	regsub "^--extra_opts," $option "" option
	foreach x [split $option ","] {
	    lappend gpp_compile_options "additional_flags=$x"
	}
	verbose -log "gpp_compile_options set to $gpp_compile_options"
	return 1
    } elseif [regexp "^--stds=" $option] {
	global gpp_std_list
	regsub "^--stds=" $option "" option
	foreach x [split $option ","] {
	    lappend gpp_std_list "$x"
	}
	verbose -log "gpp_std_list set to $gpp_std_list"
	return 1
    } else {
	return 0
    }
}
