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

#
# obj-c++ support library routines
#
load_lib prune.exp
load_lib gcc-defs.exp
load_lib timeout.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"] {
          # Allow for %s spec substitutions
          append flags " -B${gccpath}/libstdc++-v3/src/.libs "
          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}"] {
	  # Allow for %s spec substitutions
	  append flags " -B${gccpath}/libstdc++-v3/src/.libs "
	  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}]
	  # Allow for %s spec substitutions
	  append flags " -B${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 gcc_warning_prefix
    global gcc_error_prefix
    global TEST_ALWAYS_FLAGS

    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/../../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\\+\\+" "$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 ""

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

    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"

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

    if { [istarget *-*-darwin*] } {
	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

    set shlib_ext [get_shlib_extension]
    verbose "input-options: $options" 4

    # We have to figure out which runtime will be used on darwin because
    # we need to add the include path for the gnu runtime if that is in
    # use.
    # First, set the default...
    if { [istarget *-*-darwin*] } {
	set nextruntime 1
    } else {
	set nextruntime 0
    }
    verbose "initial next runtime state : $nextruntime" 2
    # Next, see if we define the option in dg-options...
    foreach opt $options {
	if [regexp ".*-fnext-runtime.*" $opt] {
	    set nextruntime 1
	}
	if [regexp ".*-fgnu-runtime.*" $opt] {
	    set nextruntime 0
	}
    }
    verbose "next runtime state after dg opts: $nextruntime" 2
   
    set tgt [target_info name]
    if [board_info $tgt exists multilib_flags] {
	set lb [board_info $tgt multilib_flags]
	verbose "board multilib_flags $lb" 2
	foreach opt $lb {
	    if [regexp ".*-fnext-runtime.*" $opt] {
		set nextruntime 1
	    }
	    if [regexp ".*-fgnu-runtime.*" $opt] {
		set nextruntime 0
	    }
	}
    }
    verbose "next runtime state after any multilib opts: $nextruntime" 2

    lappend options "libs=-lobjc"

    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, 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 == ""} {
      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 == ""} {
	    set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.${shlib_ext}]
	}
    }

    if { $libobjc_dir != "" } {
	# If we are using the gnu runtime, add its includes.
	if { $nextruntime == 0 } {
	    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";
    lappend options "timeout=[timeout_value]"

    set options [concat $gpp_compile_options $options]

    set options [concat "$ALWAYS_OBJCXXFLAGS" $options];

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