Hi Ryan,
On 9/29/06, Ryan M. Lefever <lefever at crhc.uiuc.edu>
wrote:> I have a FunctionPass F that needs a list of all the SCCs for use in its
> doFinalization() method. Let's say I write a CallGraphSCCPass C that
> creates an array of all SCCs. Let C be required by F, and let F call
> getAnalysis<C>() from its doFinalization() method. Am I guaranteed
that
> C's runOnSCC() method will have executed on all SCCs before F's
> doFinalization() method? In other words, when F calls
getAnalysis<C>()
> from its doFinalization() method, am I guaranteed that C will have been
> able to build the array of SCCs? If not, how else might I structure
things?
That should work. I've written such code, something like:
bool doFinalization(Module &M) {
CallGraph &CG = getAnalysis<CallGraph>();
for (scc_iterator<CallGraph*> SCCI = scc_begin(&CG),
SCCE = scc_end(&CG); SCCI != SCCE; ++SCCI) {
unsigned size = (*SCCI).size();
for (unsigned i = 0; i < size; ++i) {
Function *F = (*SCCI)[i]->getFunction();
......
}
}
....
}
Check out scc_* iterators. Also note that the call graph
is not aware of the indirect calls, so you will need to write your
own CG implementation if you need to handle function pointers
soundly.
Domagoj Babic