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
diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp
index ba5e031..4234905 100644
--- a/tools/llvm-nm/llvm-nm.cpp
+++ b/tools/llvm-nm/llvm-nm.cpp
@@ -152,20 +152,27 @@
 }
 
 int main(int argc, char **argv) {
-  cl::ParseCommandLineOptions(argc, argv, " llvm symbol table dumper\n");
-  sys::PrintStackTraceOnErrorSignal();
+  try {
+    cl::ParseCommandLineOptions(argc, argv, " llvm symbol table dumper\n");
+    sys::PrintStackTraceOnErrorSignal();
 
-  ToolName = argv[0];
-  if (BSDFormat) OutputFormat = bsd;
-  if (POSIXFormat) OutputFormat = posix;
+    ToolName = argv[0];
+    if (BSDFormat) OutputFormat = bsd;
+    if (POSIXFormat) OutputFormat = posix;
 
-  switch (InputFilenames.size()) {
-  case 0: InputFilenames.push_back("-");
-  case 1: break;
-  default: MultipleFiles = true;
+    switch (InputFilenames.size()) {
+    case 0: InputFilenames.push_back("-");
+    case 1: break;
+    default: MultipleFiles = true;
+    }
+
+    std::for_each (InputFilenames.begin (), InputFilenames.end (),
+                   DumpSymbolNamesFromFile);
+    return 0;
+  } catch (const std::string& msg) {
+    std::cerr << argv[0] << ": " << msg << "\n";
+  } catch (...) {
+    std::cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
   }
-
-  std::for_each (InputFilenames.begin (), InputFilenames.end (),
-                 DumpSymbolNamesFromFile);
-  return 0;
+  return 1;
 }