# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation

load_lib "libgloss.exp"

# GCJ_UNDER_TEST is the compiler under test.

global tmpdir

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

# This is like `prune_warnings', but it also prunes away a warning
# from the bytecode front end that we don't care about.
proc libjava_prune_warnings {text} {
    set text [prune_warnings $text]
    set tlist [split $text \n]
    set len [llength $tlist]
    for {set i [expr {$len - 1}]} {$i >= 2} {incr i -1} {
	if {[string match "*unreachable bytecode*" [lindex $tlist $i]]} {
	    # Delete this line, all other unreachable warnings and the previous
	    # two lines containing the method and class.
	    set j [expr {$i - 1}]
	    while {[string match "*unreachable bytecode*" [lindex $tlist $j]]} {
		incr j -1
	    }
	    incr j -1
	    set tlist [lreplace $tlist $j $i]
	    set i $j
	}
    }
    return [join $tlist \n]
}

# This is like `target_compile' but it does some surgery to work
# around stupid DejaGNU bugs.  In particular DejaGNU has very poor
# quoting, so for instance a `$' will be re-evaluated at spawn time.
# We don't want that.
proc libjava_tcompile {source destfile type options} {
    # This strange-looking expression really does quote the `$'.
    regsub -all -- {\$} $source {\$} source
    regsub -all -- {\$} $destfile {\$} destfile
    return [target_compile $source $destfile $type $options]
}

# Read an `xfail' file if it exists.  Returns a list of xfail tokens.
proc libjava_read_xfail {file} {
    if {! [file exists $file]} {
	return ""
    }
    set fd [open $file r]
    set tokens [string trim [read $fd]]
    close $fd
    return $tokens
}

# Find a particular executable.  FIXME: this relies on DejaGnu
# internals.  These should probably be exposed in a better way.
proc libjava_find_program {prog} {
    global tool_root_dir

    set file [lookfor_file $tool_root_dir $prog]
    if { $file == "" } {
	set file [lookfor_file $tool_root_dir gcc/$prog];
    }
    if {$file == ""} {
	set file $prog
    }
    return $file
}

# Find `jv-scan'.
proc find_jvscan {} {
    return [libjava_find_program jv-scan]
}

# Find `gcjh'.
proc find_gcjh {} {
    return [libjava_find_program gcjh]
}

proc find_javac {} {
    global SUN_JAVAC GCJ_UNDER_TEST env libgcj_jar
    # If JDK doesn't run on your platform but some other
    # JDK-compatible javac does, you may set SUN_JAVAC to point to it.
    # One of the most important properties of a SUN_JAVAC is that it
    # must create class-files even for classes that have not been
    # specified in the command line, but that were needed to compile
    # those that have.  For example, Pizza won't do it, but you can
    # use `kaffe sun.tools.javac.Main', if you have Sun's classes.zip
    # in the kaffe's default search path.
    if {![info exists SUN_JAVAC]} {
	if {[info exists env(SUN_JAVAC)]} {
	    set SUN_JAVAC $env(SUN_JAVAC)
	} else {
	    set SUN_JAVAC "$GCJ_UNDER_TEST -C -I$libgcj_jar"
	}
    }
    return $SUN_JAVAC
}

proc bytecompile_file { file objdir {classpath {}} } {
    global env
    set dirname [file dirname $file]

    set javac [find_javac]
    if {$classpath != ""} then {
        set env(CLASSPATH) $classpath
    }
    set here [pwd]
    cd $dirname
    send_log "byte compile: $javac [list $file] -d $objdir 2>@ stdout\n"
    if {[catch {
	set q [eval exec "$javac [list $file] -d $objdir 2>@ stdout"]
    } msg]} then {
	send_log "couldn't compile $file: $msg\n"
	set r 0
    } else {
	set r 1
    }
    cd $here
    return $r
}

set libjava_initialized 0

