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