mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
[Support] Add MemoryBuffer::getFileSlice()
mach-o supports "fat" files which are a header/table-of-contents followed by a concatenation of mach-o files built for different architectures. Currently, MemoryBuffer has no easy way to map a subrange (slice) of a file which lld will need to select a mach-o slice of a fat file. The new function provides an easy way to map a slice of a file into a MemoryBuffer. Test case included. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219260 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -97,6 +97,10 @@ public:
|
||||
};
|
||||
}
|
||||
|
||||
static ErrorOr<std::unique_ptr<MemoryBuffer>>
|
||||
getFileAux(const Twine &Filename, int64_t FileSize, uint64_t MapSize,
|
||||
uint64_t Offset, bool RequiresNullTerminator, bool IsVolatileSize);
|
||||
|
||||
std::unique_ptr<MemoryBuffer>
|
||||
MemoryBuffer::getMemBuffer(StringRef InputData, StringRef BufferName,
|
||||
bool RequiresNullTerminator) {
|
||||
@@ -167,6 +171,12 @@ MemoryBuffer::getFileOrSTDIN(const Twine &Filename, int64_t FileSize) {
|
||||
return getFile(Filename, FileSize);
|
||||
}
|
||||
|
||||
ErrorOr<std::unique_ptr<MemoryBuffer>>
|
||||
MemoryBuffer::getFileSlice(const Twine &FilePath, uint64_t MapSize,
|
||||
uint64_t Offset) {
|
||||
return getFileAux(FilePath, -1, MapSize, Offset, false, false);
|
||||
}
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// MemoryBuffer::getFile implementation.
|
||||
@@ -232,15 +242,12 @@ getMemoryBufferForStream(int FD, const Twine &BufferName) {
|
||||
return MemoryBuffer::getMemBufferCopy(Buffer, BufferName);
|
||||
}
|
||||
|
||||
static ErrorOr<std::unique_ptr<MemoryBuffer>>
|
||||
getFileAux(const Twine &Filename, int64_t FileSize, bool RequiresNullTerminator,
|
||||
bool IsVolatileSize);
|
||||
|
||||
ErrorOr<std::unique_ptr<MemoryBuffer>>
|
||||
MemoryBuffer::getFile(const Twine &Filename, int64_t FileSize,
|
||||
bool RequiresNullTerminator, bool IsVolatileSize) {
|
||||
return getFileAux(Filename, FileSize, RequiresNullTerminator,
|
||||
IsVolatileSize);
|
||||
return getFileAux(Filename, FileSize, FileSize, 0,
|
||||
RequiresNullTerminator, IsVolatileSize);
|
||||
}
|
||||
|
||||
static ErrorOr<std::unique_ptr<MemoryBuffer>>
|
||||
@@ -249,15 +256,15 @@ getOpenFileImpl(int FD, const Twine &Filename, uint64_t FileSize,
|
||||
bool IsVolatileSize);
|
||||
|
||||
static ErrorOr<std::unique_ptr<MemoryBuffer>>
|
||||
getFileAux(const Twine &Filename, int64_t FileSize, bool RequiresNullTerminator,
|
||||
bool IsVolatileSize) {
|
||||
getFileAux(const Twine &Filename, int64_t FileSize, uint64_t MapSize,
|
||||
uint64_t Offset, bool RequiresNullTerminator, bool IsVolatileSize) {
|
||||
int FD;
|
||||
std::error_code EC = sys::fs::openFileForRead(Filename, FD);
|
||||
if (EC)
|
||||
return EC;
|
||||
|
||||
ErrorOr<std::unique_ptr<MemoryBuffer>> Ret =
|
||||
getOpenFileImpl(FD, Filename, FileSize, FileSize, 0,
|
||||
getOpenFileImpl(FD, Filename, FileSize, MapSize, Offset,
|
||||
RequiresNullTerminator, IsVolatileSize);
|
||||
close(FD);
|
||||
return Ret;
|
||||
|
||||
Reference in New Issue
Block a user