Index: llvm/trunk/include/llvm/Support/FileOutputBuffer.h =================================================================== --- llvm/trunk/include/llvm/Support/FileOutputBuffer.h +++ llvm/trunk/include/llvm/Support/FileOutputBuffer.h @@ -33,11 +33,6 @@ enum { /// set the 'x' bit on the resulting file F_executable = 1, - - /// the contents of the new file are initialized from the file that exists - /// at the location (if present). This allows in-place modification of an - /// existing file. - F_modify = 2 }; /// Factory method to create an OutputBuffer object which manages a read/write Index: llvm/trunk/lib/Support/FileOutputBuffer.cpp =================================================================== --- llvm/trunk/lib/Support/FileOutputBuffer.cpp +++ llvm/trunk/lib/Support/FileOutputBuffer.cpp @@ -116,30 +116,24 @@ } static Expected> -createOnDiskBuffer(StringRef Path, size_t Size, bool InitExisting, - unsigned Mode) { +createOnDiskBuffer(StringRef Path, size_t Size, unsigned Mode) { Expected FileOrErr = fs::TempFile::create(Path + ".tmp%%%%%%%", Mode); if (!FileOrErr) return FileOrErr.takeError(); fs::TempFile File = std::move(*FileOrErr); - if (InitExisting) { - if (auto EC = sys::fs::copy_file(Path, File.FD)) - return errorCodeToError(EC); - } else { #ifndef _WIN32 - // On Windows, CreateFileMapping (the mmap function on Windows) - // automatically extends the underlying file. We don't need to - // extend the file beforehand. _chsize (ftruncate on Windows) is - // pretty slow just like it writes specified amount of bytes, - // so we should avoid calling that function. - if (auto EC = fs::resize_file(File.FD, Size)) { - consumeError(File.discard()); - return errorCodeToError(EC); - } -#endif + // On Windows, CreateFileMapping (the mmap function on Windows) + // automatically extends the underlying file. We don't need to + // extend the file beforehand. _chsize (ftruncate on Windows) is + // pretty slow just like it writes specified amount of bytes, + // so we should avoid calling that function. + if (auto EC = fs::resize_file(File.FD, Size)) { + consumeError(File.discard()); + return errorCodeToError(EC); } +#endif // Mmap it. std::error_code EC; @@ -163,15 +157,6 @@ fs::file_status Stat; fs::status(Path, Stat); - if ((Flags & F_modify) && Size == size_t(-1)) { - if (Stat.type() == fs::file_type::regular_file) - Size = Stat.getSize(); - else if (Stat.type() == fs::file_type::file_not_found) - return errorCodeToError(errc::no_such_file_or_directory); - else - return errorCodeToError(errc::invalid_argument); - } - // Usually, we want to create OnDiskBuffer to create a temporary file in // the same directory as the destination file and atomically replaces it // by rename(2). @@ -186,7 +171,7 @@ case fs::file_type::regular_file: case fs::file_type::file_not_found: case fs::file_type::status_error: - return createOnDiskBuffer(Path, Size, !!(Flags & F_modify), Mode); + return createOnDiskBuffer(Path, Size, Mode); default: return createInMemoryBuffer(Path, Size, Mode); } Index: llvm/trunk/unittests/Support/FileOutputBufferTest.cpp =================================================================== --- llvm/trunk/unittests/Support/FileOutputBufferTest.cpp +++ llvm/trunk/unittests/Support/FileOutputBufferTest.cpp @@ -122,53 +122,4 @@ // Clean up. ASSERT_NO_ERROR(fs::remove(TestDirectory.str())); } - -TEST(FileOutputBuffer, TestModify) { - // Create unique temporary directory for these tests - SmallString<128> TestDirectory; - { - ASSERT_NO_ERROR( - fs::createUniqueDirectory("FileOutputBuffer-modify", TestDirectory)); - } - - SmallString<128> File1(TestDirectory); - File1.append("/file"); - // First write some data. - { - Expected> BufferOrErr = - FileOutputBuffer::create(File1, 10); - ASSERT_NO_ERROR(errorToErrorCode(BufferOrErr.takeError())); - std::unique_ptr &Buffer = *BufferOrErr; - memcpy(Buffer->getBufferStart(), "AAAAAAAAAA", 10); - ASSERT_NO_ERROR(errorToErrorCode(Buffer->commit())); - } - - // Then re-open the file for modify and change only some bytes. - { - Expected> BufferOrErr = - FileOutputBuffer::create(File1, size_t(-1), FileOutputBuffer::F_modify); - ASSERT_NO_ERROR(errorToErrorCode(BufferOrErr.takeError())); - std::unique_ptr &Buffer = *BufferOrErr; - ASSERT_EQ(10U, Buffer->getBufferSize()); - uint8_t *Data = Buffer->getBufferStart(); - Data[0] = 'X'; - Data[9] = 'X'; - ASSERT_NO_ERROR(errorToErrorCode(Buffer->commit())); - } - - // Finally, re-open the file for read and verify that it has the modified - // contents. - { - ErrorOr> BufferOrErr = MemoryBuffer::getFile(File1); - ASSERT_NO_ERROR(BufferOrErr.getError()); - std::unique_ptr Buffer = std::move(*BufferOrErr); - ASSERT_EQ(10U, Buffer->getBufferSize()); - EXPECT_EQ(StringRef("XAAAAAAAAX"), Buffer->getBuffer()); - } - - // Clean up. - ASSERT_NO_ERROR(fs::remove(File1)); - ASSERT_NO_ERROR(fs::remove(TestDirectory)); -} - } // anonymous namespace