Reference::Addend readAddend(const Elf_Rel &ri,
const ArrayRef<uint8_t> content) const {
- const auto &rh = this->_ctx.getTargetHandler().getRelocationHandler();
- return static_cast<const MipsRelocationHandler &>(rh)
- .readAddend(getPrimaryType(ri), content.data() + ri.r_offset);
+ return readMipsRelocAddend(getPrimaryType(ri),
+ content.data() + ri.r_offset);
}
uint32_t getPairRelocation(const Elf_Rel &rel) const {
const lld::AtomLayout &atom,
const Reference &ref) const override;
- Reference::Addend readAddend(Reference::KindValue kind,
- const uint8_t *content) const override;
-
private:
MipsLinkingContext &_ctx;
MipsTargetLayout<ELFT> &_targetLayout;
}
}
-template <class ELFT>
static uint64_t relocRead(const MipsRelocationParams ¶ms,
const uint8_t *loc) {
uint64_t data;
switch (params._size) {
case 4:
- data = endian::read<uint32_t, ELFT::TargetEndianness, unaligned>(loc);
+ data = endian::read32le(loc);
break;
case 8:
- data = endian::read<uint64_t, ELFT::TargetEndianness, unaligned>(loc);
+ data = endian::read64le(loc);
break;
default:
llvm_unreachable("Unexpected size");
}
auto params = getRelocationParams(op);
- uint64_t ins = relocRead<ELFT>(params, location);
+ uint64_t ins = relocRead(params, location);
if (auto ec = adjustJumpOpCode(ins, tgtAddr, jumpMode))
return ec;
return std::error_code();
}
-template <class ELFT>
-Reference::Addend
-RelocationHandler<ELFT>::readAddend(Reference::KindValue kind,
- const uint8_t *content) const {
- auto params = getRelocationParams(kind);
- uint64_t ins = relocRead<ELFT>(params, content);
- return (ins & params._mask) << params._shift;
-}
-
namespace lld {
namespace elf {
return llvm::make_unique<RelocationHandler<Mips64ELType>>(ctx, layout);
}
+Reference::Addend readMipsRelocAddend(Reference::KindValue kind,
+ const uint8_t *content) {
+ auto params = getRelocationParams(kind);
+ uint64_t ins = relocRead(params, content);
+ return (ins & params._mask) << params._shift;
+}
+
} // elf
} // lld
class MipsRelocationHandler : public TargetRelocationHandler {
public:
- virtual Reference::Addend readAddend(Reference::KindValue kind,
- const uint8_t *content) const = 0;
};
template <class ELFT>
createMipsRelocationHandler(MipsLinkingContext &ctx,
MipsTargetLayout<ELFT> &layout);
+Reference::Addend readMipsRelocAddend(Reference::KindValue kind,
+ const uint8_t *content);
} // elf
} // lld