- Cleaned up the interface to AnalysisUsage to take analysis class names

instead of ::ID's.
 - Pass::getAnalysis<> now no longer takes an optional argument


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3263 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2002-08-08 19:01:11 +00:00
parent c6b227ecc4
commit 5791bb70b1
2 changed files with 27 additions and 11 deletions

View File

@ -114,9 +114,15 @@ protected:
// getAnalysisUsage function. // getAnalysisUsage function.
// //
template<typename AnalysisType> template<typename AnalysisType>
AnalysisType &getAnalysis(AnalysisID AID = AnalysisType::ID) { AnalysisType &getAnalysis() {
assert(Resolver && "Pass not resident in a PassManager object!"); assert(Resolver && "Pass not resident in a PassManager object!");
return *(AnalysisType*)Resolver->getAnalysis(AID); return *(AnalysisType*)Resolver->getAnalysis(AnalysisType::ID);
}
template<typename AnalysisType>
AnalysisType &getAnalysisID(const PassInfo *PI) {
assert(Resolver && "Pass not resident in a PassManager object!");
return *(AnalysisType*)Resolver->getAnalysis(PI);
} }
// getAnalysisToUpdate<AnalysisType>() - This function is used by subclasses // getAnalysisToUpdate<AnalysisType>() - This function is used by subclasses
@ -126,9 +132,9 @@ protected:
// provide the capability to update an analysis that exists. // provide the capability to update an analysis that exists.
// //
template<typename AnalysisType> template<typename AnalysisType>
AnalysisType *getAnalysisToUpdate(AnalysisID AID = AnalysisType::ID) { AnalysisType *getAnalysisToUpdate() {
assert(Resolver && "Pass not resident in a PassManager object!"); assert(Resolver && "Pass not resident in a PassManager object!");
return (AnalysisType*)Resolver->getAnalysisToUpdate(AID); return (AnalysisType*)Resolver->getAnalysisToUpdate(AnalysisType::ID);
} }

View File

@ -30,28 +30,38 @@ class AnalysisUsage {
public: public:
AnalysisUsage() : PreservesAll(false) {} AnalysisUsage() : PreservesAll(false) {}
// addRequires - Add the specified ID to the required set of the usage info // addRequired - Add the specified ID to the required set of the usage info
// for a pass. // for a pass.
// //
AnalysisUsage &addRequired(AnalysisID ID) { AnalysisUsage &addRequiredID(AnalysisID ID) {
Required.push_back(ID); Required.push_back(ID);
return *this; return *this;
} }
template<class PassClass>
AnalysisUsage &addRequired() {
Required.push_back(PassClass::ID);
return *this;
}
// addPreserves - Add the specified ID to the set of analyses preserved by // addPreserved - Add the specified ID to the set of analyses preserved by
// this pass // this pass
// //
AnalysisUsage &addPreserved(AnalysisID ID) { AnalysisUsage &addPreservedID(AnalysisID ID) {
Preserved.push_back(ID); Preserved.push_back(ID);
return *this; return *this;
} }
// PreservesAll - Set by analyses that do not transform their input at all template<class PassClass>
AnalysisUsage &addPreserved() {
Preserved.push_back(PassClass::ID);
return *this;
}
// setPreservesAll - Set by analyses that do not transform their input at all
void setPreservesAll() { PreservesAll = true; } void setPreservesAll() { PreservesAll = true; }
bool preservesAll() const { return PreservesAll; } bool preservesAll() const { return PreservesAll; }
// preservesCFG - This function should be called to by the pass, iff they do // preservesCFG - This function should be called by the pass, iff they do not:
// not:
// //
// 1. Add or remove basic blocks from the function // 1. Add or remove basic blocks from the function
// 2. Modify terminator instructions in any way. // 2. Modify terminator instructions in any way.