[llvm-commits] CVS: llvm/tools/opt/opt.cpp
Reid Spencer
reid at x10sys.com
Wed Dec 29 21:36:22 PST 2004
Changes in directory llvm/tools/opt:
opt.cpp updated: 1.99 -> 1.100
---
Log message:
For PR351: http://llvm.cs.uiuc.edu/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.
---
Diffs of the changes: (+95 -88)
Index: llvm/tools/opt/opt.cpp
diff -u llvm/tools/opt/opt.cpp:1.99 llvm/tools/opt/opt.cpp:1.100
--- llvm/tools/opt/opt.cpp:1.99 Sun Nov 14 16:30:08 2004
+++ llvm/tools/opt/opt.cpp Wed Dec 29 23:36:08 2004
@@ -70,102 +70,109 @@
// 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";
- // 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));
-
- // Now that we have all of the passes ready, run them.
- Passes.run(*M.get());
+ if (PrintEachXForm)
+ Passes.add(new PrintModulePass(&std::cerr));
+ }
- return 0;
+ // 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));
+
+ // Now that we have all of the passes ready, run them.
+ Passes.run(*M.get());
+
+ 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;
}
More information about the llvm-commits
mailing list