|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||
java.lang.Objectcom.ibm.wala.dataflow.IFDS.TabulationSolver<T,P,F>
T - type of node in the supergraphP - type of a procedure (like a box in an RSM)F - type of factoids propagated when solving this problempublic class TabulationSolver<T,P,F>
A precise interprocedural tabulation solver.
See Reps, Horwitz, Sagiv POPL 95.
This version differs in some ways from the POPL algorithm. In particular ...
| Nested Class Summary | |
|---|---|
class |
TabulationSolver.Result
|
protected class |
TabulationSolver.Worklist
|
| Field Summary | |
|---|---|
protected static int |
DEBUG_LEVEL
DEBUG_LEVEL: 0 No output 1 Print some simple stats and warning information 2 Detailed debugging 3 Also print worklists |
protected IFlowFunctionMap<T> |
flowFunctionMap
A map from an edge in a supergraph to a flow function |
protected static boolean |
PERIODIC_WIPE_SOFT_CACHES
Should we periodically clear out soft reference caches in an attempt to help the GC? |
protected MonitorUtil.IProgressMonitor |
progressMonitor
A progress monitor. |
protected java.util.Map<P,LocalSummaryEdges> |
summaryEdges
A map from Object (procedure) -> LocalSummaryEdges. |
protected ISupergraph<T,P> |
supergraph
The supergraph which induces this dataflow problem |
protected static boolean |
verbose
|
| Constructor Summary | |
|---|---|
protected |
TabulationSolver(TabulationProblem<T,P,F> p,
MonitorUtil.IProgressMonitor monitor)
|
| Method Summary | ||
|---|---|---|
void |
addSeed(PathEdge<T> seed)
Restart tabulation from a particular path edge. |
|
protected void |
addToWorkList(T s_p,
int i,
T n,
int j)
|
|
protected IntSet |
computeBinaryFlow(int call_d,
int exit_d,
IBinaryReturnFlowFunction f)
|
|
protected IntSet |
computeFlow(int d1,
IUnaryFlowFunction f)
|
|
protected IntSet |
computeInverseFlow(int d2,
IReversibleFlowFunction f)
|
|
protected CallFlowEdges |
findOrCreateCallFlowEdges(T s_p)
|
|
protected LocalPathEdges |
findOrCreateLocalPathEdges(T s_p)
|
|
protected LocalSummaryEdges |
findOrCreateLocalSummaryEdges(P proc)
|
|
protected PathEdge<T> |
getCurPathEdge()
|
|
protected PathEdge<T> |
getCurSummaryEdge()
|
|
protected IntSet |
getInversePathEdges(T s_p,
T n,
int d2)
|
|
LocalPathEdges |
getLocalPathEdges(T s_p)
|
|
TabulationProblem<T,P,F> |
getProblem()
|
|
MonitorUtil.IProgressMonitor |
getProgressMonitor()
|
|
IntSet |
getResult(T node)
get the bitvector of facts that hold at the entry to a given node |
|
java.util.Collection<PathEdge<T>> |
getSeeds()
|
|
IntSet |
getSummarySources(T n2,
int d2,
T n1)
|
|
ISupergraph<T,P> |
getSupergraph()
|
|
protected void |
initialize()
Start tabulation with the initial seeds. |
|
static
|
make(TabulationProblem<T,P,F> p)
|
|
protected ITabulationWorklist<T> |
makeWorklist()
Subclasses can override this to plug in a different worklist implementation. |
|
protected void |
performVerboseAction()
|
|
protected PathEdge<T> |
popFromWorkList()
|
|
protected void |
processCall(PathEdge<T> edge)
Handle lines [14 - 19] of the algorithm, propagating information into and across a call site. |
|
protected void |
processExit(PathEdge<T> edge)
Handle lines [21 - 32] of the algorithm, propagating information from an exit node. |
|
protected void |
processParticularCallee(PathEdge<T> edge,
int callNodeNum,
java.util.Collection<T> allReturnSites,
T calleeEntry)
handle a particular callee for some call node. |
|
protected boolean |
propagate(T s_p,
int i,
T n,
int j)
Propagate the fact |
|
protected void |
recordCall(T callNode,
T callee,
int d1,
boolean gotReuse)
invoked when a callee is processed with a particular entry fact |
|
TabulationResult<T,P,F> |
solve()
Solve the dataflow problem. |
|
protected void |
tendToSoftCaches()
For some reason (either a bug in our code that defeats soft references, or a bad policy in the GC), leaving soft reference caches to clear themselves out doesn't work. |
|
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
protected static final int DEBUG_LEVEL
protected static final boolean verbose
protected static final boolean PERIODIC_WIPE_SOFT_CACHES
protected final ISupergraph<T,P> supergraph
protected final IFlowFunctionMap<T> flowFunctionMap
protected final java.util.Map<P,LocalSummaryEdges> summaryEdges
protected final MonitorUtil.IProgressMonitor progressMonitor
| Constructor Detail |
|---|
protected TabulationSolver(TabulationProblem<T,P,F> p,
MonitorUtil.IProgressMonitor monitor)
p - a description of the dataflow problem to solve
java.lang.IllegalArgumentException - if p is null| Method Detail |
|---|
protected ITabulationWorklist<T> makeWorklist()
public static <T,P,F> TabulationSolver<T,P,F> make(TabulationProblem<T,P,F> p)
p - a description of the dataflow problem to solve
java.lang.IllegalArgumentException - if p is null
public TabulationResult<T,P,F> solve()
throws CancelException
CancelExceptionprotected void initialize()
public void addSeed(PathEdge<T> seed)
protected void tendToSoftCaches()
protected final void performVerboseAction()
protected void processExit(PathEdge<T> edge)
protected IntSet getInversePathEdges(T s_p,
T n,
int d2)
s_p - n - d2 - note that s_p must be an entry for procof(n)
protected void processCall(PathEdge<T> edge)
protected void processParticularCallee(PathEdge<T> edge,
int callNodeNum,
java.util.Collection<T> allReturnSites,
T calleeEntry)
edge - the path edge being processedcallNodeNum - the number of the call node in the supergraphallReturnSites - a set collecting return sites for the call. This set is mutated with the return sites for this callee.calleeEntry - the entry node of the callee in question
protected void recordCall(T callNode,
T callee,
int d1,
boolean gotReuse)
callNode - callee - d1 - the entry factgotReuse - whether existing summary edges were applied
protected IntSet computeBinaryFlow(int call_d,
int exit_d,
IBinaryReturnFlowFunction f)
protected IntSet computeFlow(int d1,
IUnaryFlowFunction f)
protected IntSet computeInverseFlow(int d2,
IReversibleFlowFunction f)
protected PathEdge<T> popFromWorkList()
protected boolean propagate(T s_p,
int i,
T n,
int j)
true iff the path edge was not previously
observed.
s_p - entry blocki - dataflow fact on entryn - reached blockj - dataflow fact reachedpublic LocalPathEdges getLocalPathEdges(T s_p)
protected void addToWorkList(T s_p,
int i,
T n,
int j)
protected LocalPathEdges findOrCreateLocalPathEdges(T s_p)
protected LocalSummaryEdges findOrCreateLocalSummaryEdges(P proc)
protected CallFlowEdges findOrCreateCallFlowEdges(T s_p)
public IntSet getResult(T node)
public ISupergraph<T,P> getSupergraph()
public IntSet getSummarySources(T n2,
int d2,
T n1)
throws java.lang.UnsupportedOperationException
java.lang.UnsupportedOperationException - unconditionallypublic TabulationProblem<T,P,F> getProblem()
public java.util.Collection<PathEdge<T>> getSeeds()
public MonitorUtil.IProgressMonitor getProgressMonitor()
protected PathEdge<T> getCurPathEdge()
protected PathEdge<T> getCurSummaryEdge()
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||