diff options
-rw-r--r-- | include/llvm/Support/MemoryBuffer.h | 16 | ||||
-rw-r--r-- | lib/Support/MemoryBuffer.cpp | 32 | ||||
-rw-r--r-- | tools/gold/gold-plugin.cpp | 5 | ||||
-rw-r--r-- | tools/llvm-ar/llvm-ar.cpp | 6 | ||||
-rw-r--r-- | tools/lto/LTOModule.cpp | 7 | ||||
-rw-r--r-- | tools/lto/LTOModule.h | 1 | ||||
-rw-r--r-- | tools/lto/lto.cpp | 3 | ||||
-rw-r--r-- | unittests/Support/MemoryBufferTest.cpp | 11 |
8 files changed, 48 insertions, 33 deletions
diff --git a/include/llvm/Support/MemoryBuffer.h b/include/llvm/Support/MemoryBuffer.h index e443b68463..9609e3366d 100644 --- a/include/llvm/Support/MemoryBuffer.h +++ b/include/llvm/Support/MemoryBuffer.h @@ -74,13 +74,17 @@ public: int64_t FileSize = -1, bool RequiresNullTerminator = true); - /// getOpenFile - Given an already-open file descriptor, read the file and - /// return a MemoryBuffer. + // Get a MemoryBuffer of part of a file. Since this is in the middle of a + // file, the buffer is not null terminated. + static error_code getOpenFileSlice(int FD, const char *Filename, + OwningPtr<MemoryBuffer> &Result, + uint64_t MapSize, int64_t Offset); + + /// Given an already-open file descriptor, read the file and return a + /// MemoryBuffer. static error_code getOpenFile(int FD, const char *Filename, - OwningPtr<MemoryBuffer> &result, - uint64_t FileSize = -1, - uint64_t MapSize = -1, - int64_t Offset = 0, + OwningPtr<MemoryBuffer> &Result, + uint64_t FileSize, bool RequiresNullTerminator = true); /// getMemBuffer - Open the specified memory range as a MemoryBuffer. Note diff --git a/lib/Support/MemoryBuffer.cpp b/lib/Support/MemoryBuffer.cpp index 051d64b038..cab45c736b 100644 --- a/lib/Support/MemoryBuffer.cpp +++ b/lib/Support/MemoryBuffer.cpp @@ -248,6 +248,11 @@ error_code MemoryBuffer::getFile(StringRef Filename, RequiresNullTerminator); } +static error_code getOpenFileImpl(int FD, const char *Filename, + OwningPtr<MemoryBuffer> &Result, + uint64_t FileSize, uint64_t MapSize, + int64_t Offset, bool RequiresNullTerminator); + error_code MemoryBuffer::getFile(const char *Filename, OwningPtr<MemoryBuffer> &result, int64_t FileSize, @@ -257,8 +262,8 @@ error_code MemoryBuffer::getFile(const char *Filename, if (EC) return EC; - error_code ret = getOpenFile(FD, Filename, result, FileSize, FileSize, - 0, RequiresNullTerminator); + error_code ret = getOpenFileImpl(FD, Filename, result, FileSize, FileSize, 0, + RequiresNullTerminator); close(FD); return ret; } @@ -305,11 +310,10 @@ static bool shouldUseMmap(int FD, return true; } -error_code MemoryBuffer::getOpenFile(int FD, const char *Filename, - OwningPtr<MemoryBuffer> &result, - uint64_t FileSize, uint64_t MapSize, - int64_t Offset, - bool RequiresNullTerminator) { +static error_code getOpenFileImpl(int FD, const char *Filename, + OwningPtr<MemoryBuffer> &result, + uint64_t FileSize, uint64_t MapSize, + int64_t Offset, bool RequiresNullTerminator) { static int PageSize = sys::process::get_self()->page_size(); // Default is to map the full file. @@ -386,6 +390,20 @@ error_code MemoryBuffer::getOpenFile(int FD, const char *Filename, return error_code::success(); } +error_code MemoryBuffer::getOpenFile(int FD, const char *Filename, + OwningPtr<MemoryBuffer> &Result, + uint64_t FileSize, + bool RequiresNullTerminator) { + return getOpenFileImpl(FD, Filename, Result, FileSize, FileSize, 0, + RequiresNullTerminator); +} + +error_code MemoryBuffer::getOpenFileSlice(int FD, const char *Filename, + OwningPtr<MemoryBuffer> &Result, + uint64_t MapSize, int64_t Offset) { + return getOpenFileImpl(FD, Filename, Result, -1, MapSize, Offset, false); +} + //===----------------------------------------------------------------------===// // MemoryBuffer::getSTDIN implementation. //===----------------------------------------------------------------------===// diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index 133eca48e5..77717098d6 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -252,9 +252,8 @@ static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file, if (file->offset) { offset = file->offset; } - if (error_code ec = - MemoryBuffer::getOpenFile(file->fd, file->name, buffer, -1, - file->filesize, offset, false)) { + if (error_code ec = MemoryBuffer::getOpenFileSlice( + file->fd, file->name, buffer, file->filesize, offset)) { (*message)(LDPL_ERROR, ec.message().c_str()); return LDPS_ERR; } diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index 116143e168..261446cc78 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -770,9 +770,9 @@ static void performWriteOperation(ArchiveOperation Operation, failIfError(sys::fs::status(FD, Status), FileName); OwningPtr<MemoryBuffer> File; - failIfError( - MemoryBuffer::getOpenFile(FD, FileName, File, Status.getSize()), - FileName); + failIfError(MemoryBuffer::getOpenFile(FD, FileName, File, + Status.getSize(), false), + FileName); StringRef Name = sys::path::filename(FileName); if (Name.size() < 16) diff --git a/tools/lto/LTOModule.cpp b/tools/lto/LTOModule.cpp index 5ee43ba022..6626eaac47 100644 --- a/tools/lto/LTOModule.cpp +++ b/tools/lto/LTOModule.cpp @@ -209,17 +209,16 @@ LTOModule *LTOModule::makeLTOModule(const char *path, std::string &errMsg) { LTOModule *LTOModule::makeLTOModule(int fd, const char *path, size_t size, std::string &errMsg) { - return makeLTOModule(fd, path, size, size, 0, errMsg); + return makeLTOModule(fd, path, size, 0, errMsg); } LTOModule *LTOModule::makeLTOModule(int fd, const char *path, - size_t file_size, size_t map_size, off_t offset, std::string &errMsg) { OwningPtr<MemoryBuffer> buffer; - if (error_code ec = MemoryBuffer::getOpenFile(fd, path, buffer, file_size, - map_size, offset, false)) { + if (error_code ec = + MemoryBuffer::getOpenFileSlice(fd, path, buffer, map_size, offset)) { errMsg = ec.message(); return NULL; } diff --git a/tools/lto/LTOModule.h b/tools/lto/LTOModule.h index 83f3a7def1..902e9c5438 100644 --- a/tools/lto/LTOModule.h +++ b/tools/lto/LTOModule.h @@ -82,7 +82,6 @@ public: static LTOModule *makeLTOModule(int fd, const char *path, size_t size, std::string &errMsg); static LTOModule *makeLTOModule(int fd, const char *path, - size_t file_size, size_t map_size, off_t offset, std::string& errMsg); diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp index 11ad532be8..e0df81ab20 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -78,8 +78,7 @@ lto_module_t lto_module_create_from_fd_at_offset(int fd, const char *path, size_t file_size, size_t map_size, off_t offset) { - return LTOModule::makeLTOModule(fd, path, file_size, map_size, - offset, sLastErrorString); + return LTOModule::makeLTOModule(fd, path, map_size, offset, sLastErrorString); } /// lto_module_create_from_memory - Loads an object file from memory. Returns diff --git a/unittests/Support/MemoryBufferTest.cpp b/unittests/Support/MemoryBufferTest.cpp index 336a0e441c..d5ea8de3c1 100644 --- a/unittests/Support/MemoryBufferTest.cpp +++ b/unittests/Support/MemoryBufferTest.cpp @@ -113,13 +113,10 @@ TEST_F(MemoryBufferTest, getOpenFileNoNullTerminator) { } OwningBuffer Buf; - error_code EC = MemoryBuffer::getOpenFile(TestFD, - TestPath.c_str(), - Buf, - 40000, // Size - -1, - 8000, // Offset - false); + error_code EC = MemoryBuffer::getOpenFileSlice(TestFD, TestPath.c_str(), Buf, + 40000, // Size + 8000 // Offset + ); EXPECT_FALSE(EC); StringRef BufData = Buf->getBuffer(); |