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

load_lib file-format.exp
load_lib target-supports.exp

# Make sure that the runtime list is re-evaluated for each multilib.
proc objc-set-runtime-options { dowhat args } {
    global OBJC_RUNTIME_OPTIONS
    set rtlist [list "-fgnu-runtime" ]
    # At present (4.6), the only NeXT runtime target is Darwin.
    # The previously used approach of testing trivial compiles is not reliable
    # for determining the absence of the NeXT runtime, since a non-Darwin
    # installation can have the objc headers present in the same locations 
    # that Darwin uses.  If NeXT is ported to another target, then it should
    # be listed here.
    if [istarget *-*-darwin*] {
      lappend rtlist "-fnext-runtime" 
    }
    if [info exists OBJC_RUNTIME_OPTIONS] {
      foreach other $OBJC_RUNTIME_OPTIONS {
	# Don't do tests twice...
	if { ( $other == "-fnext-runtime"  || $other == "-fgnu-runtime" ) } {
	  continue
	}
	lappend rtlist $other
      }
    }

    set OBJC_RUNTIME_OPTIONS ""

    foreach type $rtlist {
	global srcdir subdir target_triplet tmpdir

	set options "additional_flags=$type"
	if [info exists args] {
	    lappend options $args
	}
	verbose "options $options"
	if [info exists dowhat] {
          switch $dowhat {
	    "compile" {
              # We should check that the generated asm is sensible, so do 
              # the equivalent of -c.
	      set compile_type "object"
	      set output_file "trivial.o"
	      set comp_output [objc_target_compile \
	        "$srcdir/$subdir/trivial.m" "$output_file" "$compile_type" $options]

	      remote_file build delete $output_file
	      # If we get any error, then we failed.
	      if ![string match "" $comp_output] then {
	        continue;
	      }
	    }
	    "execute" {
	      set test_obj "trivial.exe"
	      set comp_output [objc_target_compile \
	        "$srcdir/$subdir/trivial.m" $test_obj "executable" $options]

	      # If we get any error, then we failed.
	      if ![string match "" $comp_output] then {
	        remote_file build delete $test_obj
	        continue;
	      }
	      set result [objc_load "$tmpdir/$test_obj" "" ""]
	      set status [lindex $result 0]
	      set output [lindex $result 1]
	      remote_file build delete $test_obj
	      if { $status != "pass" } {
	        verbose -log "trivial execute failed with $status $output"
	        continue;
	      }
	    }
	    default {
	      perror "$dowhat: not a valid objc-torture action"
	      return ""
	    }
	  }
	} else {
	  set test_obj "trivial.exe"
	  set comp_output [objc_target_compile \
	  "$srcdir/$subdir/trivial.m" $test_obj executable $options]

	  # If we get any error, then we failed.
	  remote_file build delete $test_obj
	  if ![string match "" $comp_output] then {
	      continue;
	  }
	}
	lappend OBJC_RUNTIME_OPTIONS $type
    }

    verbose -log "Using the following runtimes: $OBJC_RUNTIME_OPTIONS"
}

# The default option list can be overridden by
# TORTURE_OPTIONS="{ { list1 } ... { listN } }"

if [info exists TORTURE_OPTIONS] {
    set OBJC_TORTURE_OPTIONS $TORTURE_OPTIONS
} else {
    # It is theoretically beneficial to group all of the O2/O3 options together,
    # as in many cases the compiler will generate identical executables for
    # all of them--and the objc-torture testsuite will skip testing identical
    # executables multiple times.
    # Also note that -finline-functions is explicitly included in one of the
    # items below, even though -O3 is also specified, because some ports may
    # choose to disable inlining functions by default, even when optimizing.
    set OBJC_TORTURE_OPTIONS [list \
	" -O0 " \
	" -O1 " \
	" -O2 " \
	" -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions " \
	" -O3 -g " \
	" -Os " ]
}

if [info exists ADDITIONAL_TORTURE_OPTIONS] {
    set OBJC_TORTURE_OPTIONS \
	[concat $OBJC_TORTURE_OPTIONS $ADDITIONAL_TORTURE_OPTIONS]
}

#
# objc-torture-compile -- runs the Tege OBJC-torture test
#
# SRC is the full pathname of the testcase.
# OPTION is the specific compiler flag we're testing (eg: -O2).
#
proc objc-torture-compile { src option } {
    global output
    global srcdir tmpdir
    global host_triplet

    set output "$tmpdir/[file tail [file rootname $src]].o"

    regsub "(?q)$srcdir/" $src "" testcase
    # If we couldn't rip $srcdir out of `src' then just do the best we can.
    # The point is to reduce the unnecessary noise in the logs.  Don't strip
    # out too much because different testcases with the same name can confuse
    # `test-tool'.
    if [string match "/*" $testcase] {
	set testcase "[file tail [file dirname $src]]/[file tail $src]"
    }

    verbose "Testing $testcase, $option" 1

    # Run the compiler and analyze the results.
    set options ""
    lappend options "additional_flags=-w $option"

    set comp_output [objc_target_compile "$src" "$output" object $options]
    objc_check_compile $testcase $option $output $comp_output
    remote_file build delete $output
}

