--- old/test/TEST.ROOT 2016-08-25 21:42:16.181082478 +0300 +++ new/test/TEST.ROOT 2016-08-25 21:42:16.113082479 +0300 @@ -44,7 +44,8 @@ vm.gc.G1 \ vm.gc.Serial \ vm.gc.Parallel \ - vm.gc.ConcMarkSweep + vm.gc.ConcMarkSweep \ + vm.debug # Tests using jtreg 4.2 b03 features requiredVersion=4.2 b03 --- old/test/compiler/ciReplay/TestSA.sh 2016-08-25 21:42:16.437082476 +0300 +++ /dev/null 2016-08-22 18:39:56.099247576 +0300 @@ -1,94 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code 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 -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# - -## -## @test -## @bug 8011675 -## @ignore 8029528 -## @summary testing of ciReplay with using generated by SA replay.txt -## @author igor.ignatyev@oracle.com -## @requires vm.flightRecorder != true -## @run shell TestSA.sh -## - -if [ "${TESTSRC}" = "" ] -then - TESTSRC=${PWD} - echo "TESTSRC not set. Using "${TESTSRC}" as default" -fi -echo "TESTSRC=${TESTSRC}" - -## Adding common setup Variables for running shell tests. -. ${TESTSRC}/../../test_env.sh - -. ${TESTSRC}/common.sh - -generate_replay - -${MV} ${replay_data} replay_vm.txt - -if [ -z "${core_file}" -o ! -r "${core_file}" ] -then - # skip test if MacOS host isn't configured for core dumping - if [ "$OS" = "Darwin" ] - then - if [ ! -d "/cores" ] - then - echo TEST SKIPPED: \'/cores\' dir doens\'t exist - exit 0 - fi - if [ ! -w "/cores" ] - then - echo TEST SKIPPED: \'/cores\' dir exists but is not writable - exit 0 - fi - fi - test_fail 2 "CHECK :: CORE GENERATION" "core wasn't generated on $OS" -fi - -echo "dumpreplaydata -a > ${replay_data}" | \ - ${JAVA} ${TESTOPTS} \ - sun.jvm.hotspot.CLHSDB ${JAVA} ${core_file} - -if [ ! -s ${replay_data} ] -then - test_fail 1 "CHECK :: REPLAY DATA GENERATION" \ - "replay data wasn't generated by SA" -fi - -diff ${replay_data} replay_vm.txt > replay.diff 2>&1 -if [ -s replay.diff ] -then - echo WARNING: replay.txt from SA != replay.txt from VM: - cat replay.diff -fi - -common_tests 10 -${VM_TYPE}_tests 20 - -cleanup - -echo TEST PASSED - --- old/test/compiler/ciReplay/TestVM.sh 2016-08-25 21:42:16.593082475 +0300 +++ /dev/null 2016-08-22 18:39:56.099247576 +0300 @@ -1,87 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code 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 -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# - -## -## @test -## @bug 8011675 -## @summary testing of ciReplay with using generated by VM replay.txt -## @author igor.ignatyev@oracle.com -## @requires vm.flightRecorder != true -## @run shell TestVM.sh -## - -if [ "${TESTSRC}" = "" ] -then - TESTSRC=${PWD} - echo "TESTSRC not set. Using "${TESTSRC}" as default" -fi -echo "TESTSRC=${TESTSRC}" - -## Adding common setup Variables for running shell tests. -. ${TESTSRC}/../../test_env.sh - -. ${TESTSRC}/common.sh - -generate_replay - -if [ ! -s ${replay_data} ] -then - test_fail 1 "CHECK :: REPLAY DATA GENERATION" \ - "replay data wasn't generated by VM" -fi - -common_tests 10 -${VM_TYPE}_tests 20 - -cleanup - -if [ $is_tiered -eq 1 ] -then - stop_level=1 - while [ $stop_level -le $server_level ] - do - generate_replay "-XX:TieredStopAtLevel=$stop_level" - if [ ! -s ${replay_data} ] - then - test_fail `expr $stop_level + 30` \ - "TIERED LEVEL $stop_level :: REPLAY DATA GENERATION" \ - "replay data wasn't generated by VM with stop_level=$stop_level" - fi - level=`grep "^compile " $replay_data | awk '{print $6}'` - if [ $level -gt $stop_level ] - then - test_fail `expr $stop_level + 40` \ - "TIERED LEVEL $stop_level :: COMP_LEVEL VERIFICATION" \ - "comp_level in replay[$level] is greater than stop_level[$stop_level]" - fi - positive_test `expr $stop_level + 50` "TIERED LEVEL $stop_level :: REPLAY" \ - "-XX:TieredStopAtLevel=$stop_level" - stop_level=`expr $stop_level + 1` - cleanup - done -fi - -echo TEST PASSED - --- old/test/compiler/ciReplay/TestVM_no_comp_level.sh 2016-08-25 21:42:16.753082474 +0300 +++ /dev/null 2016-08-22 18:39:56.099247576 +0300 @@ -1,75 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code 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 -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# - -## -## @test -## @bug 8011675 -## @summary testing of ciReplay with using generated by VM replay.txt w/o comp_level -## @author igor.ignatyev@oracle.com -## @requires vm.flightRecorder != true -## @run shell TestVM_no_comp_level.sh -## - -if [ "${TESTSRC}" = "" ] -then - TESTSRC=${PWD} - echo "TESTSRC not set. Using "${TESTSRC}" as default" -fi -echo "TESTSRC=${TESTSRC}" - -## Adding common setup Variables for running shell tests. -. ${TESTSRC}/../../test_env.sh - -. ${TESTSRC}/common.sh - -generate_replay - -if [ ! -s ${replay_data} ] -then - test_fail 1 "CHECK :: REPLAY DATA GENERATION" \ - "replay data wasn't generated by VM" -fi - -${CP} ${replay_data} replay_vm.txt - -sed 's/^\(compile *[^ ][^ ]* *[^ ][^ ]* [^ ][^ ]* [^ ][^ ]*\).*$/\1/' \ - replay_vm.txt > ${replay_data} - -if [ $client_available -eq 1 ] -then - # tiered is unavailable in client vm, so results w/ flags will be the same as w/o flags - negative_test 10 "CLIENT" -client -fi - -if [ $server_available -eq 1 ] -then - positive_test 21 "SERVER :: NON-TIERED" -XX:-TieredCompilation -server - positive_test 22 "SERVER :: TIERED" -XX:+TieredCompilation -server -fi - -cleanup - -echo TEST PASSED - --- old/test/compiler/ciReplay/common.sh 2016-08-25 21:42:16.913082472 +0300 +++ /dev/null 2016-08-22 18:39:56.099247576 +0300 @@ -1,291 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code 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 -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# -set -x - -# $1 - error code -# $2 - test name -# $3,.. - decription -test_fail() { - error=$1 - shift - name=$1 - shift - echo "TEST [$name] FAILED:" - echo "$@" - exit $error -} - -# $@ - additional vm opts -start_test() { - # disable core dump on *nix - ulimit -S -c 0 - # disable core dump on windows - VMOPTS="$@ -XX:-CreateMinidumpOnCrash" - cmd="${JAVA} ${VMOPTS} -XX:+ReplayCompiles -XX:ReplayDataFile=${replay_data}" - echo $cmd - $cmd - return $? -} - -# $1 - error_code -# $2 - test name -# $3,.. - additional vm opts -positive_test() { - error=$1 - shift - name=$1 - shift - VMOPTS="${TESTOPTS} $@" - echo "POSITIVE TEST [$name]" - start_test ${VMOPTS} - exit_code=$? - if [ ${exit_code} -ne 0 ] - then - test_fail $error "$name" "exit_code[${exit_code}] != 0 during replay "\ - "w/ vmopts: ${VMOPTS}" - fi -} - -# $1 - error_code -# $2 - test name -# $2,.. - additional vm opts -negative_test() { - error=$1 - shift - name=$1 - shift - VMOPTS="${TESTOPTS} $@" - echo "NEGATIVE TEST [$name]" - start_test ${VMOPTS} - exit_code=$? - if [ ${exit_code} -eq 0 ] - then - test_fail $error "$name" "exit_code[${exit_code}] == 0 during replay "\ - "w/ vmopts: ${VMOPTS}" - fi -} - -# $1 - initial error_code -common_tests() { - positive_test $1 "COMMON :: THE SAME FLAGS" - if [ $tiered_available -eq 1 ] - then - positive_test `expr $1 + 1` "COMMON :: TIERED" -XX:+TieredCompilation - fi -} - -# $1 - initial error_code -# $2 - non-tiered comp_level -nontiered_tests() { - level=`grep "^compile " $replay_data | awk '{print $6}'` - # is level available in non-tiered - if [ "$level" -eq $2 ] - then - positive_test $1 "NON-TIERED :: AVAILABLE COMP_LEVEL" \ - -XX:-TieredCompilation - else - negative_test `expr $1 + 1` "NON-TIERED :: UNAVAILABLE COMP_LEVEL" \ - -XX:-TieredCompilation - fi -} - -# $1 - initial error_code -client_tests() { - # testing in opposite VM - if [ $server_available -eq 1 ] - then - negative_test $1 "SERVER :: NON-TIERED" -XX:-TieredCompilation \ - -server - if [ $tiered_available -eq 1 ] - then - positive_test `expr $1 + 1` "SERVER :: TIERED" -XX:+TieredCompilation \ - -server - fi - fi - nontiered_tests `expr $1 + 2` $client_level -} - -# $1 - initial error_code -server_tests() { - # testing in opposite VM - if [ $client_available -eq 1 ] - then - # tiered is unavailable in client vm, so results w/ flags will be the same as w/o flags - negative_test $1 "CLIENT" -client - fi - nontiered_tests `expr $1 + 2` $server_level -} - -cleanup() { - ${RM} -f core* - ${RM} -f replay*.txt - ${RM} -f hs_err_pid*.log - ${RM} -f test_core - ${RM} -f test_replay.txt -} - -JAVA=${TESTJAVA}${FS}bin${FS}java - -replay_data=test_replay.txt - -${JAVA} ${TESTOPTS} -Xinternalversion 2>&1 | grep debug - -# Only test fastdebug -if [ $? -ne 0 ] -then - echo TEST SKIPPED: product build - exit 0 -fi - -is_int=`${JAVA} ${TESTOPTS} -version 2>&1 | grep -c "interpreted mode"` -# Not applicable for Xint -if [ $is_int -ne 0 ] -then - echo TEST SKIPPED: interpreted mode - exit 0 -fi - -cleanup - -client_available=`${JAVA} ${TESTOPTS} -client -Xinternalversion 2>&1 | \ - grep -c Client` -server_available=`${JAVA} ${TESTOPTS} -server -Xinternalversion 2>&1 | \ - grep -c Server` -tiered_available=`${JAVA} ${TESTOPTS} -XX:+TieredCompilation -XX:+PrintFlagsFinal -version | \ - grep TieredCompilation | \ - grep -c true` -is_tiered=`${JAVA} ${TESTOPTS} -XX:+PrintFlagsFinal -version | \ - grep TieredCompilation | \ - grep -c true` -# CompLevel_simple -- C1 -client_level=1 -# CompLevel_full_optimization -- C2 or Shark -server_level=4 - -echo "client_available=$client_available" -echo "server_available=$server_available" -echo "tiered_available=$tiered_available" -echo "is_tiered=$is_tiered" - -# crash vm in compiler thread with generation replay data and 'small' dump-file -# $@ - additional vm opts -generate_replay() { - if [ $VM_OS != "windows" ] - then - # enable core dump - ulimit -c unlimited - new_ulimit=`ulimit -c` - if [ $new_ulimit != "unlimited" -a $new_ulimit != "-1" ] - then - test_fail 2 "CHECK :: ULIMIT" "Could not set 'ulimit -c unlimited'. 'ulimit -c' returns : $new_ulimit" - fi - - if [ $VM_OS = "solaris" ] - then - coreadm -p core $$ - fi - fi - - cmd="${JAVA} ${TESTOPTS} $@ \ - -Xms8m \ - -Xmx32m \ - -XX:MetaspaceSize=4m \ - -XX:MaxMetaspaceSize=16m \ - -XX:InitialCodeCacheSize=512k \ - -XX:ReservedCodeCacheSize=4m \ - -XX:ThreadStackSize=512 \ - -XX:VMThreadStackSize=512 \ - -XX:CompilerThreadStackSize=512 \ - -XX:ParallelGCThreads=1 \ - -XX:CICompilerCount=2 \ - -Xcomp \ - -XX:CICrashAt=1 \ - -XX:+CreateMinidumpOnCrash \ - -XX:+DumpReplayDataOnError \ - -XX:-TransmitErrorReport \ - -XX:+PreferInterpreterNativeStubs \ - -XX:+PrintCompilation \ - -XX:ReplayDataFile=${replay_data} \ - -version" - echo GENERATION OF REPLAY.TXT: - echo $cmd - - ${cmd} > crash.out 2>&1 - - exit_code=$? - if [ ${exit_code} -eq 0 ] - then - cat crash.out - test_fail 3 "CHECK :: CRASH" "JVM exits gracefully" - fi - - core_locations=`grep -i core crash.out | grep "location:" | \ - sed -e 's/.*location: //'` - - if [ -z "${core_locations}" ] - then - test_fail 4 "CHECK :: CORE_LOCATION" "output doesn't contain the location of core file, see crash.out" - fi - - rm crash.out - - # processing core locations for *nix - if [ $VM_OS != "windows" ] - then - # remove 'or' between '/core.' and 'core' - # and the rest of line -- ' (max size ...) . To ensure a full core ...' - core_locations=`echo $core_locations | \ - sed -e 's/\([^ ]*\) or \([^ ]*\).*/\1 \2/'` - core_with_dir=`echo $core_locations | awk '{print $1}'` - core_with_pid=`echo $core_locations | awk '{print $2}'` - dir=`dirname $core_with_dir` - file=`basename $core_with_dir` - # add /core. core - core_locations='$core_with_dir' '$file' - if [ -n "${core_with_pid}" ] - then - core_locations=$core_locations '$core_with_pid' '$dir${FS}$core_with_pid' - fi - fi - - echo "LOOKING FOR CORE IN ${core_locations}" - for core in $core_locations - do - if [ -r "$core" ] - then - core_file=$core - fi - done - - # core-file was found - if [ -n "$core_file" ] - then - ${MV} "${core_file}" test_core - core_file=test_core - fi - - ${RM} -f hs_err_pid*.log -} - --- /dev/null 2016-08-22 18:39:56.099247576 +0300 +++ new/test/compiler/ciReplay/CiReplayBase.java 2016-08-25 21:42:17.025082471 +0300 @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package compiler.ciReplay; + +import compiler.whitebox.CompilerWhiteBoxTest; +import java.io.IOException; +import java.io.File; +import java.io.BufferedReader; +import java.io.FileReader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.regex.Pattern; +import java.util.regex.Matcher; +import jdk.test.lib.Platform; +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.Asserts; +import jdk.test.lib.Utils; + +public abstract class CiReplayBase { + public static final String REPLAY_FILE_NAME = "test_replay.txt"; + public static final boolean CLIENT_VM_AVAILABLE; + public static final boolean SERVER_VM_AVAILABLE; + public static final String TIERED_ENABLED_VM_OPTION = "-XX:+TieredCompilation"; + public static final String TIERED_DISABLED_VM_OPTION = "-XX:-TieredCompilation"; + public static final String ENABLE_COREDUMP_ON_CRASH = "-XX:+CreateCoredumpOnCrash"; + public static final String DISABLE_COREDUMP_ON_CRASH = "-XX:-CreateCoredumpOnCrash"; + public static final String CLIENT_VM_OPTION = "-client"; + public static final String SERVER_VM_OPTION = "-server"; + public static final String TEST_CORE_FILE_NAME = "test_core"; + public static final String RUN_SHELL_NO_LIMIT = "ulimit -c unlimited && "; + private static final String REPLAY_FILE_OPTION = "-XX:ReplayDataFile=" + REPLAY_FILE_NAME; + private static final String LOCATIONS_STRING = "location: "; + private static final String HS_ERR_NAME = "hs_err_pid"; + private static final String RUN_SHELL_ZERO_LIMIT = "ulimit -S -c 0 && "; + private static final String VERSION_OPTION = "-version"; + private static final String[] REPLAY_GENERATION_OPTIONS = new String[]{"-Xms8m", "-Xmx32m", + "-XX:MetaspaceSize=4m", "-XX:MaxMetaspaceSize=16m", "-XX:InitialCodeCacheSize=512k", + "-XX:ReservedCodeCacheSize=4m", "-XX:ThreadStackSize=512", "-XX:VMThreadStackSize=512", + "-XX:CompilerThreadStackSize=512", "-XX:ParallelGCThreads=1", "-XX:CICompilerCount=2", + "-Xcomp", "-XX:CICrashAt=1", "-XX:+DumpReplayDataOnError", "-XX:-TransmitErrorReport", + "-XX:+PreferInterpreterNativeStubs", "-XX:+PrintCompilation", REPLAY_FILE_OPTION}; + private static final String[] REPLAY_OPTIONS = new String[]{DISABLE_COREDUMP_ON_CRASH, + "-XX:+ReplayCompiles", REPLAY_FILE_OPTION}; + protected final Optional runServer; + + static { + try { + CLIENT_VM_AVAILABLE = ProcessTools.executeTestJvm(CLIENT_VM_OPTION, VERSION_OPTION) + .getOutput().contains("Client"); + SERVER_VM_AVAILABLE = ProcessTools.executeTestJvm(SERVER_VM_OPTION, VERSION_OPTION) + .getOutput().contains("Server"); + } catch(Throwable t) { + throw new Error("Initialization failed: " + t, t); + } + } + + public CiReplayBase() { + runServer = Optional.empty(); + } + + public CiReplayBase(String args[]) { + if (args.length != 1 || (!"server".equals(args[0]) && !"client".equals(args[0]))) { + throw new Error("Expected 1 argument: [server|client]"); + } + runServer = Optional.of("server".equals(args[0])); + } + + public void runTest(boolean needCoreDump, String... args) { + cleanup(); + if (generateReplay(needCoreDump)) { + testAction(); + cleanup(); + } else { + throw new Error("Host is not configured to generate cores"); + } + } + + public abstract void testAction(); + + private static void remove(String item) { + File toDelete = new File(item); + toDelete.delete(); + if (Platform.isWindows()) { + Utils.waitForCondition(() -> !toDelete.exists()); + } + } + + private static void removeFromCurrentDirectoryStartingWith(String prefix) { + Arrays.stream(new File(".").listFiles()) + .filter(f -> f.getName().startsWith(prefix)) + .forEach(File::delete); + } + + public static void cleanup() { + removeFromCurrentDirectoryStartingWith("core"); + removeFromCurrentDirectoryStartingWith("replay"); + removeFromCurrentDirectoryStartingWith(HS_ERR_NAME); + remove(TEST_CORE_FILE_NAME); + remove(REPLAY_FILE_NAME); + } + + public boolean generateReplay(boolean needCoreDump, String... vmopts) { + OutputAnalyzer crashOut; + String crashOutputString; + try { + List options = new ArrayList<>(); + options.addAll(Arrays.asList(REPLAY_GENERATION_OPTIONS)); + options.addAll(Arrays.asList(vmopts)); + options.add(needCoreDump ? ENABLE_COREDUMP_ON_CRASH : DISABLE_COREDUMP_ON_CRASH); + options.add(VERSION_OPTION); + if (needCoreDump) { + crashOut = ProcessTools.executeProcess(getTestJavaCommandlineWithPrefix( + RUN_SHELL_NO_LIMIT, options.toArray(new String[0]))); + } else { + crashOut = ProcessTools.executeProcess(ProcessTools.createJavaProcessBuilder(true, + options.toArray(new String[0]))); + } + crashOutputString = crashOut.getOutput(); + Asserts.assertNotEquals(crashOut.getExitValue(), 0, "Crash JVM exits gracefully"); + Files.write(Paths.get("crash.out"), crashOutputString.getBytes(), + StandardOpenOption.CREATE, StandardOpenOption.WRITE, + StandardOpenOption.TRUNCATE_EXISTING); + } catch (Throwable t) { + throw new Error("Can't create replay: " + t, t); + } + if (needCoreDump) { + String coreFileLocation = getCoreFileLocation(crashOutputString); + if (coreFileLocation == null) { + if (Platform.isOSX()) { + File coresDir = new File("/cores"); + if (!coresDir.isDirectory() || !coresDir.canWrite()) { + return false; + } + } + throw new Error("Couldn't find core file location in: '" + crashOutputString + "'"); + } + try { + Asserts.assertGT(new File(coreFileLocation).length(), 0L, "Unexpected core size"); + Files.move(Paths.get(coreFileLocation), Paths.get(TEST_CORE_FILE_NAME)); + } catch (IOException ioe) { + throw new Error("Can't move core file: " + ioe, ioe); + } + } + removeFromCurrentDirectoryStartingWith(HS_ERR_NAME); + return true; + } + + public void commonTests() { + positiveTest(); + if (Platform.isTieredSupported()) { + positiveTest(TIERED_ENABLED_VM_OPTION); + } + } + + public int startTest(String... additionalVmOpts) { + try { + List allAdditionalOpts = new ArrayList<>(); + allAdditionalOpts.addAll(Arrays.asList(REPLAY_OPTIONS)); + allAdditionalOpts.addAll(Arrays.asList(additionalVmOpts)); + OutputAnalyzer oa = ProcessTools.executeProcess(getTestJavaCommandlineWithPrefix( + RUN_SHELL_ZERO_LIMIT, allAdditionalOpts.toArray(new String[0]))); + return oa.getExitValue(); + } catch (Throwable t) { + throw new Error("Can't run replay process: " + t, t); + } + } + + public void runVmTests() { + boolean runServerValue = runServer.orElseThrow(() -> new Error("runServer must be set")); + if (runServerValue) { + if (CLIENT_VM_AVAILABLE) { + negativeTest(CLIENT_VM_OPTION); + } + } else { + if (SERVER_VM_AVAILABLE) { + negativeTest(TIERED_DISABLED_VM_OPTION, SERVER_VM_OPTION); + if (Platform.isTieredSupported()) { + positiveTest(TIERED_ENABLED_VM_OPTION, SERVER_VM_OPTION); + } + } + } + nonTieredTests(runServerValue ? CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION + : CompilerWhiteBoxTest.COMP_LEVEL_SIMPLE); + } + + public int getCompLevelFromReplay() { + try(BufferedReader br = new BufferedReader(new FileReader(REPLAY_FILE_NAME))) { + return br.lines() + .filter(s -> s.startsWith("compile ")) + .map(s -> s.substring(s.lastIndexOf(' ') + 1)) + .map(Integer::parseInt) + .findAny() + .get(); + } catch (IOException ioe) { + throw new Error("Failed to read replay data: " + ioe, ioe); + } + } + + public void positiveTest(String... additionalVmOpts) { + Asserts.assertEQ(startTest(additionalVmOpts), 0, "Unexpected exit code for positive case: " + + Arrays.toString(additionalVmOpts)); + } + + public void negativeTest(String... additionalVmOpts) { + Asserts.assertNE(startTest(additionalVmOpts), 0, "Unexpected exit code for negative case: " + + Arrays.toString(additionalVmOpts)); + } + + public void nonTieredTests(int compLevel) { + int replayDataCompLevel = getCompLevelFromReplay(); + if (replayDataCompLevel == compLevel) { + positiveTest(TIERED_DISABLED_VM_OPTION); + } else { + negativeTest(TIERED_DISABLED_VM_OPTION); + } + } + + // lets search few possible locations using process output and return existing location + private String getCoreFileLocation(String crashOutputString) { + Asserts.assertTrue(crashOutputString.contains(LOCATIONS_STRING), + "Output doesn't contain the location of core file, see crash.out"); + String stringWithLocation = Arrays.stream(crashOutputString.split("\\r?\\n")) + .filter(str -> str.contains(LOCATIONS_STRING)) + .findFirst() + .get(); + stringWithLocation = stringWithLocation.substring(stringWithLocation + .indexOf(LOCATIONS_STRING) + LOCATIONS_STRING.length()); + String coreWithPid; + if (stringWithLocation.contains("or ") && !Platform.isWindows()) { + Matcher m = Pattern.compile("or.* ([^ ]+[^\\)])\\)?").matcher(stringWithLocation); + if (!m.find()) { + throw new Error("Couldn't find path to core inside location string"); + } + coreWithPid = m.group(1); + } else { + coreWithPid = stringWithLocation.trim(); + } + if (new File(coreWithPid).exists()) { + return coreWithPid; + } + String justCore = Paths.get("core").toString(); + if (new File(justCore).exists()) { + return justCore; + } + Path coreWithPidPath = Paths.get(coreWithPid); + String justFile = coreWithPidPath.getFileName().toString(); + if (new File(justFile).exists()) { + return justFile; + } + Path parent = coreWithPidPath.getParent(); + if (parent != null) { + String coreWithoutPid = parent.resolve("core").toString(); + if (new File(coreWithoutPid).exists()) { + return coreWithoutPid; + } + } + return null; + } + + private String[] getTestJavaCommandlineWithPrefix(String prefix, String... args) { + try { + String cmd = ProcessTools.getCommandLine(ProcessTools.createJavaProcessBuilder(true, args)); + return new String[]{"sh", "-c", prefix + + (Platform.isWindows() ? cmd.replace('\\', '/').replace(";", "\\;") : cmd)}; + } catch(Throwable t) { + throw new Error("Can't create process builder: " + t, t); + } + } +} --- /dev/null 2016-08-22 18:39:56.099247576 +0300 +++ new/test/compiler/ciReplay/SABase.java 2016-08-25 21:42:17.253082470 +0300 @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package compiler.ciReplay; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.io.IOException; +import java.io.File; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.util.Arrays; +import jdk.test.lib.Platform; +import jdk.test.lib.Asserts; +import jdk.test.lib.JDKToolFinder; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class SABase extends CiReplayBase { + private static final String REPLAY_FILE_COPY = "replay_vm.txt"; + + public static void main(String args[]) { + checkSetLimits(); + new SABase(args).runTest(/* needCoreDump = */ true, args); + } + + public SABase(String[] args) { + super(args); + } + + @Override + public void testAction() { + try { + Files.move(Paths.get(REPLAY_FILE_NAME), Paths.get(REPLAY_FILE_COPY)); + } catch (IOException ioe) { + throw new Error("Can't move files: " + ioe, ioe); + } + ProcessBuilder pb; + try { + pb = ProcessTools.createJavaProcessBuilder(true, "-addmods", "jdk.hotspot.agent", + "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED", + "sun.jvm.hotspot.CLHSDB", JDKToolFinder.getTestJDKTool("java"), + TEST_CORE_FILE_NAME); + } catch (Exception e) { + throw new Error("Can't create process builder: " + e, e); + } + Process p; + try { + p = pb.start(); + } catch (IOException ioe) { + throw new Error("Can't start child process: " + ioe, ioe); + } + OutputStream input = p.getOutputStream(); + String str = "dumpreplaydata -a > " + REPLAY_FILE_NAME + "\n"; + try { + input.write(str.getBytes()); + input.flush(); + } catch (IOException ioe) { + throw new Error("Problem writing process input: " + str, ioe); + } + try { + p.waitFor(); + } catch (InterruptedException ie) { + throw new Error("Problem waitinig child process: " + ie, ie); + } + int exitValue = p.exitValue(); + if (exitValue != 0) { + String output; + try { + output = new OutputAnalyzer(p).getOutput(); + } catch (IOException ioe) { + throw new Error("Can't get failed CLHSDB process output: " + ioe, ioe); + } + throw new AssertionError("CLHSDB wasn't run successfully: " + output); + } + File replay = new File(REPLAY_FILE_NAME); + Asserts.assertTrue(replay.exists() && replay.isFile() && replay.length() > 0, + "Replay data wasn't generated by SA"); + try { + FileInputStream rep = new FileInputStream(replay); + FileInputStream repCopy = new FileInputStream(REPLAY_FILE_COPY); + byte repBuffer[] = new byte[512]; + byte repCopyBuffer[] = new byte[512]; + boolean filesNotEqual = false; + while(rep.available() > 0 && !filesNotEqual) { + int count = rep.read(repBuffer); + int count2 = repCopy.read(repCopyBuffer); + filesNotEqual = count != count2 || Arrays.equals(repBuffer, repCopyBuffer); + } + if (filesNotEqual) { + System.out.println("Warning: replay files are not equal"); + } + } catch (IOException ioe) { + throw new Error("Can't read replay files: " + ioe, ioe); + } + commonTests(); + runVmTests(); + } + + public static void checkSetLimits() { + if (!Platform.isWindows()) { + OutputAnalyzer oa; + try { + // first check if setting limit is possible + oa = ProcessTools.executeProcess("sh", "-c", RUN_SHELL_NO_LIMIT + "ulimit -c"); + } catch (Throwable t) { + throw new Error("Can't set limits: " + t, t); + } + oa.shouldHaveExitValue(0); + + String out = oa.getOutput().trim(); // cut win/*nix newlines + if (!out.equals("unlimited") && !out.equals("-1")) { + throw new Error("Unable to set limits"); + } + } + if (Platform.isSolaris()) { + try { + OutputAnalyzer oa = ProcessTools.executeProcess("coreadm", "-p", "core", + "" + ProcessHandle.current().getPid()); + oa.shouldHaveExitValue(0); + } catch (Throwable t) { + throw new Error("Can't launch coreadm: " + t, t); + } + } + } +} + --- /dev/null 2016-08-22 18:39:56.099247576 +0300 +++ new/test/compiler/ciReplay/TestClientVM.java 2016-08-25 21:42:17.489082468 +0300 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8011675 + * @library / /test/lib + * @summary testing of ciReplay with using generated by VM replay.txt + * @requires vm.flightRecorder != true & vm.compMode != "Xint" & vm.debug == true & vm.flavor == "client" + * @modules java.base/jdk.internal.misc + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * compiler.ciReplay.VMBase client + */ --- /dev/null 2016-08-22 18:39:56.099247576 +0300 +++ new/test/compiler/ciReplay/TestSAClient.java 2016-08-25 21:42:17.761082465 +0300 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8011675 + * @library / /test/lib + * @ignore 8029528 + * @summary testing of ciReplay with using generated by SA replay.txt + * @requires vm.flightRecorder != true & vm.compMode != "Xint" & vm.debug == true & vm.flavor == "client" + * @modules java.base/jdk.internal.misc + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * compiler.ciReplay.SABase client + */ --- /dev/null 2016-08-22 18:39:56.099247576 +0300 +++ new/test/compiler/ciReplay/TestSAServer.java 2016-08-25 21:42:18.013082463 +0300 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8011675 + * @library / /test/lib + * @ignore 8029528 + * @summary testing of ciReplay with using generated by SA replay.txt + * @requires vm.flightRecorder != true & vm.compMode != "Xint" & vm.debug == true & vm.flavor == "server" + * @modules java.base/jdk.internal.misc + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * compiler.ciReplay.SABase server + */ --- /dev/null 2016-08-22 18:39:56.099247576 +0300 +++ new/test/compiler/ciReplay/TestServerVM.java 2016-08-25 21:42:18.249082462 +0300 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8011675 + * @library / /test/lib + * @summary testing of ciReplay with using generated by VM replay.txt + * @requires vm.flightRecorder != true & vm.compMode != "Xint" & vm.debug == true & vm.flavor == "server" + * @modules java.base/jdk.internal.misc + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * compiler.ciReplay.VMBase server + */ --- /dev/null 2016-08-22 18:39:56.099247576 +0300 +++ new/test/compiler/ciReplay/TestVMNoCompLevel.java 2016-08-25 21:42:18.485082460 +0300 @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8011675 + * @library / /test/lib + * @summary testing of ciReplay with using generated by VM replay.txt w/o comp_level + * @requires vm.flightRecorder != true & vm.compMode != "Xint" & vm.debug == true + * @modules java.base/jdk.internal.misc + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * compiler.ciReplay.TestVMNoCompLevel + */ + +package compiler.ciReplay; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.List; + +public class TestVMNoCompLevel extends CiReplayBase { + public static void main(String args[]) { + new TestVMNoCompLevel().runTest(false); + } + + @Override + public void testAction() { + try { + Path replayFilePath = Paths.get(REPLAY_FILE_NAME); + List replayContent = Files.readAllLines(replayFilePath); + for (int i = 0; i < replayContent.size(); i++) { + String line = replayContent.get(i); + if (line.startsWith("compile ")) { + replayContent.set(i, line.substring(0, line.lastIndexOf(" "))); + } + } + Files.write(replayFilePath, replayContent, StandardOpenOption.TRUNCATE_EXISTING); + } catch (IOException ioe) { + throw new Error("Failed to read/write replay data: " + ioe, ioe); + } + if (CLIENT_VM_AVAILABLE) { + negativeTest(CLIENT_VM_OPTION); + } + if (SERVER_VM_AVAILABLE) { + positiveTest(TIERED_DISABLED_VM_OPTION, SERVER_VM_OPTION); + positiveTest(TIERED_ENABLED_VM_OPTION, SERVER_VM_OPTION); + } + } +} + --- /dev/null 2016-08-22 18:39:56.099247576 +0300 +++ new/test/compiler/ciReplay/VMBase.java 2016-08-25 21:42:18.717082458 +0300 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package compiler.ciReplay; + +import compiler.whitebox.CompilerWhiteBoxTest; +import jdk.test.lib.Asserts; +import sun.hotspot.WhiteBox; + +public class VMBase extends CiReplayBase { + + public static void main(String args[]) { + new VMBase(args).runTest(/* needCoreDump = */ false, args); + } + + public VMBase(String[] args) { + super(args); + } + + @Override + public void testAction() { + commonTests(); + runVmTests(); + cleanup(); + if (runServer.orElseThrow(() -> new Error("runServer must be set")) + && WhiteBox.getWhiteBox().getBooleanVMFlag("TieredCompilation")) { + for (int stop = 1; stop < CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION; stop++) { + String vmOpt = "-XX:TieredStopAtLevel=" + stop; + generateReplay(/* need coredump = */ false, vmOpt); + int replayCompLevel = getCompLevelFromReplay(); + Asserts.assertGTE(stop, replayCompLevel, "Unexpected compLevel in replay"); + positiveTest(vmOpt); + } + } + } +} +