diff options
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp')
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp b/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp index 85c64962718..fef4d82d66c 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp @@ -236,9 +236,12 @@ void MipsELFFile<ELFT>::createRelocationReferences( } template <class ELFT> -void MipsELFFile<ELFT>::createRelocationReferences( - const Elf_Sym *symbol, ArrayRef<uint8_t> symContent, - ArrayRef<uint8_t> secContent, range<const Elf_Rel *> rels) { +void MipsELFFile<ELFT>::createRelocationReferences(const Elf_Sym *symbol, + ArrayRef<uint8_t> symContent, + ArrayRef<uint8_t> secContent, + const Elf_Shdr *relSec) { + const Elf_Shdr *symtab = *this->_objFile->getSection(relSec->sh_link); + auto rels = this->_objFile->rels(relSec); const auto value = this->getSymbolValue(symbol); for (const Elf_Rel *rit = rels.begin(), *eit = rels.end(); rit != eit; ++rit) { @@ -250,7 +253,7 @@ void MipsELFFile<ELFT>::createRelocationReferences( this->_references.push_back(r); auto addend = readAddend(*rit, secContent); - auto pairRelType = getPairRelocation(*rit); + auto pairRelType = getPairRelocation(symtab, *rit); if (pairRelType != llvm::ELF::R_MIPS_NONE) { addend <<= 16; auto mit = findMatchingRelocation(pairRelType, rit, eit); @@ -279,20 +282,21 @@ MipsELFFile<ELFT>::readAddend(const Elf_Rel &ri, } template <class ELFT> -uint32_t MipsELFFile<ELFT>::getPairRelocation(const Elf_Rel &rel) const { +uint32_t MipsELFFile<ELFT>::getPairRelocation(const Elf_Shdr *symtab, + const Elf_Rel &rel) const { switch (getPrimaryType(rel)) { case llvm::ELF::R_MIPS_HI16: return llvm::ELF::R_MIPS_LO16; case llvm::ELF::R_MIPS_PCHI16: return llvm::ELF::R_MIPS_PCLO16; case llvm::ELF::R_MIPS_GOT16: - if (isLocalBinding(rel)) + if (isLocalBinding(symtab, rel)) return llvm::ELF::R_MIPS_LO16; break; case llvm::ELF::R_MICROMIPS_HI16: return llvm::ELF::R_MICROMIPS_LO16; case llvm::ELF::R_MICROMIPS_GOT16: - if (isLocalBinding(rel)) + if (isLocalBinding(symtab, rel)) return llvm::ELF::R_MICROMIPS_LO16; break; default: @@ -315,8 +319,9 @@ MipsELFFile<ELFT>::findMatchingRelocation(uint32_t pairRelType, } template <class ELFT> -bool MipsELFFile<ELFT>::isLocalBinding(const Elf_Rel &rel) const { - return this->_objFile->getSymbol(rel.getSymbol(isMips64EL<ELFT>())) +bool MipsELFFile<ELFT>::isLocalBinding(const Elf_Shdr *symtab, + const Elf_Rel &rel) const { + return this->_objFile->getSymbol(symtab, rel.getSymbol(isMips64EL<ELFT>())) ->getBinding() == llvm::ELF::STB_LOCAL; } |