| #ifndef BOTTOMUP_CALLGRAPH_H |
| #define BOTTOMUP_CALLGRAPH_H |
| |
| #include "dsa/DataStructure.h" |
| #include "dsa/DSSupport.h" |
| #include "llvm/ADT/hash_map.h" |
| #include "llvm/Pass.h" |
| #include "llvm/Function.h" |
| #include "llvm/Module.h" |
| |
| #include <set> |
| |
| namespace llvm { |
| struct BottomUpCallGraph : public ModulePass { |
| private: |
| // OneCalledFunction - For each indirect function call, we keep track of one |
| // the DSNode and the corresponding Call Instruction |
| typedef hash_multimap<DSNode*, CallSite> CalleeNodeCallSiteMapTy; |
| CalleeNodeCallSiteMapTy CalleeNodeCallSiteMap ; |
| std::vector<Function *> Stack; |
| std::set<Function *> Visited; |
| void figureOutSCCs(Module &M); |
| void visit(Function *f); |
| |
| public: |
| |
| static char ID; |
| BottomUpCallGraph () : ModulePass ((intptr_t) &ID) {} |
| const char *getPassName() const { return "Bottom-Up Call Graph"; } |
| |
| //This keeps the map of a function and its call sites in all the callers |
| //including the indirectly called sites |
| std::map<const Function *, std::vector<CallSite> > FuncCallSiteMap; |
| std::set<Function *> SccList; //Fns involved in Sccs |
| |
| bool isInSCC(Function *f) { |
| return (SccList.find(f) != SccList.end()); |
| } |
| |
| virtual void getAnalysisUsage(AnalysisUsage &AU) const { |
| AU.addRequired<CompleteBUDataStructures>(); |
| AU.setPreservesAll(); |
| } |
| virtual bool runOnModule(Module&M); |
| }; |
| } |
| #endif |