# HG changeset patch # User Andreas Woess # Date 1407330769 -7200 # Node ID 2b7e583cfe67b9cba1db594902879f64e7907e55 # Parent c68da2397fcbdf71b53f829d0f558afa4e49413b Truffle: add TraceTruffleAssumptions option for debugging installed code invalidations due to assumptions diff -r c68da2397fcb -r 2b7e583cfe67 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedAssumption.java --- 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))); + } } diff -r c68da2397fcb -r 2b7e583cfe67 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerOptions.java --- 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 TraceTruffleSplitting = new OptionValue<>(false); @Option(help = "Print stack trace on transfer to interpreter") public static final OptionValue TraceTruffleTransferToInterpreter = new StableOptionValue<>(false); + @Option(help = "Print stack trace on assumption invalidation") + public static final OptionValue TraceTruffleAssumptions = new StableOptionValue<>(false); @Option(help = "") public static final OptionValue TruffleCallTargetProfiling = new StableOptionValue<>(false); // @formatter:on