[LLVMdev] FunctionPass requiring SCCs

Domagoj Babic babic.domagoj at gmail.com
Fri Sep 29 12:05:07 PDT 2006


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



More information about the llvm-dev mailing list