For PR797:
Change the Path::make*OnDisk methods exception free and adjust their usage.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29836 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/System/Path.h b/include/llvm/System/Path.h
index 8bc8eb8..306ce84 100644
--- a/include/llvm/System/Path.h
+++ b/include/llvm/System/Path.h
@@ -101,7 +101,7 @@
       /// @param ErrMsg Optional place for an error message if an error occurs
       /// @brief Constrct a path to an new, unique, existing temporary
       /// directory.
-      static Path GetTemporaryDirectory(std::string* ErrMsg);
+      static Path GetTemporaryDirectory(std::string* ErrMsg = 0);
 
       /// Construct a vector of sys::Path that contains the "standard" system
       /// library paths suitable for linking into programs. This function *must*
@@ -424,18 +424,18 @@
       /// This method attempts to make the file referenced by the Path object
       /// available for reading so that the canRead() method will return true.
       /// @brief Make the file readable;
-      void makeReadableOnDisk();
+      bool makeReadableOnDisk(std::string* ErrMsg);
 
       /// This method attempts to make the file referenced by the Path object
       /// available for writing so that the canWrite() method will return true.
       /// @brief Make the file writable;
-      void makeWriteableOnDisk();
+      bool makeWriteableOnDisk(std::string* ErrMsg);
 
       /// This method attempts to make the file referenced by the Path object
       /// available for execution so that the canExecute() method will return
       /// true.
       /// @brief Make the file readable;
-      void makeExecutableOnDisk();
+      bool makeExecutableOnDisk(std::string* ErrMsg);
 
       /// This method allows the last modified time stamp and permission bits
       /// to be set on the disk object referenced by the Path.
diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc
index b1e51b0..db7f4c6 100644
--- a/lib/System/Unix/Path.inc
+++ b/lib/System/Unix/Path.inc
@@ -390,19 +390,28 @@
   return true;
 }
 
-void Path::makeReadableOnDisk() {
-  if (!AddPermissionBits(*this, 0444))
-    ThrowErrno(path + ": can't make file readable");
+bool Path::makeReadableOnDisk(std::string* ErrMsg) {
+  if (!AddPermissionBits(*this, 0444)) {
+    MakeErrMsg(ErrMsg, path + ": can't make file readable");
+    return true;
+  }
+  return false;
 }
 
-void Path::makeWriteableOnDisk() {
-  if (!AddPermissionBits(*this, 0222))
-    ThrowErrno(path + ": can't make file writable");
+bool Path::makeWriteableOnDisk(std::string* ErrMsg) {
+  if (!AddPermissionBits(*this, 0222)) {
+    MakeErrMsg(ErrMsg, path + ": can't make file writable");
+    return true;
+  }
+  return false;
 }
 
-void Path::makeExecutableOnDisk() {
-  if (!AddPermissionBits(*this, 0111))
-    ThrowErrno(path + ": can't make file executable");
+bool Path::makeExecutableOnDisk(std::string* ErrMsg) {
+  if (!AddPermissionBits(*this, 0111)) {
+    MakeErrMsg(ErrMsg, path + ": can't make file executable");
+    return true;
+  }
+  return false;
 }
 
 bool
diff --git a/tools/gccld/gccld.cpp b/tools/gccld/gccld.cpp
index a9df06d..c8ecde5 100644
--- a/tools/gccld/gccld.cpp
+++ b/tools/gccld/gccld.cpp
@@ -385,13 +385,23 @@
       EmitShellScript(argv);
 
       // Make the bytecode file readable and directly executable in LLEE
-      sys::Path(RealBytecodeOutput).makeExecutableOnDisk();
-      sys::Path(RealBytecodeOutput).makeReadableOnDisk();
+      std::string ErrMsg;
+      if (sys::Path(RealBytecodeOutput).makeExecutableOnDisk(&ErrMsg)) {
+        std::cerr << argv[0] << ": " << ErrMsg << "\n";
+        return 1;
+      }
+      if (sys::Path(RealBytecodeOutput).makeReadableOnDisk(&ErrMsg)) {
+        std::cerr << argv[0] << ": " << ErrMsg << "\n";
+        return 1;
+      }
     }
 
     // Make the output, whether native or script, executable as well...
-    sys::Path(OutputFilename).makeExecutableOnDisk();
-
+    std::string ErrMsg;
+    if (sys::Path(OutputFilename).makeExecutableOnDisk(&ErrMsg)) {
+      std::cerr << argv[0] << ": " << ErrMsg << "\n";
+      return 1;
+    }
   } catch (const char*msg) {
     std::cerr << argv[0] << ": " << msg << "\n";
     exitCode = 1;
diff --git a/tools/llvm-ld/llvm-ld.cpp b/tools/llvm-ld/llvm-ld.cpp
index c8e505c..679522f 100644
--- a/tools/llvm-ld/llvm-ld.cpp
+++ b/tools/llvm-ld/llvm-ld.cpp
@@ -598,11 +598,21 @@
       }
 
       // Make the script executable...
-      sys::Path(OutputFilename).makeExecutableOnDisk();
+      std::string ErrMsg;
+      if (sys::Path(OutputFilename).makeExecutableOnDisk(&ErrMsg)) {
+        std::cerr << argv[0] << ": " << ErrMsg << "\n";
+        return 1;
+      }
 
       // Make the bytecode file readable and directly executable in LLEE as well
-      sys::Path(RealBytecodeOutput).makeExecutableOnDisk();
-      sys::Path(RealBytecodeOutput).makeReadableOnDisk();
+      if (sys::Path(RealBytecodeOutput).makeExecutableOnDisk(&ErrMsg)) {
+        std::cerr << argv[0] << ": " << ErrMsg << "\n";
+        return 1;
+      }
+      if (sys::Path(RealBytecodeOutput).makeReadableOnDisk(&ErrMsg)) {
+        std::cerr << argv[0] << ": " << ErrMsg << "\n";
+        return 1;
+      }
     }
 
     return 0;