#
# Build the status wrapper library as needed.
#
proc libjava_init { args } {
    global wrapper_file;
    global wrap_compile_flags;
    global libjava_initialized libjava_uses_threads
    global GCJ_UNDER_TEST
    global TOOL_EXECUTABLE
    global original_ld_library_path
    global env objdir
    global env libgcj_jar
    global tool_root_dir
    global libjava_libgcc_s_path
    global target_triplet

    if { $libjava_initialized == 1 } { return; }

    if ![info exists GCJ_UNDER_TEST] {
	if [info exists TOOL_EXECUTABLE] {
	    set GCJ_UNDER_TEST $TOOL_EXECUTABLE;
	} else {
	    if [info exists env(GCJ)] {
		set GCJ_UNDER_TEST $env(GCJ)
	    } else {
		set GCJ_UNDER_TEST "[find_gcj]"
	    }
	}
    }

    # Find the libgcj jar file.
    set libgcj_jar [glob $objdir/../libgcj-*.jar]
    verbose "jar file is $libgcj_jar"

    # FIXME: This finds libgcj.spec for the default multilib.
    # If thread models differ between multilibs, this has to be moved
    # to libjava_arguments
    set specdir [libjava_find_spec]

    # The -B is so we find libgcj.spec.
    set text [eval exec "$GCJ_UNDER_TEST -B$specdir -v 2>@ stdout"]
    regexp -- "Thread model: (\[^\n\]+)\n" $text ignore model
    set libjava_uses_threads [expr {! ($model == "no"
				       || $model == "none"
				       || $model == "single")}]

    # Always set encoding used by gcj.
    append GCJ_UNDER_TEST " --encoding=UTF-8"

    if [info exists env(LD_LIBRARY_PATH)] {
	set original_ld_library_path $env(LD_LIBRARY_PATH)
	# For HP-UX.
    } elseif [info exists env(SHLIB_PATH)] {
	set original_ld_library_path $env(SHLIB_PATH)
	# For Darwin.
    } elseif [info exists env(DYLD_LIBRARY_PATH)] {
	set original_ld_library_path $env(DYLD_LIBRARY_PATH)
	# For Solaris 32 bit.
    } elseif [info exists env(LD_LIBRARY_PATH_32)] {
	set original_ld_library_path $env(LD_LIBRARY_PATH_32)
	# For Solaris 64 bit.
    } elseif [info exists env(LD_LIBRARY_PATH_64)] {
	set original_ld_library_path $env(LD_LIBRARY_PATH_64)
    } else {
	set original_ld_library_path ""
    }

    set wrapper_file "";
    set wrap_compile_flags "";
    if [target_info exists needs_status_wrapper] {
	set result [build_wrapper "testglue.o"];
	if { $result != "" } {
	    set wrapper_file [lindex $result 0];
	    set wrap_compile_flags [lindex $result 1];
	} else {
	    warning "Status wrapper failed to build."
	}
    }

    # Finally, add the gcc build directory so that we can find the
    # shared libgcc.  This, like much of dejagnu, is hideous.
    set libjava_libgcc_s_path {}
    
    if { [string match "powerpc-*-darwin*" $target_triplet] } {
	set so_extension "dylib"
    } else {
	set so_extension "so"
    }
    set gccdir [lookfor_file $tool_root_dir gcc/libgcc_s.${so_extension}]
    if {$gccdir != ""} {
	set gccdir [file dirname $gccdir]
	lappend libjava_libgcc_s_path $gccdir
	verbose "libjava_libgcc_s_path = $libjava_libgcc_s_path"
	set compiler ${gccdir}/xgcc
	if { [is_remote host] == 0 && [which $compiler] != 0 } {
	    foreach i "[exec $compiler --print-multi-lib]" {
		set mldir ""
		regexp -- "\[a-z0-9=/\.-\]*;" $i mldir
		set mldir [string trimright $mldir "\;@"]
		if { "$mldir" == "." } {
		    continue
		}
		if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.${so_extension}.*]] == 1 } {
		    lappend libjava_libgcc_s_path "${gccdir}/${mldir}"
		}
	    }
	}
    }

    set libjava_initialized 1
}

