mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-19 02:08:06 +00:00
[RuntimeDyld] Add support for ELF R_ARM_REL32 and R_ARM_GOT_PREL.
Patch by William Dillon. Thanks William! This patch adds support for the R_ARM_REL32 and R_ARM_GOT_PREL ELF ARM relocations to RuntimeDyld, which should allow JITing of code that produces these relocations. No test case: Unfortunately RuntimeDyldELF's GOT building mechanism (which uses a separate section for GOT entries) isn't compatible with RuntimeDyldChecker. The correct fix for this is to fix RuntimeDyldELF's GOT support (it's fundamentally broken at the moment: separate sections aren't guaranteed to be in range of a GOT entry load), but that's a non-trivial job. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@279182 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0c6c3b22db
commit
84c33c6c95
@ -480,6 +480,9 @@ void RuntimeDyldELF::resolveARMRelocation(const SectionEntry &Section,
|
||||
*TargetPtr |= Value & 0xFFF;
|
||||
*TargetPtr |= ((Value >> 12) & 0xF) << 16;
|
||||
break;
|
||||
case ELF::R_ARM_REL32:
|
||||
*TargetPtr += Value - FinalAddress;
|
||||
break;
|
||||
// Write 24 bit relative value to the branch instruction.
|
||||
case ELF::R_ARM_PC24: // Fall through.
|
||||
case ELF::R_ARM_CALL: // Fall through.
|
||||
@ -1365,6 +1368,19 @@ RuntimeDyldELF::processRelocationRef(
|
||||
RelType, 0);
|
||||
Section.advanceStubOffset(getMaxStubSize());
|
||||
}
|
||||
} else if (RelType == ELF::R_ARM_GOT_PREL) {
|
||||
uint32_t GOTOffset = allocateGOTEntries(SectionID, 1);
|
||||
|
||||
RelocationEntry GOTRE(SectionID, Offset, ELF::R_ARM_REL32, GOTOffset);
|
||||
addRelocationForSection(GOTRE, GOTSectionID);
|
||||
|
||||
// Fill in the value of the symbol we're targeting into the GOT
|
||||
RelocationEntry RE = computeGOTOffsetRE(SectionID, GOTOffset,
|
||||
Value.Offset, ELF::R_ARM_ABS32);
|
||||
if (Value.SymbolName)
|
||||
addRelocationForSymbol(RE, Value.SymbolName);
|
||||
else
|
||||
addRelocationForSection(RE, Value.SectionID);
|
||||
} else {
|
||||
uint32_t *Placeholder =
|
||||
reinterpret_cast<uint32_t*>(computePlaceholderAddress(SectionID, Offset));
|
||||
|
Loading…
x
Reference in New Issue
Block a user