public final class FrameStateBuilder extends Object implements IntrinsicContext.SideEffectsState
Modifier and Type | Field and Description |
---|---|
private boolean |
canVerifyKind |
private static com.oracle.graal.nodes.ValueNode[] |
EMPTY_ARRAY |
private static com.oracle.graal.nodes.java.MonitorIdNode[] |
EMPTY_MONITOR_ARRAY |
private com.oracle.graal.nodes.StructuredGraph |
graph |
protected com.oracle.graal.nodes.ValueNode[] |
locals |
private com.oracle.graal.nodes.ValueNode[] |
lockedObjects |
private jdk.internal.jvmci.meta.ResolvedJavaMethod |
method |
private com.oracle.graal.nodes.java.MonitorIdNode[] |
monitorIds |
private com.oracle.graal.nodes.FrameState |
outerFrameState |
private BytecodeParser |
parser |
private boolean |
rethrowException |
private List<com.oracle.graal.nodes.StateSplit> |
sideEffects
The closest
side-effect predecessors. |
protected com.oracle.graal.nodes.ValueNode[] |
stack |
private int |
stackSize |
Modifier | Constructor and Description |
---|---|
|
FrameStateBuilder(BytecodeParser parser,
jdk.internal.jvmci.meta.ResolvedJavaMethod method,
com.oracle.graal.nodes.StructuredGraph graph)
Creates a new frame state builder for the given method and the given target graph.
|
private |
FrameStateBuilder(FrameStateBuilder other) |
Modifier and Type | Method and Description |
---|---|
void |
addSideEffect(com.oracle.graal.nodes.StateSplit sideEffect) |
private static com.oracle.graal.nodes.ValueNode[] |
allocateArray(int length) |
void |
cleanDeletedNodes()
Phi nodes are recursively deleted in
propagateDelete(com.oracle.graal.nodes.calc.FloatingNode) . |
void |
clearLocals()
Clears all local variables.
|
void |
clearNonLiveLocals(BciBlockMapping.BciBlock block,
LocalLiveness liveness,
boolean liveIn) |
void |
clearStack()
Clears all values on this stack.
|
boolean |
contains(com.oracle.graal.nodes.ValueNode value) |
FrameStateBuilder |
copy() |
private jdk.internal.jvmci.code.BytecodePosition |
create(jdk.internal.jvmci.code.BytecodePosition o,
int bci,
BytecodeParser parent) |
com.oracle.graal.nodes.FrameState |
create(int bci,
BytecodeParser parent,
boolean duringCall,
jdk.internal.jvmci.meta.Kind[] pushedSlotKinds,
com.oracle.graal.nodes.ValueNode[] pushedValues) |
com.oracle.graal.nodes.FrameState |
create(int bci,
com.oracle.graal.nodes.StateSplit forStateSplit) |
jdk.internal.jvmci.code.BytecodePosition |
createBytecodePosition(int bci) |
private com.oracle.graal.nodes.ValueNode |
createLoopPhi(com.oracle.graal.nodes.AbstractMergeNode block,
com.oracle.graal.nodes.ValueNode value) |
private com.oracle.graal.nodes.ValuePhiNode |
createValuePhi(com.oracle.graal.nodes.ValueNode currentValue,
com.oracle.graal.nodes.ValueNode otherValue,
com.oracle.graal.nodes.AbstractMergeNode block) |
void |
disableKindVerification() |
boolean |
equals(Object otherObject) |
private static boolean |
equals(com.oracle.graal.nodes.ValueNode[] a,
com.oracle.graal.nodes.ValueNode[] b,
int length) |
jdk.internal.jvmci.meta.ResolvedJavaMethod |
getMethod() |
int |
hashCode() |
private static int |
hashCode(Object[] a,
int length) |
void |
initializeForMethodStart(boolean eagerResolve,
ParameterPlugin[] parameterPlugins) |
void |
initializeFromArgumentsArray(com.oracle.graal.nodes.ValueNode[] arguments) |
void |
insertLoopPhis(LocalLiveness liveness,
int loopId,
com.oracle.graal.nodes.LoopBeginNode loopBegin,
boolean forcePhis) |
void |
insertLoopProxies(com.oracle.graal.nodes.LoopExitNode loopExit,
FrameStateBuilder loopEntryState) |
void |
insertProxies(Function<com.oracle.graal.nodes.ValueNode,com.oracle.graal.nodes.ValueNode> proxyFunction) |
boolean |
isAfterSideEffect() |
boolean |
isCompatibleWith(FrameStateBuilder other) |
com.oracle.graal.nodes.ValueNode |
loadLocal(int i,
jdk.internal.jvmci.meta.Kind slotKind)
Loads the local variable at the specified index, checking that the returned value is non-null
and that two-stack values are properly handled.
|
int |
localsSize()
Returns the size of the local variables.
|
int |
lockDepth(boolean includeParents) |
void |
merge(com.oracle.graal.nodes.AbstractMergeNode block,
FrameStateBuilder other) |
private com.oracle.graal.nodes.ValueNode |
merge(com.oracle.graal.nodes.ValueNode currentValue,
com.oracle.graal.nodes.ValueNode otherValue,
com.oracle.graal.nodes.AbstractMergeNode block) |
com.oracle.graal.nodes.java.MonitorIdNode |
peekMonitorId() |
com.oracle.graal.nodes.ValueNode |
pop(jdk.internal.jvmci.meta.Kind slotKind)
Pops an instruction off the stack with the expected type.
|
com.oracle.graal.nodes.ValueNode[] |
popArguments(int argSize)
Pop the specified number of slots off of this stack and return them as an array of
instructions.
|
com.oracle.graal.nodes.ValueNode |
popLock()
Removes a locked monitor from this frame state.
|
private void |
propagateDelete(com.oracle.graal.nodes.calc.FloatingNode node) |
void |
push(jdk.internal.jvmci.meta.Kind slotKind,
com.oracle.graal.nodes.ValueNode x)
Pushes an instruction onto the stack with the expected type.
|
void |
pushLock(com.oracle.graal.nodes.ValueNode object,
com.oracle.graal.nodes.java.MonitorIdNode monitorId)
Adds a locked monitor to this frame state.
|
void |
pushReturn(jdk.internal.jvmci.meta.Kind slotKind,
com.oracle.graal.nodes.ValueNode x) |
boolean |
rethrowException() |
void |
setRethrowException(boolean b) |
Iterable<com.oracle.graal.nodes.StateSplit> |
sideEffects() |
void |
stackOp(int opcode)
Performs a raw stack operation as defined in the Java bytecode specification.
|
int |
stackSize()
Gets the current size (height) of the stack.
|
void |
storeLocal(int i,
jdk.internal.jvmci.meta.Kind slotKind,
com.oracle.graal.nodes.ValueNode x)
Stores a given local variable at the specified index.
|
String |
toString() |
void |
traceState() |
private boolean |
verifyKind(jdk.internal.jvmci.meta.Kind slotKind,
com.oracle.graal.nodes.ValueNode x) |
private com.oracle.graal.nodes.ValueNode |
xpeek() |
private com.oracle.graal.nodes.ValueNode |
xpop() |
private void |
xpush(com.oracle.graal.nodes.ValueNode x) |
private static final com.oracle.graal.nodes.ValueNode[] EMPTY_ARRAY
private static final com.oracle.graal.nodes.java.MonitorIdNode[] EMPTY_MONITOR_ARRAY
private final BytecodeParser parser
private final jdk.internal.jvmci.meta.ResolvedJavaMethod method
private int stackSize
protected final com.oracle.graal.nodes.ValueNode[] locals
protected final com.oracle.graal.nodes.ValueNode[] stack
private com.oracle.graal.nodes.ValueNode[] lockedObjects
private boolean canVerifyKind
private boolean rethrowException
BytecodeFrame.rethrowException
private com.oracle.graal.nodes.java.MonitorIdNode[] monitorIds
private final com.oracle.graal.nodes.StructuredGraph graph
private com.oracle.graal.nodes.FrameState outerFrameState
private List<com.oracle.graal.nodes.StateSplit> sideEffects
side-effect
predecessors. There will be more
than one when the current block contains no side-effects but merging predecessor blocks do.public FrameStateBuilder(BytecodeParser parser, jdk.internal.jvmci.meta.ResolvedJavaMethod method, com.oracle.graal.nodes.StructuredGraph graph)
method
- the method whose frame is simulatedgraph
- the target graph of Graal nodes created by the builderprivate FrameStateBuilder(FrameStateBuilder other)
public void disableKindVerification()
public void initializeFromArgumentsArray(com.oracle.graal.nodes.ValueNode[] arguments)
public void initializeForMethodStart(boolean eagerResolve, ParameterPlugin[] parameterPlugins)
private static com.oracle.graal.nodes.ValueNode[] allocateArray(int length)
public jdk.internal.jvmci.meta.ResolvedJavaMethod getMethod()
public com.oracle.graal.nodes.FrameState create(int bci, com.oracle.graal.nodes.StateSplit forStateSplit)
public com.oracle.graal.nodes.FrameState create(int bci, BytecodeParser parent, boolean duringCall, jdk.internal.jvmci.meta.Kind[] pushedSlotKinds, com.oracle.graal.nodes.ValueNode[] pushedValues)
pushedValues
- if non-null, values to push(Kind, ValueNode)
to the stack before
creating the FrameState
public jdk.internal.jvmci.code.BytecodePosition createBytecodePosition(int bci)
private jdk.internal.jvmci.code.BytecodePosition create(jdk.internal.jvmci.code.BytecodePosition o, int bci, BytecodeParser parent)
public FrameStateBuilder copy()
public boolean isCompatibleWith(FrameStateBuilder other)
public void cleanDeletedNodes()
propagateDelete(com.oracle.graal.nodes.calc.FloatingNode)
. However, this does not cover
frame state builder objects, since these are not nodes and not in the usage list of the phi
node. Therefore, we clean the frame state builder manually here, before we parse a block.public void merge(com.oracle.graal.nodes.AbstractMergeNode block, FrameStateBuilder other)
private com.oracle.graal.nodes.ValueNode merge(com.oracle.graal.nodes.ValueNode currentValue, com.oracle.graal.nodes.ValueNode otherValue, com.oracle.graal.nodes.AbstractMergeNode block)
private com.oracle.graal.nodes.ValuePhiNode createValuePhi(com.oracle.graal.nodes.ValueNode currentValue, com.oracle.graal.nodes.ValueNode otherValue, com.oracle.graal.nodes.AbstractMergeNode block)
private void propagateDelete(com.oracle.graal.nodes.calc.FloatingNode node)
public void insertLoopPhis(LocalLiveness liveness, int loopId, com.oracle.graal.nodes.LoopBeginNode loopBegin, boolean forcePhis)
public void insertLoopProxies(com.oracle.graal.nodes.LoopExitNode loopExit, FrameStateBuilder loopEntryState)
public void insertProxies(Function<com.oracle.graal.nodes.ValueNode,com.oracle.graal.nodes.ValueNode> proxyFunction)
private com.oracle.graal.nodes.ValueNode createLoopPhi(com.oracle.graal.nodes.AbstractMergeNode block, com.oracle.graal.nodes.ValueNode value)
public void pushLock(com.oracle.graal.nodes.ValueNode object, com.oracle.graal.nodes.java.MonitorIdNode monitorId)
object
- the object whose monitor will be locked.public com.oracle.graal.nodes.ValueNode popLock()
public com.oracle.graal.nodes.java.MonitorIdNode peekMonitorId()
public int lockDepth(boolean includeParents)
public boolean contains(com.oracle.graal.nodes.ValueNode value)
public void clearNonLiveLocals(BciBlockMapping.BciBlock block, LocalLiveness liveness, boolean liveIn)
public void clearLocals()
public boolean rethrowException()
BytecodeFrame.rethrowException
public void setRethrowException(boolean b)
BytecodeFrame.rethrowException
public int localsSize()
public int stackSize()
private boolean verifyKind(jdk.internal.jvmci.meta.Kind slotKind, com.oracle.graal.nodes.ValueNode x)
public com.oracle.graal.nodes.ValueNode loadLocal(int i, jdk.internal.jvmci.meta.Kind slotKind)
i
- the index of the local variable to loadslotKind
- the kind of the local variable from the point of view of the bytecodespublic void storeLocal(int i, jdk.internal.jvmci.meta.Kind slotKind, com.oracle.graal.nodes.ValueNode x)
i
- the index at which to storeslotKind
- the kind of the local variable from the point of view of the bytecodesx
- the instruction which produces the value for the localpublic void push(jdk.internal.jvmci.meta.Kind slotKind, com.oracle.graal.nodes.ValueNode x)
slotKind
- the kind of the stack element from the point of view of the bytecodesx
- the instruction to push onto the stackpublic void pushReturn(jdk.internal.jvmci.meta.Kind slotKind, com.oracle.graal.nodes.ValueNode x)
public com.oracle.graal.nodes.ValueNode pop(jdk.internal.jvmci.meta.Kind slotKind)
slotKind
- the kind of the stack element from the point of view of the bytecodesprivate void xpush(com.oracle.graal.nodes.ValueNode x)
private com.oracle.graal.nodes.ValueNode xpop()
private com.oracle.graal.nodes.ValueNode xpeek()
public com.oracle.graal.nodes.ValueNode[] popArguments(int argSize)
public void clearStack()
public void stackOp(int opcode)
opcode
- The Java bytecode.private static boolean equals(com.oracle.graal.nodes.ValueNode[] a, com.oracle.graal.nodes.ValueNode[] b, int length)
public boolean isAfterSideEffect()
isAfterSideEffect
in interface IntrinsicContext.SideEffectsState
public Iterable<com.oracle.graal.nodes.StateSplit> sideEffects()
sideEffects
in interface IntrinsicContext.SideEffectsState
public void addSideEffect(com.oracle.graal.nodes.StateSplit sideEffect)
addSideEffect
in interface IntrinsicContext.SideEffectsState
public void traceState()