# Find a library.  We know where libtool puts the actual libraries,
# and we look there.  The implementation is fairly hacky.  We can't
# compile with -nodefaultlibs, because that will also eliminate the
# system libraries we need.  In order to have gcj still work, it must
# find the appropriate libraries so we must add -L options for their
# paths.  However we can't simply use those libraries; we still need
# libtool for linking.
# Don't return the the lib${name}.la files here, since this causes the
# libraries to be linked twice: once as lib${name}.so/dylib and another time
# via gcj's implicit -l${name}.  This is both unnecessary and causes the
# Solaris ld to warn: attempted multiple inclusion of file.  This warning
# is not ignored by the dejagnu framework and cannot be disabled.
proc libjava_find_lib {dir name} {
    global base_dir
    set gp [get_multilibs]
    foreach extension {so dll a} {
	foreach sub {.libs _libs} {
	    if {$gp != ""} {
		if {[file exists $gp/$dir/$sub/lib${name}.${extension}]} then {
		    # Just return the `-L' option.  The library itself
		    # will be picked up via the spec file.
		    return "-L$gp/$dir/$sub"
		}
	    }
	    # Just return the `-L' option.  The library itself will be
	    # picked up via the spec file.
	    set lib [findfile \
		       $base_dir/../../$dir/$sub/lib${name}.${extension} \
		       "-L$base_dir/../../$dir/$sub" \
		       ""]
	    if {$lib != ""} {
		return $lib
	    }
	}
    }
    return ""
}

# Find libgcj.spec.  We need to use the file corresponding to the multilib
# under test since they might differ.  Append a trailing slash since this
# is used with -B.
proc libjava_find_spec {} {
    global objdir
    set gp [get_multilibs]

    if {[file exists $gp/libjava/libgcj.spec]} then {
	return "$gp/libjava/"
    }
    return "$objdir/../"
}

# Find `gij'.
proc libjava_find_gij {} {
    global base_dir
    set gp [get_multilibs]
    if {$gp != ""} {
	set file $gp/libjava/gij
    } else {
	set file $base_dir/../gij
    }

    if {[file exists $file]} {
	return $file
    }
    return gij
}

# Remove a bunch of files.
proc gcj_cleanup {args} {
    foreach file $args {
	if {[string match *.o $file]} {
	    verbose "removing [file rootname $file].lo"
	    file delete -force [file rootname $file].lo
	}
	file delete -force -- $file
	verbose "removing $file"
    }
    # It is simplest to do this instead of trying to figure out what
    # bits in .libs ought to be removed.
    catch {system "rm -rf .libs"}
}

# Compute arguments needed for compiler.  MODE is a libtool mode:
# either compile or link.
proc libjava_arguments {{mode compile}} {
    global base_dir
    global LIBJAVA
    global srcdir subdir objdir
    global TOOL_OPTIONS
    global GCJ_UNDER_TEST
    global tmpdir
    global runtests
    global env
    global tool_root_dir
    global libgcj_jar
    global libjava_libgcc_s_path

    if [info exists LIBJAVA] {
	set libjava $LIBJAVA;
    } else {
	set libjava [libjava_find_lib libjava gcj]
    }

    verbose "using LIBJAVA = $libjava" 2
    set args ""

    # Basically we want to build up a colon separated path list from
    # the value of $libjava.

    set lpath {}
    foreach dir [list $libjava] {
	foreach item [split $dir " "] {
	    switch -glob -- $item {
		"-L*" {
		    lappend lpath [string range $item 2 end]
		}
	    }
	}
    }

    set lpath [concat $lpath $libjava_libgcc_s_path]
    verbose "lpath = $lpath ; libgcc_s_path = $libjava_libgcc_s_path"
    set ld_library_path [join $lpath :]

    # That's enough to make things work for the normal case.
    # If we wanted to handle an arbitrary value of libjava,
    # then we'd have to do a lot more work.

    # Set variables the dynamic linker looks at.
    global original_ld_library_path
    setenv LD_LIBRARY_PATH "$ld_library_path:$original_ld_library_path"

    verbose "LD_LIBRARY_PATH = $env(LD_LIBRARY_PATH)"

    # Set the CLASSPATH environment variable
    verbose "CLASSPATH is .:$srcdir/$subdir:$objdir:$libgcj_jar"
    global env
    set env(CLASSPATH) ".:$srcdir/$subdir:$objdir:$libgcj_jar"

    if {$mode == "link"} {
	global wrapper_file wrap_compile_flags
	lappend args "additional_flags=$wrap_compile_flags"
	lappend args "libs=$wrapper_file"
	lappend args "libs=$libjava"
	lappend args debug
    }

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

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

    # Determine libgcj.spec corresponding to multilib under test.
    set specdir [libjava_find_spec]

    # Search for libtool.  We need it to link.
    set found_compiler 0
    set d [absolute $objdir]
    foreach x {. .. ../.. ../../..} {
	if {[file exists $d/$x/libtool]} then {
	    # We have to run silently to avoid DejaGNU lossage.
	    lappend args \
	      "compiler=$d/$x/libtool --silent --tag=GCJ --mode=$mode $GCJ_UNDER_TEST -B$specdir"
	    set found_compiler 1
	    break
	}
    }
    if {! $found_compiler} {
	# Append -B$specdir so that we find libgcj.spec before it
	# is installed.
	lappend args "compiler=$GCJ_UNDER_TEST -B$specdir"
    }

    # Avoid libtool wrapper scripts when possible.
    # but not if libtool warnings results in FAILs
    if {$mode == "link"} {
	if {! [istarget "*-*-cygwin*"] && ! [istarget "*-*-mingw*"] } {
	    lappend args "additional_flags=-no-install"
	}
	if { [istarget "*-*-darwin*"] } {
	    lappend args "additional_flags=-bind_at_load"
	    lappend args "additional_flags=-multiply_defined suppress"
	}
    }

    return $args
}

