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
virtual uint64_t getSectionFlags(DataRefImpl Sec) const = 0;
virtual uint64_t getSectionOffset(DataRefImpl Sec) const = 0;
- virtual ErrorOr<int64_t> getRelocationAddend(DataRefImpl Rel) const = 0;
+ virtual Expected<int64_t> getRelocationAddend(DataRefImpl Rel) const = 0;
public:
using elf_symbol_iterator_range = iterator_range<elf_symbol_iterator>;
return cast<ELFObjectFileBase>(RelocationRef::getObject());
}
- ErrorOr<int64_t> getAddend() const {
+ Expected<int64_t> getAddend() const {
return getObject()->getRelocationAddend(getRawDataRefImpl());
}
};
section_iterator section_begin() const override;
section_iterator section_end() const override;
- ErrorOr<int64_t> getRelocationAddend(DataRefImpl Rel) const override;
+ Expected<int64_t> getRelocationAddend(DataRefImpl Rel) const override;
uint8_t getBytesInAddress() const override;
StringRef getFileFormatName() const override;
}
template <class ELFT>
-ErrorOr<int64_t>
+Expected<int64_t>
ELFObjectFile<ELFT>::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;
}
}
int64_t getELFAddend(RelocationRef R) {
- ErrorOr<int64_t> AddendOrErr = ELFRelocationRef(R).getAddend();
- if (std::error_code EC = AddendOrErr.getError())
- report_fatal_error(EC.message());
+ Expected<int64_t> AddendOrErr = ELFRelocationRef(R).getAddend();
+ handleAllErrors(AddendOrErr.takeError(), [](const ErrorInfoBase &EI) {
+ report_fatal_error(EI.message());
+ });
return *AddendOrErr;
}
if (auto AddendOrErr = i->getAddend())
Addend = *AddendOrErr;
else
- return errorCodeToError(AddendOrErr.getError());
+ return AddendOrErr.takeError();
++i;
if (i == e)
ObjSectionToIDMap &ObjSectionToID, StubMap &Stubs) {
const auto &Obj = cast<ELFObjectFileBase>(O);
uint64_t RelType = RelI->getType();
- ErrorOr<int64_t> AddendOrErr = ELFRelocationRef(*RelI).getAddend();
- int64_t Addend = AddendOrErr ? *AddendOrErr : 0;
+ int64_t Addend = 0;
+ if (Expected<int64_t> 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
-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