changeset 19732:6a3832494e24

Check for derived pointers before passing BytecodeFrame into HotSpot
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Mon, 09 Mar 2015 13:07:18 -0700
parents d0b4f9771622
children 415975c5550b
files graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/BytecodeFrame.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotCompiledCode.java src/share/vm/graal/graalCodeInstaller.cpp
diffstat 4 files changed, 6 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/BytecodeFrame.java	Mon Mar 09 12:46:01 2015 -0700
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/BytecodeFrame.java	Mon Mar 09 13:07:18 2015 -0700
@@ -161,9 +161,9 @@
      * slot following a double word item. This should really be checked in FrameState itself but
      * because of Word type rewriting and alternative backends that can't be done.
      */
-    public boolean validateFormat() {
+    public boolean validateFormat(boolean derivedOk) {
         if (caller() != null) {
-            caller().validateFormat();
+            caller().validateFormat(derivedOk);
         }
         for (int i = 0; i < numLocals + numStack; i++) {
             if (values[i] != null) {
@@ -172,6 +172,7 @@
                     assert values.length > i + 1 : String.format("missing second word %s", this);
                     assert values[i + 1] == null || values[i + 1].getKind() == Kind.Illegal : this;
                 }
+                assert derivedOk || ValueUtil.isIllegal(values[i]) || !values[i].getLIRKind().isDerivedReference() : "Unexpected derived value: " + values[i];
             }
         }
         return true;
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java	Mon Mar 09 12:46:01 2015 -0700
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java	Mon Mar 09 13:07:18 2015 -0700
@@ -113,7 +113,7 @@
         }
         objectStates.clear();
 
-        assert frame.validateFormat();
+        assert frame.validateFormat(false);
         return newLIRFrameState(exceptionEdge, frame, virtualObjectsArray);
     }
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotCompiledCode.java	Mon Mar 09 12:46:01 2015 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotCompiledCode.java	Mon Mar 09 13:07:18 2015 -0700
@@ -115,7 +115,7 @@
                 Infopoint info = (Infopoint) site;
                 if (info.debugInfo != null) {
                     BytecodeFrame frame = info.debugInfo.frame();
-                    assert frame == null || frame.validateFormat();
+                    assert frame == null || frame.validateFormat(false);
                 }
             }
         }
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Mon Mar 09 12:46:01 2015 -0700
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Mon Mar 09 13:07:18 2015 -0700
@@ -212,6 +212,7 @@
   oop lirKind = AbstractValue::lirKind(value);
   oop platformKind = LIRKind::platformKind(lirKind);
   jint referenceMask = LIRKind::referenceMask(lirKind);
+  assert(referenceMask != -1, "derived pointers are not allowed");
   assert(referenceMask == 0 || referenceMask == 1, "unexpected referenceMask");
   bool reference = referenceMask == 1;