# Link a bunch of objects into a program.  MAIN is the name of the
# class holding `main'.  Return 0 on failure.
proc gcj_link {program main files {options {}}} {
    set arguments [libjava_arguments link]
    if {[llength $options]} {
	eval lappend arguments $options
    }
    lappend arguments "additional_flags=--main=$main"
    set x [libjava_prune_warnings \
	     [libjava_tcompile $files $program executable $arguments]]
    if {$x != ""} {
	verbose "link failure: $x" 2
	fail "linking $program"
	setup_xfail "*-*-*"
	fail "running $program"
	return 0
    }

    pass "linking $program"
    return 1
}

# Invoke the program and see what happens.  Return 0 on failure.
proc gcj_invoke {program expectFile ld_library_additions} {
  global env
  set lib_path $env(LD_LIBRARY_PATH)

  set newval .
  if {[llength $ld_library_additions] > 0} {
    append newval :[join $ld_library_additions :]
  }
  append newval :$lib_path

  setenv LD_LIBRARY_PATH $newval

  verbose "LD_LIBRARY_PATH=$env(LD_LIBRARY_PATH)"

  set result [libjava_load ./$program]
  set status [lindex $result 0]
  set output [lindex $result 1]

  # Restore setting
  setenv LD_LIBRARY_PATH $lib_path

  if {$status != "pass"} {
    verbose "got $output"
    fail "$program run"
    untested "$program output"
    return 0
  }

  set id [open $expectFile r]
  set expected [read $id]
  close $id

  if {! [string compare $output $expected]} {
    pass "$program output"
    return 1
  } else {
    fail "$program output"
    return 0
  }
}

# Invoke a program and check its output.  EXECUTABLE is the program;
# ARGS are the arguments to the program.  Returns 1 if tests passed
# (or things were left untested), 0 otherwise.
proc libjava_invoke {errname testName optName executable inpfile resultfile args} {
    upvar $optName opts

    if {[info exists opts(no-exec)]} {
	if {[info exists opts(need-threads)]} {
	    # This means we wanted to try to run it but we couldn't
	    # because threads aren't supported.  So we have to
	    # generate an `untested'.
	    untested "$errname execution - $testName"
	    untested "$errname output - $testName"
	}
	return 1
    }

    set result [libjava_load $executable $args "$inpfile"]
    set status [lindex $result 0]
    set output [lindex $result 1]
    if {[info exists opts(xfail-exec)]} then {
	setup_xfail *-*-*
    }
    $status "$errname execution - $testName"
    if { $status != "pass" } {
	untested "$errname output - $testName"
	return 0
    }

    verbose "resultfile is $resultfile"
    set id [open $resultfile r]
    set expected ""
    append expected [read $id]
    regsub -all "\r" "$output" "" output
    regsub "\n*$" $expected "" expected
    regsub "\n*$" $output "" output
    regsub "^\n*" $expected "" expected
    regsub "^\n*" $output "" output
    regsub -all "\[ \t\]\[ \t\]*" $expected " " expected
    regsub -all "\[ \t\]*\n\n*" $expected "\n" expected
    regsub -all "\[ \t\]\[ \t\]*" $output " " output
    regsub -all "\[ \t\]*\n\n*" $output "\n" output
    verbose "expected is $expected"
    verbose "actual is $output"
    set passed 0
    if {[info exists opts(regexp_match)]} {
	if [regexp $expected $output] {
	    set passed 1
	}
    } else {
	if { $expected == $output } {
	    set passed 1
	}
    }
    if {[info exists opts(xfail-output)]} {
	setup_xfail *-*-*
    }
    if { $passed == 1 } {
	pass "$errname output - $testName"
    } else {
	fail "$errname output - $testName"
    }
    close $id

    return $passed
}

