const char *PassName; // Nice name for Pass
const char *PassArgument; // Command Line argument to run this pass
const std::type_info &TypeInfo; // type_info object for this Pass class
+ bool IsCFGOnlyPass; // Pass only looks at the CFG.
bool IsAnalysisGroup; // True if an analysis group.
std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass
/// through RegisterPass.
PassInfo(const char *name, const char *arg, const std::type_info &ti,
Pass *(*normal)() = 0)
- : PassName(name), PassArgument(arg), TypeInfo(ti), IsAnalysisGroup(false),
- NormalCtor(normal) {
+ : PassName(name), PassArgument(arg), TypeInfo(ti),
+ IsCFGOnlyPass(false), IsAnalysisGroup(false), NormalCtor(normal) {
}
/// getPassName - Return the friendly name for the pass, never returns null
bool isAnalysisGroup() const { return IsAnalysisGroup; }
void SetIsAnalysisGroup() { IsAnalysisGroup = true; }
+ /// isCFGOnlyPass - return true if this pass only looks at the CFG for the
+ /// function.
+ bool isCFGOnlyPass() const { return IsCFGOnlyPass; }
+ void SetIsCFGOnlyPass() { IsCFGOnlyPass = true; }
+
/// getNormalCtor - Return a pointer to a function, that when called, creates
/// an instance of the pass and returns it. This pointer may be null if there
/// is no default constructor for the pass.
/// setOnlyUsesCFG - Notice that this pass only depends on the CFG, so
/// transformations that do not modify the CFG do not invalidate this pass.
///
- void setOnlyUsesCFG();
+ void setOnlyUsesCFG() {
+ PIObj.SetIsCFGOnlyPass();
+ }
};
template<typename PassName>
#include <set>
using namespace llvm;
-//===----------------------------------------------------------------------===//
-// AnalysisID Class Implementation
-//
-
-// getCFGOnlyAnalyses - A wrapper around the CFGOnlyAnalyses which make it
-// initializer order independent.
-static std::vector<const PassInfo*> &getCFGOnlyAnalyses() {
- static std::vector<const PassInfo*> CFGOnlyAnalyses;
- return CFGOnlyAnalyses;
-}
-
-void RegisterPassBase::setOnlyUsesCFG() {
- getCFGOnlyAnalyses().push_back(&PIObj);
-}
-
//===----------------------------------------------------------------------===//
// AnalysisResolver Class Implementation
//
P->Resolver = AR;
}
-//===----------------------------------------------------------------------===//
-// AnalysisUsage Class Implementation
-//
-
-// setPreservesCFG - This function should be called to by the pass, iff they do
-// not:
-//
-// 1. Add or remove basic blocks from the function
-// 2. Modify terminator instructions in any way.
-//
-// This function annotates the AnalysisUsage info object to say that analyses
-// that only depend on the CFG are preserved by this pass.
-//
-void AnalysisUsage::setPreservesCFG() {
- // Since this transformation doesn't modify the CFG, it preserves all analyses
- // that only depend on the CFG (like dominators, loop info, etc...)
- //
- Preserved.insert(Preserved.end(),
- getCFGOnlyAnalyses().begin(), getCFGOnlyAnalyses().end());
-}
-
-
//===----------------------------------------------------------------------===//
// PassManager implementation - The PassManager class is a simple Pimpl class
// that wraps the PassManagerT template.
passEnumerate(I->second);
}
+//===----------------------------------------------------------------------===//
+// AnalysisUsage Class Implementation
+//
+
+// setPreservesCFG - This function should be called to by the pass, iff they do
+// not:
+//
+// 1. Add or remove basic blocks from the function
+// 2. Modify terminator instructions in any way.
+//
+// This function annotates the AnalysisUsage info object to say that analyses
+// that only depend on the CFG are preserved by this pass.
+//
+void AnalysisUsage::setPreservesCFG() {
+ // Since this transformation doesn't modify the CFG, it preserves all analyses
+ // that only depend on the CFG (like dominators, loop info, etc...)
+ //
+ if (PassInfoMap) {
+ for (std::map<TypeInfo, PassInfo*>::iterator I = PassInfoMap->begin(),
+ E = PassInfoMap->end(); I != E; ++I)
+ if (I->second->isCFGOnlyPass())
+ Preserved.push_back(I->second);
+ }
+}
+
+