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