mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 15:13:49 -04:00
[Support] Improve readNativeFile(Slice) interface
Summary: There was a subtle, but pretty important difference between the Slice and regular versions of this function. The Slice function was zero-initializing the rest of the buffer when the read syscall returned less bytes than expected, while the regular function did not. This patch removes the inconsistency by making both functions *not* zero-initialize the buffer. The zeroing code is moved to the MemoryBuffer class, which is currently the only user of this code. This makes the API more consistent, and the code shorter. While in there, I also refactor the functions to return the number of bytes through the regular return value (via Expected<size_t>) instead of a separate by-ref argument. Reviewers: aganea, rnk Subscribers: kristina, Bigcheese, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D66471 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@369627 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -211,15 +211,17 @@ static ErrorOr<std::unique_ptr<WritableMemoryBuffer>>
|
||||
getMemoryBufferForStream(sys::fs::file_t FD, const Twine &BufferName) {
|
||||
const ssize_t ChunkSize = 4096*4;
|
||||
SmallString<ChunkSize> Buffer;
|
||||
size_t ReadBytes;
|
||||
// Read into Buffer until we hit EOF.
|
||||
do {
|
||||
for (;;) {
|
||||
Buffer.reserve(Buffer.size() + ChunkSize);
|
||||
if (auto EC = sys::fs::readNativeFile(
|
||||
FD, makeMutableArrayRef(Buffer.end(), ChunkSize), &ReadBytes))
|
||||
return EC;
|
||||
Buffer.set_size(Buffer.size() + ReadBytes);
|
||||
} while (ReadBytes != 0);
|
||||
Expected<size_t> ReadBytes = sys::fs::readNativeFile(
|
||||
FD, makeMutableArrayRef(Buffer.end(), ChunkSize));
|
||||
if (!ReadBytes)
|
||||
return errorToErrorCode(ReadBytes.takeError());
|
||||
if (*ReadBytes == 0)
|
||||
break;
|
||||
Buffer.set_size(Buffer.size() + *ReadBytes);
|
||||
}
|
||||
|
||||
return getMemBufferCopyImpl(Buffer, BufferName);
|
||||
}
|
||||
@@ -458,9 +460,20 @@ getOpenFileImpl(sys::fs::file_t FD, const Twine &Filename, uint64_t FileSize,
|
||||
return make_error_code(errc::not_enough_memory);
|
||||
}
|
||||
|
||||
if (std::error_code EC =
|
||||
sys::fs::readNativeFileSlice(FD, Buf->getBuffer(), Offset))
|
||||
return EC;
|
||||
// Read until EOF, zero-initialize the rest.
|
||||
MutableArrayRef<char> ToRead = Buf->getBuffer();
|
||||
while (!ToRead.empty()) {
|
||||
Expected<size_t> ReadBytes =
|
||||
sys::fs::readNativeFileSlice(FD, ToRead, Offset);
|
||||
if (!ReadBytes)
|
||||
return errorToErrorCode(ReadBytes.takeError());
|
||||
if (*ReadBytes == 0) {
|
||||
std::memset(ToRead.data(), 0, ToRead.size());
|
||||
break;
|
||||
}
|
||||
ToRead = ToRead.drop_front(*ReadBytes);
|
||||
Offset += *ReadBytes;
|
||||
}
|
||||
|
||||
return std::move(Buf);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user