#
# objc-torture-execute -- utility to compile and execute a testcase
#
# SRC is the full pathname of the testcase.
#
# If the testcase has an associated .x file, we source that to run the
# test instead.  We use .x so that we don't lengthen the existing filename
# to more than 14 chars.
#
proc objc-torture-execute { src args } {
    global tmpdir tool srcdir output compiler_conditional_xfail_data

    if { [llength $args] > 0 } {
	set additional_flags [lindex $args 0]
    } else {
	set additional_flags ""
    }
    # Check for alternate driver.
    if [file exists [file rootname $src].x] {
	verbose "Using alternate driver [file rootname [file tail $src]].x" 2
	set done_p 0
	catch "set done_p \[source [file rootname $src].x\]"
	if { $done_p } {
	    return
	}
    }

    # Look for a loop within the source code - if we don't find one,
    # don't pass -funroll[-all]-loops.
    global torture_with_loops torture_without_loops
    if [expr [search_for $src "for*("]+[search_for $src "while*("]] then {
	set option_list $torture_with_loops
    } else {
	set option_list $torture_without_loops
    }

    set executable $tmpdir/[file tail [file rootname $src].x]

    regsub "(?q)$srcdir/" $src "" testcase
    # If we couldn't rip $srcdir out of `src' then just do the best we can.
    # The point is to reduce the unnecessary noise in the logs.  Don't strip
    # out too much because different testcases with the same name can confuse
    # `test-tool'.
    if [string match "/*" $testcase] {
	set testcase "[file tail [file dirname $src]]/[file tail $src]"
    }

    set count 0
    set oldstatus "foo"
    foreach option $option_list {
	if { $count > 0 } {
	    if [info exists oldexec] {
		remote_file build delete $oldexec
	    }
	    set oldexec $execname
	}
	set execname "${executable}${count}"
	incr count

	# torture_{compile,execute}_xfail are set by the .x script
	# (if present)
	if [info exists torture_compile_xfail] {
	    setup_xfail $torture_compile_xfail
	}

	# torture_execute_before_{compile,execute} can be set by the .x script
	# (if present)
	if [info exists torture_eval_before_compile] {
	  set ignore_me [eval $torture_eval_before_compile]
	}

	remote_file build delete $execname
	verbose "Testing $testcase, $option" 1

	set options ""
	lappend options "additional_flags=-w $option"
	if { $additional_flags != "" } {
	    lappend options "additional_flags=$additional_flags"
	}
	set comp_output [objc_target_compile "$src" "${execname}" executable $options]

	if ![objc_check_compile "$testcase compilation" $option $execname $comp_output] {
	    unresolved "$testcase execution, $option"
	    remote_file build delete $execname
	    continue
	}

	# See if this source file uses "long long" types, if it does, and
	# no_long_long is set, skip execution of the test.
	if [target_info exists no_long_long] then {
	    if [expr [search_for $src "long long"]] then {
		unsupported "$testcase execution, $option"
		remote_file build delete $execname
		continue
	    }
	}

	if [info exists torture_execute_xfail] {
	    setup_xfail $torture_execute_xfail
	}

	if [info exists torture_eval_before_execute] {
	    set ignore_me [eval $torture_eval_before_execute]
	}


	# Sometimes we end up creating identical executables for two
	# consecutive sets of different of compiler options.
	#
	# In such cases we know the result of this test will be identical
	# to the result of the last test.
	#
	# So in cases where the time to load and run/simulate the test
	# is relatively high, compare the two binaries and avoid rerunning
	# tests if the executables are identical.
	#
	# Do not do this for native testing since the cost to load/execute
	# the test is fairly small and the comparison step actually slows
	# the entire process down because it usually does not "hit".
	set skip 0
	if { ![isnative] && [info exists oldexec] } {
	    if { [remote_file build cmp $oldexec $execname] == 0 } {
		set skip 1
		set status $oldstatus
	    }
	}
	if { $skip == 0 } {
	    set result [objc_load "$execname" "" ""]
	    set status [lindex $result 0]
	    set output [lindex $result 1]
	}
	$status "$testcase execution, $option"
	set oldstatus $status
    # for each option
    } 
    # tidy up
    if [info exists execname] {
	remote_file build delete $execname
    }
    if [info exists oldexec] {
	remote_file build delete $oldexec
    }
}

#
# search_for -- looks for a string match in a file
#
proc search_for { file pattern } {
    set fd [open $file r]
    while { [gets $fd cur_line]>=0 } {
	if [string match "*$pattern*" $cur_line] then {
	    close $fd
	    return 1
	}
    }
    close $fd
    return 0
}

#
# objc-torture -- the objc-torture testcase source file processor
#
# This runs compilation only tests (no execute tests).
# SRC is the full pathname of the testcase, or just a file name in which case
# we prepend $srcdir/$subdir.
#
# If the testcase has an associated .x file, we source that to run the
# test instead.  We use .x so that we don't lengthen the existing filename
# to more than 14 chars.
#
proc objc-torture { args } {
    global srcdir subdir compiler_conditional_xfail_data

    set src [lindex $args 0]
    if { [llength $args] > 1 } {
	set options [lindex $args 1]
    } else {
	set options ""
    }

    # Prepend $srdir/$subdir if missing.
    if ![string match "*/*" $src] {
	set src "$srcdir/$subdir/$src"
    }

    # Check for alternate driver.
    if [file exists [file rootname $src].x] {
	verbose "Using alternate driver [file rootname [file tail $src]].x" 2
	set done_p 0
	catch "set done_p \[source [file rootname $src].x\]"
	if { $done_p } {
	    return
	}
    }

    # Look for a loop within the source code - if we don't find one,
    # don't pass -funroll[-all]-loops.
    global torture_with_loops torture_without_loops
    if [expr [search_for $src "for*("]+[search_for $src "while*("]] then {
	    set option_list $torture_with_loops
    } else {
	    set option_list $torture_without_loops
    }

    # loop through all the options
    foreach option $option_list {
	# torture_compile_xfail is set by the .x script (if present)
	if [info exists torture_compile_xfail] {
	    setup_xfail $torture_compile_xfail
	}

	# torture_execute_before_compile is set by the .x script (if present)
	if [info exists torture_eval_before_compile] {
	    set ignore_me [eval $torture_eval_before_compile]
	}

	objc-torture-compile $src "$option $options"
    }
}
