Mercurial > hg > graal-jvmci-8
changeset 16712:2b7e583cfe67
Truffle: add TraceTruffleAssumptions option for debugging installed code invalidations due to assumptions
author | Andreas Woess <andreas.woess@jku.at> |
---|---|
date | Wed, 06 Aug 2014 15:12:49 +0200 |
parents | c68da2397fcb |
children | 47f9c47145fd |
files | graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedAssumption.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerOptions.java |
diffstat | 2 files changed, 31 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedAssumption.java Wed Aug 06 14:52:41 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedAssumption.java Wed Aug 06 15:12:49 2014 +0200 @@ -22,9 +22,14 @@ */ package com.oracle.graal.truffle; +import static com.oracle.graal.truffle.TruffleCompilerOptions.*; + import java.lang.ref.*; +import java.util.*; +import java.util.stream.*; import com.oracle.graal.api.code.*; +import com.oracle.graal.debug.*; import com.oracle.truffle.api.impl.*; import com.oracle.truffle.api.nodes.*; @@ -52,16 +57,28 @@ @Override public synchronized void invalidate() { if (isValid) { + boolean invalidatedInstalledCode = false; Entry e = first; while (e != null) { InstalledCode installedCode = e.installedCode.get(); if (installedCode != null && installedCode.getVersion() == e.version) { installedCode.invalidate(); + + invalidatedInstalledCode = true; + if (TraceTruffleAssumptions.getValue()) { + logInvalidatedInstalledCode(installedCode); + } } e = e.next; } first = null; isValid = false; + + if (TraceTruffleAssumptions.getValue()) { + if (invalidatedInstalledCode) { + logStackTrace(); + } + } } } @@ -81,4 +98,16 @@ public boolean isValid() { return isValid; } + + private void logInvalidatedInstalledCode(InstalledCode installedCode) { + TTY.out().out().printf("assumption '%s' invalidated installed code '%s'\n", name, installedCode); + } + + private static void logStackTrace() { + final int skip = 1; + final int limit = 20; + StackTraceElement[] stackTrace = new Throwable().getStackTrace(); + String suffix = stackTrace.length > skip + limit ? "\n ..." : ""; + TTY.out().out().println(Arrays.stream(stackTrace).skip(skip).limit(limit).map(StackTraceElement::toString).collect(Collectors.joining("\n ", "", suffix))); + } }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerOptions.java Wed Aug 06 14:52:41 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerOptions.java Wed Aug 06 15:12:49 2014 +0200 @@ -121,6 +121,8 @@ public static final OptionValue<Boolean> TraceTruffleSplitting = new OptionValue<>(false); @Option(help = "Print stack trace on transfer to interpreter") public static final OptionValue<Boolean> TraceTruffleTransferToInterpreter = new StableOptionValue<>(false); + @Option(help = "Print stack trace on assumption invalidation") + public static final OptionValue<Boolean> TraceTruffleAssumptions = new StableOptionValue<>(false); @Option(help = "") public static final OptionValue<Boolean> TruffleCallTargetProfiling = new StableOptionValue<>(false); // @formatter:on