[llvm] r185726 - Add a createUniqueFile function and switch llvm's users of unique_file.

Manuel Klimek klimek at google.com
Mon Jul 8 07:48:05 PDT 2013


On Fri, Jul 5, 2013 at 11:01 PM, Rafael Espindola <
rafael.espindola at gmail.com> wrote:

> Author: rafael
> Date: Fri Jul  5 16:01:08 2013
> New Revision: 185726
>
> URL: http://llvm.org/viewvc/llvm-project?rev=185726&view=rev
> Log:
> Add a createUniqueFile function and switch llvm's users of unique_file.
>
> This function is complementary to createTemporaryFile. It handles the case
> were
> the unique file is *not* temporary: we will rename it in the end. Since we
> will rename it, the file has to be in the same filesystem as the final
> destination and we don't prepend the system temporary directory.
>
> This has a small semantic difference from unique_file: the default mode is
> 0666.
> This matches the behavior of most unix tools. For example, with this change
> lld now produces files with the same permissions as ld. I will add a test
> of this change when I port clang over to createUniqueFile (next commit).
>
> Modified:
>     llvm/trunk/include/llvm/Support/FileSystem.h
>     llvm/trunk/lib/Support/FileOutputBuffer.cpp
>     llvm/trunk/lib/Support/LockFileManager.cpp
>     llvm/trunk/lib/Support/Path.cpp
>     llvm/trunk/tools/bugpoint/ExecutionDriver.cpp
>     llvm/trunk/tools/bugpoint/ExtractFunction.cpp
>     llvm/trunk/tools/bugpoint/OptimizerDriver.cpp
>     llvm/trunk/tools/bugpoint/ToolRunner.cpp
>     llvm/trunk/tools/llvm-ar/ArchiveWriter.cpp
>
> Modified: llvm/trunk/include/llvm/Support/FileSystem.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FileSystem.h?rev=185726&r1=185725&r2=185726&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/FileSystem.h (original)
> +++ llvm/trunk/include/llvm/Support/FileSystem.h Fri Jul  5 16:01:08 2013
> @@ -575,6 +575,35 @@ error_code unique_file(const Twine &mode
>  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
>
> Modified: llvm/trunk/lib/Support/FileOutputBuffer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FileOutputBuffer.cpp?rev=185726&r1=185725&r2=185726&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/FileOutputBuffer.cpp (original)
> +++ llvm/trunk/lib/Support/FileOutputBuffer.cpp Fri Jul  5 16:01:08 2013
> @@ -65,8 +65,8 @@ error_code FileOutputBuffer::create(Stri
>    // 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;
>
>
> Modified: llvm/trunk/lib/Support/LockFileManager.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/LockFileManager.cpp?rev=185726&r1=185725&r2=185726&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/LockFileManager.cpp (original)
> +++ llvm/trunk/lib/Support/LockFileManager.cpp Fri Jul  5 16:01:08 2013
> @@ -78,10 +78,9 @@ LockFileManager::LockFileManager(StringR
>    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;
>    }
>
> Modified: llvm/trunk/lib/Support/Path.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Path.cpp?rev=185726&r1=185725&r2=185726&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/Path.cpp (original)
> +++ llvm/trunk/lib/Support/Path.cpp Fri Jul  5 16:01:08 2013
> @@ -654,6 +654,17 @@ error_code unique_file(const Twine &Mode
>    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) {
>
> Modified: llvm/trunk/tools/bugpoint/ExecutionDriver.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/ExecutionDriver.cpp?rev=185726&r1=185725&r2=185726&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/bugpoint/ExecutionDriver.cpp (original)
> +++ llvm/trunk/tools/bugpoint/ExecutionDriver.cpp Fri Jul  5 16:01:08 2013
> @@ -267,7 +267,7 @@ void BugDriver::compileProgram(Module *M
>    // 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(co
>      // 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(co
>
>    // 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";
>
> Modified: llvm/trunk/tools/bugpoint/ExtractFunction.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/ExtractFunction.cpp?rev=185726&r1=185725&r2=185726&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/bugpoint/ExtractFunction.cpp (original)
> +++ llvm/trunk/tools/bugpoint/ExtractFunction.cpp Fri Jul  5 16:01:08 2013
> @@ -365,8 +365,8 @@ Module *BugDriver::ExtractMappedBlocksFr
>                                                   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";
>
> Modified: llvm/trunk/tools/bugpoint/OptimizerDriver.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/OptimizerDriver.cpp?rev=185726&r1=185725&r2=185726&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/bugpoint/OptimizerDriver.cpp (original)
> +++ llvm/trunk/tools/bugpoint/OptimizerDriver.cpp Fri Jul  5 16:01:08 2013
> @@ -124,8 +124,8 @@ bool BugDriver::runPasses(Module *Progra
>    // 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 *Progra
>    // 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";
>
> Modified: llvm/trunk/tools/bugpoint/ToolRunner.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/ToolRunner.cpp?rev=185726&r1=185725&r2=185726&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/bugpoint/ToolRunner.cpp (original)
> +++ llvm/trunk/tools/bugpoint/ToolRunner.cpp Fri Jul  5 16:01:08 2013
> @@ -478,7 +478,7 @@ GCC::FileType LLC::OutputCode(const std:
>
>    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::strin
>
>    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::str
>                            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);
>
> Modified: llvm/trunk/tools/llvm-ar/ArchiveWriter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/ArchiveWriter.cpp?rev=185726&r1=185725&r2=185726&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-ar/ArchiveWriter.cpp (original)
> +++ llvm/trunk/tools/llvm-ar/ArchiveWriter.cpp Fri Jul  5 16:01:08 2013
> @@ -260,8 +260,8 @@ bool Archive::writeToDisk(bool TruncateN
>    // 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);
>

This regressed the Object/nm-archive test. We need to anchor on the output
file to make sure we can actually write the temporary file.

Fixed in r185825.


>    if (EC)
>      return true;
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130708/e0763e20/attachment.html>


More information about the llvm-commits mailing list