summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2013-09-19 06:02:43 +0000
committerAndrew Trick <atrick@apple.com>2013-09-19 06:02:43 +0000
commitabe68f59174c7418ae73de0a87587abe0be1fb03 (patch)
treeab1e29c1c732267f8fc6e0407243499e46fea9a3
parent7d4e9934e7ca83094c5cf41346966c8350179ff2 (diff)
downloadllvm-abe68f59174c7418ae73de0a87587abe0be1fb03.tar.gz
llvm-abe68f59174c7418ae73de0a87587abe0be1fb03.tar.bz2
llvm-abe68f59174c7418ae73de0a87587abe0be1fb03.tar.xz
Revert "Encapsulate PassManager debug flags to avoid static init and cxa_exit."
Working on a better solution to this. This reverts commit 7d4e9934e7ca83094c5cf41346966c8350179ff2. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190990 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/PassManager.h5
-rw-r--r--lib/IR/Core.cpp1
-rw-r--r--lib/IR/PassManager.cpp171
-rw-r--r--tools/llvm-as/llvm-as.cpp5
-rw-r--r--tools/llvm-diff/llvm-diff.cpp4
-rw-r--r--tools/llvm-dis/llvm-dis.cpp3
-rw-r--r--tools/llvm-extract/llvm-extract.cpp4
-rw-r--r--tools/llvm-link/llvm-link.cpp5
-rw-r--r--tools/llvm-nm/llvm-nm.cpp5
-rw-r--r--tools/llvm-prof/llvm-prof.cpp3
-rw-r--r--tools/llvm-stress/llvm-stress.cpp4
11 files changed, 74 insertions, 136 deletions
diff --git a/include/llvm/PassManager.h b/include/llvm/PassManager.h
index 044dc3320b..b6a8186a4e 100644
--- a/include/llvm/PassManager.h
+++ b/include/llvm/PassManager.h
@@ -28,11 +28,6 @@ class Module;
class PassManagerImpl;
class FunctionPassManagerImpl;
-/// Called by tools to initialize globals and register options at a particular
-/// point (before command line parsing). If this is not called, then PassManager
-/// globals are lazily initialized at first use.
-void initializePassManager();
-
/// PassManagerBase - An abstract interface to allow code to add passes to
/// a pass manager without having to hard-code what kind of pass manager
/// it is.
diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp
index 749ae60146..95c516a251 100644
--- a/lib/IR/Core.cpp
+++ b/lib/IR/Core.cpp
@@ -40,7 +40,6 @@
using namespace llvm;
void llvm::initializeCore(PassRegistry &Registry) {
- initializePassManager();
initializeDominatorTreePass(Registry);
initializePrintModulePassPass(Registry);
initializePrintFunctionPassPass(Registry);
diff --git a/lib/IR/PassManager.cpp b/lib/IR/PassManager.cpp
index 99933a89b0..8d2e2ca89b 100644
--- a/lib/IR/PassManager.cpp
+++ b/lib/IR/PassManager.cpp
@@ -45,94 +45,65 @@ enum PassDebugLevel {
Disabled, Arguments, Structure, Executions, Details
};
-bool TimePassesIsEnabled = false;
-
-/// Encapsulate PassManager debug options. These are convenient options that
-/// should be available to any LLVM-based tool. They exist purely as
-/// command-line debug options, therefore don't need to be local to an LLVM
-/// context or captured by a formal API. In all respects they are handled like
-/// global variables, but being defined in the LLVMCore library cannot have
-/// static initializers and must be destroyed only at llvm_shutdown.
-struct PassDebugOpts {
- cl::opt<enum PassDebugLevel> PassDebugging;
-
- typedef llvm::cl::list<const llvm::PassInfo *, bool, PassNameParser>
- PassOptionList;
-
- // Print IR out before/after specified passes.
- PassOptionList PrintBefore;
-
- PassOptionList PrintAfter;
-
- cl::opt<bool> PrintBeforeAll;
- cl::opt<bool> PrintAfterAll;
-
- cl::opt<bool,true> EnableTiming;
-
- PassDebugOpts():
- PassDebugging("debug-pass", cl::Hidden,
+static cl::opt<enum PassDebugLevel>
+PassDebugging("debug-pass", cl::Hidden,
cl::desc("Print PassManager debugging information"),
cl::values(
- clEnumVal(Disabled , "disable debug output"),
- clEnumVal(Arguments,
- "print pass arguments to pass to 'opt'"),
- 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"),
- clEnumValEnd)),
- PrintBefore("print-before",
- llvm::cl::desc("Print IR before specified passes"),
- cl::Hidden),
- PrintAfter("print-after",
- llvm::cl::desc("Print IR after specified passes"),
- cl::Hidden),
- PrintBeforeAll("print-before-all",
- llvm::cl::desc("Print IR before each pass"),
- cl::init(false)),
- PrintAfterAll("print-after-all",
- llvm::cl::desc("Print IR after each pass"),
- cl::init(false)),
- EnableTiming("time-passes", cl::location(TimePassesIsEnabled),
- cl::desc(
- "Time each pass, printing elapsed time for each on exit"))
- {}
-
- /// This is a helper to determine whether to print IR before or
- /// after a pass.
- bool ShouldPrintBeforeOrAfterPass(const PassInfo *PI,
- PassOptionList &PassesToPrint) {
- for (unsigned i = 0, ie = PassesToPrint.size(); i < ie; ++i) {
- const llvm::PassInfo *PassInf = PassesToPrint[i];
- if (PassInf)
- if (PassInf->getPassArgument() == PI->getPassArgument()) {
- return true;
- }
- }
- return false;
- }
-
- /// This is a utility to check whether a pass should have IR dumped
- /// before it.
- bool ShouldPrintBeforePass(const PassInfo *PI) {
- return PrintBeforeAll || ShouldPrintBeforeOrAfterPass(PI, PrintBefore);
- }
-
- /// This is a utility to check whether a pass should have IR dumped
- /// after it.
- bool ShouldPrintAfterPass(const PassInfo *PI) {
- return PrintAfterAll || ShouldPrintBeforeOrAfterPass(PI, PrintAfter);
+ clEnumVal(Disabled , "disable debug output"),
+ clEnumVal(Arguments , "print pass arguments to pass to 'opt'"),
+ 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"),
+ clEnumValEnd));
+
+typedef llvm::cl::list<const llvm::PassInfo *, bool, PassNameParser>
+PassOptionList;
+
+// Print IR out before/after specified passes.
+static PassOptionList
+PrintBefore("print-before",
+ llvm::cl::desc("Print IR before specified passes"),
+ cl::Hidden);
+
+static PassOptionList
+PrintAfter("print-after",
+ llvm::cl::desc("Print IR after specified passes"),
+ cl::Hidden);
+
+static cl::opt<bool>
+PrintBeforeAll("print-before-all",
+ llvm::cl::desc("Print IR before each pass"),
+ cl::init(false));
+static cl::opt<bool>
+PrintAfterAll("print-after-all",
+ llvm::cl::desc("Print IR after each pass"),
+ cl::init(false));
+
+/// This is a helper to determine whether to print IR before or
+/// after a pass.
+
+static bool ShouldPrintBeforeOrAfterPass(const PassInfo *PI,
+ PassOptionList &PassesToPrint) {
+ for (unsigned i = 0, ie = PassesToPrint.size(); i < ie; ++i) {
+ const llvm::PassInfo *PassInf = PassesToPrint[i];
+ if (PassInf)
+ if (PassInf->getPassArgument() == PI->getPassArgument()) {
+ return true;
+ }
}
-};
+ return false;
+}
-static ManagedStatic<PassDebugOpts> GlobalPassDebugOpts;
+/// This is a utility to check whether a pass should have IR dumped
+/// before it.
+static bool ShouldPrintBeforePass(const PassInfo *PI) {
+ return PrintBeforeAll || ShouldPrintBeforeOrAfterPass(PI, PrintBefore);
+}
-/// This is called by tools to force registration of debugging options and
-/// ensure they appear in the tool's -help usage.
-void initializePassManager() {
- // Force instantiation of PassDebugOpts.
- *GlobalPassDebugOpts;
+/// This is a utility to check whether a pass should have IR dumped
+/// after it.
+static bool ShouldPrintAfterPass(const PassInfo *PI) {
+ return PrintAfterAll || ShouldPrintBeforeOrAfterPass(PI, PrintAfter);
}
} // End of llvm namespace
@@ -140,9 +111,12 @@ void initializePassManager() {
/// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions
/// or higher is specified.
bool PMDataManager::isPassDebuggingExecutionsOrMore() const {
- return GlobalPassDebugOpts->PassDebugging >= Executions;
+ return PassDebugging >= Executions;
}
+
+
+
void PassManagerPrettyStackEntry::print(raw_ostream &OS) const {
if (V == 0 && M == 0)
OS << "Releasing pass '";
@@ -694,8 +668,7 @@ void PMTopLevelManager::schedulePass(Pass *P) {
return;
}
- if (PI && !PI->isAnalysis() &&
- GlobalPassDebugOpts->ShouldPrintBeforePass(PI)) {
+ if (PI && !PI->isAnalysis() && ShouldPrintBeforePass(PI)) {
Pass *PP = P->createPrinterPass(
dbgs(), std::string("*** IR Dump Before ") + P->getPassName() + " ***");
PP->assignPassManager(activeStack, getTopLevelPassManagerType());
@@ -704,8 +677,7 @@ void PMTopLevelManager::schedulePass(Pass *P) {
// Add the requested pass to the best available pass manager.
P->assignPassManager(activeStack, getTopLevelPassManagerType());
- if (PI && !PI->isAnalysis() &&
- GlobalPassDebugOpts->ShouldPrintAfterPass(PI)) {
+ if (PI && !PI->isAnalysis() && ShouldPrintAfterPass(PI)) {
Pass *PP = P->createPrinterPass(
dbgs(), std::string("*** IR Dump After ") + P->getPassName() + " ***");
PP->assignPassManager(activeStack, getTopLevelPassManagerType());
@@ -757,7 +729,7 @@ Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
// Print passes managed by this top level manager.
void PMTopLevelManager::dumpPasses() const {
- if (GlobalPassDebugOpts->PassDebugging < Structure)
+ if (PassDebugging < Structure)
return;
// Print out the immutable passes
@@ -776,7 +748,7 @@ void PMTopLevelManager::dumpPasses() const {
void PMTopLevelManager::dumpArguments() const {
- if (GlobalPassDebugOpts->PassDebugging < Arguments)
+ if (PassDebugging < Arguments)
return;
dbgs() << "Pass Arguments: ";
@@ -909,7 +881,7 @@ void PMDataManager::removeNotPreservedAnalysis(Pass *P) {
std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==
PreservedSet.end()) {
// Remove this analysis
- if (GlobalPassDebugOpts->PassDebugging >= Details) {
+ if (PassDebugging >= Details) {
Pass *S = Info->second;
dbgs() << " -- '" << P->getPassName() << "' is not preserving '";
dbgs() << S->getPassName() << "'\n";
@@ -933,7 +905,7 @@ void PMDataManager::removeNotPreservedAnalysis(Pass *P) {
std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==
PreservedSet.end()) {
// Remove this analysis
- if (GlobalPassDebugOpts->PassDebugging >= Details) {
+ if (PassDebugging >= Details) {
Pass *S = Info->second;
dbgs() << " -- '" << P->getPassName() << "' is not preserving '";
dbgs() << S->getPassName() << "'\n";
@@ -956,7 +928,7 @@ void PMDataManager::removeDeadPasses(Pass *P, StringRef Msg,
TPM->collectLastUses(DeadPasses, P);
- if (GlobalPassDebugOpts->PassDebugging >= Details && !DeadPasses.empty()) {
+ if (PassDebugging >= Details && !DeadPasses.empty()) {
dbgs() << " -*- '" << P->getPassName();
dbgs() << "' is the last user of following pass instances.";
dbgs() << " Free these instances\n";
@@ -1174,7 +1146,7 @@ void PMDataManager::dumpPassArguments() const {
void PMDataManager::dumpPassInfo(Pass *P, enum PassDebuggingString S1,
enum PassDebuggingString S2,
StringRef Msg) {
- if (GlobalPassDebugOpts->PassDebugging < Executions)
+ if (PassDebugging < Executions)
return;
dbgs() << (void*)this << std::string(getDepth()*2+1, ' ');
switch (S1) {
@@ -1215,7 +1187,7 @@ void PMDataManager::dumpPassInfo(Pass *P, enum PassDebuggingString S1,
}
void PMDataManager::dumpRequiredSet(const Pass *P) const {
- if (GlobalPassDebugOpts->PassDebugging < Details)
+ if (PassDebugging < Details)
return;
AnalysisUsage analysisUsage;
@@ -1224,7 +1196,7 @@ void PMDataManager::dumpRequiredSet(const Pass *P) const {
}
void PMDataManager::dumpPreservedSet(const Pass *P) const {
- if (GlobalPassDebugOpts->PassDebugging < Details)
+ if (PassDebugging < Details)
return;
AnalysisUsage analysisUsage;
@@ -1234,7 +1206,7 @@ void PMDataManager::dumpPreservedSet(const Pass *P) const {
void PMDataManager::dumpAnalysisUsage(StringRef Msg, const Pass *P,
const AnalysisUsage::VectorType &Set) const {
- assert(GlobalPassDebugOpts->PassDebugging >= Details);
+ assert(PassDebugging >= Details);
if (Set.empty())
return;
dbgs() << (const void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:";
@@ -1769,6 +1741,11 @@ bool PassManager::run(Module &M) {
//===----------------------------------------------------------------------===//
// TimingInfo implementation
+bool llvm::TimePassesIsEnabled = false;
+static cl::opt<bool,true>
+EnableTiming("time-passes", cl::location(TimePassesIsEnabled),
+ cl::desc("Time each pass, printing elapsed time for each on exit"));
+
// createTheTimeInfo - This method either initializes the TheTimeInfo pointer to
// a non null value (if the -time-passes option is enabled) or it leaves it
// null. It may be called multiple times.
diff --git a/tools/llvm-as/llvm-as.cpp b/tools/llvm-as/llvm-as.cpp
index 9d5e96d965..b2e44ef9d3 100644
--- a/tools/llvm-as/llvm-as.cpp
+++ b/tools/llvm-as/llvm-as.cpp
@@ -20,7 +20,6 @@
#include "llvm/Assembly/Parser.h"
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/IR/Module.h"
-#include "llvm/PassManager.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/PrettyStackTrace.h"
@@ -90,10 +89,6 @@ int main(int argc, char **argv) {
PrettyStackTraceProgram X(argc, argv);
LLVMContext &Context = getGlobalContext();
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
-
- // Initialize PassManager for -time-passes support.
- initializePassManager();
-
cl::ParseCommandLineOptions(argc, argv, "llvm .ll -> .bc assembler\n");
// Parse the file now...
diff --git a/tools/llvm-diff/llvm-diff.cpp b/tools/llvm-diff/llvm-diff.cpp
index 62fc026327..f70219eaf5 100644
--- a/tools/llvm-diff/llvm-diff.cpp
+++ b/tools/llvm-diff/llvm-diff.cpp
@@ -20,7 +20,6 @@
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IRReader/IRReader.h"
-#include "llvm/PassManager.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SourceMgr.h"
@@ -68,9 +67,6 @@ static cl::list<std::string> GlobalsToCompare(cl::Positional,
cl::desc("<globals to compare>"));
int main(int argc, char **argv) {
- // Initialize PassManager for -time-passes support.
- initializePassManager();
-
cl::ParseCommandLineOptions(argc, argv);
LLVMContext Context;
diff --git a/tools/llvm-dis/llvm-dis.cpp b/tools/llvm-dis/llvm-dis.cpp
index f31cbd4d2c..87eb34708a 100644
--- a/tools/llvm-dis/llvm-dis.cpp
+++ b/tools/llvm-dis/llvm-dis.cpp
@@ -23,7 +23,6 @@
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
-#include "llvm/PassManager.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/DataStream.h"
#include "llvm/Support/FormattedStream.h"
@@ -120,8 +119,6 @@ int main(int argc, char **argv) {
LLVMContext &Context = getGlobalContext();
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
- // Initialize PassManager for -time-passes support.
- initializePassManager();
cl::ParseCommandLineOptions(argc, argv, "llvm .bc -> .ll disassembler\n");
diff --git a/tools/llvm-extract/llvm-extract.cpp b/tools/llvm-extract/llvm-extract.cpp
index 99131764f3..dc1a410953 100644
--- a/tools/llvm-extract/llvm-extract.cpp
+++ b/tools/llvm-extract/llvm-extract.cpp
@@ -96,10 +96,6 @@ int main(int argc, char **argv) {
LLVMContext &Context = getGlobalContext();
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
-
- // Initialize PassManager for -time-passes support.
- initializePassManager();
-
cl::ParseCommandLineOptions(argc, argv, "llvm extractor\n");
// Use lazy loading, since we only care about selected global values.
diff --git a/tools/llvm-link/llvm-link.cpp b/tools/llvm-link/llvm-link.cpp
index 8e7d4b01df..99cca2322d 100644
--- a/tools/llvm-link/llvm-link.cpp
+++ b/tools/llvm-link/llvm-link.cpp
@@ -18,7 +18,6 @@
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IRReader/IRReader.h"
-#include "llvm/PassManager.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/Path.h"
@@ -74,10 +73,6 @@ int main(int argc, char **argv) {
LLVMContext &Context = getGlobalContext();
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
-
- // Initialize PassManager for -time-passes support.
- initializePassManager();
-
cl::ParseCommandLineOptions(argc, argv, "llvm linker\n");
unsigned BaseArg = 0;
diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp
index 45309c0714..01dd1c33fd 100644
--- a/tools/llvm-nm/llvm-nm.cpp
+++ b/tools/llvm-nm/llvm-nm.cpp
@@ -22,7 +22,6 @@
#include "llvm/Object/Archive.h"
#include "llvm/Object/MachOUniversal.h"
#include "llvm/Object/ObjectFile.h"
-#include "llvm/PassManager.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Format.h"
@@ -447,10 +446,6 @@ int main(int argc, char **argv) {
PrettyStackTraceProgram X(argc, argv);
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
-
- // Initialize PassManager for -time-passes support.
- initializePassManager();
-
cl::ParseCommandLineOptions(argc, argv, "llvm symbol table dumper\n");
// llvm-nm only reads binary files.
diff --git a/tools/llvm-prof/llvm-prof.cpp b/tools/llvm-prof/llvm-prof.cpp
index e36441d6f1..52d0130069 100644
--- a/tools/llvm-prof/llvm-prof.cpp
+++ b/tools/llvm-prof/llvm-prof.cpp
@@ -260,9 +260,6 @@ int main(int argc, char **argv) {
LLVMContext &Context = getGlobalContext();
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
- // Initialize PassManager for -time-passes support.
- initializePassManager();
-
cl::ParseCommandLineOptions(argc, argv, "llvm profile dump decoder\n");
// Read in the bitcode file...
diff --git a/tools/llvm-stress/llvm-stress.cpp b/tools/llvm-stress/llvm-stress.cpp
index 6f2224221d..15f7abf70e 100644
--- a/tools/llvm-stress/llvm-stress.cpp
+++ b/tools/llvm-stress/llvm-stress.cpp
@@ -681,10 +681,6 @@ void IntroduceControlFlow(Function *F, Random &R) {
int main(int argc, char **argv) {
// Init LLVM, call llvm_shutdown() on exit, parse args, etc.
llvm::PrettyStackTraceProgram X(argc, argv);
-
- // Initialize PassManager for -time-passes support.
- initializePassManager();
-
cl::ParseCommandLineOptions(argc, argv, "llvm codegen stress-tester\n");
llvm_shutdown_obj Y;