#
# Run the test specified by srcfile and resultfile. compile_args and
# exec_args are options telling this proc how to work.
#
proc test_libjava_from_source { options srcfile compile_args inpfile resultfile exec_args } {
    global base_dir
    global srcdir subdir objdir
    global TOOL_OPTIONS
    global GCJ_UNDER_TEST
    global tmpdir
    global runtests

    # Make opts into an array.
    set opts(_) x
    unset opts(_)
    foreach item $exec_args {
	set opts($item) x
    }

    # If we need threads and we don't have them then set the `no-exec'
    # flag.  This is case is also handled specially later.
    if {[info exists opts(need-threads)]} {
	global libjava_uses_threads
	if {! $libjava_uses_threads} {
	    set opts(no-exec) x
	}
    }

    set errname [file rootname [file tail $srcfile]]
    if {! [runtest_file_p $runtests $errname]} {
        return
    }

    if {[info exists opts(no-link)]} {
	set mode compile
    } else {
	set mode link
    }
    set args [libjava_arguments $mode]
    if {! [info exists opts(no-link)]} {
	# Add the --main flag
	lappend args "additional_flags=--main=[file rootname [file tail $srcfile]]"
	if { $compile_args != "" } {
	    lappend args "additional_flags=$compile_args"
	}
    }

    regsub "^.*/(\[^/.\]+)\[.\]\[^/]*$" "$srcfile" "\\1" out
    set executable "${objdir}/$out"
    if {[info exists opts(no-link)]} {
	append executable ".o"
	set target object
    } else {
        # DOS/win32 targets default to .exe if no suffix is given
        # We then try to delete a file that doesn't exist.  It is
        # simpler to add the suffix everywhere.
        append executable ".exe"
	set target executable
    }
    if { $compile_args != "" } {
	set errname "$errname $compile_args"
    }

    set removeList [list $executable]

    set x [libjava_prune_warnings \
	     [libjava_tcompile $srcfile "$executable" $target $args]]
    if {[info exists opts(xfail-gcj)]} {
	setup_xfail *-*-*
    }
    if { $x != "" } {
	verbose "target_compile failed: $x" 2

	if {[info exists opts(shouldfail)]} {
	    pass "$errname compilation from source"
	    eval gcj_cleanup $removeList
	    return
	}

	fail "$errname compilation from source"
	if {[info exists opts(xfail-gcj)]
	    || ! [info exists opts(no-exec)]
	    || [info exists opts(need-threads)]} {
	    untested "$errname execution from source compiled test"
	    untested "$errname output from source compiled test"
	}
	return
    }
    if {[info exists opts(shouldfail)]} {
	fail "$errname compilation from source"
	return
    }
    pass "$errname compilation from source"

    # Set up the options the way they are expected by libjava_invoke.
    if {[info exists opts(xfail-source-output)]} {
	set opts(xfail-output) x
    }
    if {[libjava_invoke $errname "source compiled test" opts $executable \
	   $inpfile $resultfile]} {
	# Everything ok, so clean up.
	eval gcj_cleanup $removeList
    }
}

