[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