[LLVMbugs] Re: [LLVMdev] Tarjan+function_ptrs == trouble ?

Vikram Adve vadve at cs.uiuc.edu
Fri Dec 6 09:14:00 PST 2002


The tarj_end() function had never been tested and one of the methods 
it used was broken.  This has now been fixed:
     http://mail.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20021202/001852.html

Note that there is already a pass that prints out the SCCs of the
CallGraph, and another one that prints SCCs of each CFG.
You can run them as
	analyze -callscc
	analyze -cfgscc
The passes are in llvm/lib/Analysis/PrintSCC.cpp.

--Vikram
http://www.cs.uiuc.edu/~vadve


> From: Chris Lattner <sabre at nondot.org>
> Subject: [LLVMbugs] Re: [LLVMdev] Tarjan+function_ptrs == trouble ?
> Sender: llvmbugs-admin at cs.uiuc.edu
> Date: Fri, 6 Dec 2002 01:00:07 -0600 (CST)
> 
> > if you take the time to print out the function each non-looping node iter
> > traverses, it never reaches main...
> 
> Ok, first note that the CallGraph class does really stupid (but correct)
> things for function pointers, so you're not going to see anything
> remarkably nice here... Make sure to read the CallGraph.h comments to
> understand exactly what is going on.
> 
> Despite that, I can verify that the SCC iterator seems to not be doing the
> right thing.  On the testcase (below), and with the pass below, I get the
> following:
> 
> $ opt -load /localhome/lattner/llvm/lib/Debug/libtest.so -test < test.o > /dev/null
> New SCC
>   Node: __main
> New SCC
>   Node: func_one
> New SCC
>   Node: func_two
> New SCC
>   Node: func_three
> 
> Which doesn't visit main.  Vikram, could you look into this if you get a
> chance?
> 
> -Chris
> 
> ------------------- Pass code ----------------------------
> 
> #include "llvm/Analysis/CallGraph.h"
> #include "llvm/Function.h"
> #include "llvm/Pass.h"
> #include "Support/TarjanSCCIterator.h"
> 
> struct Test : public Pass {
>   virtual bool run(Module &F) {
>     typedef TarjanSCC_iterator<CallGraph*> MyTarjan;
>     CallGraph& callGraph = getAnalysis<CallGraph>();
>     for (MyTarjan I = tarj_begin(&callGraph), E = tarj_end(&callGraph); I != E; ++I) {
>       SCC<CallGraph*> *S = *I;
>       assert(S);
>       std::cerr << "New SCC\n";
>       for (unsigned i = 0, e = S->size(); i != e; ++i)
>         if (Function *F = (*S)[i]->getFunction())
>           std::cerr << "  Node: " << F->getName() << "\n";
>         else
>           std::cerr << "  Indirect node\n";
>     }
>     return false;
>   }
>   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
>     AU.setPreservesAll();
>     AU.addRequired<CallGraph>();
>   };
> };
> RegisterOpt<Test> Z("test", "test");
> 
> 
> -------------------- Testcase ------------------------
> 
> #include <stdlib.h>
> #include <stdio.h>
> 
> //#define WORKS
> 
> int * a_global;
> 
> int a_predicate = 1;
> int another_pred =0;
> 
> int func_one()
> {
>     return 1;
> }
> 
> int func_two()
> {
>     return 2;
> }
> 
> int func_three()
> {
>     return 3;
> }
> 
> int main()
> {
>     int (*func_ptr)();
> 
>     if(a_predicate)
>         func_ptr = func_one;
>     else if(another_pred)
>         func_ptr = func_two;
>     else
>         func_ptr = func_three;
> 
> #ifdef WORKS
>     return func_one();
> #else
>     return func_ptr();
> #endif
> }
> 
> 
> _______________________________________________
> LLVMbugs mailing list
> LLVMbugs at cs.uiuc.edu
> http://mail.cs.uiuc.edu/mailman/listinfo/llvmbugs
> 





More information about the llvm-dev mailing list