#
# Run the test specified by srcfile and resultfile. compile_args and
# exec_args are options telling this proc how to work.
#
proc test_libjava_from_javac { options srcfile compile_args inpfile resultfile exec_args } {
    global base_dir
    global srcdir subdir objdir
    global TOOL_OPTIONS
    global GCJ_UNDER_TEST
    global tmpdir
    global runtests
    global INTERPRETER

    # Make opts into an array.
    set opts(_) x
    unset opts(_)
    foreach item $exec_args {
	set opts($item) x
    }

    # If we need threads and we don't have them then set the `no-exec'
    # flag.  This is case is also handled specially later.
    if {[info exists opts(need-threads)]} {
	global libjava_uses_threads
	if {! $libjava_uses_threads} {
	    set opts(no-exec) x
	}
    }
    set errname [file rootname [file tail $srcfile]]
    if {! [runtest_file_p $runtests $errname]} {
        return
    }

    # bytecompile files with Sun's compiler for now.
    set bc_ok [bytecompile_file $srcfile $objdir]

    set javac [find_javac]
    # This is an ugly heuristic but it will have to do.
    if {[string match *gcj* $javac]} {
	set tag gcjC
    } else {
	set tag javac
    }
    if {[info exists opts(xfail-$tag)]} {
	setup_xfail *-*-*
    }
    if {! $bc_ok} then {
	if {[info exists opts(shouldfail)]} {
	    pass "$errname byte compilation"
	    return
	}
	fail "$errname byte compilation"
	untested "$errname compilation from bytecode"
	if {! [info exists opts(no-exec)]
	    || [info exists opts(need-threads)]} {
	    untested "$errname execution from bytecode->native test"
	    untested "$errname output from bytecode->native test"
	}
	return
    }
    if {[info exists opts(shouldfail)]} {
	fail "$errname byte compilation"
	return
    }
    pass "$errname byte compilation"

    set removeList {}

    # Find name to use for --main, and name of all class files.
    set jvscan [find_jvscan]
    verbose "jvscan is $jvscan"
    set main_name [string trim \
		     [libjava_prune_warnings \
			[lindex [local_exec "$jvscan --encoding=UTF-8 $srcfile --print-main" "" "" 300] 1]]]
    verbose "main name is $main_name"
    set class_out [string trim \
		     [libjava_prune_warnings \
			[lindex [local_exec "$jvscan --encoding=UTF-8 $srcfile --list-class" "" "" 300] 1]]]
    verbose "class list is $class_out"

    if {[string match "*parse error*" $main_name]
	|| [string match "*parse error*" $class_out]} {
	untested "$errname compilation from bytecode"
	if {! [info exists opts(no-exec)]
	    || [info exists opts(need-threads)]} {
	    untested "$errname execution from bytecode->native test"
	    untested "$errname output from bytecode->native test"
	}
	return
    }

    # Turn "a b" into "a.class b.class".
    # Also, turn "foo.bar" into "foo/bar.class".
    set class_files {}
    foreach file [split [string trim $class_out]] {
	set file [join [split $file .] /]
	lappend class_files $objdir/$file.class
    }

    eval lappend removeList $class_files

    # Usually it is an error for a test program not to have a `main'
    # method.  However, for no-exec tests it is ok.  Treat no-link
    # like no-exec here.
    if {[info exists opts(no-link)]} {
	set opts(no-exec) x
    }
    set largs {}

    if {[info exists opts(no-exec)]} {
	set type object
	set mode compile
    } elseif {$main_name == ""} {
	perror "No `main' given in program $errname"
	return
    } else {
	set type executable
	lappend largs "additional_flags=--main=$main_name"
	# DOS/win32 targets default to .exe if no suffix is given
        # We then try to delete a file that doesn't exist.  It is
	# simpler to add the suffix everywhere.
	set executable "${objdir}/${main_name}.exe"
	set mode link
    }

    # We purposely ignore errors here; we still want to run the other
    # appropriate tests.
    set gij [libjava_find_gij]
    # libjava_find_gij will return `gij' if it couldn't find the
    # program; in this case we want to skip the test.
    if {$INTERPRETER == "yes" && $gij != "gij"} {
	libjava_invoke $errname "gij test" opts $gij \
	  $inpfile $resultfile $main_name
    }

    # Initial arguments.
    set args [libjava_arguments $mode]
    eval lappend args $largs

    if { $compile_args != "" } {
	lappend args "additional_flags=$compile_args"
    }

    if { $compile_args != "" } {
	set errname "$errname $compile_args"
    }

    verbose "compilation command = $args" 2
    # When compiling and not linking, we have to build each .o
    # separately.  We do this because DejaGNU's target_compile won't
    # accept an empty "destfile" argument when the mode is "compile".
    if {$mode == "compile"} {
	foreach c_file $class_files {
	    set executable [file rootname [file tail $c_file]].o
	    # Don't write files which contain $ chars.
	    regsub -all "\\$" $executable "\^" executable
	    set x [libjava_prune_warnings \
		     [libjava_tcompile '$c_file' "$executable" $type $args]]
	    lappend removeList $executable
	    if {$x != ""} {
		break
	    }
	}
    } else {
	# This is so evil: we de-listify CLASS_FILES so that we can
	# turn around and quote the `$' in it for the shell.  I really
	# hate DejaGNU.  It is so !@#$!@# unpredictable.
	set hack ""
	foreach stupid $class_files {
	    set hack "$hack $stupid"
	}
	lappend removeList $executable
	set x [libjava_prune_warnings \
		 [libjava_tcompile $hack "$executable" $type $args]]
    }
    if {[info exists opts(xfail-byte)]} {
	setup_xfail *-*-*
    }
    if { $x != "" } {
	verbose "target_compile failed: $x" 2
	fail "$errname compilation from bytecode"
	if {! [info exists opts(no-exec)]
	    || [info exists opts(need-threads)]} {
	    untested "$errname execution from bytecode->native test"
	    untested "$errname output from bytecode->native test"
	}
	return;
    }
    pass "$errname compilation from bytecode"

    # Set up the options the way they are expected by libjava_invoke.
    if {[info exists opts(xfail-byte-output)]} {
	set opts(xfail-output) x
    }
    if {[libjava_invoke $errname "bytecode->native test" opts $executable \
	   $inpfile $resultfile]} {
	# Everything ok, so clean up.
	eval gcj_cleanup $removeList
    }
}

