<div dir="ltr">On Wed, Sep 18, 2013 at 4:48 PM, Chandler Carruth <span dir="ltr"><<a href="mailto:chandlerc@google.com" target="_blank" class="cremed">chandlerc@google.com</a>></span> wrote:<br><div class="gmail_extra">
<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="im">On Wed, Sep 18, 2013 at 4:31 PM, Andrew Trick <span dir="ltr"><<a href="mailto:atrick@apple.com" target="_blank" class="cremed">atrick@apple.com</a>></span> wrote:<br>
</div><div class="gmail_extra"><div class="gmail_quote"><div class="im">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: atrick<br>
Date: Wed Sep 18 18:31:16 2013<br>
New Revision: 190974<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=190974&view=rev" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project?rev=190974&view=rev</a><br>
Log:<br>
Encapsulate PassManager debug flags to avoid static init and cxa_exit.<br>
<br>
This puts all the global PassManager debugging flags, like<br>
-print-after-all and -time-passes, behind a managed static. This<br>
eliminates their static initializers and, more importantly, exit-time<br>
destructors.<br>
<br>
The only behavioral change I anticipate is that tools need to<br>
initialize the PassManager before parsing the command line in order to<br>
export these options, which makes sense. Tools that already initialize<br>
the standard passes (opt/llc) don't need to do anything new.<br></blockquote><div><br></div></div><div>Andy, this really feels like a hack, and a bad hack at that.</div><div><br></div><div>Where is the requirement for the core library to have no static initializers coming from? What is the support plan here? What problem are you actually trying to fix?</div>
</div></div></div></blockquote><div><br></div><div>Just for clarity, I have read the llvmdev thread, and I understand the *general* goal, but this patch itself doesn't seem like a clean incremental step toward that goal, doesn't reference any of the constructs under discussion in that thread.</div>
<div><br></div><div>(And it's probably good that it doesn't, as that design discussion hasn't really had time to resolve itself.. i haven't even had time to reply yet, that'll come later)</div><div><br>
</div><div>So my assumption is that this is trying to fix a smaller, more targeted problem, and I'd like to find a cleaner way to do that if possible.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div class="h5">
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Modified:<br>
    llvm/trunk/include/llvm/PassManager.h<br>
    llvm/trunk/lib/IR/Core.cpp<br>
    llvm/trunk/lib/IR/PassManager.cpp<br>
    llvm/trunk/tools/llvm-as/llvm-as.cpp<br>
    llvm/trunk/tools/llvm-diff/llvm-diff.cpp<br>
    llvm/trunk/tools/llvm-dis/llvm-dis.cpp<br>
    llvm/trunk/tools/llvm-extract/llvm-extract.cpp<br>
    llvm/trunk/tools/llvm-link/llvm-link.cpp<br>
    llvm/trunk/tools/llvm-nm/llvm-nm.cpp<br>
    llvm/trunk/tools/llvm-prof/llvm-prof.cpp<br>
    llvm/trunk/tools/llvm-stress/llvm-stress.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/PassManager.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassManager.h?rev=190974&r1=190973&r2=190974&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassManager.h?rev=190974&r1=190973&r2=190974&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/include/llvm/PassManager.h (original)<br>
+++ llvm/trunk/include/llvm/PassManager.h Wed Sep 18 18:31:16 2013<br>
@@ -28,6 +28,11 @@ class Module;<br>
 class PassManagerImpl;<br>
 class FunctionPassManagerImpl;<br>
<br>
+/// Called by tools to initialize globals and register options at a particular<br>
+/// point (before command line parsing). If this is not called, then PassManager<br>
+/// globals are lazily initialized at first use.<br>
+void initializePassManager();<br>
+<br>
 /// PassManagerBase - An abstract interface to allow code to add passes to<br>
 /// a pass manager without having to hard-code what kind of pass manager<br>
 /// it is.<br>
<br>
Modified: llvm/trunk/lib/IR/Core.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Core.cpp?rev=190974&r1=190973&r2=190974&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Core.cpp?rev=190974&r1=190973&r2=190974&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/lib/IR/Core.cpp (original)<br>
+++ llvm/trunk/lib/IR/Core.cpp Wed Sep 18 18:31:16 2013<br>
@@ -40,6 +40,7 @@<br>
 using namespace llvm;<br>
<br>
 void llvm::initializeCore(PassRegistry &Registry) {<br>
+  initializePassManager();<br>
   initializeDominatorTreePass(Registry);<br>
   initializePrintModulePassPass(Registry);<br>
   initializePrintFunctionPassPass(Registry);<br>
<br>
Modified: llvm/trunk/lib/IR/PassManager.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/PassManager.cpp?rev=190974&r1=190973&r2=190974&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/PassManager.cpp?rev=190974&r1=190973&r2=190974&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/lib/IR/PassManager.cpp (original)<br>
+++ llvm/trunk/lib/IR/PassManager.cpp Wed Sep 18 18:31:16 2013<br>
@@ -45,65 +45,94 @@ enum PassDebugLevel {<br>
   Disabled, Arguments, Structure, Executions, Details<br>
 };<br>
<br>
-static cl::opt<enum PassDebugLevel><br>
-PassDebugging("debug-pass", cl::Hidden,<br>
+bool TimePassesIsEnabled = false;<br>
+<br>
+/// Encapsulate PassManager debug options. These are convenient options that<br>
+/// should be available to any LLVM-based tool. They exist purely as<br>
+/// command-line debug options, therefore don't need to be local to an LLVM<br>
+/// context or captured by a formal API. In all respects they are handled like<br>
+/// global variables, but being defined in the LLVMCore library cannot have<br>
+/// static initializers and must be destroyed only at llvm_shutdown.<br>
+struct PassDebugOpts {<br>
+  cl::opt<enum PassDebugLevel> PassDebugging;<br>
+<br>
+  typedef llvm::cl::list<const llvm::PassInfo *, bool, PassNameParser><br>
+  PassOptionList;<br>
+<br>
+  // Print IR out before/after specified passes.<br>
+  PassOptionList PrintBefore;<br>
+<br>
+  PassOptionList PrintAfter;<br>
+<br>
+  cl::opt<bool> PrintBeforeAll;<br>
+  cl::opt<bool> PrintAfterAll;<br>
+<br>
+  cl::opt<bool,true> EnableTiming;<br>
+<br>
+  PassDebugOpts():<br>
+    PassDebugging("debug-pass", cl::Hidden,<br>
                   cl::desc("Print PassManager debugging information"),<br>
                   cl::values(<br>
-  clEnumVal(Disabled  , "disable debug output"),<br>
-  clEnumVal(Arguments , "print pass arguments to pass to 'opt'"),<br>
-  clEnumVal(Structure , "print pass structure before run()"),<br>
-  clEnumVal(Executions, "print pass name before it is executed"),<br>
-  clEnumVal(Details   , "print pass details when it is executed"),<br>
-                             clEnumValEnd));<br>
-<br>
-typedef llvm::cl::list<const llvm::PassInfo *, bool, PassNameParser><br>
-PassOptionList;<br>
-<br>
-// Print IR out before/after specified passes.<br>
-static PassOptionList<br>
-PrintBefore("print-before",<br>
-            llvm::cl::desc("Print IR before specified passes"),<br>
-            cl::Hidden);<br>
-<br>
-static PassOptionList<br>
-PrintAfter("print-after",<br>
-           llvm::cl::desc("Print IR after specified passes"),<br>
-           cl::Hidden);<br>
-<br>
-static cl::opt<bool><br>
-PrintBeforeAll("print-before-all",<br>
-               llvm::cl::desc("Print IR before each pass"),<br>
-               cl::init(false));<br>
-static cl::opt<bool><br>
-PrintAfterAll("print-after-all",<br>
-              llvm::cl::desc("Print IR after each pass"),<br>
-              cl::init(false));<br>
-<br>
-/// This is a helper to determine whether to print IR before or<br>
-/// after a pass.<br>
-<br>
-static bool ShouldPrintBeforeOrAfterPass(const PassInfo *PI,<br>
-                                         PassOptionList &PassesToPrint) {<br>
-  for (unsigned i = 0, ie = PassesToPrint.size(); i < ie; ++i) {<br>
-    const llvm::PassInfo *PassInf = PassesToPrint[i];<br>
-    if (PassInf)<br>
-      if (PassInf->getPassArgument() == PI->getPassArgument()) {<br>
-        return true;<br>
-      }<br>
+                    clEnumVal(Disabled , "disable debug output"),<br>
+                    clEnumVal(Arguments,<br>
+                              "print pass arguments to pass to 'opt'"),<br>
+                    clEnumVal(Structure, "print pass structure before run()"),<br>
+                    clEnumVal(Executions,<br>
+                              "print pass name before it is executed"),<br>
+                    clEnumVal(Details,<br>
+                              "print pass details when it is executed"),<br>
+                    clEnumValEnd)),<br>
+    PrintBefore("print-before",<br>
+                llvm::cl::desc("Print IR before specified passes"),<br>
+                cl::Hidden),<br>
+    PrintAfter("print-after",<br>
+               llvm::cl::desc("Print IR after specified passes"),<br>
+               cl::Hidden),<br>
+    PrintBeforeAll("print-before-all",<br>
+                   llvm::cl::desc("Print IR before each pass"),<br>
+                   cl::init(false)),<br>
+    PrintAfterAll("print-after-all",<br>
+                  llvm::cl::desc("Print IR after each pass"),<br>
+                  cl::init(false)),<br>
+    EnableTiming("time-passes", cl::location(TimePassesIsEnabled),<br>
+                 cl::desc(<br>
+                   "Time each pass, printing elapsed time for each on exit"))<br>
+  {}<br>
+<br>
+  /// This is a helper to determine whether to print IR before or<br>
+  /// after a pass.<br>
+  bool ShouldPrintBeforeOrAfterPass(const PassInfo *PI,<br>
+                                    PassOptionList &PassesToPrint) {<br>
+    for (unsigned i = 0, ie = PassesToPrint.size(); i < ie; ++i) {<br>
+      const llvm::PassInfo *PassInf = PassesToPrint[i];<br>
+      if (PassInf)<br>
+        if (PassInf->getPassArgument() == PI->getPassArgument()) {<br>
+          return true;<br>
+        }<br>
+    }<br>
+    return false;<br>
   }<br>
-  return false;<br>
-}<br>
<br>
-/// This is a utility to check whether a pass should have IR dumped<br>
-/// before it.<br>
-static bool ShouldPrintBeforePass(const PassInfo *PI) {<br>
-  return PrintBeforeAll || ShouldPrintBeforeOrAfterPass(PI, PrintBefore);<br>
-}<br>
+  /// This is a utility to check whether a pass should have IR dumped<br>
+  /// before it.<br>
+  bool ShouldPrintBeforePass(const PassInfo *PI) {<br>
+    return PrintBeforeAll || ShouldPrintBeforeOrAfterPass(PI, PrintBefore);<br>
+  }<br>
+<br>
+  /// This is a utility to check whether a pass should have IR dumped<br>
+  /// after it.<br>
+  bool ShouldPrintAfterPass(const PassInfo *PI) {<br>
+    return PrintAfterAll || ShouldPrintBeforeOrAfterPass(PI, PrintAfter);<br>
+  }<br>
+};<br>
<br>
-/// This is a utility to check whether a pass should have IR dumped<br>
-/// after it.<br>
-static bool ShouldPrintAfterPass(const PassInfo *PI) {<br>
-  return PrintAfterAll || ShouldPrintBeforeOrAfterPass(PI, PrintAfter);<br>
+static ManagedStatic<PassDebugOpts> GlobalPassDebugOpts;<br>
+<br>
+/// This is called by tools to force registration of debugging options and<br>
+/// ensure they appear in the tool's -help usage.<br>
+void initializePassManager() {<br>
+  // Force instantiation of PassDebugOpts.<br>
+  *GlobalPassDebugOpts;<br>
 }<br>
<br>
 } // End of llvm namespace<br>
@@ -111,12 +140,9 @@ static bool ShouldPrintAfterPass(const P<br>
 /// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions<br>
 /// or higher is specified.<br>
 bool PMDataManager::isPassDebuggingExecutionsOrMore() const {<br>
-  return PassDebugging >= Executions;<br>
+  return GlobalPassDebugOpts->PassDebugging >= Executions;<br>
 }<br>
<br>
-<br>
-<br>
-<br>
 void PassManagerPrettyStackEntry::print(raw_ostream &OS) const {<br>
   if (V == 0 && M == 0)<br>
     OS << "Releasing pass '";<br>
@@ -668,7 +694,8 @@ void PMTopLevelManager::schedulePass(Pas<br>
     return;<br>
   }<br>
<br>
-  if (PI && !PI->isAnalysis() && ShouldPrintBeforePass(PI)) {<br>
+  if (PI && !PI->isAnalysis() &&<br>
+      GlobalPassDebugOpts->ShouldPrintBeforePass(PI)) {<br>
     Pass *PP = P->createPrinterPass(<br>
       dbgs(), std::string("*** IR Dump Before ") + P->getPassName() + " ***");<br>
     PP->assignPassManager(activeStack, getTopLevelPassManagerType());<br>
@@ -677,7 +704,8 @@ void PMTopLevelManager::schedulePass(Pas<br>
   // Add the requested pass to the best available pass manager.<br>
   P->assignPassManager(activeStack, getTopLevelPassManagerType());<br>
<br>
-  if (PI && !PI->isAnalysis() && ShouldPrintAfterPass(PI)) {<br>
+  if (PI && !PI->isAnalysis() &&<br>
+      GlobalPassDebugOpts->ShouldPrintAfterPass(PI)) {<br>
     Pass *PP = P->createPrinterPass(<br>
       dbgs(), std::string("*** IR Dump After ") + P->getPassName() + " ***");<br>
     PP->assignPassManager(activeStack, getTopLevelPassManagerType());<br>
@@ -729,7 +757,7 @@ Pass *PMTopLevelManager::findAnalysisPas<br>
 // Print passes managed by this top level manager.<br>
 void PMTopLevelManager::dumpPasses() const {<br>
<br>
-  if (PassDebugging < Structure)<br>
+  if (GlobalPassDebugOpts->PassDebugging < Structure)<br>
     return;<br>
<br>
   // Print out the immutable passes<br>
@@ -748,7 +776,7 @@ void PMTopLevelManager::dumpPasses() con<br>
<br>
 void PMTopLevelManager::dumpArguments() const {<br>
<br>
-  if (PassDebugging < Arguments)<br>
+  if (GlobalPassDebugOpts->PassDebugging < Arguments)<br>
     return;<br>
<br>
   dbgs() << "Pass Arguments: ";<br>
@@ -881,7 +909,7 @@ void PMDataManager::removeNotPreservedAn<br>
         std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==<br>
         PreservedSet.end()) {<br>
       // Remove this analysis<br>
-      if (PassDebugging >= Details) {<br>
+      if (GlobalPassDebugOpts->PassDebugging >= Details) {<br>
         Pass *S = Info->second;<br>
         dbgs() << " -- '" <<  P->getPassName() << "' is not preserving '";<br>
         dbgs() << S->getPassName() << "'\n";<br>
@@ -905,7 +933,7 @@ void PMDataManager::removeNotPreservedAn<br>
           std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==<br>
              PreservedSet.end()) {<br>
         // Remove this analysis<br>
-        if (PassDebugging >= Details) {<br>
+        if (GlobalPassDebugOpts->PassDebugging >= Details) {<br>
           Pass *S = Info->second;<br>
           dbgs() << " -- '" <<  P->getPassName() << "' is not preserving '";<br>
           dbgs() << S->getPassName() << "'\n";<br>
@@ -928,7 +956,7 @@ void PMDataManager::removeDeadPasses(Pas<br>
<br>
   TPM->collectLastUses(DeadPasses, P);<br>
<br>
-  if (PassDebugging >= Details && !DeadPasses.empty()) {<br>
+  if (GlobalPassDebugOpts->PassDebugging >= Details && !DeadPasses.empty()) {<br>
     dbgs() << " -*- '" <<  P->getPassName();<br>
     dbgs() << "' is the last user of following pass instances.";<br>
     dbgs() << " Free these instances\n";<br>
@@ -1146,7 +1174,7 @@ void PMDataManager::dumpPassArguments()<br>
 void PMDataManager::dumpPassInfo(Pass *P, enum PassDebuggingString S1,<br>
                                  enum PassDebuggingString S2,<br>
                                  StringRef Msg) {<br>
-  if (PassDebugging < Executions)<br>
+  if (GlobalPassDebugOpts->PassDebugging < Executions)<br>
     return;<br>
   dbgs() << (void*)this << std::string(getDepth()*2+1, ' ');<br>
   switch (S1) {<br>
@@ -1187,7 +1215,7 @@ void PMDataManager::dumpPassInfo(Pass *P<br>
 }<br>
<br>
 void PMDataManager::dumpRequiredSet(const Pass *P) const {<br>
-  if (PassDebugging < Details)<br>
+  if (GlobalPassDebugOpts->PassDebugging < Details)<br>
     return;<br>
<br>
   AnalysisUsage analysisUsage;<br>
@@ -1196,7 +1224,7 @@ void PMDataManager::dumpRequiredSet(cons<br>
 }<br>
<br>
 void PMDataManager::dumpPreservedSet(const Pass *P) const {<br>
-  if (PassDebugging < Details)<br>
+  if (GlobalPassDebugOpts->PassDebugging < Details)<br>
     return;<br>
<br>
   AnalysisUsage analysisUsage;<br>
@@ -1206,7 +1234,7 @@ void PMDataManager::dumpPreservedSet(con<br>
<br>
 void PMDataManager::dumpAnalysisUsage(StringRef Msg, const Pass *P,<br>
                                    const AnalysisUsage::VectorType &Set) const {<br>
-  assert(PassDebugging >= Details);<br>
+  assert(GlobalPassDebugOpts->PassDebugging >= Details);<br>
   if (Set.empty())<br>
     return;<br>
   dbgs() << (const void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:";<br>
@@ -1741,11 +1769,6 @@ bool PassManager::run(Module &M) {<br>
 //===----------------------------------------------------------------------===//<br>
 // TimingInfo implementation<br>
<br>
-bool llvm::TimePassesIsEnabled = false;<br>
-static cl::opt<bool,true><br>
-EnableTiming("time-passes", cl::location(TimePassesIsEnabled),<br>
-            cl::desc("Time each pass, printing elapsed time for each on exit"));<br>
-<br>
 // createTheTimeInfo - This method either initializes the TheTimeInfo pointer to<br>
 // a non null value (if the -time-passes option is enabled) or it leaves it<br>
 // null.  It may be called multiple times.<br>
<br>
Modified: llvm/trunk/tools/llvm-as/llvm-as.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-as/llvm-as.cpp?rev=190974&r1=190973&r2=190974&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-as/llvm-as.cpp?rev=190974&r1=190973&r2=190974&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/tools/llvm-as/llvm-as.cpp (original)<br>
+++ llvm/trunk/tools/llvm-as/llvm-as.cpp Wed Sep 18 18:31:16 2013<br>
@@ -20,6 +20,7 @@<br>
 #include "llvm/Assembly/Parser.h"<br>
 #include "llvm/Bitcode/ReaderWriter.h"<br>
 #include "llvm/IR/Module.h"<br>
+#include "llvm/PassManager.h"<br>
 #include "llvm/Support/CommandLine.h"<br>
 #include "llvm/Support/ManagedStatic.h"<br>
 #include "llvm/Support/PrettyStackTrace.h"<br>
@@ -89,6 +90,10 @@ int main(int argc, char **argv) {<br>
   PrettyStackTraceProgram X(argc, argv);<br>
   LLVMContext &Context = getGlobalContext();<br>
   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.<br>
+<br>
+  // Initialize PassManager for -time-passes support.<br>
+  initializePassManager();<br>
+<br>
   cl::ParseCommandLineOptions(argc, argv, "llvm .ll -> .bc assembler\n");<br>
<br>
   // Parse the file now...<br>
<br>
Modified: llvm/trunk/tools/llvm-diff/llvm-diff.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-diff/llvm-diff.cpp?rev=190974&r1=190973&r2=190974&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-diff/llvm-diff.cpp?rev=190974&r1=190973&r2=190974&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/tools/llvm-diff/llvm-diff.cpp (original)<br>
+++ llvm/trunk/tools/llvm-diff/llvm-diff.cpp Wed Sep 18 18:31:16 2013<br>
@@ -20,6 +20,7 @@<br>
 #include "llvm/IR/Module.h"<br>
 #include "llvm/IR/Type.h"<br>
 #include "llvm/IRReader/IRReader.h"<br>
+#include "llvm/PassManager.h"<br>
 #include "llvm/Support/CommandLine.h"<br>
 #include "llvm/Support/MemoryBuffer.h"<br>
 #include "llvm/Support/SourceMgr.h"<br>
@@ -67,6 +68,9 @@ static cl::list<std::string> GlobalsToCo<br>
                                               cl::desc("<globals to compare>"));<br>
<br>
 int main(int argc, char **argv) {<br>
+  // Initialize PassManager for -time-passes support.<br>
+  initializePassManager();<br>
+<br>
   cl::ParseCommandLineOptions(argc, argv);<br>
<br>
   LLVMContext Context;<br>
<br>
Modified: llvm/trunk/tools/llvm-dis/llvm-dis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dis/llvm-dis.cpp?rev=190974&r1=190973&r2=190974&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dis/llvm-dis.cpp?rev=190974&r1=190973&r2=190974&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/tools/llvm-dis/llvm-dis.cpp (original)<br>
+++ llvm/trunk/tools/llvm-dis/llvm-dis.cpp Wed Sep 18 18:31:16 2013<br>
@@ -23,6 +23,7 @@<br>
 #include "llvm/IR/IntrinsicInst.h"<br>
 #include "llvm/IR/Module.h"<br>
 #include "llvm/IR/Type.h"<br>
+#include "llvm/PassManager.h"<br>
 #include "llvm/Support/CommandLine.h"<br>
 #include "llvm/Support/DataStream.h"<br>
 #include "llvm/Support/FormattedStream.h"<br>
@@ -119,6 +120,8 @@ int main(int argc, char **argv) {<br>
   LLVMContext &Context = getGlobalContext();<br>
   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.<br>
<br>
+  // Initialize PassManager for -time-passes support.<br>
+  initializePassManager();<br>
<br>
   cl::ParseCommandLineOptions(argc, argv, "llvm .bc -> .ll disassembler\n");<br>
<br>
<br>
Modified: llvm/trunk/tools/llvm-extract/llvm-extract.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-extract/llvm-extract.cpp?rev=190974&r1=190973&r2=190974&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-extract/llvm-extract.cpp?rev=190974&r1=190973&r2=190974&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/tools/llvm-extract/llvm-extract.cpp (original)<br>
+++ llvm/trunk/tools/llvm-extract/llvm-extract.cpp Wed Sep 18 18:31:16 2013<br>
@@ -96,6 +96,10 @@ int main(int argc, char **argv) {<br>
<br>
   LLVMContext &Context = getGlobalContext();<br>
   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.<br>
+<br>
+  // Initialize PassManager for -time-passes support.<br>
+  initializePassManager();<br>
+<br>
   cl::ParseCommandLineOptions(argc, argv, "llvm extractor\n");<br>
<br>
   // Use lazy loading, since we only care about selected global values.<br>
<br>
Modified: llvm/trunk/tools/llvm-link/llvm-link.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-link/llvm-link.cpp?rev=190974&r1=190973&r2=190974&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-link/llvm-link.cpp?rev=190974&r1=190973&r2=190974&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/tools/llvm-link/llvm-link.cpp (original)<br>
+++ llvm/trunk/tools/llvm-link/llvm-link.cpp Wed Sep 18 18:31:16 2013<br>
@@ -18,6 +18,7 @@<br>
 #include "llvm/IR/LLVMContext.h"<br>
 #include "llvm/IR/Module.h"<br>
 #include "llvm/IRReader/IRReader.h"<br>
+#include "llvm/PassManager.h"<br>
 #include "llvm/Support/CommandLine.h"<br>
 #include "llvm/Support/ManagedStatic.h"<br>
 #include "llvm/Support/Path.h"<br>
@@ -73,6 +74,10 @@ int main(int argc, char **argv) {<br>
<br>
   LLVMContext &Context = getGlobalContext();<br>
   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.<br>
+<br>
+  // Initialize PassManager for -time-passes support.<br>
+  initializePassManager();<br>
+<br>
   cl::ParseCommandLineOptions(argc, argv, "llvm linker\n");<br>
<br>
   unsigned BaseArg = 0;<br>
<br>
Modified: llvm/trunk/tools/llvm-nm/llvm-nm.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=190974&r1=190973&r2=190974&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=190974&r1=190973&r2=190974&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original)<br>
+++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Wed Sep 18 18:31:16 2013<br>
@@ -22,6 +22,7 @@<br>
 #include "llvm/Object/Archive.h"<br>
 #include "llvm/Object/MachOUniversal.h"<br>
 #include "llvm/Object/ObjectFile.h"<br>
+#include "llvm/PassManager.h"<br>
 #include "llvm/Support/CommandLine.h"<br>
 #include "llvm/Support/FileSystem.h"<br>
 #include "llvm/Support/Format.h"<br>
@@ -446,6 +447,10 @@ int main(int argc, char **argv) {<br>
   PrettyStackTraceProgram X(argc, argv);<br>
<br>
   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.<br>
+<br>
+  // Initialize PassManager for -time-passes support.<br>
+  initializePassManager();<br>
+<br>
   cl::ParseCommandLineOptions(argc, argv, "llvm symbol table dumper\n");<br>
<br>
   // llvm-nm only reads binary files.<br>
<br>
Modified: llvm/trunk/tools/llvm-prof/llvm-prof.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-prof/llvm-prof.cpp?rev=190974&r1=190973&r2=190974&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-prof/llvm-prof.cpp?rev=190974&r1=190973&r2=190974&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/tools/llvm-prof/llvm-prof.cpp (original)<br>
+++ llvm/trunk/tools/llvm-prof/llvm-prof.cpp Wed Sep 18 18:31:16 2013<br>
@@ -260,6 +260,9 @@ int main(int argc, char **argv) {<br>
   LLVMContext &Context = getGlobalContext();<br>
   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.<br>
<br>
+  // Initialize PassManager for -time-passes support.<br>
+  initializePassManager();<br>
+<br>
   cl::ParseCommandLineOptions(argc, argv, "llvm profile dump decoder\n");<br>
<br>
   // Read in the bitcode file...<br>
<br>
Modified: llvm/trunk/tools/llvm-stress/llvm-stress.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-stress/llvm-stress.cpp?rev=190974&r1=190973&r2=190974&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-stress/llvm-stress.cpp?rev=190974&r1=190973&r2=190974&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/tools/llvm-stress/llvm-stress.cpp (original)<br>
+++ llvm/trunk/tools/llvm-stress/llvm-stress.cpp Wed Sep 18 18:31:16 2013<br>
@@ -681,6 +681,10 @@ void IntroduceControlFlow(Function *F, R<br>
 int main(int argc, char **argv) {<br>
   // Init LLVM, call llvm_shutdown() on exit, parse args, etc.<br>
   llvm::PrettyStackTraceProgram X(argc, argv);<br>
+<br>
+  // Initialize PassManager for -time-passes support.<br>
+  initializePassManager();<br>
+<br>
   cl::ParseCommandLineOptions(argc, argv, "llvm codegen stress-tester\n");<br>
   llvm_shutdown_obj Y;<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank" class="cremed">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank" class="cremed">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br></div></div>