Add globals graphs to all three passes

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4663 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2002-11-09 21:12:07 +00:00
parent dc26d45c71
commit aa0b468f6d
6 changed files with 76 additions and 40 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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.

View File

@ -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;
}

View File

@ -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;
}

View File

@ -16,6 +16,26 @@
static RegisterAnalysis<TDDataStructures>
Y("tddatastructure", "Top-down Data Structure Analysis Closure");
// 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())
calculateGraph(*F);
// Next calculate the graphs for each function unreachable function...
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...
//
@ -27,23 +47,8 @@ void TDDataStructures::releaseMemory() {
// 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>();
// Calculate top-down from main...
if (Function *F = M.getMainFunction())
calculateGraph(*F);
// Next calculate the graphs for each function unreachable function...
for (Module::reverse_iterator I = M.rbegin(), E = M.rend(); I != E; ++I)
if (!I->isExternal())
calculateGraph(*I);
return false;
delete GlobalsGraph;
GlobalsGraph = 0;
}
/// ResolveCallSite - This method is used to link the actual arguments together
@ -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;
}