more generalization for reuse

This commit is contained in:
Julian Dolby 2018-02-17 22:08:09 +01:00
parent be6bb3dc9a
commit e1def2ffb5
11 changed files with 37 additions and 16 deletions

View File

@ -28,7 +28,6 @@ import com.ibm.wala.ipa.callgraph.impl.FakeRootMethod;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.shrikeBT.IInvokeInstruction;
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
import com.ibm.wala.ssa.SSAInvokeInstruction;
import com.ibm.wala.ssa.SSANewInstruction;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.types.FieldReference;
@ -147,14 +146,14 @@ public class CrossLanguageCallGraph extends AstCallGraph {
}
@Override
public SSAInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
public SSAAbstractInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
TypeReference type = site.getDeclaredTarget().getDeclaringClass();
Atom language = type.getClassLoader().getLanguage();
AbstractRootMethod root = getLanguageRoot(language);
return root.addInvocation(params, site);
}
public SSAInvokeInstruction addInvocationInternal(int[] params, CallSiteReference site) {
public SSAAbstractInvokeInstruction addInvocationInternal(int[] params, CallSiteReference site) {
return super.addInvocation(params, site);
}

View File

@ -40,6 +40,7 @@ import com.ibm.wala.shrikeCT.BootstrapMethodsReader.BootstrapMethod;
import com.ibm.wala.shrikeCT.ConstantPoolParser.ReferenceToken;
import com.ibm.wala.shrikeCT.InvalidClassFileException;
import com.ibm.wala.ssa.SSAAbstractBinaryInstruction;
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
import com.ibm.wala.ssa.SSAAddressOfInstruction;
import com.ibm.wala.ssa.SSAArrayLengthInstruction;
import com.ibm.wala.ssa.SSAArrayLoadInstruction;
@ -234,7 +235,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons
}
@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) {
return new SSAInvokeDynamicInstruction(iindex, result, params, exception, site, bootstrap) {
@Override

View File

@ -15,11 +15,14 @@ import java.util.Set;
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.Context;
import com.ibm.wala.ipa.callgraph.IAnalysisCacheView;
import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.shrikeCT.InvalidClassFileException;
import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAInstructionFactory;
import com.ibm.wala.ssa.SSALoadMetadataInstruction;
import com.ibm.wala.types.MethodReference;
@ -149,5 +152,6 @@ public interface Language {
boolean methodsHaveDeclaredParameterTypes();
AbstractRootMethod getFakeRootMethod(IClassHierarchy cha, AnalysisOptions options, IAnalysisCacheView cache);
InducedCFG makeInducedCFG(SSAInstruction[] instructions, IMethod method, Context context);
}

View File

@ -12,6 +12,9 @@ package com.ibm.wala.classLoader;
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;
/**
@ -65,4 +68,10 @@ public abstract class LanguageImpl implements Language {
public String toString() {
return getName().toString();
}
@Override
public
InducedCFG makeInducedCFG(SSAInstruction[] instructions, IMethod method, Context context) {
return new InducedCFG(instructions, method, context);
}
}

View File

@ -175,7 +175,7 @@ public class SyntheticMethod implements IMethod {
* NOTE: SIDE EFFECT!!! ... nulls out phi instructions in the instruction array!
*/
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 {

View File

@ -32,6 +32,7 @@ import com.ibm.wala.ipa.summaries.SyntheticIR;
import com.ibm.wala.shrikeBT.IInvokeInstruction;
import com.ibm.wala.ssa.ConstantValue;
import com.ibm.wala.ssa.IR;
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
import com.ibm.wala.ssa.SSAArrayStoreInstruction;
import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAInstructionFactory;
@ -130,12 +131,12 @@ public abstract class AbstractRootMethod extends SyntheticMethod {
* @return the invoke instructions added by this operation
* @throws IllegalArgumentException if site is null
*/
public SSAInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
public SSAAbstractInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
if (site == null) {
throw new IllegalArgumentException("site is null");
}
CallSiteReference newSite = CallSiteReference.make(statements.size(), site.getDeclaredTarget(), site.getInvocationCode());
SSAInvokeInstruction s = null;
SSAAbstractInvokeInstruction s = null;
if (newSite.getDeclaredTarget().getReturnType().equals(TypeReference.Void)) {
s = insts.InvokeInstruction(statements.size(), params, nextLocal++, newSite, null);
} else {

View File

@ -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.cha.IClassHierarchy;
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.types.ClassLoaderReference;
import com.ibm.wala.types.FieldReference;
@ -198,7 +198,7 @@ public abstract class AbstractRTABuilder extends PropagationCallGraphBuilder {
if (targetMethod != null) {
CGNode target = callGraph.getNode(targetMethod, Everywhere.EVERYWHERE);
if (target == null) {
SSAInvokeInstruction s = fakeWorldClinitMethod.addInvocation(null, site);
SSAAbstractInvokeInstruction s = fakeWorldClinitMethod.addInvocation(null, site);
try {
target = callGraph.findOrCreateNode(targetMethod, Everywhere.EVERYWHERE);
processResolvedCall(callGraph.getFakeWorldClinitNode(), s.getCallSite(), target);

View File

@ -459,6 +459,12 @@ public class XMLMethodSummaryReader implements BytecodeConstants {
} else {
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];
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);
Integer valueNumber = symbolTable.get(argString);
if (valueNumber == null) {
Assertions.UNREACHABLE("Cannot lookup value: " + argString);
valueNumber = Integer.parseInt(argString);
}
params[i] = valueNumber.intValue();
}

View File

@ -66,7 +66,7 @@ public interface SSAInstructionFactory {
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);

View File

@ -53,6 +53,7 @@ import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.shrikeBT.IConditionalBranchInstruction;
import com.ibm.wala.shrikeBT.IInvokeInstruction;
import com.ibm.wala.shrikeCT.BootstrapMethodsReader.BootstrapMethod;
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
import com.ibm.wala.ssa.SSAArrayLoadInstruction;
import com.ibm.wala.ssa.SSAArrayStoreInstruction;
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 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) {
info("Now: InvokeInstruction to {} using {}", site, params);
if (iindex < 0) {

View File

@ -72,9 +72,9 @@ import com.ibm.wala.ipa.summaries.MethodSummary;
import com.ibm.wala.shrikeBT.IInvokeInstruction;
import com.ibm.wala.shrikeBT.IInvokeInstruction.IDispatch;
import com.ibm.wala.ssa.ConstantValue;
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
import com.ibm.wala.ssa.SSAArrayStoreInstruction;
import com.ibm.wala.ssa.SSAInstructionFactory;
import com.ibm.wala.ssa.SSAInvokeInstruction;
import com.ibm.wala.ssa.SSANewInstruction;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.types.Descriptor;
@ -424,12 +424,12 @@ public class AppModelMethod {
return a;
}
public SSAInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
public SSAAbstractInvokeInstruction addInvocation(int[] params, CallSiteReference site) {
if (site == null) {
throw new IllegalArgumentException("site is null");
}
CallSiteReference newSite = CallSiteReference.make(methodSummary.getNumberOfStatements(), site.getDeclaredTarget(), site.getInvocationCode());
SSAInvokeInstruction s = null;
SSAAbstractInvokeInstruction s = null;
if (newSite.getDeclaredTarget().getReturnType().equals(TypeReference.Void)) {
s = insts.InvokeInstruction(methodSummary.getNumberOfStatements(), params, nextLocal++, newSite, null);
} else {