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.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);
} }

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.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

View File

@ -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);
} }

View File

@ -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);
}
} }

View File

@ -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 {

View File

@ -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 {

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.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);

View File

@ -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();
} }

View File

@ -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);

View File

@ -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) {

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;
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 {