[llvm-commits] CVS: llvm/tools/extract/extract.cpp

Reid Spencer reid at x10sys.com
Wed Dec 29 21:36:22 PST 2004



Changes in directory llvm/tools/extract:

extract.cpp updated: 1.25 -> 1.26
---
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:  (+51 -44)

Index: llvm/tools/extract/extract.cpp
diff -u llvm/tools/extract/extract.cpp:1.25 llvm/tools/extract/extract.cpp:1.26
--- llvm/tools/extract/extract.cpp:1.25	Wed Sep  1 17:55:37 2004
+++ llvm/tools/extract/extract.cpp	Wed Dec 29 23:36:07 2004
@@ -45,53 +45,60 @@
             cl::value_desc("function"));
 
 int main(int argc, char **argv) {
-  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;
-  }
-
-  // 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;
-  }
+  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;
+    }
 
-  // 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;
-
-  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";
+    // 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;
     }
-    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());
+    // 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;
+
+    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;       
+    }
 
-  if (Out != &std::cout)
-    delete Out;
-  return 0;
+    Passes.add(new WriteBytecodePass(Out));  // Write bytecode to file...
+    Passes.run(*M.get());
+
+    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;
 }






More information about the llvm-commits mailing list