summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Support/MemoryBufferTest.cpp
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2018-03-08 20:34:47 +0000
committerZachary Turner <zturner@google.com>2018-03-08 20:34:47 +0000
commitadad33011f3f5511e5959362fc33003e1e378eb6 (patch)
treee27f8cb286ddea20f07e6d589f2a8e55c72f0eec /llvm/unittests/Support/MemoryBufferTest.cpp
parent373c38a2db3787b60a5d2588922e8b8eac389d17 (diff)
downloadbcm5719-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.cpp29
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());
+}
}
OpenPOWER on IntegriCloud