# Interpreted Tests for JVMTI code. # These tests are used to test JVMTI functions in a purley interpreted setting # This file compiles the JNI code into a shared object, then invokes gij to run # the test. # Compile a single C file and produce a .so file. OPTIONS is a list # of options to pass to the compiler. Returns 0 on failure, 1 on # success. proc gcj_jni_compile_c_to_so {file {options {}}} { global srcdir subdir global host_triplet verbose "options: $options" set options_cxx $options set options "" # Apple uses a different extension for shared/dynamic libraries # so we check against powerpc-apple-darwin and set them to # dylib. # HP-UX uses sl, so we check this too, otherwise we take so. if { [istarget "*-*-darwin*"] } { set so_extension "dylib" set so_flag "-dynamiclib" } elseif { [istarget "hppa*-hp-hpux*"] } { set so_extension "sl" set so_flag "-shared" } else { set so_extension "so" set so_flag "-shared" } set filename [file tail $file] set name [file rootname $filename] set soname lib${name}.${so_extension} lappend options "additional_flags=${so_flag} -fPIC" # Find the generated header. lappend options "additional_flags=-I. -I.. -I$srcdir/$subdir" # Ensure that the generated header has correct prototypes. set cfile [file rootname $file].c if { [file exists $cfile] } { # This option is only valid for C sources. lappend options "additional_flags=-Wmissing-prototypes" } # Find jni.h and jni_md.h. lappend options "additional_flags=-I$srcdir/../include \ -I$srcdir/../classpath/include -fdollars-in-identifiers" # Append C++ options lappend options "additional_flags=$options_cxx" set x [libjava_prune_warnings \ [target_compile $file $soname executable $options]] if {$x != ""} { verbose "target_compile failed: $x" 2 fail "$filename compilation" return 0 } pass "$filename compilation" return 1 } # Do all the work for a single JVMTI test. Return 0 on failure. proc gij_jvmti_test_one {file} { global runtests # The base name. We use it for several purposes. set main [file rootname [file tail $file]] if {! [runtest_file_p $runtests $main] } { # Simply skip it. return 1 } # if {! [bytecompile_file $file [pwd]] } { # fail "bytecompile $file" # # FIXME - should use `untested' on all remaining tests. # # But that is hard. # return 0 # } # pass "bytecompile $file" # if {! [gcj_jvmti_build_headers $file] } { # # FIXME # return 0 # } set cfile [file join [file dirname $file] nat$main.c] set cxxflags "" set cxxldlibflags {} # If there is no `.c' file, assume there is a `.cc' file. if {! [file exists $cfile] } { set cfile [file join [file dirname $file] nat$main.cc] set cxxflaglist {} foreach arg [split [libjava_find_lib libstdc++-v3/src stdc++] " "] { switch -glob -- $arg { "-L*" { set arg [string range $arg 2 end] lappend cxxldlibflags $arg # Strip the `.libs' directory; we link with libtool which # doesn't need it. set arg "-L[file dirname $arg]" } } lappend cxxflaglist $arg # In case the libstdc++ is not installed yet, we pass the build # directory of it to the cxxflaglist. lappend cxxflaglist "-L$cxxldlibflags" } # If you're building the compiler with --prefix set to a place # where it's not yet installed, then the linker won't be able to # find the libgcc used by libgcj.dylib/libstdc++.dylib. We could pass # the -dylib_file option, but that's complicated, and it's much easier # to just make the linker find libgcc using -L options. if { [istarget "*-*-darwin*"] } { lappend cxxflaglist "-shared-libgcc -lstdc++" } else { lappend cxxflaglist "-lstdc++" } set cxxflags [join $cxxflaglist] } if {! [gcj_jni_compile_c_to_so $cfile $cxxflags] } { # FIXME return 0 } libjava_arguments set jarfile [file join [file dirname $file] $main.jar] set gij_flags {-agentlib:dummyagent} if {! [exec_gij $jarfile [file rootname $file].out $cxxldlibflags $gij_flags] } { return 0 } # When we succeed we remove all our clutter. eval gcj_cleanup [glob -nocomplain -- ${main}.*] \ [list $main.class libnat$main.so] return 1 } # Run the JVMTI tests. proc gij_jvmti_run {} { global srcdir subdir global build_triplet host_triplet # For now we only test JVMTI on native builds. if {$build_triplet == $host_triplet} { # Build our dummy JVMTI agent library if {![gcj_jni_compile_c_to_so [file join $srcdir $subdir dummyagent.c]]} { fail "compiling dummy JVMTI agent" } else { pass "compiling dummy JVMTI agent" catch {lsort [glob -nocomplain ${srcdir}/${subdir}/interp/*.jar]} \ srcfiles foreach x $srcfiles { gij_jvmti_test_one $x } gcj_cleanup libdummyagent.so } } else { verbose "JVMTI tests not run in cross-compilation environment" } } gij_jvmti_run