diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2006-08-22 23:27:23 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2006-08-22 23:27:23 +0000 |
commit | e1647f46982c67b68f40ec6d775f165cacf0a9dc (patch) | |
tree | e78e8d9f6a67fb5283d8e6c4cd83ddbddc9bac93 | |
parent | ab96bb1df3987b94fcd897e97f917ecd064deed3 (diff) | |
download | external_llvm-e1647f46982c67b68f40ec6d775f165cacf0a9dc.zip external_llvm-e1647f46982c67b68f40ec6d775f165cacf0a9dc.tar.gz external_llvm-e1647f46982c67b68f40ec6d775f165cacf0a9dc.tar.bz2 |
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
-rw-r--r-- | include/llvm/System/Path.h | 8 | ||||
-rw-r--r-- | lib/System/Unix/Path.inc | 27 | ||||
-rw-r--r-- | tools/gccld/gccld.cpp | 18 | ||||
-rw-r--r-- | tools/llvm-ld/llvm-ld.cpp | 16 |
4 files changed, 49 insertions, 20 deletions
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 @@ 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. 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 @@ 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 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 @@ 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; 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 @@ 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; |