diff options
-rw-r--r-- | include/llvm/Analysis/DataStructure.h | 10 | ||||
-rw-r--r-- | include/llvm/Analysis/DataStructure/DataStructure.h | 10 | ||||
-rw-r--r-- | lib/Analysis/DataStructure/BottomUpClosure.cpp | 26 | ||||
-rw-r--r-- | lib/Analysis/DataStructure/Local.cpp | 20 | ||||
-rw-r--r-- | lib/Analysis/DataStructure/Printer.cpp | 10 | ||||
-rw-r--r-- | lib/Analysis/DataStructure/TopDownClosure.cpp | 32 |
6 files changed, 72 insertions, 36 deletions
diff --git a/include/llvm/Analysis/DataStructure.h b/include/llvm/Analysis/DataStructure.h index 71bf512..ea1c2ae 100644 --- a/include/llvm/Analysis/DataStructure.h +++ b/include/llvm/Analysis/DataStructure.h @@ -46,6 +46,8 @@ public: return *I->second; } + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; @@ -66,6 +68,7 @@ public: class BUDataStructures : public Pass { // DSInfo, one graph for each function std::map<const Function*, DSGraph*> DSInfo; + DSGraph *GlobalsGraph; public: ~BUDataStructures() { releaseMemory(); } @@ -78,7 +81,9 @@ public: return *I->second; } - // print - Print out the analysis results... + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; // If the pass pipeline is done with this pass, we can release our memory... @@ -101,6 +106,7 @@ class TDDataStructures : public Pass { // DSInfo, one graph for each function std::map<const Function*, DSGraph*> DSInfo; std::set<const Function*> GraphDone; + DSGraph *GlobalsGraph; public: ~TDDataStructures() { releaseMemory(); } @@ -113,6 +119,8 @@ public: return *I->second; } + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; diff --git a/include/llvm/Analysis/DataStructure/DataStructure.h b/include/llvm/Analysis/DataStructure/DataStructure.h index 71bf512..ea1c2ae 100644 --- a/include/llvm/Analysis/DataStructure/DataStructure.h +++ b/include/llvm/Analysis/DataStructure/DataStructure.h @@ -46,6 +46,8 @@ public: return *I->second; } + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; @@ -66,6 +68,7 @@ public: class BUDataStructures : public Pass { // DSInfo, one graph for each function std::map<const Function*, DSGraph*> DSInfo; + DSGraph *GlobalsGraph; public: ~BUDataStructures() { releaseMemory(); } @@ -78,7 +81,9 @@ public: return *I->second; } - // print - Print out the analysis results... + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; // If the pass pipeline is done with this pass, we can release our memory... @@ -101,6 +106,7 @@ class TDDataStructures : public Pass { // DSInfo, one graph for each function std::map<const Function*, DSGraph*> DSInfo; std::set<const Function*> GraphDone; + DSGraph *GlobalsGraph; public: ~TDDataStructures() { releaseMemory(); } @@ -113,6 +119,8 @@ public: return *I->second; } + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; diff --git a/lib/Analysis/DataStructure/BottomUpClosure.cpp b/lib/Analysis/DataStructure/BottomUpClosure.cpp index d57b618..ade6ca6 100644 --- a/lib/Analysis/DataStructure/BottomUpClosure.cpp +++ b/lib/Analysis/DataStructure/BottomUpClosure.cpp @@ -18,6 +18,18 @@ X("budatastructure", "Bottom-up Data Structure Analysis Closure"); using namespace DS; +// run - Calculate the bottom up data structure graphs for each function in the +// program. +// +bool BUDataStructures::run(Module &M) { + GlobalsGraph = new DSGraph(); + + // Simply calculate the graphs for each function... + for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) + if (!I->isExternal()) + calculateGraph(*I); + return false; +} // releaseMemory - If the pass pipeline is done with this pass, we can release // our memory... here... @@ -30,17 +42,8 @@ void BUDataStructures::releaseMemory() { // Empty map so next time memory is released, data structures are not // re-deleted. DSInfo.clear(); -} - -// run - Calculate the bottom up data structure graphs for each function in the -// program. -// -bool BUDataStructures::run(Module &M) { - // Simply calculate the graphs for each function... - for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) - if (!I->isExternal()) - calculateGraph(*I); - return false; + delete GlobalsGraph; + GlobalsGraph = 0; } DSGraph &BUDataStructures::calculateGraph(Function &F) { @@ -52,6 +55,7 @@ DSGraph &BUDataStructures::calculateGraph(Function &F) { // Copy the local version into DSInfo... Graph = new DSGraph(getAnalysis<LocalDataStructures>().getDSGraph(F)); + Graph->setGlobalsGraph(GlobalsGraph); #if 0 // Populate the GlobalsGraph with globals from this one. diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp index e159a60..3118106 100644 --- a/lib/Analysis/DataStructure/Local.cpp +++ b/lib/Analysis/DataStructure/Local.cpp @@ -409,6 +409,16 @@ void GraphBuilder::visitCastInst(CastInst &CI) { // LocalDataStructures Implementation //===----------------------------------------------------------------------===// +bool LocalDataStructures::run(Module &M) { + GlobalsGraph = new DSGraph(); + + // Calculate all of the graphs... + for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) + if (!I->isExternal()) + DSInfo.insert(std::make_pair(I, new DSGraph(*I, GlobalsGraph))); + return false; +} + // releaseMemory - If the pass pipeline is done with this pass, we can release // our memory... here... // @@ -423,13 +433,3 @@ void LocalDataStructures::releaseMemory() { delete GlobalsGraph; GlobalsGraph = 0; } - -bool LocalDataStructures::run(Module &M) { - GlobalsGraph = new DSGraph(); - - // Calculate all of the graphs... - for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) - if (!I->isExternal()) - DSInfo.insert(std::make_pair(I, new DSGraph(*I, GlobalsGraph))); - return false; -} diff --git a/lib/Analysis/DataStructure/Printer.cpp b/lib/Analysis/DataStructure/Printer.cpp index 962a093..bbd9c2d 100644 --- a/lib/Analysis/DataStructure/Printer.cpp +++ b/lib/Analysis/DataStructure/Printer.cpp @@ -181,6 +181,16 @@ static void printCollection(const Collection &C, std::ostream &O, } } + DSGraph &GG = C.getGlobalsGraph(); + TotalNumNodes += GG.getGraphSize(); + TotalCallNodes += GG.getFunctionCalls().size(); + if (OnlyPrintMain) { + GG.writeGraphToFile(O, Prefix+"GlobalsGraph"); + } else { + O << "Skipped Writing '" << Prefix << "GlobalsGraph.dot'... [" + << GG.getGraphSize() << "+" << GG.getFunctionCalls().size() << "]\n"; + } + O << "\nGraphs contain [" << TotalNumNodes << "+" << TotalCallNodes << "] nodes total" << std::endl; } diff --git a/lib/Analysis/DataStructure/TopDownClosure.cpp b/lib/Analysis/DataStructure/TopDownClosure.cpp index b4b43f7..1da43e5 100644 --- a/lib/Analysis/DataStructure/TopDownClosure.cpp +++ b/lib/Analysis/DataStructure/TopDownClosure.cpp @@ -16,24 +16,12 @@ static RegisterAnalysis<TDDataStructures> Y("tddatastructure", "Top-down Data Structure Analysis Closure"); -// releaseMemory - If the pass pipeline is done with this pass, we can release -// our memory... here... -// -void TDDataStructures::releaseMemory() { - for (std::map<const Function*, DSGraph*>::iterator I = DSInfo.begin(), - E = DSInfo.end(); I != E; ++I) - delete I->second; - - // Empty map so next time memory is released, data structures are not - // re-deleted. - DSInfo.clear(); -} - // run - Calculate the top down data structure graphs for each function in the // program. // bool TDDataStructures::run(Module &M) { BUDataStructures &BU = getAnalysis<BUDataStructures>(); + GlobalsGraph = new DSGraph(); // Calculate top-down from main... if (Function *F = M.getMainFunction()) @@ -43,9 +31,26 @@ bool TDDataStructures::run(Module &M) { for (Module::reverse_iterator I = M.rbegin(), E = M.rend(); I != E; ++I) if (!I->isExternal()) calculateGraph(*I); + + GraphDone.clear(); // Free temporary memory... return false; } +// releaseMemory - If the pass pipeline is done with this pass, we can release +// our memory... here... +// +void TDDataStructures::releaseMemory() { + for (std::map<const Function*, DSGraph*>::iterator I = DSInfo.begin(), + E = DSInfo.end(); I != E; ++I) + delete I->second; + + // Empty map so next time memory is released, data structures are not + // re-deleted. + DSInfo.clear(); + delete GlobalsGraph; + GlobalsGraph = 0; +} + /// ResolveCallSite - This method is used to link the actual arguments together /// with the formal arguments for a function call in the top-down closure. This /// method assumes that the call site arguments have been mapped into nodes @@ -77,6 +82,7 @@ DSGraph &TDDataStructures::getOrCreateDSGraph(Function &F) { if (G == 0) { // Not created yet? Clone BU graph... G = new DSGraph(getAnalysis<BUDataStructures>().getDSGraph(F)); G->getAuxFunctionCalls().clear(); + G->setGlobalsGraph(GlobalsGraph); } return *G; } |