#
# Run the test specified by srcfile and resultfile. compile_args and
# exec_args are options telling this proc how to work.
#   `no-link'     don't try to link the program
#   `no-exec'     don't try to run the test
#   `xfail-gcj'   compilation from source will fail
#   `xfail-javac' compilation with javac will fail
#   `xfail-gcjC'  compilation with gcj -C will fail
#   `shouldfail'  compilation from source is supposed to fail
#                 This is different from xfail, which marks a known
#                 failure that we just haven't fixed.
#                 A compilation marked this way should fail with any
#                 front end.
#   `xfail-byte'  compilation from bytecode will fail
#   `xfail-exec'  exec will fail
#   `xfail-output'
#                 output will be wrong
#   `xfail-byte-output'
#                 output will be wrong when compiled from bytecode
#   `xfail-source-output'
#                 output will be wrong when compiled from source code
#   `need-threads'
#                 test relies on thread support
#
proc test_libjava { options srcfile compile_args inpfile resultfile exec_args } {
    test_libjava_from_source $options $srcfile $compile_args $inpfile $resultfile $exec_args
    test_libjava_from_javac $options $srcfile $compile_args $inpfile $resultfile $exec_args
 }

#
# libjava_version -- extract and print the version number of libjavap
#
proc default_libjava_version {} {
}

proc default_libjava_start { } {
}

# On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
# called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
# (for the 64-bit ABI).  The right way to do this would be to modify
# unix.exp -- but that's not an option since it's part of DejaGNU
# proper, so we do it here, by trickery.
# The same applies to darwin (DYLD_LIBRARY_PATH), solaris 32 bit
# (LD_LIBRARY_PATH_32), solaris 64 bit (LD_LIBRARY_PATH_64), and HP-UX
# (SHLIB_PATH).
proc ${tool}_set_ld_library_path { name element op } {
  setenv LD_LIBRARYN32_PATH [getenv LD_LIBRARY_PATH]
  setenv LD_LIBRARY64_PATH [getenv LD_LIBRARY_PATH]
  setenv SHLIB_PATH [getenv LD_LIBRARY_PATH]
  setenv DYLD_LIBRARY_PATH [getenv LD_LIBRARY_PATH]
  setenv LD_LIBRARY_PATH_32 [getenv LD_LIBRARY_PATH]
  setenv LD_LIBRARY_PATH_64 [getenv LD_LIBRARY_PATH]
}

trace variable env(LD_LIBRARY_PATH) w ${tool}_set_ld_library_path

# Local Variables:
# tcl-indent-level:4
# End:
