make slicer handle multiple languages, using the Language to build mod and ref visitors
This commit is contained in:
parent
196f7cb153
commit
d1840f0531
|
@ -31,9 +31,9 @@ import com.ibm.wala.ipa.modref.ExtendedHeapModel;
|
|||
|
||||
public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
|
||||
|
||||
protected static class JavaScriptRefVisitor<T extends InstanceKey> extends AstRefVisitor<T> implements JSInstructionVisitor {
|
||||
public static class JavaScriptRefVisitor<T extends InstanceKey> extends AstRefVisitor<T> implements JSInstructionVisitor {
|
||||
|
||||
protected JavaScriptRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h) {
|
||||
public JavaScriptRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h) {
|
||||
super(n, result, pa, (AstHeapModel)h);
|
||||
}
|
||||
|
||||
|
@ -80,9 +80,9 @@ public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
|
|||
return new JavaScriptRefVisitor<>(n, result, pa, h);
|
||||
}
|
||||
|
||||
protected static class JavaScriptModVisitor<T extends InstanceKey> extends AstModVisitor<T> implements JSInstructionVisitor {
|
||||
public static class JavaScriptModVisitor<T extends InstanceKey> extends AstModVisitor<T> implements JSInstructionVisitor {
|
||||
|
||||
protected JavaScriptModVisitor(CGNode n, Collection<PointerKey> result, ExtendedHeapModel h, PointerAnalysis<T> pa) {
|
||||
public JavaScriptModVisitor(CGNode n, Collection<PointerKey> result, ExtendedHeapModel h, PointerAnalysis<T> pa) {
|
||||
super(n, result, (AstHeapModel)h, pa);
|
||||
}
|
||||
|
||||
|
|
|
@ -36,6 +36,8 @@ import com.ibm.wala.cast.ir.translator.TranslatorToCAst;
|
|||
import com.ibm.wala.cast.ir.translator.TranslatorToIR;
|
||||
import com.ibm.wala.cast.js.analysis.typeInference.JSPrimitiveType;
|
||||
import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraph.JSFakeRoot;
|
||||
import com.ibm.wala.cast.js.ipa.modref.JavaScriptModRef;
|
||||
import com.ibm.wala.cast.js.ipa.modref.JavaScriptModRef.JavaScriptRefVisitor;
|
||||
import com.ibm.wala.cast.js.ssa.JSInstructionFactory;
|
||||
import com.ibm.wala.cast.js.ssa.JavaScriptCheckReference;
|
||||
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
|
||||
|
@ -67,9 +69,16 @@ import com.ibm.wala.classLoader.LanguageImpl;
|
|||
import com.ibm.wala.classLoader.ModuleEntry;
|
||||
import com.ibm.wala.classLoader.NewSiteReference;
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
|
||||
import com.ibm.wala.ipa.callgraph.CGNode;
|
||||
import com.ibm.wala.ipa.callgraph.IAnalysisCacheView;
|
||||
import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
|
||||
import com.ibm.wala.ipa.modref.ModRef.ModVisitor;
|
||||
import com.ibm.wala.ipa.modref.ModRef.RefVisitor;
|
||||
import com.ibm.wala.shrikeBT.IBinaryOpInstruction.IOperator;
|
||||
import com.ibm.wala.shrikeBT.IComparisonInstruction.Operator;
|
||||
import com.ibm.wala.shrikeCT.BootstrapMethodsReader.BootstrapMethod;
|
||||
|
@ -669,6 +678,18 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader {
|
|||
return new JSFakeRoot(cha, options, cache);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends InstanceKey> RefVisitor<T, ? extends ExtendedHeapModel> makeRefVisitor(CGNode n,
|
||||
Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h) {
|
||||
return new JavaScriptRefVisitor<>(n, result, pa, h);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends InstanceKey> ModVisitor<T, ? extends ExtendedHeapModel> makeModVisitor(CGNode n, Collection<PointerKey> result,
|
||||
PointerAnalysis<T> pa, ExtendedHeapModel h, boolean ignoreAllocHeapDefs) {
|
||||
return new JavaScriptModRef.JavaScriptModVisitor<>(n, result, h, pa);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
private final JavaScriptTranslatorFactory translatorFactory;
|
||||
|
|
|
@ -21,11 +21,18 @@ import java.util.Collections;
|
|||
import com.ibm.wala.analysis.typeInference.JavaPrimitiveType;
|
||||
import com.ibm.wala.analysis.typeInference.PrimitiveType;
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
|
||||
import com.ibm.wala.ipa.callgraph.CGNode;
|
||||
import com.ibm.wala.ipa.callgraph.IAnalysisCacheView;
|
||||
import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod;
|
||||
import com.ibm.wala.ipa.callgraph.impl.FakeRootClass;
|
||||
import com.ibm.wala.ipa.callgraph.impl.FakeRootMethod;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
|
||||
import com.ibm.wala.ipa.modref.ModRef.ModVisitor;
|
||||
import com.ibm.wala.ipa.modref.ModRef.RefVisitor;
|
||||
import com.ibm.wala.shrikeBT.ConstantInstruction;
|
||||
import com.ibm.wala.shrikeBT.ConstantInstruction.ClassToken;
|
||||
import com.ibm.wala.shrikeBT.Constants;
|
||||
|
@ -776,4 +783,16 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons
|
|||
return new FakeRootMethod(new FakeRootClass(ClassLoaderReference.Primordial, cha), options, cache);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends InstanceKey> RefVisitor<T, ? extends ExtendedHeapModel> makeRefVisitor(CGNode n, Collection<PointerKey> result,
|
||||
PointerAnalysis<T> pa, ExtendedHeapModel h) {
|
||||
return new RefVisitor<>(n, result, pa, h);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends InstanceKey> ModVisitor<T, ? extends ExtendedHeapModel> makeModVisitor(CGNode n, Collection<PointerKey> result,
|
||||
PointerAnalysis<T> pa, ExtendedHeapModel h, boolean ignoreAllocHeapDefs) {
|
||||
return new ModVisitor<>(n, result, h, pa, ignoreAllocHeapDefs);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -17,10 +17,17 @@ import com.ibm.wala.analysis.typeInference.PrimitiveType;
|
|||
import com.ibm.wala.analysis.typeInference.TypeInference;
|
||||
import com.ibm.wala.cfg.InducedCFG;
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
|
||||
import com.ibm.wala.ipa.callgraph.CGNode;
|
||||
import com.ibm.wala.ipa.callgraph.Context;
|
||||
import com.ibm.wala.ipa.callgraph.IAnalysisCacheView;
|
||||
import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
|
||||
import com.ibm.wala.ipa.modref.ModRef;
|
||||
import com.ibm.wala.ipa.modref.ModRef.RefVisitor;
|
||||
import com.ibm.wala.shrikeCT.InvalidClassFileException;
|
||||
import com.ibm.wala.ssa.SSAInstruction;
|
||||
import com.ibm.wala.ssa.SSAInstructionFactory;
|
||||
|
@ -157,4 +164,10 @@ public interface Language {
|
|||
|
||||
boolean modelConstant(Object o);
|
||||
|
||||
<T extends InstanceKey> RefVisitor<T, ? extends ExtendedHeapModel> makeRefVisitor(CGNode n, Collection<PointerKey> result,
|
||||
PointerAnalysis<T> pa, ExtendedHeapModel h);
|
||||
|
||||
<T extends InstanceKey> ModRef.ModVisitor<T, ? extends ExtendedHeapModel> makeModVisitor(CGNode n,
|
||||
Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h,
|
||||
boolean ignoreAllocHeapDefs);
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ import com.ibm.wala.classLoader.IField;
|
|||
import com.ibm.wala.ipa.callgraph.CGNode;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraph;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraphTransitiveClosure;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.HeapModel;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
|
||||
|
@ -116,8 +117,14 @@ public class ModRef<T extends InstanceKey> {
|
|||
}
|
||||
|
||||
public ExtendedHeapModel makeHeapModel(PointerAnalysis<T> pa) {
|
||||
return new DelegatingExtendedHeapModel(pa.getHeapModel());
|
||||
HeapModel heapModel = pa.getHeapModel();
|
||||
if (heapModel instanceof ExtendedHeapModel) {
|
||||
return (ExtendedHeapModel) heapModel;
|
||||
} else {
|
||||
return new DelegatingExtendedHeapModel(heapModel);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* For a call graph node, what heap locations (as determined by a heap model) may it write, <b> NOT </b> including it's callees
|
||||
* transitively
|
||||
|
@ -162,7 +169,7 @@ public class ModRef<T extends InstanceKey> {
|
|||
return result;
|
||||
}
|
||||
|
||||
protected static class RefVisitor<T extends InstanceKey, H extends ExtendedHeapModel> extends SSAInstruction.Visitor {
|
||||
public static class RefVisitor<T extends InstanceKey, H extends ExtendedHeapModel> extends SSAInstruction.Visitor {
|
||||
protected final CGNode n;
|
||||
|
||||
protected final Collection<PointerKey> result;
|
||||
|
@ -171,7 +178,7 @@ public class ModRef<T extends InstanceKey> {
|
|||
|
||||
protected final H h;
|
||||
|
||||
protected RefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa2, H h) {
|
||||
public RefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa2, H h) {
|
||||
this.n = n;
|
||||
this.result = result;
|
||||
this.pa = pa2;
|
||||
|
@ -213,7 +220,7 @@ public class ModRef<T extends InstanceKey> {
|
|||
}
|
||||
}
|
||||
|
||||
protected static class ModVisitor<T extends InstanceKey, H extends ExtendedHeapModel> extends SSAInstruction.Visitor {
|
||||
public static class ModVisitor<T extends InstanceKey, H extends ExtendedHeapModel> extends SSAInstruction.Visitor {
|
||||
protected final CGNode n;
|
||||
|
||||
protected final Collection<PointerKey> result;
|
||||
|
@ -224,7 +231,7 @@ public class ModRef<T extends InstanceKey> {
|
|||
|
||||
private final boolean ignoreAllocHeapDefs;
|
||||
|
||||
protected ModVisitor(CGNode n, Collection<PointerKey> result, H h, PointerAnalysis<T> pa,
|
||||
public ModVisitor(CGNode n, Collection<PointerKey> result, H h, PointerAnalysis<T> pa,
|
||||
boolean ignoreAllocHeapDefs) {
|
||||
this.n = n;
|
||||
this.result = result;
|
||||
|
@ -330,7 +337,8 @@ public class ModRef<T extends InstanceKey> {
|
|||
|
||||
protected ModVisitor<T, ? extends ExtendedHeapModel> makeModVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h,
|
||||
boolean ignoreAllocHeapDefs) {
|
||||
return new ModVisitor<>(n, result, h, pa, ignoreAllocHeapDefs);
|
||||
return n.getMethod().getDeclaringClass().getClassLoader().getLanguage().makeModVisitor(n, result, pa, h, ignoreAllocHeapDefs);
|
||||
//return new ModVisitor<>(n, result, h, pa, ignoreAllocHeapDefs);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -355,7 +363,7 @@ public class ModRef<T extends InstanceKey> {
|
|||
}
|
||||
|
||||
protected RefVisitor<T, ? extends ExtendedHeapModel> makeRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h) {
|
||||
return new RefVisitor<>(n, result, pa, h);
|
||||
return n.getMethod().getDeclaringClass().getClassLoader().getLanguage().makeRefVisitor(n, result, pa, h);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue