diff options
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Atoms.h | 14 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/File.h | 12 |
2 files changed, 18 insertions, 8 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Atoms.h b/lld/lib/ReaderWriter/ELF/Atoms.h index 22a615d6c24..c5f66bcdedf 100644 --- a/lld/lib/ReaderWriter/ELF/Atoms.h +++ b/lld/lib/ReaderWriter/ELF/Atoms.h @@ -33,16 +33,18 @@ template <class ELFT> class ELFReference LLVM_FINAL : public Reference { typedef llvm::object::Elf_Rel_Impl<ELFT, true> Elf_Rela; public: - ELFReference(const Elf_Rela *rela, uint64_t offset, const Atom *target) - : _target(target), _targetSymbolIndex(rela->getSymbol()), + ELFReference(const Elf_Rela *rela, uint64_t offset, const Atom *target, + Kind kind, uint32_t symbol) + : _target(target), _targetSymbolIndex(symbol), _offsetInAtom(offset), _addend(rela->r_addend) { - _kind = (Kind) rela->getType(); + _kind = kind; } - ELFReference(const Elf_Rel *rel, uint64_t offset, const Atom *target) - : _target(target), _targetSymbolIndex(rel->getSymbol()), + ELFReference(const Elf_Rel *rel, uint64_t offset, const Atom *target, + Kind kind, uint32_t symbol) + : _target(target), _targetSymbolIndex(symbol), _offsetInAtom(offset), _addend(0) { - _kind = (Kind) rel->getType(); + _kind = kind; } ELFReference(Kind kind) diff --git a/lld/lib/ReaderWriter/ELF/File.h b/lld/lib/ReaderWriter/ELF/File.h index 450de6bae38..cbc2fff9895 100644 --- a/lld/lib/ReaderWriter/ELF/File.h +++ b/lld/lib/ReaderWriter/ELF/File.h @@ -576,8 +576,12 @@ private: if (!((rai.r_offset >= symbol->st_value) && (rai.r_offset < symbol->st_value + content.size()))) continue; + bool isMips64EL = _objFile->isMips64EL(); + Kind kind = (Kind) rai.getType(isMips64EL); + uint32_t symbolIndex = rai.getSymbol(isMips64EL); auto *ERef = new (_readerStorage) - ELFReference<ELFT>(&rai, rai.r_offset - symbol->st_value, nullptr); + ELFReference<ELFT>(&rai, rai.r_offset - symbol->st_value, nullptr, + kind, symbolIndex); _references.push_back(ERef); } @@ -586,8 +590,12 @@ private: for (auto &ri : rri->second) { if ((ri.r_offset >= symbol->st_value) && (ri.r_offset < symbol->st_value + content.size())) { + bool isMips64EL = _objFile->isMips64EL(); + Kind kind = (Kind) ri.getType(isMips64EL); + uint32_t symbolIndex = ri.getSymbol(isMips64EL); auto *ERef = new (_readerStorage) - ELFReference<ELFT>(&ri, ri.r_offset - symbol->st_value, nullptr); + ELFReference<ELFT>(&ri, ri.r_offset - symbol->st_value, nullptr, + kind, symbolIndex); // Read the addend from the section contents // TODO : We should move the way lld reads relocations totally from // ELFObjectFile |