[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Reverse control flow graph for control dependence



Hi Navindra,

Thanks alot for your help. Very much appreciated. When iterating through each block to reverse the predecessors for the successors, you have Block.setPreds and Block.setSuccs. These are not public methods despite the fact that they are in the API. Is this on purpose? I could download the Soot source code and change this, but that would be the messiest option. Do you have any other suggestions?

Thanks,

Neil

Navindra Umanee wrote:

Neil Walkinshaw <Neil.Walkinshaw@cis.strath.ac.uk> wrote:


I'm trying to use Soot to compute intra-procedural control dependencies using Cytron's algorithm. According to this, I need to compute the dominator tree on a reverse control flow graph. I have found the soot.shimple.internal.analysis.DominatorTree class which accepts a


You should be able to get DominatorTree to work without too much hassle, but please note that it's marked "internal and messy" because the implementation and interface really isn't all that pretty and might make certain undocumented assumptions. One thing that's immediately obvious is that some of the exposed public interfaces are really meant for internal use only.

You can therefore expect the code to change significantly in the
future.  I will be cleaning up the code and moving it out of
shimple/internal into jimple/toolkits for public use especially since
I've been getting several enquiries about it.



BlockGraph, but since the BlockGraph is not mutable, it seems impossible to construct a MutableDirectedGraph which reverses the Blockgraph in question. Are there any convenience methods in soot which I have overlooked? Do you have any suggestions that might help?



I think it should be fairly easy to hack this at a lower level:


Basically iterate through all the Blocks and reverse the predecessors
with the successors for each block. Look at the API documentation for
Block for how to do this.


Okay, then you have to reverse the heads with the tails... you can
easily do this by modifying the (backed) lists you get from getHeads
and getTails.  Not at all ideal, I agree, but it should work.  :-)

Another gotcha: You will probably have to run
OneHeadBlockGraph.convert on the resulting graph before passing it to
DominatorTree.

Cheers,
Navin.