aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/opt/CMakeLists.txt1
-rw-r--r--tools/opt/Makefile1
-rw-r--r--tools/opt/opt.cpp311
3 files changed, 150 insertions, 163 deletions
diff --git a/tools/opt/CMakeLists.txt b/tools/opt/CMakeLists.txt
index b75cda0..0570d0e 100644
--- a/tools/opt/CMakeLists.txt
+++ b/tools/opt/CMakeLists.txt
@@ -1,4 +1,3 @@
-set(LLVM_REQUIRES_EH 1)
set(LLVM_LINK_COMPONENTS bitreader asmparser bitwriter instrumentation scalaropts ipo)
add_llvm_tool(opt
diff --git a/tools/opt/Makefile b/tools/opt/Makefile
index b17be34..726cad8 100644
--- a/tools/opt/Makefile
+++ b/tools/opt/Makefile
@@ -8,7 +8,6 @@
##===----------------------------------------------------------------------===##
LEVEL = ../..
TOOLNAME = opt
-REQUIRES_EH := 1
LINK_COMPONENTS := bitreader bitwriter asmparser instrumentation scalaropts ipo
diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp
index 8674a7d..1950a73 100644
--- a/tools/opt/opt.cpp
+++ b/tools/opt/opt.cpp
@@ -346,198 +346,187 @@ void AddStandardLinkPasses(PassManager &PM) {
int main(int argc, char **argv) {
llvm_shutdown_obj X; // Call llvm_shutdown() on exit.
LLVMContext &Context = getGlobalContext();
- try {
- cl::ParseCommandLineOptions(argc, argv,
- "llvm .bc -> .bc modular optimizer and analysis printer\n");
- sys::PrintStackTraceOnErrorSignal();
+
+ cl::ParseCommandLineOptions(argc, argv,
+ "llvm .bc -> .bc modular optimizer and analysis printer\n");
+ sys::PrintStackTraceOnErrorSignal();
- // Allocate a full target machine description only if necessary.
- // FIXME: The choice of target should be controllable on the command line.
- std::auto_ptr<TargetMachine> target;
+ // Allocate a full target machine description only if necessary.
+ // FIXME: The choice of target should be controllable on the command line.
+ std::auto_ptr<TargetMachine> target;
- SMDiagnostic Err;
+ SMDiagnostic Err;
- // Load the input module...
- std::auto_ptr<Module> M;
- M.reset(ParseIRFile(InputFilename, Err, Context));
+ // Load the input module...
+ std::auto_ptr<Module> M;
+ M.reset(ParseIRFile(InputFilename, Err, Context));
- if (M.get() == 0) {
- Err.Print(argv[0], errs());
- return 1;
- }
+ if (M.get() == 0) {
+ Err.Print(argv[0], errs());
+ return 1;
+ }
- // Figure out what stream we are supposed to write to...
- // FIXME: outs() is not binary!
- raw_ostream *Out = &outs(); // Default to printing to stdout...
- if (OutputFilename != "-") {
- // Make sure that the Output file gets unlinked from the disk if we get a
- // SIGINT
- sys::RemoveFileOnSignal(sys::Path(OutputFilename));
-
- std::string ErrorInfo;
- Out = new raw_fd_ostream(OutputFilename.c_str(), ErrorInfo,
- raw_fd_ostream::F_Binary);
- if (!ErrorInfo.empty()) {
- errs() << ErrorInfo << '\n';
- delete Out;
- return 1;
- }
+ // Figure out what stream we are supposed to write to...
+ // FIXME: outs() is not binary!
+ raw_ostream *Out = &outs(); // Default to printing to stdout...
+ if (OutputFilename != "-") {
+ // Make sure that the Output file gets unlinked from the disk if we get a
+ // SIGINT
+ sys::RemoveFileOnSignal(sys::Path(OutputFilename));
+
+ std::string ErrorInfo;
+ Out = new raw_fd_ostream(OutputFilename.c_str(), ErrorInfo,
+ raw_fd_ostream::F_Binary);
+ if (!ErrorInfo.empty()) {
+ errs() << ErrorInfo << '\n';
+ delete Out;
+ return 1;
}
+ }
- // If the output is set to be emitted to standard out, and standard out is a
- // console, print out a warning message and refuse to do it. We don't
- // impress anyone by spewing tons of binary goo to a terminal.
- if (!Force && !NoOutput && !OutputAssembly)
- if (CheckBitcodeOutputToConsole(*Out, !Quiet))
- NoOutput = true;
-
- // Create a PassManager to hold and optimize the collection of passes we are
- // about to build...
- //
- PassManager Passes;
-
- // Add an appropriate TargetData instance for this module...
- TargetData *TD = 0;
- const std::string &ModuleDataLayout = M.get()->getDataLayout();
- if (!ModuleDataLayout.empty())
- TD = new TargetData(ModuleDataLayout);
- else if (!NoDefaultDataLayout)
- TD = new TargetData(DefaultDataLayout);
-
+ // If the output is set to be emitted to standard out, and standard out is a
+ // console, print out a warning message and refuse to do it. We don't
+ // impress anyone by spewing tons of binary goo to a terminal.
+ if (!Force && !NoOutput && !OutputAssembly)
+ if (CheckBitcodeOutputToConsole(*Out, !Quiet))
+ NoOutput = true;
+
+ // Create a PassManager to hold and optimize the collection of passes we are
+ // about to build...
+ //
+ PassManager Passes;
+
+ // Add an appropriate TargetData instance for this module...
+ TargetData *TD = 0;
+ const std::string &ModuleDataLayout = M.get()->getDataLayout();
+ if (!ModuleDataLayout.empty())
+ TD = new TargetData(ModuleDataLayout);
+ else if (!NoDefaultDataLayout)
+ TD = new TargetData(DefaultDataLayout);
+
+ if (TD)
+ Passes.add(TD);
+
+ FunctionPassManager *FPasses = NULL;
+ if (OptLevelO1 || OptLevelO2 || OptLevelO3) {
+ FPasses = new FunctionPassManager(new ExistingModuleProvider(M.get()));
if (TD)
- Passes.add(TD);
-
- FunctionPassManager *FPasses = NULL;
- if (OptLevelO1 || OptLevelO2 || OptLevelO3) {
- FPasses = new FunctionPassManager(new ExistingModuleProvider(M.get()));
- if (TD)
- FPasses->add(new TargetData(*TD));
- }
-
- // If the -strip-debug command line option was specified, add it. If
- // -std-compile-opts was also specified, it will handle StripDebug.
- if (StripDebug && !StandardCompileOpts)
- addPass(Passes, createStripSymbolsPass(true));
-
- // Create a new optimization pass for each one specified on the command line
- for (unsigned i = 0; i < PassList.size(); ++i) {
- // Check to see if -std-compile-opts was specified before this option. If
- // so, handle it.
- if (StandardCompileOpts &&
- StandardCompileOpts.getPosition() < PassList.getPosition(i)) {
- AddStandardCompilePasses(Passes);
- StandardCompileOpts = false;
- }
-
- if (StandardLinkOpts &&
- StandardLinkOpts.getPosition() < PassList.getPosition(i)) {
- AddStandardLinkPasses(Passes);
- StandardLinkOpts = false;
- }
-
- if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) {
- AddOptimizationPasses(Passes, *FPasses, 1);
- OptLevelO1 = false;
- }
-
- if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) {
- AddOptimizationPasses(Passes, *FPasses, 2);
- OptLevelO2 = false;
- }
-
- if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) {
- AddOptimizationPasses(Passes, *FPasses, 3);
- OptLevelO3 = false;
- }
-
- const PassInfo *PassInf = PassList[i];
- Pass *P = 0;
- if (PassInf->getNormalCtor())
- P = PassInf->getNormalCtor()();
- else
- errs() << argv[0] << ": cannot create pass: "
- << PassInf->getPassName() << "\n";
- if (P) {
- bool isBBPass = dynamic_cast<BasicBlockPass*>(P) != 0;
- bool isLPass = !isBBPass && dynamic_cast<LoopPass*>(P) != 0;
- bool isFPass = !isLPass && dynamic_cast<FunctionPass*>(P) != 0;
- bool isCGSCCPass = !isFPass && dynamic_cast<CallGraphSCCPass*>(P) != 0;
-
- addPass(Passes, P);
-
- if (AnalyzeOnly) {
- if (isBBPass)
- Passes.add(new BasicBlockPassPrinter(PassInf));
- else if (isLPass)
- Passes.add(new LoopPassPrinter(PassInf));
- else if (isFPass)
- Passes.add(new FunctionPassPrinter(PassInf));
- else if (isCGSCCPass)
- Passes.add(new CallGraphSCCPassPrinter(PassInf));
- else
- Passes.add(new ModulePassPrinter(PassInf));
- }
- }
-
- if (PrintEachXForm)
- Passes.add(createPrintModulePass(&errs()));
- }
+ FPasses->add(new TargetData(*TD));
+ }
- // If -std-compile-opts was specified at the end of the pass list, add them.
- if (StandardCompileOpts) {
+ // If the -strip-debug command line option was specified, add it. If
+ // -std-compile-opts was also specified, it will handle StripDebug.
+ if (StripDebug && !StandardCompileOpts)
+ addPass(Passes, createStripSymbolsPass(true));
+
+ // Create a new optimization pass for each one specified on the command line
+ for (unsigned i = 0; i < PassList.size(); ++i) {
+ // Check to see if -std-compile-opts was specified before this option. If
+ // so, handle it.
+ if (StandardCompileOpts &&
+ StandardCompileOpts.getPosition() < PassList.getPosition(i)) {
AddStandardCompilePasses(Passes);
StandardCompileOpts = false;
}
- if (StandardLinkOpts) {
+ if (StandardLinkOpts &&
+ StandardLinkOpts.getPosition() < PassList.getPosition(i)) {
AddStandardLinkPasses(Passes);
StandardLinkOpts = false;
}
- if (OptLevelO1) {
+ if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) {
AddOptimizationPasses(Passes, *FPasses, 1);
+ OptLevelO1 = false;
}
- if (OptLevelO2) {
+ if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) {
AddOptimizationPasses(Passes, *FPasses, 2);
+ OptLevelO2 = false;
}
- if (OptLevelO3) {
+ if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) {
AddOptimizationPasses(Passes, *FPasses, 3);
+ OptLevelO3 = false;
}
- if (OptLevelO1 || OptLevelO2 || OptLevelO3) {
- FPasses->doInitialization();
- for (Module::iterator I = M.get()->begin(), E = M.get()->end();
- I != E; ++I)
- FPasses->run(*I);
+ const PassInfo *PassInf = PassList[i];
+ Pass *P = 0;
+ if (PassInf->getNormalCtor())
+ P = PassInf->getNormalCtor()();
+ else
+ errs() << argv[0] << ": cannot create pass: "
+ << PassInf->getPassName() << "\n";
+ if (P) {
+ bool isBBPass = dynamic_cast<BasicBlockPass*>(P) != 0;
+ bool isLPass = !isBBPass && dynamic_cast<LoopPass*>(P) != 0;
+ bool isFPass = !isLPass && dynamic_cast<FunctionPass*>(P) != 0;
+ bool isCGSCCPass = !isFPass && dynamic_cast<CallGraphSCCPass*>(P) != 0;
+
+ addPass(Passes, P);
+
+ if (AnalyzeOnly) {
+ if (isBBPass)
+ Passes.add(new BasicBlockPassPrinter(PassInf));
+ else if (isLPass)
+ Passes.add(new LoopPassPrinter(PassInf));
+ else if (isFPass)
+ Passes.add(new FunctionPassPrinter(PassInf));
+ else if (isCGSCCPass)
+ Passes.add(new CallGraphSCCPassPrinter(PassInf));
+ else
+ Passes.add(new ModulePassPrinter(PassInf));
+ }
}
- // Check that the module is well formed on completion of optimization
- if (!NoVerify && !VerifyEach)
- Passes.add(createVerifierPass());
+ if (PrintEachXForm)
+ Passes.add(createPrintModulePass(&errs()));
+ }
- // Write bitcode or assembly out to disk or outs() as the last step...
- if (!NoOutput && !AnalyzeOnly) {
- if (OutputAssembly)
- Passes.add(createPrintModulePass(Out));
- else
- Passes.add(createBitcodeWriterPass(*Out));
- }
+ // If -std-compile-opts was specified at the end of the pass list, add them.
+ if (StandardCompileOpts) {
+ AddStandardCompilePasses(Passes);
+ StandardCompileOpts = false;
+ }
- // Now that we have all of the passes ready, run them.
- Passes.run(*M.get());
+ if (StandardLinkOpts) {
+ AddStandardLinkPasses(Passes);
+ StandardLinkOpts = false;
+ }
- // Delete the raw_fd_ostream.
- if (Out != &outs())
- delete Out;
- return 0;
+ if (OptLevelO1)
+ AddOptimizationPasses(Passes, *FPasses, 1);
+
+ if (OptLevelO2)
+ AddOptimizationPasses(Passes, *FPasses, 2);
- } catch (const std::string& msg) {
- errs() << argv[0] << ": " << msg << "\n";
- } catch (...) {
- errs() << argv[0] << ": Unexpected unknown exception occurred.\n";
+ if (OptLevelO3)
+ AddOptimizationPasses(Passes, *FPasses, 3);
+
+ if (OptLevelO1 || OptLevelO2 || OptLevelO3) {
+ FPasses->doInitialization();
+ for (Module::iterator I = M.get()->begin(), E = M.get()->end();
+ I != E; ++I)
+ FPasses->run(*I);
}
- llvm_shutdown();
- return 1;
+
+ // Check that the module is well formed on completion of optimization
+ if (!NoVerify && !VerifyEach)
+ Passes.add(createVerifierPass());
+
+ // Write bitcode or assembly out to disk or outs() as the last step...
+ if (!NoOutput && !AnalyzeOnly) {
+ if (OutputAssembly)
+ Passes.add(createPrintModulePass(Out));
+ else
+ Passes.add(createBitcodeWriterPass(*Out));
+ }
+
+ // Now that we have all of the passes ready, run them.
+ Passes.run(*M.get());
+
+ // Delete the raw_fd_ostream.
+ if (Out != &outs())
+ delete Out;
+ return 0;
}