From df5b37b8a644e16462f2538abfcd1bde5f33ebb9 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sat, 19 Jan 2019 00:07:57 +0000 Subject: [PATCH] Remove F_modify flag from FileOutputBuffer. This code is dead. There is no use of the feature in the entire LLVM codebase. Differential Revision: https://reviews.llvm.org/D56939 llvm-svn: 351613 --- include/llvm/Support/FileOutputBuffer.h | 5 --- lib/Support/FileOutputBuffer.cpp | 37 +++++----------- unittests/Support/FileOutputBufferTest.cpp | 49 ---------------------- 3 files changed, 11 insertions(+), 80 deletions(-) diff --git a/include/llvm/Support/FileOutputBuffer.h b/include/llvm/Support/FileOutputBuffer.h index 68226ca5550..1dea0d6f067 100644 --- a/include/llvm/Support/FileOutputBuffer.h +++ b/include/llvm/Support/FileOutputBuffer.h @@ -33,11 +33,6 @@ public: 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 diff --git a/lib/Support/FileOutputBuffer.cpp b/lib/Support/FileOutputBuffer.cpp index b8223126227..b98152af9b2 100644 --- a/lib/Support/FileOutputBuffer.cpp +++ b/lib/Support/FileOutputBuffer.cpp @@ -116,30 +116,24 @@ createInMemoryBuffer(StringRef Path, size_t Size, unsigned Mode) { } 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 @@ FileOutputBuffer::create(StringRef Path, size_t Size, unsigned Flags) { 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 @@ FileOutputBuffer::create(StringRef Path, size_t Size, unsigned Flags) { 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); } diff --git a/unittests/Support/FileOutputBufferTest.cpp b/unittests/Support/FileOutputBufferTest.cpp index 554859587d4..ca5cc7d8c81 100644 --- a/unittests/Support/FileOutputBufferTest.cpp +++ b/unittests/Support/FileOutputBufferTest.cpp @@ -122,53 +122,4 @@ TEST(FileOutputBuffer, Test) { // 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