diff options
author | Zachary Turner <zturner@google.com> | 2018-03-08 20:34:47 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2018-03-08 20:34:47 +0000 |
commit | adad33011f3f5511e5959362fc33003e1e378eb6 (patch) | |
tree | e27f8cb286ddea20f07e6d589f2a8e55c72f0eec /llvm/unittests/Support/MemoryBufferTest.cpp | |
parent | 373c38a2db3787b60a5d2588922e8b8eac389d17 (diff) | |
download | bcm5719-llvm-adad33011f3f5511e5959362fc33003e1e378eb6.tar.gz bcm5719-llvm-adad33011f3f5511e5959362fc33003e1e378eb6.zip |
[Support] Add WriteThroughMemoryBuffer.
This is like MemoryBuffer (read-only) and WritableMemoryBuffer
(writable private), but where the underlying file can be modified
after writing. This is useful when you want to open a file, make
some targeted edits, and then write it back out.
Differential Revision: https://reviews.llvm.org/D44230
llvm-svn: 327057
Diffstat (limited to 'llvm/unittests/Support/MemoryBufferTest.cpp')
-rw-r--r-- | llvm/unittests/Support/MemoryBufferTest.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/llvm/unittests/Support/MemoryBufferTest.cpp b/llvm/unittests/Support/MemoryBufferTest.cpp index 64a7bb676f9..bafdffe752f 100644 --- a/llvm/unittests/Support/MemoryBufferTest.cpp +++ b/llvm/unittests/Support/MemoryBufferTest.cpp @@ -260,4 +260,33 @@ TEST_F(MemoryBufferTest, writableSlice) { for (size_t i = 0; i < MB.getBufferSize(); i += 0x10) EXPECT_EQ("0123456789abcdef", MB.getBuffer().substr(i, 0x10)) << "i: " << i; } + +TEST_F(MemoryBufferTest, writeThroughFile) { + // Create a file initialized with some data + int FD; + SmallString<64> TestPath; + sys::fs::createTemporaryFile("MemoryBufferTest_WriteThrough", "temp", FD, + TestPath); + FileRemover Cleanup(TestPath); + raw_fd_ostream OF(FD, true); + OF << "0123456789abcdef"; + OF.close(); + { + auto MBOrError = WriteThroughMemoryBuffer::getFile(TestPath); + ASSERT_FALSE(MBOrError.getError()); + // Write some data. It should be mapped readwrite, so that upon completion + // the original file contents are modified. + WriteThroughMemoryBuffer &MB = **MBOrError; + ASSERT_EQ(16, MB.getBufferSize()); + char *Start = MB.getBufferStart(); + ASSERT_EQ(MB.getBufferEnd(), MB.getBufferStart() + MB.getBufferSize()); + ::memset(Start, 'x', MB.getBufferSize()); + } + + auto MBOrError = MemoryBuffer::getFile(TestPath); + ASSERT_FALSE(MBOrError.getError()); + auto &MB = **MBOrError; + ASSERT_EQ(16, MB.getBufferSize()); + EXPECT_EQ("xxxxxxxxxxxxxxxx", MB.getBuffer()); +} } |