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

# 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 ""
# Allow gpp_std_list to be set in configuration files, e.g., ~/.dejagnurc
if ![info exists gpp_std_list] {
    set gpp_std_list { }
}
# Allow gpp_std_list to be set from the environment.
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}/libstdc++-v3/src/experimental/.libs/libstdc++exp.a"] {
	  append flags " -L${gccpath}/libstdc++-v3/src/experimental/.libs "
	  append ld_library_path ":${gccpath}/libstdc++-v3/src/experimental/.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

    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]

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

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