For PR797:
authorReid Spencer <rspencer@reidspencer.com>
Tue, 22 Aug 2006 23:27:23 +0000 (23:27 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Tue, 22 Aug 2006 23:27:23 +0000 (23:27 +0000)
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

include/llvm/System/Path.h
lib/System/Unix/Path.inc
tools/gccld/gccld.cpp
tools/llvm-ld/llvm-ld.cpp

index 8bc8eb8a1e78fe43ecdf518012bd6ac954943804..306ce84228ea469ad7fdb61f165c4e967464ea79 100644 (file)
@@ -101,7 +101,7 @@ namespace sys {
       /// @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 @@ namespace sys {
       /// 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.
index b1e51b0aff9388b681280f1ef2730c6cdd6397ab..db7f4c6fabf52e114141f5e50c6d28f07b1ab565 100644 (file)
@@ -390,19 +390,28 @@ static bool AddPermissionBits(const Path &File, int bits) {
   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
index a9df06d69c79607e92003ba441aa31890a4e66be..c8ecde549156743664eec5d6558c972037d2be10 100644 (file)
@@ -385,13 +385,23 @@ int main(int argc, char **argv, char **envp ) {
       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;
index c8e505c9757bff4d327630a1334e0d6f5e0d8655..679522f63df71092abeec348b47e6b9d2e738ca2 100644 (file)
@@ -598,11 +598,21 @@ int main(int argc, char **argv, char **envp) {
       }
 
       // 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;