diff --git a/include/llvm/Analysis/DataStructure.h b/include/llvm/Analysis/DataStructure.h index 4d6e3a04760..3e57af21318 100644 --- a/include/llvm/Analysis/DataStructure.h +++ b/include/llvm/Analysis/DataStructure.h @@ -82,6 +82,7 @@ public: // only performs a "Bottom Up" propagation (hence the name). // class BUDataStructures : public Pass { +protected: // DSInfo, one graph for each function hash_map DSInfo; DSGraph *GlobalsGraph; @@ -186,6 +187,39 @@ private: const BUDataStructures::ActualCalleesTy &ActualCallees); }; + +// CompleteBUDataStructures - This is the exact same as the bottom-up graphs, +// but we use take a completed call graph and inline all indirect callees into +// their callers graphs, making the result more useful for things like pool +// allocation. +// +struct CompleteBUDataStructures : public BUDataStructures { + virtual bool run(Module &M); + + bool hasGraph(const Function &F) const { + return DSInfo.find(const_cast(&F)) != DSInfo.end(); + } + + // getDSGraph - Return the data structure graph for the specified function. + DSGraph &getDSGraph(const Function &F) const { + hash_map::const_iterator I = + DSInfo.find(const_cast(&F)); + assert(I != DSInfo.end() && "Function not in module!"); + return *I->second; + } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired(); + + // FIXME: TEMPORARY (remove once finalization of indirect call sites in the + // globals graph has been implemented in the BU pass) + AU.addRequired(); + } +}; + + + } // End llvm namespace #endif diff --git a/include/llvm/Analysis/DataStructure/DataStructure.h b/include/llvm/Analysis/DataStructure/DataStructure.h index 4d6e3a04760..3e57af21318 100644 --- a/include/llvm/Analysis/DataStructure/DataStructure.h +++ b/include/llvm/Analysis/DataStructure/DataStructure.h @@ -82,6 +82,7 @@ public: // only performs a "Bottom Up" propagation (hence the name). // class BUDataStructures : public Pass { +protected: // DSInfo, one graph for each function hash_map DSInfo; DSGraph *GlobalsGraph; @@ -186,6 +187,39 @@ private: const BUDataStructures::ActualCalleesTy &ActualCallees); }; + +// CompleteBUDataStructures - This is the exact same as the bottom-up graphs, +// but we use take a completed call graph and inline all indirect callees into +// their callers graphs, making the result more useful for things like pool +// allocation. +// +struct CompleteBUDataStructures : public BUDataStructures { + virtual bool run(Module &M); + + bool hasGraph(const Function &F) const { + return DSInfo.find(const_cast(&F)) != DSInfo.end(); + } + + // getDSGraph - Return the data structure graph for the specified function. + DSGraph &getDSGraph(const Function &F) const { + hash_map::const_iterator I = + DSInfo.find(const_cast(&F)); + assert(I != DSInfo.end() && "Function not in module!"); + return *I->second; + } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired(); + + // FIXME: TEMPORARY (remove once finalization of indirect call sites in the + // globals graph has been implemented in the BU pass) + AU.addRequired(); + } +}; + + + } // End llvm namespace #endif