diff --git a/compiler/src/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationWrapper.java b/compiler/src/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationWrapper.java index 0e3bfe4eaea6..7fe39f89b871 100644 --- a/compiler/src/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationWrapper.java +++ b/compiler/src/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationWrapper.java @@ -31,6 +31,8 @@ import static org.graalvm.compiler.core.GraalCompilerOptions.MaxCompilationProblemsPerAction; import static org.graalvm.compiler.core.common.GraalOptions.TrackNodeSourcePosition; import static org.graalvm.compiler.debug.DebugOptions.Dump; +import static org.graalvm.compiler.debug.DebugOptions.Time; +import static org.graalvm.compiler.debug.DebugOptions.Count; import static org.graalvm.compiler.debug.DebugOptions.DumpPath; import static org.graalvm.compiler.debug.DebugOptions.MethodFilter; import static org.graalvm.compiler.debug.DebugOptions.PrintBackendCFG; @@ -336,6 +338,8 @@ protected T handleFailure(DebugContext initialDebug, Throwable cause) { OptionValues retryOptions = new OptionValues(initialOptions, Dump, ":" + DebugOptions.DiagnoseDumpLevel.getValue(initialOptions), MethodFilter, null, + Count, "", + Time, "", DumpPath, dumpPath, PrintBackendCFG, true, TrackNodeSourcePosition, true); @@ -343,26 +347,38 @@ protected T handleFailure(DebugContext initialDebug, Throwable cause) { ByteArrayOutputStream logBaos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(logBaos); try (DebugContext retryDebug = createRetryDebugContext(initialDebug, retryOptions, ps)) { - T res = performCompilation(retryDebug); + T res; + try { + res = performCompilation(retryDebug); + } finally { + ps.println(""); + retryDebug.printMetrics(initialDebug.getDescription(), ps, true); + ps.println(""); + } ps.println("There was no exception during retry."); - return postRetry(action, retryLogFile, logBaos, ps, res); + finalizeRetryLog(retryLogFile, logBaos, ps); + return postRetry(action, res); } catch (Throwable e) { ps.println("Exception during retry:"); e.printStackTrace(ps); - return postRetry(action, retryLogFile, logBaos, ps, handleException(cause)); + finalizeRetryLog(retryLogFile, logBaos, ps); + return postRetry(action, handleException(cause)); } } } - private T postRetry(ExceptionAction action, String retryLogFile, ByteArrayOutputStream logBaos, PrintStream ps, T res) { + private T postRetry(ExceptionAction action, T res) { + maybeExitVM(action); + return res; + } + + private static void finalizeRetryLog(String retryLogFile, ByteArrayOutputStream logBaos, PrintStream ps) { ps.close(); try (OutputStream fos = PathUtilities.openOutputStream(retryLogFile, true)) { fos.write(logBaos.toByteArray()); } catch (Throwable e) { TTY.printf("Error writing to %s: %s%n", retryLogFile, e); } - maybeExitVM(action); - return res; } /** diff --git a/compiler/src/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugContext.java b/compiler/src/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugContext.java index 3f6f7e9c9384..60100da3c6fc 100644 --- a/compiler/src/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugContext.java +++ b/compiler/src/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugContext.java @@ -2301,7 +2301,22 @@ private void printMetricsCSV(PrintStream out, Object compilable, Integer identit } /** - * Appends metrics in a human readable format to {@code out} for a single method compilation. + * Prints the metrics in a human-readable format to {@code out} for a single method compilation. + * + * @param clear specifies if the metrics should be cleared after printing + */ + public void printMetrics(Description desc, PrintStream out, boolean clear) { + if (metricValues == null) { + return; + } + printMetrics(out, desc.compilable, 0, 0, desc.identifier); + if (clear) { + metricValues = null; + } + } + + /** + * Appends metrics in a human-readable format to {@code out} for a single method compilation. * * @param identity the identity hash code of {@code compilable} * @param compilationNr where this compilation lies in the ordered sequence of all compilations diff --git a/compiler/src/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompilationWrapperTest.java b/compiler/src/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompilationWrapperTest.java index 466c52a8e1b4..c833b0f6586d 100644 --- a/compiler/src/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompilationWrapperTest.java +++ b/compiler/src/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompilationWrapperTest.java @@ -195,7 +195,7 @@ public void testTruffleCompilation3() throws IOException, InterruptedException { "org.graalvm.compiler.truffle.test.SLTruffleGraalTestSuite", "test"); } - private static final boolean VERBOSE = Boolean.getBoolean(CompilationWrapperTest.class.getSimpleName() + ".verbose"); + private static final boolean VERBOSE = Boolean.getBoolean("CompilationWrapperTest.verbose"); private static void testHelper(List initialProbes, List extraVmArgs, String... mainClassAndArgs) throws IOException, InterruptedException { final File dumpPath = new File(CompilationWrapperTest.class.getSimpleName() + "_" + System.currentTimeMillis()).getAbsoluteFile(); @@ -262,6 +262,12 @@ String test() { entries.add(name); if (name.endsWith(".bgv") || name.endsWith(".cfg")) { bgvOrCfgFiles++; + } else if (name.endsWith("retry.log")) { + String log = new String(dd.getInputStream(ze).readAllBytes()); + Pattern re = Pattern.compile(".*", Pattern.DOTALL); + if (!re.matcher(log).find()) { + Assert.fail(String.format("Could not find %s in %s:%n%s", re.pattern(), name, log)); + } } } if (bgvOrCfgFiles == 0) { diff --git a/compiler/src/org.graalvm.compiler.test/src/org/graalvm/compiler/test/SubprocessUtil.java b/compiler/src/org.graalvm.compiler.test/src/org/graalvm/compiler/test/SubprocessUtil.java index 470220790561..b403b3ce03dd 100644 --- a/compiler/src/org.graalvm.compiler.test/src/org/graalvm/compiler/test/SubprocessUtil.java +++ b/compiler/src/org.graalvm.compiler.test/src/org/graalvm/compiler/test/SubprocessUtil.java @@ -53,10 +53,8 @@ public final class SubprocessUtil { /** * The name of the boolean system property that can be set to preserve temporary files created * as arguments files passed to the java launcher. - * - * @see "https://docs.oracle.com/javase/9/tools/java.htm#JSWOR-GUID-4856361B-8BFD-4964-AE84-121F5F6CF111" */ - public static final String KEEP_TEMPORARY_ARGUMENT_FILES_PROPERTY_NAME = "test." + SubprocessUtil.class.getSimpleName() + ".keepTempArgumentFiles"; + public static final String KEEP_TEMPORARY_ARGUMENT_FILES_PROPERTY_NAME = "test.SubprocessUtil.keepTempArgumentFiles"; private SubprocessUtil() { }