# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2002, 2003,
# 2004, 2005, 2007, 2008 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 ""

#
# 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 "
          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 "
      }
      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 target_triplet
    global gcc_warning_prefix
    global gcc_error_prefix

    # 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 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/../../g++ "$base_dir/../../g++ -B$base_dir/../../" [findfile $base_dir/g++ "$base_dir/g++ -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 ""

    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 "error:"

    if { [string match "*-*-darwin*" $target_triplet] } {
	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

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

    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
    }

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

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

    return $result
}

#
# ${tool}_option_help
#

proc ${tool}_option_help { } {
    send_user " --additional_options,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 "^--additional_options," $option] {
	global gpp_compile_options
	regsub "--additional_options," $option "" option
	foreach x [split $option ","] {
	    lappend gpp_compile_options "additional_flags=$x"
	}
	return 1
    } else {
	return 0
    }
}
