1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 10:42:39 +01:00

[llvm-objcopy][NFC][Wasm] Do not use internal buffer while writing into the output.

This patch is follow-up for D91028. It implements direct writing into the
output stream for wasm.

Depends on D91028

Differential Revision: https://reviews.llvm.org/D95478
This commit is contained in:
Alexey Lapshin 2020-12-27 16:07:20 +03:00
parent f5df993033
commit 1bb761e13b

View File

@ -56,29 +56,21 @@ size_t Writer::finalize() {
Error Writer::write() {
size_t TotalSize = finalize();
std::unique_ptr<WritableMemoryBuffer> Buf =
WritableMemoryBuffer::getNewMemBuffer(TotalSize);
if (!Buf)
return createStringError(errc::not_enough_memory,
"failed to allocate memory buffer of " +
Twine::utohexstr(TotalSize) + " bytes");
Out.reserveExtraSpace(TotalSize);
// Write the header.
uint8_t *Ptr = reinterpret_cast<uint8_t *>(Buf->getBufferStart());
Ptr = std::copy(Obj.Header.Magic.begin(), Obj.Header.Magic.end(), Ptr);
support::endian::write32le(Ptr, Obj.Header.Version);
Ptr += sizeof(Obj.Header.Version);
Out.write(Obj.Header.Magic.data(), Obj.Header.Magic.size());
uint32_t Version;
support::endian::write32le(&Version, Obj.Header.Version);
Out.write(reinterpret_cast<const char *>(&Version), sizeof(Version));
// Write each section.
for (size_t I = 0, S = SectionHeaders.size(); I < S; ++I) {
Ptr = std::copy(SectionHeaders[I].begin(), SectionHeaders[I].end(), Ptr);
ArrayRef<uint8_t> Contents = Obj.Sections[I].Contents;
Ptr = std::copy(Contents.begin(), Contents.end(), Ptr);
Out.write(SectionHeaders[I].data(), SectionHeaders[I].size());
Out.write(reinterpret_cast<const char *>(Obj.Sections[I].Contents.data()),
Obj.Sections[I].Contents.size());
}
// TODO: Implement direct writing to the output stream (without intermediate
// memory buffer Buf).
Out.write(Buf->getBufferStart(), Buf->getBufferSize());
return Error::success();
}