summaryrefslogtreecommitdiff
path: root/tools/opt/opt.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2004-12-30 05:36:08 +0000
committerReid Spencer <rspencer@reidspencer.com>2004-12-30 05:36:08 +0000
commit1ef8bdaedbd98bee35a573b8bc87149f2182cb5e (patch)
treedc21da7903997dfbcf6061f19b35a2a522c740b9 /tools/opt/opt.cpp
parentc18671cdcd53df08cbeff7ecf443475f61971b9d (diff)
downloadllvm-1ef8bdaedbd98bee35a573b8bc87149f2182cb5e.tar.gz
llvm-1ef8bdaedbd98bee35a573b8bc87149f2182cb5e.tar.bz2
llvm-1ef8bdaedbd98bee35a573b8bc87149f2182cb5e.tar.xz
For PR351:
* Place a try/catch block around the entire tool to Make sure std::string exceptions are caught and printed before exiting the tool. * Make sure we catch unhandled exceptions at the top level so that we don't abort with a useless message but indicate than an unhandled exception was generated. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19192 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/opt/opt.cpp')
-rw-r--r--tools/opt/opt.cpp179
1 files changed, 93 insertions, 86 deletions
diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp
index dcc3666ca1..3ca5d42272 100644
--- a/tools/opt/opt.cpp
+++ b/tools/opt/opt.cpp
@@ -70,102 +70,109 @@ QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet));
// main for opt
//
int main(int argc, char **argv) {
- cl::ParseCommandLineOptions(argc, argv,
- " llvm .bc -> .bc modular optimizer\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;
-
- TargetMachine* TM = NULL;
- std::string ErrorMessage;
-
- // Load the input module...
- std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename, &ErrorMessage));
- if (M.get() == 0) {
- std::cerr << argv[0] << ": ";
- if (ErrorMessage.size())
- std::cerr << ErrorMessage << "\n";
- else
- std::cerr << "bytecode didn't read correctly.\n";
- return 1;
- }
-
- // Figure out what stream we are supposed to write to...
- std::ostream *Out = &std::cout; // Default to printing to stdout...
- if (OutputFilename != "-") {
- if (!Force && std::ifstream(OutputFilename.c_str())) {
- // If force is not specified, make sure not to overwrite a file!
- std::cerr << argv[0] << ": error opening '" << OutputFilename
- << "': file exists!\n"
- << "Use -f command line argument to force output\n";
+ try {
+ cl::ParseCommandLineOptions(argc, argv,
+ " llvm .bc -> .bc modular optimizer\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;
+
+ TargetMachine* TM = NULL;
+ std::string ErrorMessage;
+
+ // Load the input module...
+ std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename, &ErrorMessage));
+ if (M.get() == 0) {
+ std::cerr << argv[0] << ": ";
+ if (ErrorMessage.size())
+ std::cerr << ErrorMessage << "\n";
+ else
+ std::cerr << "bytecode didn't read correctly.\n";
return 1;
}
- Out = new std::ofstream(OutputFilename.c_str());
- if (!Out->good()) {
- std::cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
- return 1;
+ // Figure out what stream we are supposed to write to...
+ std::ostream *Out = &std::cout; // Default to printing to stdout...
+ if (OutputFilename != "-") {
+ if (!Force && std::ifstream(OutputFilename.c_str())) {
+ // If force is not specified, make sure not to overwrite a file!
+ std::cerr << argv[0] << ": error opening '" << OutputFilename
+ << "': file exists!\n"
+ << "Use -f command line argument to force output\n";
+ return 1;
+ }
+ Out = new std::ofstream(OutputFilename.c_str());
+
+ if (!Out->good()) {
+ std::cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
+ return 1;
+ }
+
+ // Make sure that the Output file gets unlinked from the disk if we get a
+ // SIGINT
+ sys::RemoveFileOnSignal(sys::Path(OutputFilename));
}
- // Make sure that the Output file gets unlinked from the disk if we get a
- // SIGINT
- sys::RemoveFileOnSignal(sys::Path(OutputFilename));
- }
-
- // 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 (Out == &std::cout && isStandardOutAConsole() && !Force && !NoOutput
- && !Quiet) {
- std::cerr << "WARNING: It looks like you're attempting to print out a "
- << "bytecode file. I'm\ngoing to pretend you didn't ask me to do"
- << " this (for your own good). If you\nREALLY want to taste LLVM"
- << " bytecode first-hand, you can force output with the\n`-f'"
- << " option.\n\n";
- NoOutput = true;
- }
+ // 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 (Out == &std::cout && isStandardOutAConsole() && !Force && !NoOutput
+ && !Quiet) {
+ std::cerr << "WARNING: It looks like you're attempting to print out a "
+ << "bytecode file. I'm\ngoing to pretend you didn't ask me to do"
+ << " this (for your own good). If you\nREALLY want to taste LLVM"
+ << " bytecode first-hand, you can force output with the\n`-f'"
+ << " option.\n\n";
+ 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...
- Passes.add(new TargetData("opt", M.get()));
-
- // Create a new optimization pass for each one specified on the command line
- for (unsigned i = 0; i < OptimizationList.size(); ++i) {
- const PassInfo *Opt = OptimizationList[i];
-
- if (Opt->getNormalCtor())
- Passes.add(Opt->getNormalCtor()());
- else if (Opt->getTargetCtor()) {
+ // 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...
+ Passes.add(new TargetData("opt", M.get()));
+
+ // Create a new optimization pass for each one specified on the command line
+ for (unsigned i = 0; i < OptimizationList.size(); ++i) {
+ const PassInfo *Opt = OptimizationList[i];
+
+ if (Opt->getNormalCtor())
+ Passes.add(Opt->getNormalCtor()());
+ else if (Opt->getTargetCtor()) {
#if 0
- if (target.get() == NULL)
- target.reset(allocateSparcTargetMachine()); // FIXME: target option
+ if (target.get() == NULL)
+ target.reset(allocateSparcTargetMachine()); // FIXME: target option
#endif
- assert(target.get() && "Could not allocate target machine!");
- Passes.add(Opt->getTargetCtor()(*target.get()));
- } else
- std::cerr << argv[0] << ": cannot create pass: " << Opt->getPassName()
- << "\n";
-
- if (PrintEachXForm)
- Passes.add(new PrintModulePass(&std::cerr));
- }
+ assert(target.get() && "Could not allocate target machine!");
+ Passes.add(Opt->getTargetCtor()(*target.get()));
+ } else
+ std::cerr << argv[0] << ": cannot create pass: " << Opt->getPassName()
+ << "\n";
+
+ if (PrintEachXForm)
+ Passes.add(new PrintModulePass(&std::cerr));
+ }
- // Check that the module is well formed on completion of optimization
- if (!NoVerify)
- Passes.add(createVerifierPass());
+ // Check that the module is well formed on completion of optimization
+ if (!NoVerify)
+ Passes.add(createVerifierPass());
- // Write bytecode out to disk or cout as the last step...
- if (!NoOutput)
- Passes.add(new WriteBytecodePass(Out, Out != &std::cout));
+ // Write bytecode out to disk or cout as the last step...
+ if (!NoOutput)
+ Passes.add(new WriteBytecodePass(Out, Out != &std::cout));
- // Now that we have all of the passes ready, run them.
- Passes.run(*M.get());
+ // Now that we have all of the passes ready, run them.
+ Passes.run(*M.get());
- return 0;
+ return 0;
+ } catch (const std::string& msg) {
+ std::cerr << argv[0] << ": " << msg << "\n";
+ } catch (...) {
+ std::cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
+ }
+ return 1;
}