-
-// Different debug levels that can be enabled...
-enum PassDebugLevel {
- None, Structure, Executions, Details
-};
-
-static cl::opt<enum PassDebugLevel>
-PassDebugging("debug-pass", cl::Hidden,
- cl::desc("Print PassManager debugging information"),
- cl::values(
- clEnumVal(None , "disable debug output"),
- // TODO: add option to print out pass names "PassOptions"
- clEnumVal(Structure , "print pass structure before run()"),
- clEnumVal(Executions, "print pass name before it is executed"),
- clEnumVal(Details , "print pass details when it is executed"),
- 0));
-
-void PMDebug::PrintPassStructure(Pass *P) {
- if (PassDebugging >= Structure)
- P->dumpPassStructure();
-}
-
-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) {
- Pass *P = Set[i].createPass(); // Good thing this is just debug code...
- std::cerr << " " << P->getPassName();
- delete P;
- }
- std::cerr << "\n";
- }