/*
* Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.oracle.svm.hosted.code;
import java.util.concurrent.atomic.AtomicBoolean;
import org.graalvm.compiler.nodes.ConstantNode;
import org.graalvm.compiler.nodes.StructuredGraph;
import com.oracle.svm.core.annotate.DeoptTest;
import com.oracle.svm.core.annotate.Specialize;
import com.oracle.svm.hosted.code.CompileQueue.CompileFunction;
import com.oracle.svm.hosted.code.CompileQueue.ParseFunction;
import com.oracle.svm.hosted.meta.HostedMethod;
public class CompilationInfo {
protected final HostedMethod method;
protected final AtomicBoolean inParseQueue = new AtomicBoolean(false);
protected volatile StructuredGraph graph;
protected boolean isTrivialMethod;
protected boolean canDeoptForTesting;
The constant arguments for a DeoptTest
method called by a Specialize
method. Note: this is only used for testing. /**
* The constant arguments for a {@link DeoptTest} method called by a {@link Specialize} method.
* Note: this is only used for testing.
*/
protected ConstantNode[] specializedArguments;
A link to the deoptimization target method if this method can deoptimize.
/**
* A link to the deoptimization target method if this method can deoptimize.
*/
protected HostedMethod deoptTarget;
A link to the regular compiled method if this method is a deoptimization target. /** A link to the regular compiled method if this method is a deoptimization target. */
protected HostedMethod deoptOrigin;
/* Custom parsing and compilation code that is executed instead of that of CompileQueue */
protected ParseFunction customParseFunction;
protected CompileFunction customCompileFunction;
/* Statistics collected before/during compilation. */
protected long numNodesBeforeCompilation;
protected long numNodesAfterCompilation;
protected long numDeoptEntryPoints;
protected long numDuringCallEntryPoints;
public CompilationInfo(HostedMethod method) {
this.method = method;
}
public boolean isDeoptTarget() {
return deoptOrigin != null;
}
public boolean isDeoptEntry(int bci, boolean duringCall, boolean rethrowException) {
return isDeoptTarget() && (deoptOrigin.compilationInfo.canDeoptForTesting || CompilationInfoSupport.singleton().isDeoptEntry(method, bci, duringCall, rethrowException));
}
public boolean canDeoptForTesting() {
return canDeoptForTesting;
}
public HostedMethod getDeoptTargetMethod() {
return deoptTarget;
}
public void setDeoptTarget(HostedMethod deoptTarget) {
assert this.deoptTarget == null;
this.deoptTarget = deoptTarget;
deoptTarget.compilationInfo.deoptOrigin = this.method;
}
public void setGraph(StructuredGraph graph) {
this.graph = graph;
}
public void clear() {
graph = null;
specializedArguments = null;
}
public StructuredGraph getGraph() {
return graph;
}
public boolean isTrivialMethod() {
return isTrivialMethod;
}
public void setTrivialMethod(boolean trivial) {
isTrivialMethod = trivial;
}
public void setCustomParseFunction(ParseFunction parseFunction) {
this.customParseFunction = parseFunction;
}
public ParseFunction getCustomParseFunction() {
return customParseFunction;
}
public void setCustomCompileFunction(CompileFunction compileFunction) {
this.customCompileFunction = compileFunction;
}
public CompileFunction getCustomCompileFunction() {
return customCompileFunction;
}
public boolean hasDefaultParseFunction() {
return customCompileFunction == null;
}
}