-
-// IncludeFile - Stub function used to help linking out.
-IncludeFile::IncludeFile(void*) {}
-
-//===----------------------------------------------------------------------===//
-// AnalysisID Class Implementation
-//
-
-static std::vector<const PassInfo*> CFGOnlyAnalyses;
-
-void RegisterPassBase::setPreservesCFG() {
- CFGOnlyAnalyses.push_back(PIObj);
-}
-
-//===----------------------------------------------------------------------===//
-// AnalysisResolver Class Implementation
-//
-
-void AnalysisResolver::setAnalysisResolver(Pass *P, AnalysisResolver *AR) {
- assert(P->Resolver == 0 && "Pass already in a PassManager!");
- 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(),
- CFGOnlyAnalyses.begin(), CFGOnlyAnalyses.end());
-}
-
-
-//===----------------------------------------------------------------------===//
-// PassManager implementation - The PassManager class is a simple Pimpl class
-// that wraps the PassManagerT template.
-//
-PassManager::PassManager() : PM(new PassManagerT<Module>()) {}
-PassManager::~PassManager() { delete PM; }
-void PassManager::add(Pass *P) { PM->add(P); }
-bool PassManager::run(Module &M) { return PM->run(M); }
-
-//===----------------------------------------------------------------------===//
-// FunctionPassManager implementation - The FunctionPassManager class
-// is a simple Pimpl class that wraps the PassManagerT template. It
-// is like PassManager, but only deals in FunctionPasses.
-//
-FunctionPassManager::FunctionPassManager() : PM(new PassManagerT<Function>()) {}
-FunctionPassManager::~FunctionPassManager() { delete PM; }
-void FunctionPassManager::add(FunctionPass *P) { PM->add(P); }
-bool FunctionPassManager::run(Function &F) { return PM->run(F); }
-
-
-//===----------------------------------------------------------------------===//
-// TimingInfo Class - This class is used to calculate information about the
-// amount of time each pass takes to execute. This only happens with
-// -time-passes is enabled on the command line.
-//
-static cl::opt<bool>
-EnableTiming("time-passes",
- cl::desc("Time each pass, printing elapsed time for each on exit"));
-
-// Create method. If Timing is enabled, this creates and returns a new timing
-// object, otherwise it returns null.
-//
-TimingInfo *TimingInfo::create() {
- return EnableTiming ? new TimingInfo() : 0;
-}
-
-void PMDebug::PrintArgumentInformation(const Pass *P) {
- // Print out passes in pass manager...
- if (const AnalysisResolver *PM = dynamic_cast<const AnalysisResolver*>(P)) {
- for (unsigned i = 0, e = PM->getNumContainedPasses(); i != e; ++i)
- PrintArgumentInformation(PM->getContainedPass(i));
-
- } else { // Normal pass. Print argument information...
- // Print out arguments for registered passes that are _optimizations_
- if (const PassInfo *PI = P->getPassInfo())
- if (PI->getPassType() & PassInfo::Optimization)
- std::cerr << " -" << PI->getPassArgument();
- }
-}
-
-void PMDebug::PrintPassInformation(unsigned Depth, const char *Action,
- Pass *P, Annotable *V) {
- if (PassDebugging >= Executions) {
- std::cerr << (void*)P << std::string(Depth*2+1, ' ') << Action << " '"
- << P->getPassName();
- if (V) {
- std::cerr << "' on ";
-
- if (dynamic_cast<Module*>(V)) {
- std::cerr << "Module\n"; return;
- } else if (Function *F = dynamic_cast<Function*>(V))
- std::cerr << "Function '" << F->getName();
- else if (BasicBlock *BB = dynamic_cast<BasicBlock*>(V))
- std::cerr << "BasicBlock '" << BB->getName();
- else if (Value *Val = dynamic_cast<Value*>(V))
- std::cerr << typeid(*Val).name() << " '" << Val->getName();
- }
- std::cerr << "'...\n";
- }
-}
-
-void PMDebug::PrintAnalysisSetInfo(unsigned Depth, const char *Msg,
- Pass *P, const std::vector<AnalysisID> &Set){
- if (PassDebugging >= Details && !Set.empty()) {
- std::cerr << (void*)P << std::string(Depth*2+3, ' ') << Msg << " Analyses:";
- for (unsigned i = 0; i != Set.size(); ++i) {
- if (i) std::cerr << ",";
- std::cerr << " " << Set[i]->getPassName();
- }
- std::cerr << "\n";
- }
-}