From 86ab1f56e4e77afd2acd1d8ce65aa818fe7964a3 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 11 Oct 2017 16:56:33 +0000 Subject: [PATCH] Convert an ErrorOr to Expected. getRelocationAddend should never be called on non SHT_RELA sections, but changing that requires changing RelocVisitor.h. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315473 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/ELFObjectFile.h | 10 +++++----- include/llvm/Object/RelocVisitor.h | 7 ++++--- lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp | 9 ++++++--- test/Object/invalid.test | 4 +++- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index 2856084e96d..0e34ca598dc 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -61,7 +61,7 @@ protected: virtual uint64_t getSectionFlags(DataRefImpl Sec) const = 0; virtual uint64_t getSectionOffset(DataRefImpl Sec) const = 0; - virtual ErrorOr getRelocationAddend(DataRefImpl Rel) const = 0; + virtual Expected getRelocationAddend(DataRefImpl Rel) const = 0; public: using elf_symbol_iterator_range = iterator_range; @@ -167,7 +167,7 @@ public: return cast(RelocationRef::getObject()); } - ErrorOr getAddend() const { + Expected getAddend() const { return getObject()->getRelocationAddend(getRawDataRefImpl()); } }; @@ -359,7 +359,7 @@ public: section_iterator section_begin() const override; section_iterator section_end() const override; - ErrorOr getRelocationAddend(DataRefImpl Rel) const override; + Expected getRelocationAddend(DataRefImpl Rel) const override; uint8_t getBytesInAddress() const override; StringRef getFileFormatName() const override; @@ -822,10 +822,10 @@ void ELFObjectFile::getRelocationTypeName( } template -ErrorOr +Expected ELFObjectFile::getRelocationAddend(DataRefImpl Rel) const { if (getRelSection(Rel)->sh_type != ELF::SHT_RELA) - return object_error::parse_failed; + return createError("Section is not SHT_RELA"); return (int64_t)getRela(Rel)->r_addend; } diff --git a/include/llvm/Object/RelocVisitor.h b/include/llvm/Object/RelocVisitor.h index 35bfc245236..3c083f9c2a4 100644 --- a/include/llvm/Object/RelocVisitor.h +++ b/include/llvm/Object/RelocVisitor.h @@ -115,9 +115,10 @@ private: } int64_t getELFAddend(RelocationRef R) { - ErrorOr AddendOrErr = ELFRelocationRef(R).getAddend(); - if (std::error_code EC = AddendOrErr.getError()) - report_fatal_error(EC.message()); + Expected AddendOrErr = ELFRelocationRef(R).getAddend(); + handleAllErrors(AddendOrErr.takeError(), [](const ErrorInfoBase &EI) { + report_fatal_error(EI.message()); + }); return *AddendOrErr; } diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp index d4f22ad05b5..b32b842e657 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp @@ -611,7 +611,7 @@ Error RuntimeDyldELF::findOPDEntrySection(const ELFObjectFileBase &Obj, if (auto AddendOrErr = i->getAddend()) Addend = *AddendOrErr; else - return errorCodeToError(AddendOrErr.getError()); + return AddendOrErr.takeError(); ++i; if (i == e) @@ -1079,8 +1079,11 @@ RuntimeDyldELF::processRelocationRef( ObjSectionToIDMap &ObjSectionToID, StubMap &Stubs) { const auto &Obj = cast(O); uint64_t RelType = RelI->getType(); - ErrorOr AddendOrErr = ELFRelocationRef(*RelI).getAddend(); - int64_t Addend = AddendOrErr ? *AddendOrErr : 0; + int64_t Addend = 0; + if (Expected AddendOrErr = ELFRelocationRef(*RelI).getAddend()) + Addend = *AddendOrErr; + else + consumeError(AddendOrErr.takeError()); elf_symbol_iterator Symbol = RelI->getSymbol(); // Obtain the symbol name which is referenced in the relocation diff --git a/test/Object/invalid.test b/test/Object/invalid.test index 66542259b90..b0b5528ab05 100644 --- a/test/Object/invalid.test +++ b/test/Object/invalid.test @@ -1,9 +1,11 @@ -RUN: not llvm-dwarfdump %p/Inputs/invalid-bad-rel-type.elf 2>&1 | FileCheck %s RUN: not llvm-objdump -s %p/Inputs/invalid-strtab-type.elf 2>&1 | FileCheck %s RUN: not llvm-objdump -s %p/Inputs/invalid-strtab-size.elf 2>&1 | FileCheck %s RUN: not llvm-objdump -s %p/Inputs/invalid-strtab-zero-size.elf 2>&1 | FileCheck %s CHECK: Invalid data was encountered while parsing the file +RUN: not llvm-dwarfdump %p/Inputs/invalid-bad-rel-type.elf 2>&1 | FileCheck --check-prefix=RELA %s +RELA: Section is not SHT_RELA + RUN: not llvm-objdump -s %p/Inputs/invalid-strtab-non-null.elf 2>&1 | FileCheck --check-prefix=NON-NULL %s NON-NULL: Invalid data was encountered while parsing the file -- 2.50.1