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 | 996ec72d48e86d16dc14b1c014be4c13d2f1f686 (patch) | |
tree | 388b95aebb8676f1fcbf8447e60a06c6223ed613 /llvm/tools/extract | |
parent | a6d9c1415ce032235324f70cd074a4bad4c1cb86 (diff) | |
download | bcm5719-llvm-996ec72d48e86d16dc14b1c014be4c13d2f1f686.tar.gz bcm5719-llvm-996ec72d48e86d16dc14b1c014be4c13d2f1f686.zip |
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.
llvm-svn: 19192
Diffstat (limited to 'llvm/tools/extract')
-rw-r--r-- | llvm/tools/extract/extract.cpp | 89 |
1 files changed, 48 insertions, 41 deletions
diff --git a/llvm/tools/extract/extract.cpp b/llvm/tools/extract/extract.cpp index 95822d03899..c7f942af27e 100644 --- a/llvm/tools/extract/extract.cpp +++ b/llvm/tools/extract/extract.cpp @@ -45,53 +45,60 @@ ExtractFunc("func", cl::desc("Specify function to extract"), cl::init("main"), cl::value_desc("function")); int main(int argc, char **argv) { - cl::ParseCommandLineOptions(argc, argv, " llvm extractor\n"); - sys::PrintStackTraceOnErrorSignal(); + try { + cl::ParseCommandLineOptions(argc, argv, " llvm extractor\n"); + sys::PrintStackTraceOnErrorSignal(); - std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename)); - if (M.get() == 0) { - std::cerr << argv[0] << ": bytecode didn't read correctly.\n"; - return 1; - } + std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename)); + if (M.get() == 0) { + std::cerr << argv[0] << ": bytecode didn't read correctly.\n"; + return 1; + } - // Figure out which function we should extract - Function *F = M.get()->getNamedFunction(ExtractFunc); - if (F == 0) { - std::cerr << argv[0] << ": program doesn't contain function named '" - << ExtractFunc << "'!\n"; - return 1; - } + // Figure out which function we should extract + Function *F = M.get()->getNamedFunction(ExtractFunc); + if (F == 0) { + std::cerr << argv[0] << ": program doesn't contain function named '" + << ExtractFunc << "'!\n"; + return 1; + } - // In addition to deleting all other functions, we also want to spiff it up a - // little bit. Do this now. - // - PassManager Passes; - Passes.add(new TargetData("extract", M.get())); // Use correct TargetData - // Either isolate the function or delete it from the Module - Passes.add(createFunctionExtractionPass(F, DeleteFn)); - Passes.add(createGlobalDCEPass()); // Delete unreachable globals - Passes.add(createFunctionResolvingPass()); // Delete prototypes - Passes.add(createDeadTypeEliminationPass()); // Remove dead types... + // In addition to deleting all other functions, we also want to spiff it up a + // little bit. Do this now. + // + PassManager Passes; + Passes.add(new TargetData("extract", M.get())); // Use correct TargetData + // Either isolate the function or delete it from the Module + Passes.add(createFunctionExtractionPass(F, DeleteFn)); + Passes.add(createGlobalDCEPass()); // Delete unreachable globals + Passes.add(createFunctionResolvingPass()); // Delete prototypes + Passes.add(createDeadTypeEliminationPass()); // Remove dead types... - std::ostream *Out = 0; + std::ostream *Out = 0; - if (OutputFilename != "-") { // Not stdout? - 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; + if (OutputFilename != "-") { // Not stdout? + 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()); + } else { // Specified stdout + Out = &std::cout; } - Out = new std::ofstream(OutputFilename.c_str()); - } else { // Specified stdout - Out = &std::cout; - } - Passes.add(new WriteBytecodePass(Out)); // Write bytecode to file... - Passes.run(*M.get()); + Passes.add(new WriteBytecodePass(Out)); // Write bytecode to file... + Passes.run(*M.get()); - if (Out != &std::cout) - delete Out; - return 0; + if (Out != &std::cout) + delete Out; + 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; } |