diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java index baa23bb17..c942a2965 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java @@ -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); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java index 7baeaf98b..73a075a94 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java @@ -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 diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java index 59afe82f9..88c9a4fd9 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java @@ -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); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java index d6d05a31b..71a9b507f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java @@ -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); + } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java index 700e4d884..4d0915340 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java @@ -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 { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java index 0655121d4..72c3ad540 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java @@ -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 { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/AbstractRTABuilder.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/AbstractRTABuilder.java index 6742912d5..141a8a829 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/AbstractRTABuilder.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/AbstractRTABuilder.java @@ -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); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/XMLMethodSummaryReader.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/XMLMethodSummaryReader.java index 15c600bff..81b03d640 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/XMLMethodSummaryReader.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/XMLMethodSummaryReader.java @@ -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(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstructionFactory.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstructionFactory.java index fd90715a1..0eb01894e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstructionFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstructionFactory.java @@ -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); diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/ssa/TypeSafeInstructionFactory.java b/com.ibm.wala.core/src/com/ibm/wala/util/ssa/TypeSafeInstructionFactory.java index c7429f1ba..f4e3de829 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/ssa/TypeSafeInstructionFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/ssa/TypeSafeInstructionFactory.java @@ -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 params, + public SSAAbstractInvokeInstruction InvokeInstruction(final int iindex, final SSAValue result, List params, final SSAValue exception, final CallSiteReference site) { info("Now: InvokeInstruction to {} using {}", site, params); if (iindex < 0) { diff --git a/com.ibm.wala.scandroid/source/org/scandroid/model/AppModelMethod.java b/com.ibm.wala.scandroid/source/org/scandroid/model/AppModelMethod.java index 14ef3a81c..06ebd767d 100644 --- a/com.ibm.wala.scandroid/source/org/scandroid/model/AppModelMethod.java +++ b/com.ibm.wala.scandroid/source/org/scandroid/model/AppModelMethod.java @@ -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 {