summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/IR/PassManager.h11
-rw-r--r--lib/IR/PassManager.cpp30
-rw-r--r--tools/opt/Passes.cpp1
-rw-r--r--unittests/IR/PassManagerTest.cpp10
4 files changed, 51 insertions, 1 deletions
diff --git a/include/llvm/IR/PassManager.h b/include/llvm/IR/PassManager.h
index b85f7f1762..09eb10b846 100644
--- a/include/llvm/IR/PassManager.h
+++ b/include/llvm/IR/PassManager.h
@@ -168,6 +168,9 @@ template <typename IRUnitT, typename AnalysisManagerT> struct PassConcept {
/// desired. Also that the analysis manager may be null if there is no
/// analysis manager in the pass pipeline.
virtual PreservedAnalyses run(IRUnitT IR, AnalysisManagerT *AM) = 0;
+
+ /// \brief Polymorphic method to access the name of a pass.
+ virtual StringRef name() = 0;
};
/// \brief SFINAE metafunction for computing whether \c PassT has a run method
@@ -208,6 +211,7 @@ struct PassModel<IRUnitT, AnalysisManagerT, PassT,
virtual PreservedAnalyses run(IRUnitT IR, AnalysisManagerT *AM) {
return Pass.run(IR, AM);
}
+ virtual StringRef name() { return PassT::name(); }
PassT Pass;
};
@@ -221,6 +225,7 @@ struct PassModel<IRUnitT, AnalysisManagerT, PassT,
virtual PreservedAnalyses run(IRUnitT IR, AnalysisManagerT *AM) {
return Pass.run(IR);
}
+ virtual StringRef name() { return PassT::name(); }
PassT Pass;
};
@@ -403,6 +408,8 @@ public:
Passes.push_back(new ModulePassModel<ModulePassT>(llvm_move(Pass)));
}
+ static StringRef name() { return "ModulePassManager"; }
+
private:
// Pull in the concept type and model template specialized for modules.
typedef detail::PassConcept<Module *, ModuleAnalysisManager> ModulePassConcept;
@@ -428,6 +435,8 @@ public:
PreservedAnalyses run(Function *F, FunctionAnalysisManager *AM = 0);
+ static StringRef name() { return "FunctionPassManager"; }
+
private:
// Pull in the concept type and model template specialized for functions.
typedef detail::PassConcept<Function *, FunctionAnalysisManager>
@@ -808,6 +817,8 @@ public:
return PA;
}
+ static StringRef name() { return "ModuleToFunctionPassAdaptor"; }
+
private:
FunctionPassT Pass;
};
diff --git a/lib/IR/PassManager.cpp b/lib/IR/PassManager.cpp
index 30b46b01c1..70533fef58 100644
--- a/lib/IR/PassManager.cpp
+++ b/lib/IR/PassManager.cpp
@@ -7,19 +7,36 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/IR/PassManager.h"
#include "llvm/ADT/STLExtras.h"
+#include "llvm/IR/PassManager.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/Debug.h"
using namespace llvm;
+static cl::opt<bool>
+DebugPM("debug-pass-manager", cl::Hidden,
+ cl::desc("Print pass management debugging information"));
+
PreservedAnalyses ModulePassManager::run(Module *M, ModuleAnalysisManager *AM) {
PreservedAnalyses PA = PreservedAnalyses::all();
+
+ if (DebugPM)
+ dbgs() << "Starting module pass manager run.\n";
+
for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx) {
+ if (DebugPM)
+ dbgs() << "Running module pass: " << Passes[Idx]->name() << "\n";
+
PreservedAnalyses PassPA = Passes[Idx]->run(M, AM);
if (AM)
AM->invalidate(M, PassPA);
PA.intersect(llvm_move(PassPA));
}
+
+ if (DebugPM)
+ dbgs() << "Finished module pass manager run.\n";
+
return PA;
}
@@ -61,12 +78,23 @@ void ModuleAnalysisManager::invalidateImpl(Module *M,
PreservedAnalyses FunctionPassManager::run(Function *F, FunctionAnalysisManager *AM) {
PreservedAnalyses PA = PreservedAnalyses::all();
+
+ if (DebugPM)
+ dbgs() << "Starting function pass manager run.\n";
+
for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx) {
+ if (DebugPM)
+ dbgs() << "Running function pass: " << Passes[Idx]->name() << "\n";
+
PreservedAnalyses PassPA = Passes[Idx]->run(F, AM);
if (AM)
AM->invalidate(F, PassPA);
PA.intersect(llvm_move(PassPA));
}
+
+ if (DebugPM)
+ dbgs() << "Finished function pass manager run.\n";
+
return PA;
}
diff --git a/tools/opt/Passes.cpp b/tools/opt/Passes.cpp
index 49751269df..d58acaf1f6 100644
--- a/tools/opt/Passes.cpp
+++ b/tools/opt/Passes.cpp
@@ -24,6 +24,7 @@ namespace {
/// \brief No-op module pass which does nothing.
struct NoOpModulePass {
PreservedAnalyses run(Module *M) { return PreservedAnalyses::all(); }
+ static StringRef name() { return "NoOpModulePass"; }
};
} // End anonymous namespace.
diff --git a/unittests/IR/PassManagerTest.cpp b/unittests/IR/PassManagerTest.cpp
index 8db9c67e7d..7b2b46a934 100644
--- a/unittests/IR/PassManagerTest.cpp
+++ b/unittests/IR/PassManagerTest.cpp
@@ -86,6 +86,8 @@ struct TestModulePass {
return PreservedAnalyses::none();
}
+ static StringRef name() { return "TestModulePass"; }
+
int &RunCount;
};
@@ -93,6 +95,8 @@ struct TestPreservingModulePass {
PreservedAnalyses run(Module *M) {
return PreservedAnalyses::all();
}
+
+ static StringRef name() { return "TestPreservingModulePass"; }
};
struct TestMinPreservingModulePass {
@@ -105,6 +109,8 @@ struct TestMinPreservingModulePass {
PA.preserve<FunctionAnalysisManagerModuleProxy>();
return PA;
}
+
+ static StringRef name() { return "TestMinPreservingModulePass"; }
};
struct TestFunctionPass {
@@ -138,6 +144,8 @@ struct TestFunctionPass {
return PreservedAnalyses::all();
}
+ static StringRef name() { return "TestFunctionPass"; }
+
int &RunCount;
int &AnalyzedInstrCount;
int &AnalyzedFunctionCount;
@@ -154,6 +162,8 @@ struct TestInvalidationFunctionPass {
: PreservedAnalyses::all();
}
+ static StringRef name() { return "TestInvalidationFunctionPass"; }
+
StringRef Name;
};