# Copyright (C) 1992-2021 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)
# Currently maintained by Doug Evans (dje@cygnus.com)

# This file is loaded by the tool init file (eg: unix.exp).  It provides
# default definitions for objc_start, etc. and other supporting cast members.

# These globals are used by objc_start if no compiler arguments are provided.
# They are also used by the various testsuites to define the environment:
# where to find stdio.h, libc.a, etc.

load_lib libgloss.exp
load_lib prune.exp
load_lib gcc-defs.exp
load_lib timeout.exp
load_lib target-libpath.exp
load_lib target-utils.exp

#
# OBJC_UNDER_TEST is the compiler under test.
#

#
# default_objc_version -- extract and print the version number of the compiler
#

proc default_objc_version { } {
    global OBJC_UNDER_TEST

    objc_init

    # Ignore any arguments after the command.
    set compiler [lindex $OBJC_UNDER_TEST 0]

    if ![is_remote host] {
	set compiler_name [which $compiler]
    } else {
	set compiler_name $compiler
    }

    # Verify that the compiler exists.
    if { $compiler_name != 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 {
	    clone_output "$compiler_name $version\n"
	} else {
	    clone_output "Couldn't determine version of $compiler_name: $output\n"
	}
    } else {
	# Compiler does not exist (this should have already been detected).
	warning "$compiler does not exist"
    }
}

#
# Call objc_version. We do it this way so we can override it if needed.
#
proc objc_version { } {
    default_objc_version
}

#
# objc_init -- called at the start of each .exp script.
#
# There currently isn't much to do, but always using it allows us to
# make some enhancements without having to go back and rewrite the scripts.
#

set objc_initialized 0

proc objc_init { args } {
    global rootme
    global tmpdir
    global libdir
    global gluefile wrap_flags
    global objc_initialized
    global OBJC_UNDER_TEST
    global TOOL_EXECUTABLE
    global objc_libgcc_s_path
    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

    # 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 { $objc_initialized == 1 } { return; }

    if ![info exists OBJC_UNDER_TEST] then {
	if [info exists TOOL_EXECUTABLE] {
	    set OBJC_UNDER_TEST $TOOL_EXECUTABLE
	} else {
	    set OBJC_UNDER_TEST [find_gcc]
	}
    }

    if ![info exists tmpdir] then {
	set tmpdir /tmp
    }

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

    objc_maybe_build_wrapper "${tmpdir}/objc-testglue.o"

    set objc_libgcc_s_path [gcc-set-multilib-library-path $OBJC_UNDER_TEST]
}

proc objc_target_compile { source dest type options } {
    global rootme
    global tmpdir
    global gluefile wrap_flags
    global srcdir
    global OBJC_UNDER_TEST
    global TOOL_OPTIONS
    global ld_library_path
    global objc_libgcc_s_path
    global shlib_ext
    global TEST_ALWAYS_FLAGS
    
    set shlib_ext [get_shlib_extension]
    set ld_library_path ".:${objc_libgcc_s_path}"
    
    # 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"
    verbose "shared lib extension: $shlib_ext" 3

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

    # 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] {
	set options [concat "{additional_flags=$TEST_ALWAYS_FLAGS}" $options]
    }

    # TOOL_OPTIONS must come first, so that it doesn't override testcase
    # specific options.
    if [info exists TOOL_OPTIONS] {
	set options [concat "{additional_flags=$TOOL_OPTIONS}" $options]
    }

    # 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 == "" } {
	# On darwin there is, potentially, a gnu runtime too.
	set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.a]
    }
    # Perhaps we didn't build static libs.
    if { $libobjc_dir == "" } {
	set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.${shlib_ext}]
	# On darwin there is, potentially, a gnu runtime too.
	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}"
	    verbose "adding gnu runtime include dir: $objc_include_dir "
	}
	set libobjc_dir [file dirname ${libobjc_dir}]
	# Allow for %s spec substitutions..
	set objc_link_flags " -B${libobjc_dir} "
	lappend options "additional_flags=${objc_link_flags}"
	set objc_link_flags " -L${libobjc_dir} "
	lappend options "additional_flags=${objc_link_flags}"
	append ld_library_path ":${libobjc_dir}"
    }
    if { $type == "precompiled_header" } {
	# If we generating a precompiled header, we have say this is an
	# objective-C header.
	set source [concat "-x objective-c-header" $source]
    }
    lappend options "compiler=$OBJC_UNDER_TEST"
    lappend options "timeout=[timeout_value]"

    set_ld_library_path_env_vars

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

    return [target_compile $source $dest $type $options]
}

#
# objc_pass -- utility to record a testcase passed.
#

proc objc_pass { testcase cflags } {
    if { "$cflags" == "" } {
	pass "$testcase"
    } else {
	pass "$testcase, $cflags"
    }
}

#
# objc_fail -- utility to record a testcase failed
#

proc objc_fail { testcase cflags } {
    if { "$cflags" == "" } {
	fail "$testcase"
    } else {
	fail "$testcase, $cflags"
    }
}

#
# objc_finish -- called at the end of every .exp script that calls objc_init
#
# The purpose of this proc is to hide all quirks of the testing environment
# from the testsuites.  It also exists to undo anything that objc_init did
# (that needs undoing).
#

proc objc_finish { } {
    # The testing harness apparently requires this.
    global errorInfo

    if [info exists errorInfo] then {
	unset errorInfo
    }

    # Might as well reset these (keeps our caller from wondering whether
    # s/he has to or not).
    global prms_id bug_id
    set prms_id 0
    set bug_id 0
}

proc objc_exit { } {
    global gluefile

    if [info exists gluefile] {
	file_on_build delete $gluefile
	unset gluefile
    }
}
    
# If this is an older version of dejagnu (without runtest_file_p),
# provide one and assume the old syntax: foo1.exp bar1.c foo2.exp bar2.c.
# This can be deleted after next dejagnu release.

if { [info procs runtest_file_p] == "" } then {
    proc runtest_file_p { runtests testcase } {
	if { $runtests != "" && [regexp "\[.\]\[cC\]" $runtests] } then {
	    if { [lsearch $runtests [file tail $testcase]] >= 0 } then {
		return 1
	    } else {
		return 0
	    }
	}
	return 1
    }
}

# Provide a definition of this if missing (delete after next dejagnu release).

if { [info procs prune_warnings] == "" } then {
    proc prune_warnings { text } {
	return $text
    }
}

# Prune messages from objc that aren't useful.

proc prune_objc_output { text } {
    #send_user "Before:$text\n"
    regsub -all "(^|\n)\[^\n\]*: In (function|method) \[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: At top level:\[^\n\]*" $text "" text

    # It would be nice to avoid passing anything to objc that would cause it to
    # issue these messages (since ignoring them seems like a hack on our part),
    # but that's too difficult in the general case.  For example, sometimes
    # you need to use -B to point objc at crt0.o, but there are some targets
    # that don't have crt0.o.
    regsub -all "(^|\n)\[^\n\]*file path prefix \[^\n\]* never used" $text "" text
    regsub -all "(^|\n)\[^\n\]*linker input file unused since linking not done" $text "" text

    #send_user "After:$text\n"

    return $text
}

