diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-12-30 05:36:08 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-12-30 05:36:08 +0000 |
commit | 1ef8bdaedbd98bee35a573b8bc87149f2182cb5e (patch) | |
tree | dc21da7903997dfbcf6061f19b35a2a522c740b9 /tools/opt/opt.cpp | |
parent | c18671cdcd53df08cbeff7ecf443475f61971b9d (diff) | |
download | external_llvm-1ef8bdaedbd98bee35a573b8bc87149f2182cb5e.zip external_llvm-1ef8bdaedbd98bee35a573b8bc87149f2182cb5e.tar.gz external_llvm-1ef8bdaedbd98bee35a573b8bc87149f2182cb5e.tar.bz2 |
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.cpp | 179 |
1 files changed, 93 insertions, 86 deletions
diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index dcc3666..3ca5d42 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; } |