diff options
author | Simon Atanasyan <simon@atanasyan.com> | 2014-04-11 07:25:35 +0000 |
---|---|---|
committer | Simon Atanasyan <simon@atanasyan.com> | 2014-04-11 07:25:35 +0000 |
commit | dca4162aa52eacf921e17ce52eb68365bbb37db2 (patch) | |
tree | bc67c49a3c32409eb807c1949ea590f47b5fde3c | |
parent | e5b156810a5315d6eb958f10fc47f1ef5e21a1cd (diff) | |
download | bcm5719-llvm-dca4162aa52eacf921e17ce52eb68365bbb37db2.tar.gz bcm5719-llvm-dca4162aa52eacf921e17ce52eb68365bbb37db2.zip |
[Mips] Factor out MIPS relocation addend reading to the separate
function.
No functional changes.
llvm-svn: 206023
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h b/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h index ab60daae523..2c5ad6fa781 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h @@ -105,22 +105,26 @@ private: auto *ref = new (this->_readerStorage) ELFReference<ELFT>(&ri, ri.r_offset - symbol.st_value, this->kindArch(), ri.getType(isMips64EL), ri.getSymbol(isMips64EL)); + ref->setAddend(readAddend(symbol, ri, content)); + return ref; + } + + Reference::Addend readAddend(const Elf_Sym &symbol, const Elf_Rel &ri, + ArrayRef<uint8_t> content) const { const uint8_t *ap = content.data() + ri.r_offset - symbol.st_value; - switch (ri.getType(isMips64EL)) { + switch (ri.getType(this->_objFile->isMips64EL())) { case llvm::ELF::R_MIPS_32: case llvm::ELF::R_MIPS_PC32: - ref->setAddend(*(int32_t *)ap); - break; + return *(int32_t *)ap; case llvm::ELF::R_MIPS_26: - ref->setAddend(*(int32_t *)ap & 0x3ffffff); - break; + return *(int32_t *)ap & 0x3ffffff; case llvm::ELF::R_MIPS_HI16: case llvm::ELF::R_MIPS_LO16: case llvm::ELF::R_MIPS_GOT16: - ref->setAddend(*(int16_t *)ap); - break; + return *(int16_t *)ap; + default: + return 0; } - return ref; } }; |