mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
[RuntimeDyld] Fix ppc64 stub relocations on little-endian
When RuntimeDyldELF creates stub functions, it needs to install relocations that will resolve to the final address of the target routine. Since those are 16-bit relocs, they need to be applied to the least-significant halfword of the instruction. On big-endian ppc64, this means that addresses have to be adjusted by 2, which is what the code currently does. However, on a little-endian system, the address must *not* be adjusted; the least-significant halfword is the first one. This patch updates the RuntimeDyldELF code to take the target byte order into account. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211384 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
602941c737
commit
e29fc75ea5
@ -1205,14 +1205,20 @@ relocation_iterator RuntimeDyldELF::processRelocationRef(
|
||||
ELF::R_PPC64_ADDR64, Value.Addend);
|
||||
|
||||
// Generates the 64-bits address loads as exemplified in section
|
||||
// 4.5.1 in PPC64 ELF ABI.
|
||||
RelocationEntry REhst(SectionID, StubTargetAddr - Section.Address + 2,
|
||||
// 4.5.1 in PPC64 ELF ABI. Note that the relocations need to
|
||||
// apply to the low part of the instructions, so we have to update
|
||||
// the offset according to the target endianness.
|
||||
uint64_t StubRelocOffset = StubTargetAddr - Section.Address;
|
||||
if (!IsTargetLittleEndian)
|
||||
StubRelocOffset += 2;
|
||||
|
||||
RelocationEntry REhst(SectionID, StubRelocOffset + 0,
|
||||
ELF::R_PPC64_ADDR16_HIGHEST, Value.Addend);
|
||||
RelocationEntry REhr(SectionID, StubTargetAddr - Section.Address + 6,
|
||||
RelocationEntry REhr(SectionID, StubRelocOffset + 4,
|
||||
ELF::R_PPC64_ADDR16_HIGHER, Value.Addend);
|
||||
RelocationEntry REh(SectionID, StubTargetAddr - Section.Address + 14,
|
||||
RelocationEntry REh(SectionID, StubRelocOffset + 12,
|
||||
ELF::R_PPC64_ADDR16_HI, Value.Addend);
|
||||
RelocationEntry REl(SectionID, StubTargetAddr - Section.Address + 18,
|
||||
RelocationEntry REl(SectionID, StubRelocOffset + 16,
|
||||
ELF::R_PPC64_ADDR16_LO, Value.Addend);
|
||||
|
||||
if (Value.SymbolName) {
|
||||
|
Loading…
Reference in New Issue
Block a user