package com.oracle.graal.pointsto;
import org.graalvm.compiler.options.OptionValues;
import com.oracle.graal.pointsto.api.PointstoOptions;
import com.oracle.graal.pointsto.flow.AbstractSpecialInvokeTypeFlow;
import com.oracle.graal.pointsto.flow.AbstractVirtualInvokeTypeFlow;
import com.oracle.graal.pointsto.flow.ActualReturnTypeFlow;
import com.oracle.graal.pointsto.flow.TypeFlow;
import com.oracle.graal.pointsto.flow.context.AnalysisContext;
import com.oracle.graal.pointsto.flow.context.AnalysisContextPolicy;
import com.oracle.graal.pointsto.flow.context.BytecodeLocation;
import com.oracle.graal.pointsto.flow.context.object.AnalysisObject;
import com.oracle.graal.pointsto.meta.AnalysisField;
import com.oracle.graal.pointsto.meta.AnalysisMethod;
import com.oracle.graal.pointsto.meta.AnalysisType;
import com.oracle.graal.pointsto.meta.AnalysisUniverse;
import com.oracle.graal.pointsto.typestate.TypeState;
import com.oracle.graal.pointsto.typestore.ArrayElementsTypeStore;
import com.oracle.graal.pointsto.typestore.FieldTypeStore;
import jdk.vm.ci.code.BytecodePosition;
import jdk.vm.ci.meta.JavaConstant;
public abstract class AnalysisPolicy {
protected final OptionValues options;
protected final boolean aliasArrayTypeFlows;
protected final boolean relaxTypeFlowConstraints;
protected final boolean removeSaturatedTypeFlows;
protected final int typeFlowSaturationCutoff;
public AnalysisPolicy(OptionValues options) {
this.options = options;
aliasArrayTypeFlows = PointstoOptions.AliasArrayTypeFlows.getValue(options);
relaxTypeFlowConstraints = PointstoOptions.RelaxTypeFlowStateConstraints.getValue(options);
removeSaturatedTypeFlows = PointstoOptions.RemoveSaturatedTypeFlows.getValue(options);
typeFlowSaturationCutoff = PointstoOptions.TypeFlowSaturationCutoff.getValue(options);
}
public boolean aliasArrayTypeFlows() {
return aliasArrayTypeFlows;
}
public boolean relaxTypeFlowConstraints() {
return relaxTypeFlowConstraints;
}
public boolean removeSaturatedTypeFlows() {
return removeSaturatedTypeFlows;
}
public int typeFlowSaturationCutoff() {
return typeFlowSaturationCutoff;
}
protected abstract AnalysisContextPolicy<? extends AnalysisContext> contextPolicy();
@SuppressWarnings("unchecked")
public AnalysisContextPolicy<AnalysisContext> getContextPolicy() {
return (AnalysisContextPolicy<AnalysisContext>) contextPolicy();
}
public abstract boolean needsConstantCache();
public abstract boolean isSummaryObject(AnalysisObject object);
public abstract boolean isMergingEnabled();
public abstract void noteMerge(BigBang bb, TypeState t);
public abstract void noteMerge(BigBang bb, AnalysisObject... a);
public abstract void noteMerge(BigBang bb, AnalysisObject o);
public abstract boolean isContextSensitiveAllocation(BigBang bb, AnalysisType type, AnalysisContext allocationContext);
public abstract AnalysisObject createHeapObject(BigBang bb, AnalysisType objectType, BytecodeLocation allocationSite, AnalysisContext allocationContext);
public abstract AnalysisObject createConstantObject(BigBang bb, JavaConstant constant, AnalysisType exactType);
public abstract BytecodeLocation createAllocationSite(BigBang bb, int bci, AnalysisMethod method);
public BytecodeLocation createAllocationSite(BigBang bb, Object key, AnalysisMethod method) {
return createAllocationSite(bb, BytecodeLocation.keyToBci(key), method);
}
public abstract FieldTypeStore createFieldTypeStore(AnalysisObject object, AnalysisField field, AnalysisUniverse universe);
public abstract ArrayElementsTypeStore createArrayElementsTypeStore(AnalysisObject object, AnalysisUniverse universe);
public abstract AbstractVirtualInvokeTypeFlow createVirtualInvokeTypeFlow(BytecodePosition invokeLocation, AnalysisType receiverType, AnalysisMethod targetMethod,
TypeFlow<?>[] actualParameters, ActualReturnTypeFlow actualReturn, BytecodeLocation location);
public abstract AbstractSpecialInvokeTypeFlow createSpecialInvokeTypeFlow(BytecodePosition invokeLocation, AnalysisType receiverType, AnalysisMethod targetMethod,
TypeFlow<?>[] actualParameters, ActualReturnTypeFlow actualReturn, BytecodeLocation location);
@SuppressWarnings("unused")
public int makePoperties(BigBang bb, AnalysisObject... objects) {
return 0;
}
@SuppressWarnings("unused")
public int makePopertiesForUnion(TypeState s1, TypeState s2) {
return 0;
}
}