1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 05:01:59 +01:00

[Orc] Fix working memory buffer for section mapping in ELFDebugObject

This commit is contained in:
Stefan Gränitz 2021-03-09 12:44:21 +01:00
parent c2c05d8f17
commit 9a8ecaf741

View File

@ -156,6 +156,8 @@ public:
void reportSectionTargetMemoryRange(StringRef Name,
SectionRange TargetMem) override;
StringRef getBuffer() const { return Buffer->getMemBufferRef().getBuffer(); }
protected:
Expected<std::unique_ptr<Allocation>>
finalizeWorkingMemory(JITLinkContext &Ctx) override;
@ -169,8 +171,8 @@ private:
static Expected<std::unique_ptr<ELFDebugObject>>
CreateArchType(MemoryBufferRef Buffer, JITLinkContext &Ctx);
static Expected<std::unique_ptr<WritableMemoryBuffer>>
CopyBuffer(MemoryBufferRef Buffer);
static std::unique_ptr<WritableMemoryBuffer>
CopyBuffer(MemoryBufferRef Buffer, Error &Err);
ELFDebugObject(std::unique_ptr<WritableMemoryBuffer> Buffer,
JITLinkContext &Ctx)
@ -193,16 +195,18 @@ static bool isDwarfSection(StringRef SectionName) {
return DwarfSectionNames.count(SectionName) == 1;
}
Expected<std::unique_ptr<WritableMemoryBuffer>>
ELFDebugObject::CopyBuffer(MemoryBufferRef Buffer) {
std::unique_ptr<WritableMemoryBuffer>
ELFDebugObject::CopyBuffer(MemoryBufferRef Buffer, Error &Err) {
ErrorAsOutParameter _(&Err);
size_t Size = Buffer.getBufferSize();
StringRef Name = Buffer.getBufferIdentifier();
auto Copy = WritableMemoryBuffer::getNewUninitMemBuffer(Size, Name);
if (!Copy)
return errorCodeToError(make_error_code(errc::not_enough_memory));
if (auto Copy = WritableMemoryBuffer::getNewUninitMemBuffer(Size, Name)) {
memcpy(Copy->getBufferStart(), Buffer.getBufferStart(), Size);
return std::move(Copy);
return Copy;
}
Err = errorCodeToError(make_error_code(errc::not_enough_memory));
return nullptr;
}
template <typename ELFT>
@ -210,7 +214,13 @@ Expected<std::unique_ptr<ELFDebugObject>>
ELFDebugObject::CreateArchType(MemoryBufferRef Buffer, JITLinkContext &Ctx) {
using SectionHeader = typename ELFT::Shdr;
Expected<ELFFile<ELFT>> ObjRef = ELFFile<ELFT>::create(Buffer.getBuffer());
Error Err = Error::success();
std::unique_ptr<ELFDebugObject> DebugObj(
new ELFDebugObject(CopyBuffer(Buffer, Err), Ctx));
if (Err)
return std::move(Err);
Expected<ELFFile<ELFT>> ObjRef = ELFFile<ELFT>::create(DebugObj->getBuffer());
if (!ObjRef)
return ObjRef.takeError();
@ -223,13 +233,6 @@ ELFDebugObject::CreateArchType(MemoryBufferRef Buffer, JITLinkContext &Ctx) {
if (!Sections)
return Sections.takeError();
Expected<std::unique_ptr<WritableMemoryBuffer>> Copy = CopyBuffer(Buffer);
if (!Copy)
return Copy.takeError();
std::unique_ptr<ELFDebugObject> DebugObj(
new ELFDebugObject(std::move(*Copy), Ctx));
bool HasDwarfSection = false;
for (const SectionHeader &Header : *Sections) {
Expected<StringRef> Name = ObjRef->getSectionName(Header);