summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Support/FileSystem.h29
-rw-r--r--lib/Support/FileOutputBuffer.cpp4
-rw-r--r--lib/Support/LockFileManager.cpp7
-rw-r--r--lib/Support/Path.cpp11
-rw-r--r--tools/bugpoint/ExecutionDriver.cpp6
-rw-r--r--tools/bugpoint/ExtractFunction.cpp4
-rw-r--r--tools/bugpoint/OptimizerDriver.cpp8
-rw-r--r--tools/bugpoint/ToolRunner.cpp8
-rw-r--r--tools/llvm-ar/ArchiveWriter.cpp4
9 files changed, 60 insertions, 21 deletions
diff --git a/include/llvm/Support/FileSystem.h b/include/llvm/Support/FileSystem.h
index d8f79ba69d..b729a992c3 100644
--- a/include/llvm/Support/FileSystem.h
+++ b/include/llvm/Support/FileSystem.h
@@ -575,6 +575,35 @@ error_code unique_file(const Twine &model, int &result_fd,
error_code unique_file(const Twine &Model, SmallVectorImpl<char> &ResultPath,
bool MakeAbsolute = true);
+/// @brief Create a uniquely named file.
+///
+/// Generates a unique path suitable for a temporary file and then opens it as a
+/// file. The name is based on \a model with '%' replaced by a random char in
+/// [0-9a-f]. If \a model is not an absolute path, a suitable temporary
+/// directory will be prepended.
+///
+/// Example: clang-%%-%%-%%-%%-%%.s => clang-a0-b1-c2-d3-e4.s
+///
+/// This is an atomic operation. Either the file is created and opened, or the
+/// file system is left untouched.
+///
+/// The intendend use is for files that are to be kept, possibly after
+/// renaming them. For example, when running 'clang -c foo.o', the file can
+/// be first created as foo-abc123.o and then renamed.
+///
+/// @param Model Name to base unique path off of.
+/// @param ResultFD Set to the opened file's file descriptor.
+/// @param ResultPath Set to the opened file's absolute path.
+/// @returns errc::success if Result{FD,Path} have been successfully set,
+/// otherwise a platform specific error_code.
+error_code createUniqueFile(const Twine &Model, int &ResultFD,
+ SmallVectorImpl<char> &ResultPath,
+ unsigned Mode = all_read | all_write);
+
+/// @brief Simpler version for clients that don't want an open file.
+error_code createUniqueFile(const Twine &Model,
+ SmallVectorImpl<char> &ResultPath);
+
/// @brief Create a file in the system temporary directory.
///
/// The filename is of the form prefix-random_chars.suffix. Since the directory
diff --git a/lib/Support/FileOutputBuffer.cpp b/lib/Support/FileOutputBuffer.cpp
index 1ee69b6023..fbfda317e7 100644
--- a/lib/Support/FileOutputBuffer.cpp
+++ b/lib/Support/FileOutputBuffer.cpp
@@ -65,8 +65,8 @@ error_code FileOutputBuffer::create(StringRef FilePath,
// Create new file in same directory but with random name.
SmallString<128> TempFilePath;
int FD;
- EC = sys::fs::unique_file(Twine(FilePath) + ".tmp%%%%%%%",
- FD, TempFilePath, false, 0644);
+ EC = sys::fs::createUniqueFile(Twine(FilePath) + ".tmp%%%%%%%",
+ FD, TempFilePath);
if (EC)
return EC;
diff --git a/lib/Support/LockFileManager.cpp b/lib/Support/LockFileManager.cpp
index 2917e273bc..21c4d4070d 100644
--- a/lib/Support/LockFileManager.cpp
+++ b/lib/Support/LockFileManager.cpp
@@ -78,10 +78,9 @@ LockFileManager::LockFileManager(StringRef FileName)
UniqueLockFileName += "-%%%%%%%%";
int UniqueLockFileID;
if (error_code EC
- = sys::fs::unique_file(UniqueLockFileName.str(),
- UniqueLockFileID,
- UniqueLockFileName,
- /*makeAbsolute=*/false)) {
+ = sys::fs::createUniqueFile(UniqueLockFileName.str(),
+ UniqueLockFileID,
+ UniqueLockFileName)) {
Error = EC;
return;
}
diff --git a/lib/Support/Path.cpp b/lib/Support/Path.cpp
index 36fb9f3a4b..58c7c96c66 100644
--- a/lib/Support/Path.cpp
+++ b/lib/Support/Path.cpp
@@ -654,6 +654,17 @@ error_code unique_file(const Twine &Model, SmallVectorImpl<char> &ResultPath,
return createUniqueEntity(Model, Dummy, ResultPath, MakeAbsolute, 0, FS_Name);
}
+error_code createUniqueFile(const Twine &Model, int &ResultFd,
+ SmallVectorImpl<char> &ResultPath, unsigned Mode) {
+ return createUniqueEntity(Model, ResultFd, ResultPath, false, Mode, FS_File);
+}
+
+error_code createUniqueFile(const Twine &Model,
+ SmallVectorImpl<char> &ResultPath) {
+ int Dummy;
+ return createUniqueEntity(Model, Dummy, ResultPath, false, 0, FS_Name);
+}
+
static error_code createTemporaryFile(const Twine &Model, int &ResultFD,
llvm::SmallVectorImpl<char> &ResultPath,
FSEntity Type) {
diff --git a/tools/bugpoint/ExecutionDriver.cpp b/tools/bugpoint/ExecutionDriver.cpp
index 270dab2317..3d3dac3274 100644
--- a/tools/bugpoint/ExecutionDriver.cpp
+++ b/tools/bugpoint/ExecutionDriver.cpp
@@ -267,7 +267,7 @@ void BugDriver::compileProgram(Module *M, std::string *Error) const {
// Emit the program to a bitcode file...
SmallString<128> BitcodeFile;
int BitcodeFD;
- error_code EC = sys::fs::unique_file(
+ error_code EC = sys::fs::createUniqueFile(
OutputPrefix + "-test-program-%%%%%%%.bc", BitcodeFD, BitcodeFile);
if (EC) {
errs() << ToolName << ": Error making unique filename: " << EC.message()
@@ -306,7 +306,7 @@ std::string BugDriver::executeProgram(const Module *Program,
// Emit the program to a bitcode file...
SmallString<128> UniqueFilename;
int UniqueFD;
- error_code EC = sys::fs::unique_file(
+ error_code EC = sys::fs::createUniqueFile(
OutputPrefix + "-test-program-%%%%%%%.bc", UniqueFD, UniqueFilename);
if (EC) {
errs() << ToolName << ": Error making unique filename: "
@@ -332,7 +332,7 @@ std::string BugDriver::executeProgram(const Module *Program,
// Check to see if this is a valid output filename...
SmallString<128> UniqueFile;
- error_code EC = sys::fs::unique_file(OutputFile, UniqueFile);
+ error_code EC = sys::fs::createUniqueFile(OutputFile, UniqueFile);
if (EC) {
errs() << ToolName << ": Error making unique filename: "
<< EC.message() << "\n";
diff --git a/tools/bugpoint/ExtractFunction.cpp b/tools/bugpoint/ExtractFunction.cpp
index d50f49b2db..2098928b5c 100644
--- a/tools/bugpoint/ExtractFunction.cpp
+++ b/tools/bugpoint/ExtractFunction.cpp
@@ -365,8 +365,8 @@ Module *BugDriver::ExtractMappedBlocksFromModule(const
Module *M) {
SmallString<128> Filename;
int FD;
- error_code EC = sys::fs::unique_file(OutputPrefix + "-extractblocks%%%%%%%",
- FD, Filename);
+ error_code EC = sys::fs::createUniqueFile(
+ OutputPrefix + "-extractblocks%%%%%%%", FD, Filename);
if (EC) {
outs() << "*** Basic Block extraction failed!\n";
errs() << "Error creating temporary file: " << EC.message() << "\n";
diff --git a/tools/bugpoint/OptimizerDriver.cpp b/tools/bugpoint/OptimizerDriver.cpp
index 43f2d3318a..36d536ab89 100644
--- a/tools/bugpoint/OptimizerDriver.cpp
+++ b/tools/bugpoint/OptimizerDriver.cpp
@@ -124,8 +124,8 @@ bool BugDriver::runPasses(Module *Program,
// setup the output file name
outs().flush();
SmallString<128> UniqueFilename;
- error_code EC =
- sys::fs::unique_file(OutputPrefix + "-output-%%%%%%%.bc", UniqueFilename);
+ error_code EC = sys::fs::createUniqueFile(
+ OutputPrefix + "-output-%%%%%%%.bc", UniqueFilename);
if (EC) {
errs() << getToolName() << ": Error making unique filename: "
<< EC.message() << "\n";
@@ -136,8 +136,8 @@ bool BugDriver::runPasses(Module *Program,
// set up the input file name
SmallString<128> InputFilename;
int InputFD;
- EC = sys::fs::unique_file(OutputPrefix + "-input-%%%%%%%.bc", InputFD,
- InputFilename);
+ EC = sys::fs::createUniqueFile(OutputPrefix + "-input-%%%%%%%.bc", InputFD,
+ InputFilename);
if (EC) {
errs() << getToolName() << ": Error making unique filename: "
<< EC.message() << "\n";
diff --git a/tools/bugpoint/ToolRunner.cpp b/tools/bugpoint/ToolRunner.cpp
index bec00364d7..107d0dbaeb 100644
--- a/tools/bugpoint/ToolRunner.cpp
+++ b/tools/bugpoint/ToolRunner.cpp
@@ -478,7 +478,7 @@ GCC::FileType LLC::OutputCode(const std::string &Bitcode,
SmallString<128> UniqueFile;
error_code EC =
- sys::fs::unique_file(Bitcode + "-%%%%%%%" + Suffix, UniqueFile);
+ sys::fs::createUniqueFile(Bitcode + "-%%%%%%%" + Suffix, UniqueFile);
if (EC) {
errs() << "Error making unique filename: " << EC.message() << "\n";
exit(1);
@@ -715,7 +715,7 @@ int GCC::ExecuteProgram(const std::string &ProgramFile,
SmallString<128> OutputBinary;
error_code EC =
- sys::fs::unique_file(ProgramFile+ "-%%%%%%%.gcc.exe", OutputBinary);
+ sys::fs::createUniqueFile(ProgramFile + "-%%%%%%%.gcc.exe", OutputBinary);
if (EC) {
errs() << "Error making unique filename: " << EC.message() << "\n";
exit(1);
@@ -824,8 +824,8 @@ int GCC::MakeSharedObject(const std::string &InputFile, FileType fileType,
const std::vector<std::string> &ArgsForGCC,
std::string &Error) {
SmallString<128> UniqueFilename;
- error_code EC = sys::fs::unique_file(InputFile + "-%%%%%%%" + LTDL_SHLIB_EXT,
- UniqueFilename);
+ error_code EC = sys::fs::createUniqueFile(
+ InputFile + "-%%%%%%%" + LTDL_SHLIB_EXT, UniqueFilename);
if (EC) {
errs() << "Error making unique filename: " << EC.message() << "\n";
exit(1);
diff --git a/tools/llvm-ar/ArchiveWriter.cpp b/tools/llvm-ar/ArchiveWriter.cpp
index 048748a3c9..52ce045c16 100644
--- a/tools/llvm-ar/ArchiveWriter.cpp
+++ b/tools/llvm-ar/ArchiveWriter.cpp
@@ -260,8 +260,8 @@ bool Archive::writeToDisk(bool TruncateNames, std::string *ErrMsg) {
// Create a temporary file to store the archive in
int TmpArchiveFD;
SmallString<128> TmpArchive;
- error_code EC = sys::fs::unique_file("temp-archive-%%%%%%%.a", TmpArchiveFD,
- TmpArchive, true, sys::fs::all_read | sys::fs::all_write);
+ error_code EC = sys::fs::createUniqueFile("temp-archive-%%%%%%%.a",
+ TmpArchiveFD, TmpArchive);
if (EC)
return true;