summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp')
-rw-r--r--lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp23
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;
}
OpenPOWER on IntegriCloud