12d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//===- llvm/unittest/Support/MemoryBufferTest.cpp - MemoryBuffer tests ----===// 22d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// 32d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// The LLVM Compiler Infrastructure 42d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// 52d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// This file is distributed under the University of Illinois Open Source 62d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// License. See LICENSE.TXT for details. 72d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// 82d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//===----------------------------------------------------------------------===// 92d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// 102d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// This file implements unit tests for the MemoryBuffer support class. 112d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// 122d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//===----------------------------------------------------------------------===// 132d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 14f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky#include "llvm/Support/FileSystem.h" 152d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor#include "llvm/Support/MemoryBuffer.h" 16f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky#include "llvm/Support/raw_ostream.h" 172d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor#include "gtest/gtest.h" 182d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 192d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylorusing namespace llvm; 202d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 21ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Benderskynamespace { 22ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky 232d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylorclass MemoryBufferTest : public testing::Test { 242d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylorprotected: 252d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor MemoryBufferTest() 262d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor : data("this is some data") 272d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor { } 282d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 292c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar void SetUp() override {} 302d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 31ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky /// Common testing for different modes of getOpenFileSlice. 32ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky /// Creates a temporary file with known contents, and uses 33ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky /// MemoryBuffer::getOpenFileSlice to map it. 34ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky /// If \p Reopen is true, the file is closed after creating and reopened 35ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky /// anew before using MemoryBuffer. 36ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky void testGetOpenFileSlice(bool Reopen); 37ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky 38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines typedef std::unique_ptr<MemoryBuffer> OwningBuffer; 392d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 402d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor std::string data; 412d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor}; 422d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 432d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew KaylorTEST_F(MemoryBufferTest, get) { 442d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // Default name and null-terminator flag 452d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor OwningBuffer MB1(MemoryBuffer::getMemBuffer(data)); 46c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_TRUE(nullptr != MB1.get()); 472d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 482d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // RequiresNullTerminator = false 492d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor OwningBuffer MB2(MemoryBuffer::getMemBuffer(data, "one", false)); 50c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_TRUE(nullptr != MB2.get()); 512d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 522d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // RequiresNullTerminator = true 532d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor OwningBuffer MB3(MemoryBuffer::getMemBuffer(data, "two", true)); 54c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_TRUE(nullptr != MB3.get()); 552d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 562d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // verify all 3 buffers point to the same address 572d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor EXPECT_EQ(MB1->getBufferStart(), MB2->getBufferStart()); 582d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor EXPECT_EQ(MB2->getBufferStart(), MB3->getBufferStart()); 592d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 602d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // verify the original data is unmodified after deleting the buffers 612d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor MB1.reset(); 622d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor MB2.reset(); 632d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor MB3.reset(); 642d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor EXPECT_EQ("this is some data", data); 652d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor} 662d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 67072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri GribenkoTEST_F(MemoryBufferTest, NullTerminator4K) { 68072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko // Test that a file with size that is a multiple of the page size can be null 69072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko // terminated correctly by MemoryBuffer. 70072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko int TestFD; 71072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko SmallString<64> TestPath; 72072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko sys::fs::createTemporaryFile("MemoryBufferTest_NullTerminator4K", "temp", 73072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko TestFD, TestPath); 74072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko raw_fd_ostream OF(TestFD, true, /*unbuffered=*/true); 75072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko for (unsigned i = 0; i < 4096 / 16; ++i) { 76072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko OF << "0123456789abcdef"; 77072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko } 78072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko OF.close(); 79072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko 80c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ErrorOr<OwningBuffer> MB = MemoryBuffer::getFile(TestPath.c_str()); 81c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code EC = MB.getError(); 82072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko ASSERT_FALSE(EC); 83072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko 84c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const char *BufData = MB.get()->getBufferStart(); 85072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko EXPECT_EQ('f', BufData[4095]); 86072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko EXPECT_EQ('\0', BufData[4096]); 87072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko} 88072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko 892d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew KaylorTEST_F(MemoryBufferTest, copy) { 902d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // copy with no name 912d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor OwningBuffer MBC1(MemoryBuffer::getMemBufferCopy(data)); 92c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_TRUE(nullptr != MBC1.get()); 932d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 942d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // copy with a name 952d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor OwningBuffer MBC2(MemoryBuffer::getMemBufferCopy(data, "copy")); 96c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_TRUE(nullptr != MBC2.get()); 972d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 982d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // verify the two copies do not point to the same place 992d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor EXPECT_NE(MBC1->getBufferStart(), MBC2->getBufferStart()); 1002d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor} 1012d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 1022d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew KaylorTEST_F(MemoryBufferTest, make_new) { 1032d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // 0-sized buffer 1042d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor OwningBuffer Zero(MemoryBuffer::getNewUninitMemBuffer(0)); 105c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_TRUE(nullptr != Zero.get()); 1062d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 1072d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // uninitialized buffer with no name 1082d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor OwningBuffer One(MemoryBuffer::getNewUninitMemBuffer(321)); 109c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_TRUE(nullptr != One.get()); 1102d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 1112d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // uninitialized buffer with name 1122d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor OwningBuffer Two(MemoryBuffer::getNewUninitMemBuffer(123, "bla")); 113c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_TRUE(nullptr != Two.get()); 1142d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 1152d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // 0-initialized buffer with no name 1162d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor OwningBuffer Three(MemoryBuffer::getNewMemBuffer(321, data)); 117c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_TRUE(nullptr != Three.get()); 1182d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor for (size_t i = 0; i < 321; ++i) 1192d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor EXPECT_EQ(0, Three->getBufferStart()[0]); 1202d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 1212d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor // 0-initialized buffer with name 1222d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor OwningBuffer Four(MemoryBuffer::getNewMemBuffer(123, "zeros")); 123c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_TRUE(nullptr != Four.get()); 1242d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor for (size_t i = 0; i < 123; ++i) 1252d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor EXPECT_EQ(0, Four->getBufferStart()[0]); 1262d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor} 1272d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor 128ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Benderskyvoid MemoryBufferTest::testGetOpenFileSlice(bool Reopen) { 129f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky // Test that MemoryBuffer::getOpenFile works properly when no null 130f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky // terminator is requested and the size is large enough to trigger 131f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky // the usage of memory mapping. 132f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky int TestFD; 133f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky SmallString<64> TestPath; 134f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky // Create a temporary file and write data into it. 135f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky sys::fs::createTemporaryFile("prefix", "temp", TestFD, TestPath); 13637693da119853a4b2a31df4a6b7213043fe97e1aNAKAMURA Takumi // OF is responsible for closing the file; If the file is not 137ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky // reopened, it will be unbuffered so that the results are 138ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky // immediately visible through the fd. 139ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky raw_fd_ostream OF(TestFD, true, !Reopen); 140f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky for (int i = 0; i < 60000; ++i) { 141f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky OF << "0123456789"; 142f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky } 143f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky 144ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky if (Reopen) { 145ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky OF.close(); 146ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky EXPECT_FALSE(sys::fs::openFileForRead(TestPath.c_str(), TestFD)); 147ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky } 148ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky 149c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ErrorOr<OwningBuffer> Buf = 150c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MemoryBuffer::getOpenFileSlice(TestFD, TestPath.c_str(), 151c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 40000, // Size 152c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 80000 // Offset 153c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ); 154c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 155c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code EC = Buf.getError(); 156f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky EXPECT_FALSE(EC); 157f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky 158c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines StringRef BufData = Buf.get()->getBuffer(); 159f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky EXPECT_EQ(BufData.size(), 40000U); 160f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky EXPECT_EQ(BufData[0], '0'); 161f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky EXPECT_EQ(BufData[9], '9'); 162f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky} 163f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky 164ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli BenderskyTEST_F(MemoryBufferTest, getOpenFileNoReopen) { 165ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky testGetOpenFileSlice(false); 166ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky} 167ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky 168ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli BenderskyTEST_F(MemoryBufferTest, getOpenFileReopened) { 169ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky testGetOpenFileSlice(true); 170ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky} 171ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky 17237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 17337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesTEST_F(MemoryBufferTest, slice) { 17437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Create a file that is six pages long with different data on each page. 17537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines int FD; 17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SmallString<64> TestPath; 17737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines sys::fs::createTemporaryFile("MemoryBufferTest_Slice", "temp", FD, TestPath); 17837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines raw_fd_ostream OF(FD, true, /*unbuffered=*/true); 17937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines for (unsigned i = 0; i < 0x2000 / 8; ++i) { 18037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines OF << "12345678"; 18137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 18237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines for (unsigned i = 0; i < 0x2000 / 8; ++i) { 18337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines OF << "abcdefgh"; 18437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 18537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines for (unsigned i = 0; i < 0x2000 / 8; ++i) { 18637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines OF << "ABCDEFGH"; 18737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 18837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines OF.close(); 18937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 19037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Try offset of one page. 19137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ErrorOr<OwningBuffer> MB = MemoryBuffer::getFileSlice(TestPath.str(), 19237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 0x4000, 0x1000); 19337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code EC = MB.getError(); 19437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ASSERT_FALSE(EC); 19537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_EQ(0x4000UL, MB.get()->getBufferSize()); 19637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 19737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines StringRef BufData = MB.get()->getBuffer(); 19837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_TRUE(BufData.substr(0x0000,8).equals("12345678")); 19937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_TRUE(BufData.substr(0x0FF8,8).equals("12345678")); 20037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_TRUE(BufData.substr(0x1000,8).equals("abcdefgh")); 20137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_TRUE(BufData.substr(0x2FF8,8).equals("abcdefgh")); 20237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_TRUE(BufData.substr(0x3000,8).equals("ABCDEFGH")); 20337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_TRUE(BufData.substr(0x3FF8,8).equals("ABCDEFGH")); 20437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 20537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Try non-page aligned. 20637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ErrorOr<OwningBuffer> MB2 = MemoryBuffer::getFileSlice(TestPath.str(), 20737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 0x3000, 0x0800); 20837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EC = MB2.getError(); 20937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ASSERT_FALSE(EC); 21037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_EQ(0x3000UL, MB2.get()->getBufferSize()); 21137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 21237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines StringRef BufData2 = MB2.get()->getBuffer(); 21337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_TRUE(BufData2.substr(0x0000,8).equals("12345678")); 21437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_TRUE(BufData2.substr(0x17F8,8).equals("12345678")); 21537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_TRUE(BufData2.substr(0x1800,8).equals("abcdefgh")); 21637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EXPECT_TRUE(BufData2.substr(0x2FF8,8).equals("abcdefgh")); 21737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 21837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 21937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 22037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 22137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 2222d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor} 223