# Copyright (C) 2004, 2005 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 2 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 this program; if not, write to the Free Software
# Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

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

#
# obj-c++ support library routines
#
load_lib prune.exp
load_lib gcc-defs.exp
load_lib target-libpath.exp

#
# OBJCXX_UNDER_TEST is the compiler under test.
#


set gpp_compile_options ""

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

proc obj-c++_version { } {
    global OBJCXX_UNDER_TEST
    
    obj-c++_init

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

#
# obj-c++_include_flags -- provide new version of obj-c++_include_flags
# (originally from libgloss.exp) which knows about the gcc tree structure
#
proc obj-c++_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"
}

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

proc obj-c++_link_flags { paths } {
    global rootme
    global srcdir
    global ld_library_path
    global OBJCXX_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 "
      }

      set objcpath "[get_multilibs]"
      set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.a]
      if { $libobjc_dir == ""} {
	  set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.a]
      }
      # Now check if we have a shared only build.
      if { $libobjc_dir == ""} {
	  set libobjc_dir \
	      [lookfor_file ${objcpath} libobjc/.libs/libobjc.${shlib_ext}]
      }
      if { $libobjc_dir == ""} {
	  set libobjc_dir \
	      [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.${shlib_ext}]
      }

      verbose "libobjc_dir: $libobjc_dir"

      if { $libobjc_dir != "" } {
	  set libobjc_dir [file dirname ${libobjc_dir}]
	  append flags "-L${libobjc_dir}"
	  append ld_library_path ":${libobjc_dir}"
      }
      append ld_library_path \
	  [gcc-set-multilib-library-path $OBJCXX_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"
}

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

proc obj-c++_init { args } {
    global subdir
    global gpp_initialized
    global base_dir
    global tmpdir
    global libdir
    global gluefile wrap_flags;
    global objdir srcdir
    global ALWAYS_OBJCXXFLAGS
    global TOOL_EXECUTABLE TOOL_OPTIONS
    global OBJCXX_UNDER_TEST
    global TESTING_IN_BUILD_TREE
    global target_triplet

    if ![info exists OBJCXX_UNDER_TEST] then {
	if [info exists TOOL_EXECUTABLE] {
	    set OBJCXX_UNDER_TEST $TOOL_EXECUTABLE;
	} else {
	    if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
		set OBJCXX_UNDER_TEST [transform c++]
	    } else {
		set OBJCXX_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\\+\\+" "$OBJCXX_UNDER_TEST" "gcc" OBJCXX_UNDER_TEST
    }

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

    if [info exists gluefile] {
	unset gluefile
    }

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

    set ALWAYS_OBJCXXFLAGS ""

    if ![is_remote host] {
	if [info exists TOOL_OPTIONS] {
	    lappend ALWAYS_OBJCXXFLAGS "additional_flags=[obj-c++_include_flags [get_multilibs ${TOOL_OPTIONS}] ]";
	    lappend ALWAYS_OBJCXXFLAGS "ldflags=[obj-c++_link_flags [get_multilibs ${TOOL_OPTIONS}] ]";
	} else {
	    lappend ALWAYS_OBJCXXFLAGS "additional_flags=[obj-c++_include_flags [get_multilibs] ]";
	    lappend ALWAYS_OBJCXXFLAGS "ldflags=[obj-c++_link_flags [get_multilibs] ]";
	}
    }

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

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

    if { [string match "*-*-darwin*" $target_triplet] } {
	lappend ALWAYS_OBJCXXFLAGS "ldflags=-multiply_defined suppress"
       }

    verbose -log "ALWAYS_OBJCXXFLAGS set to $ALWAYS_OBJCXXFLAGS"

    verbose "obj-c++ is initialized" 3
}

#
# obj-c++_target_compile -- compile a source file
#

proc obj-c++_target_compile { source dest type options } {
    global tmpdir
    global srcdir
    global gpp_compile_options
    global gluefile wrap_flags
    global ALWAYS_OBJCXXFLAGS
    global OBJCXX_UNDER_TEST
    global shlib_ext

    lappend options "libs=-lobjc"
    set shlib_ext [get_shlib_extension]
    verbose "shared lib extension: $shlib_ext"

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

    # If we have built libobjc along with the compiler (which usually
    # _is not_ the case on Mac OS X systems), point the test harness
    # at it (and associated headers).

    set objcpath "[get_multilibs]"

    set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.a]
    if { $libobjc_dir == ""} {
      verbose "see if we have -fgnu-runtime in options"
      if [regexp ".*-fgnu-runtime.*" "${options}" ] {
	  set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.a]
      }
    }
    if { $libobjc_dir == ""} {
	set libobjc_dir \
	    [lookfor_file ${objcpath} libobjc/.libs/libobjc.${shlib_ext}]
    }
    if { $libobjc_dir == ""} {
	verbose "see if we have -fgnu-runtime in options"
	if [regexp ".*-fgnu-runtime.*" "${options}"] {
	 set libobjc_dir \
	     [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.${shlib_ext}]
	}
    }

    if { $libobjc_dir != "" } {
	set objc_include_dir "${srcdir}/../../libobjc"
	lappend options "additional_flags=-I${objc_include_dir}"
    }

    lappend options "additional_flags=[libio_include_flags]"
    lappend options "compiler=$OBJCXX_UNDER_TEST";

    set options [concat $gpp_compile_options $options]

    set options [concat "$ALWAYS_OBJCXXFLAGS" $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
    }
}
