# HG changeset patch # User Tom Rodriguez # Date 1425931638 25200 # Node ID 6a3832494e24e08d064d5583ba28155c11d6eeb1 # Parent d0b4f977162226ce42c0f65f83741b1eac837abd Check for derived pointers before passing BytecodeFrame into HotSpot diff -r d0b4f9771622 -r 6a3832494e24 graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/BytecodeFrame.java --- 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; diff -r d0b4f9771622 -r 6a3832494e24 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java --- 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); } diff -r d0b4f9771622 -r 6a3832494e24 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotCompiledCode.java --- 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); } } } diff -r d0b4f9771622 -r 6a3832494e24 src/share/vm/graal/graalCodeInstaller.cpp --- 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;