<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>