# Copyright (C) 1992-2018 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]

    if { [regexp "(^| )-frepo( |$)" $options] && \
	 [regexp "\.o(|bj)$" $dest] } then {
	regsub "\.o(|bj)$" $dest ".rpo" rponame
	exec rm -f $rponame
    }

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