Add an initial version of the CompleteBUDataStructures pass

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9955 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2003-11-13 01:42:38 +00:00
parent c6b1584de6
commit 7d26815d8d
2 changed files with 68 additions and 0 deletions

View File

@ -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<Function*, DSGraph*> 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<Function*>(&F)) != DSInfo.end();
}
// getDSGraph - Return the data structure graph for the specified function.
DSGraph &getDSGraph(const Function &F) const {
hash_map<Function*, DSGraph*>::const_iterator I =
DSInfo.find(const_cast<Function*>(&F));
assert(I != DSInfo.end() && "Function not in module!");
return *I->second;
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
AU.addRequired<BUDataStructures>();
// FIXME: TEMPORARY (remove once finalization of indirect call sites in the
// globals graph has been implemented in the BU pass)
AU.addRequired<TDDataStructures>();
}
};
} // End llvm namespace
#endif

View File

@ -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<Function*, DSGraph*> 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<Function*>(&F)) != DSInfo.end();
}
// getDSGraph - Return the data structure graph for the specified function.
DSGraph &getDSGraph(const Function &F) const {
hash_map<Function*, DSGraph*>::const_iterator I =
DSInfo.find(const_cast<Function*>(&F));
assert(I != DSInfo.end() && "Function not in module!");
return *I->second;
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
AU.addRequired<BUDataStructures>();
// FIXME: TEMPORARY (remove once finalization of indirect call sites in the
// globals graph has been implemented in the BU pass)
AU.addRequired<TDDataStructures>();
}
};
} // End llvm namespace
#endif