more generalization for reuse
This commit is contained in:
parent
be6bb3dc9a
commit
e1def2ffb5
|
@ -28,7 +28,6 @@ import com.ibm.wala.ipa.callgraph.impl.FakeRootMethod;
|
||||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||||
import com.ibm.wala.shrikeBT.IInvokeInstruction;
|
import com.ibm.wala.shrikeBT.IInvokeInstruction;
|
||||||
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
|
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
|
||||||
import com.ibm.wala.ssa.SSAInvokeInstruction;
|
|
||||||
import com.ibm.wala.ssa.SSANewInstruction;
|
import com.ibm.wala.ssa.SSANewInstruction;
|
||||||
import com.ibm.wala.types.ClassLoaderReference;
|
import com.ibm.wala.types.ClassLoaderReference;
|
||||||
import com.ibm.wala.types.FieldReference;
|
import com.ibm.wala.types.FieldReference;
|
||||||
|
@ -147,14 +146,14 @@ public class CrossLanguageCallGraph extends AstCallGraph {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SSAInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
|
public SSAAbstractInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
|
||||||
TypeReference type = site.getDeclaredTarget().getDeclaringClass();
|
TypeReference type = site.getDeclaredTarget().getDeclaringClass();
|
||||||
Atom language = type.getClassLoader().getLanguage();
|
Atom language = type.getClassLoader().getLanguage();
|
||||||
AbstractRootMethod root = getLanguageRoot(language);
|
AbstractRootMethod root = getLanguageRoot(language);
|
||||||
return root.addInvocation(params, site);
|
return root.addInvocation(params, site);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SSAInvokeInstruction addInvocationInternal(int[] params, CallSiteReference site) {
|
public SSAAbstractInvokeInstruction addInvocationInternal(int[] params, CallSiteReference site) {
|
||||||
return super.addInvocation(params, site);
|
return super.addInvocation(params, site);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@ import com.ibm.wala.shrikeCT.BootstrapMethodsReader.BootstrapMethod;
|
||||||
import com.ibm.wala.shrikeCT.ConstantPoolParser.ReferenceToken;
|
import com.ibm.wala.shrikeCT.ConstantPoolParser.ReferenceToken;
|
||||||
import com.ibm.wala.shrikeCT.InvalidClassFileException;
|
import com.ibm.wala.shrikeCT.InvalidClassFileException;
|
||||||
import com.ibm.wala.ssa.SSAAbstractBinaryInstruction;
|
import com.ibm.wala.ssa.SSAAbstractBinaryInstruction;
|
||||||
|
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
|
||||||
import com.ibm.wala.ssa.SSAAddressOfInstruction;
|
import com.ibm.wala.ssa.SSAAddressOfInstruction;
|
||||||
import com.ibm.wala.ssa.SSAArrayLengthInstruction;
|
import com.ibm.wala.ssa.SSAArrayLengthInstruction;
|
||||||
import com.ibm.wala.ssa.SSAArrayLoadInstruction;
|
import com.ibm.wala.ssa.SSAArrayLoadInstruction;
|
||||||
|
@ -234,7 +235,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SSAInvokeInstruction InvokeInstruction(int iindex, int result, int[] params, int exception, CallSiteReference site, BootstrapMethod bootstrap) {
|
public SSAAbstractInvokeInstruction InvokeInstruction(int iindex, int result, int[] params, int exception, CallSiteReference site, BootstrapMethod bootstrap) {
|
||||||
if (bootstrap != null) {
|
if (bootstrap != null) {
|
||||||
return new SSAInvokeDynamicInstruction(iindex, result, params, exception, site, bootstrap) {
|
return new SSAInvokeDynamicInstruction(iindex, result, params, exception, site, bootstrap) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -15,11 +15,14 @@ import java.util.Set;
|
||||||
|
|
||||||
import com.ibm.wala.analysis.typeInference.PrimitiveType;
|
import com.ibm.wala.analysis.typeInference.PrimitiveType;
|
||||||
import com.ibm.wala.analysis.typeInference.TypeInference;
|
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.AnalysisOptions;
|
||||||
|
import com.ibm.wala.ipa.callgraph.Context;
|
||||||
import com.ibm.wala.ipa.callgraph.IAnalysisCacheView;
|
import com.ibm.wala.ipa.callgraph.IAnalysisCacheView;
|
||||||
import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod;
|
import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod;
|
||||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||||
import com.ibm.wala.shrikeCT.InvalidClassFileException;
|
import com.ibm.wala.shrikeCT.InvalidClassFileException;
|
||||||
|
import com.ibm.wala.ssa.SSAInstruction;
|
||||||
import com.ibm.wala.ssa.SSAInstructionFactory;
|
import com.ibm.wala.ssa.SSAInstructionFactory;
|
||||||
import com.ibm.wala.ssa.SSALoadMetadataInstruction;
|
import com.ibm.wala.ssa.SSALoadMetadataInstruction;
|
||||||
import com.ibm.wala.types.MethodReference;
|
import com.ibm.wala.types.MethodReference;
|
||||||
|
@ -149,5 +152,6 @@ public interface Language {
|
||||||
boolean methodsHaveDeclaredParameterTypes();
|
boolean methodsHaveDeclaredParameterTypes();
|
||||||
|
|
||||||
AbstractRootMethod getFakeRootMethod(IClassHierarchy cha, AnalysisOptions options, IAnalysisCacheView cache);
|
AbstractRootMethod getFakeRootMethod(IClassHierarchy cha, AnalysisOptions options, IAnalysisCacheView cache);
|
||||||
|
|
||||||
|
InducedCFG makeInducedCFG(SSAInstruction[] instructions, IMethod method, Context context);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,9 @@ package com.ibm.wala.classLoader;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.ibm.wala.cfg.InducedCFG;
|
||||||
|
import com.ibm.wala.ipa.callgraph.Context;
|
||||||
|
import com.ibm.wala.ssa.SSAInstruction;
|
||||||
import com.ibm.wala.util.collections.HashSetFactory;
|
import com.ibm.wala.util.collections.HashSetFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -65,4 +68,10 @@ public abstract class LanguageImpl implements Language {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getName().toString();
|
return getName().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public
|
||||||
|
InducedCFG makeInducedCFG(SSAInstruction[] instructions, IMethod method, Context context) {
|
||||||
|
return new InducedCFG(instructions, method, context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -175,7 +175,7 @@ public class SyntheticMethod implements IMethod {
|
||||||
* NOTE: SIDE EFFECT!!! ... nulls out phi instructions in the instruction array!
|
* NOTE: SIDE EFFECT!!! ... nulls out phi instructions in the instruction array!
|
||||||
*/
|
*/
|
||||||
public InducedCFG makeControlFlowGraph(SSAInstruction[] instructions) {
|
public InducedCFG makeControlFlowGraph(SSAInstruction[] instructions) {
|
||||||
return new InducedCFG(instructions, this, Everywhere.EVERYWHERE);
|
return this.getDeclaringClass().getClassLoader().getLanguage().makeInducedCFG(instructions, this, Everywhere.EVERYWHERE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BytecodeStream getBytecodeStream() throws UnsupportedOperationException {
|
public BytecodeStream getBytecodeStream() throws UnsupportedOperationException {
|
||||||
|
|
|
@ -32,6 +32,7 @@ import com.ibm.wala.ipa.summaries.SyntheticIR;
|
||||||
import com.ibm.wala.shrikeBT.IInvokeInstruction;
|
import com.ibm.wala.shrikeBT.IInvokeInstruction;
|
||||||
import com.ibm.wala.ssa.ConstantValue;
|
import com.ibm.wala.ssa.ConstantValue;
|
||||||
import com.ibm.wala.ssa.IR;
|
import com.ibm.wala.ssa.IR;
|
||||||
|
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
|
||||||
import com.ibm.wala.ssa.SSAArrayStoreInstruction;
|
import com.ibm.wala.ssa.SSAArrayStoreInstruction;
|
||||||
import com.ibm.wala.ssa.SSAInstruction;
|
import com.ibm.wala.ssa.SSAInstruction;
|
||||||
import com.ibm.wala.ssa.SSAInstructionFactory;
|
import com.ibm.wala.ssa.SSAInstructionFactory;
|
||||||
|
@ -130,12 +131,12 @@ public abstract class AbstractRootMethod extends SyntheticMethod {
|
||||||
* @return the invoke instructions added by this operation
|
* @return the invoke instructions added by this operation
|
||||||
* @throws IllegalArgumentException if site is null
|
* @throws IllegalArgumentException if site is null
|
||||||
*/
|
*/
|
||||||
public SSAInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
|
public SSAAbstractInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
|
||||||
if (site == null) {
|
if (site == null) {
|
||||||
throw new IllegalArgumentException("site is null");
|
throw new IllegalArgumentException("site is null");
|
||||||
}
|
}
|
||||||
CallSiteReference newSite = CallSiteReference.make(statements.size(), site.getDeclaredTarget(), site.getInvocationCode());
|
CallSiteReference newSite = CallSiteReference.make(statements.size(), site.getDeclaredTarget(), site.getInvocationCode());
|
||||||
SSAInvokeInstruction s = null;
|
SSAAbstractInvokeInstruction s = null;
|
||||||
if (newSite.getDeclaredTarget().getReturnType().equals(TypeReference.Void)) {
|
if (newSite.getDeclaredTarget().getReturnType().equals(TypeReference.Void)) {
|
||||||
s = insts.InvokeInstruction(statements.size(), params, nextLocal++, newSite, null);
|
s = insts.InvokeInstruction(statements.size(), params, nextLocal++, newSite, null);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -45,7 +45,7 @@ import com.ibm.wala.ipa.callgraph.propagation.cfa.DefaultSSAInterpreter;
|
||||||
import com.ibm.wala.ipa.callgraph.propagation.cfa.DelegatingSSAContextInterpreter;
|
import com.ibm.wala.ipa.callgraph.propagation.cfa.DelegatingSSAContextInterpreter;
|
||||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||||
import com.ibm.wala.shrikeBT.IInvokeInstruction;
|
import com.ibm.wala.shrikeBT.IInvokeInstruction;
|
||||||
import com.ibm.wala.ssa.SSAInvokeInstruction;
|
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
|
||||||
import com.ibm.wala.ssa.SSANewInstruction;
|
import com.ibm.wala.ssa.SSANewInstruction;
|
||||||
import com.ibm.wala.types.ClassLoaderReference;
|
import com.ibm.wala.types.ClassLoaderReference;
|
||||||
import com.ibm.wala.types.FieldReference;
|
import com.ibm.wala.types.FieldReference;
|
||||||
|
@ -198,7 +198,7 @@ public abstract class AbstractRTABuilder extends PropagationCallGraphBuilder {
|
||||||
if (targetMethod != null) {
|
if (targetMethod != null) {
|
||||||
CGNode target = callGraph.getNode(targetMethod, Everywhere.EVERYWHERE);
|
CGNode target = callGraph.getNode(targetMethod, Everywhere.EVERYWHERE);
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
SSAInvokeInstruction s = fakeWorldClinitMethod.addInvocation(null, site);
|
SSAAbstractInvokeInstruction s = fakeWorldClinitMethod.addInvocation(null, site);
|
||||||
try {
|
try {
|
||||||
target = callGraph.findOrCreateNode(targetMethod, Everywhere.EVERYWHERE);
|
target = callGraph.findOrCreateNode(targetMethod, Everywhere.EVERYWHERE);
|
||||||
processResolvedCall(callGraph.getFakeWorldClinitNode(), s.getCallSite(), target);
|
processResolvedCall(callGraph.getFakeWorldClinitNode(), s.getCallSite(), target);
|
||||||
|
|
|
@ -459,6 +459,12 @@ public class XMLMethodSummaryReader implements BytecodeConstants {
|
||||||
} else {
|
} else {
|
||||||
Assertions.UNREACHABLE("Invalid call type " + typeString);
|
Assertions.UNREACHABLE("Invalid call type " + typeString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String paramCount = atts.getValue(A_NUM_ARGS);
|
||||||
|
if (paramCount != null) {
|
||||||
|
nParams = Integer.parseInt(paramCount);
|
||||||
|
}
|
||||||
|
|
||||||
int[] params = new int[nParams];
|
int[] params = new int[nParams];
|
||||||
|
|
||||||
for (int i = 0; i < params.length; i++) {
|
for (int i = 0; i < params.length; i++) {
|
||||||
|
@ -466,7 +472,7 @@ public class XMLMethodSummaryReader implements BytecodeConstants {
|
||||||
Assertions.productionAssertion(argString != null, "unspecified arg in method " + governingMethod + " " + site);
|
Assertions.productionAssertion(argString != null, "unspecified arg in method " + governingMethod + " " + site);
|
||||||
Integer valueNumber = symbolTable.get(argString);
|
Integer valueNumber = symbolTable.get(argString);
|
||||||
if (valueNumber == null) {
|
if (valueNumber == null) {
|
||||||
Assertions.UNREACHABLE("Cannot lookup value: " + argString);
|
valueNumber = Integer.parseInt(argString);
|
||||||
}
|
}
|
||||||
params[i] = valueNumber.intValue();
|
params[i] = valueNumber.intValue();
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,7 @@ public interface SSAInstructionFactory {
|
||||||
|
|
||||||
SSAInstanceofInstruction InstanceofInstruction(int iindex, int result, int ref, TypeReference checkedType);
|
SSAInstanceofInstruction InstanceofInstruction(int iindex, int result, int ref, TypeReference checkedType);
|
||||||
|
|
||||||
SSAInvokeInstruction InvokeInstruction(int iindex, int result, int[] params, int exception, CallSiteReference site, BootstrapMethod bootstrap);
|
SSAAbstractInvokeInstruction InvokeInstruction(int iindex, int result, int[] params, int exception, CallSiteReference site, BootstrapMethod bootstrap);
|
||||||
|
|
||||||
SSAInvokeInstruction InvokeInstruction(int iindex, int[] params, int exception, CallSiteReference site, BootstrapMethod bootstrap);
|
SSAInvokeInstruction InvokeInstruction(int iindex, int[] params, int exception, CallSiteReference site, BootstrapMethod bootstrap);
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||||
import com.ibm.wala.shrikeBT.IConditionalBranchInstruction;
|
import com.ibm.wala.shrikeBT.IConditionalBranchInstruction;
|
||||||
import com.ibm.wala.shrikeBT.IInvokeInstruction;
|
import com.ibm.wala.shrikeBT.IInvokeInstruction;
|
||||||
import com.ibm.wala.shrikeCT.BootstrapMethodsReader.BootstrapMethod;
|
import com.ibm.wala.shrikeCT.BootstrapMethodsReader.BootstrapMethod;
|
||||||
|
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
|
||||||
import com.ibm.wala.ssa.SSAArrayLoadInstruction;
|
import com.ibm.wala.ssa.SSAArrayLoadInstruction;
|
||||||
import com.ibm.wala.ssa.SSAArrayStoreInstruction;
|
import com.ibm.wala.ssa.SSAArrayStoreInstruction;
|
||||||
import com.ibm.wala.ssa.SSAConditionalBranchInstruction;
|
import com.ibm.wala.ssa.SSAConditionalBranchInstruction;
|
||||||
|
@ -109,7 +110,7 @@ public class TypeSafeInstructionFactory {
|
||||||
* @param exception An SSAValue receiving the exception-object when something in the method throws unhandled
|
* @param exception An SSAValue receiving the exception-object when something in the method throws unhandled
|
||||||
* @param site The CallSiteReference to this call.
|
* @param site The CallSiteReference to this call.
|
||||||
*/
|
*/
|
||||||
public SSAInvokeInstruction InvokeInstruction(final int iindex, final SSAValue result, List<? extends SSAValue> params,
|
public SSAAbstractInvokeInstruction InvokeInstruction(final int iindex, final SSAValue result, List<? extends SSAValue> params,
|
||||||
final SSAValue exception, final CallSiteReference site) {
|
final SSAValue exception, final CallSiteReference site) {
|
||||||
info("Now: InvokeInstruction to {} using {}", site, params);
|
info("Now: InvokeInstruction to {} using {}", site, params);
|
||||||
if (iindex < 0) {
|
if (iindex < 0) {
|
||||||
|
|
|
@ -72,9 +72,9 @@ import com.ibm.wala.ipa.summaries.MethodSummary;
|
||||||
import com.ibm.wala.shrikeBT.IInvokeInstruction;
|
import com.ibm.wala.shrikeBT.IInvokeInstruction;
|
||||||
import com.ibm.wala.shrikeBT.IInvokeInstruction.IDispatch;
|
import com.ibm.wala.shrikeBT.IInvokeInstruction.IDispatch;
|
||||||
import com.ibm.wala.ssa.ConstantValue;
|
import com.ibm.wala.ssa.ConstantValue;
|
||||||
|
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
|
||||||
import com.ibm.wala.ssa.SSAArrayStoreInstruction;
|
import com.ibm.wala.ssa.SSAArrayStoreInstruction;
|
||||||
import com.ibm.wala.ssa.SSAInstructionFactory;
|
import com.ibm.wala.ssa.SSAInstructionFactory;
|
||||||
import com.ibm.wala.ssa.SSAInvokeInstruction;
|
|
||||||
import com.ibm.wala.ssa.SSANewInstruction;
|
import com.ibm.wala.ssa.SSANewInstruction;
|
||||||
import com.ibm.wala.types.ClassLoaderReference;
|
import com.ibm.wala.types.ClassLoaderReference;
|
||||||
import com.ibm.wala.types.Descriptor;
|
import com.ibm.wala.types.Descriptor;
|
||||||
|
@ -424,12 +424,12 @@ public class AppModelMethod {
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SSAInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
|
public SSAAbstractInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
|
||||||
if (site == null) {
|
if (site == null) {
|
||||||
throw new IllegalArgumentException("site is null");
|
throw new IllegalArgumentException("site is null");
|
||||||
}
|
}
|
||||||
CallSiteReference newSite = CallSiteReference.make(methodSummary.getNumberOfStatements(), site.getDeclaredTarget(), site.getInvocationCode());
|
CallSiteReference newSite = CallSiteReference.make(methodSummary.getNumberOfStatements(), site.getDeclaredTarget(), site.getInvocationCode());
|
||||||
SSAInvokeInstruction s = null;
|
SSAAbstractInvokeInstruction s = null;
|
||||||
if (newSite.getDeclaredTarget().getReturnType().equals(TypeReference.Void)) {
|
if (newSite.getDeclaredTarget().getReturnType().equals(TypeReference.Void)) {
|
||||||
s = insts.InvokeInstruction(methodSummary.getNumberOfStatements(), params, nextLocal++, newSite, null);
|
s = insts.InvokeInstruction(methodSummary.getNumberOfStatements(), params, nextLocal++, newSite, null);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue