mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-31 10:34:17 +00:00
Made RuntimeDyldMachO support vanilla i386
relocations. The algorithm is the same as that for x86_64. Scattered relocations, a feature present in i386 but not on x86_64, are not yet supported. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153466 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c71108b6f8
commit
b38aae442f
@ -32,6 +32,14 @@ resolveRelocation(uint8_t *LocalAddress,
|
|||||||
// This just dispatches to the proper target specific routine.
|
// This just dispatches to the proper target specific routine.
|
||||||
switch (CPUType) {
|
switch (CPUType) {
|
||||||
default: llvm_unreachable("Unsupported CPU type!");
|
default: llvm_unreachable("Unsupported CPU type!");
|
||||||
|
case mach::CTM_i386:
|
||||||
|
return resolveI386Relocation(LocalAddress,
|
||||||
|
FinalAddress,
|
||||||
|
(uintptr_t)Value,
|
||||||
|
isPCRel,
|
||||||
|
Type,
|
||||||
|
Size,
|
||||||
|
Addend);
|
||||||
case mach::CTM_x86_64:
|
case mach::CTM_x86_64:
|
||||||
return resolveX86_64Relocation(LocalAddress,
|
return resolveX86_64Relocation(LocalAddress,
|
||||||
FinalAddress,
|
FinalAddress,
|
||||||
@ -51,6 +59,35 @@ resolveRelocation(uint8_t *LocalAddress,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RuntimeDyldMachO::
|
||||||
|
resolveI386Relocation(uint8_t *LocalAddress,
|
||||||
|
uint64_t FinalAddress,
|
||||||
|
uint64_t Value,
|
||||||
|
bool isPCRel,
|
||||||
|
unsigned Type,
|
||||||
|
unsigned Size,
|
||||||
|
int64_t Addend) {
|
||||||
|
if (isPCRel)
|
||||||
|
Value -= FinalAddress + 4; // see resolveX86_64Relocation
|
||||||
|
|
||||||
|
switch (Type) {
|
||||||
|
default:
|
||||||
|
llvm_unreachable("Invalid relocation type!");
|
||||||
|
case macho::RIT_Vanilla: {
|
||||||
|
uint8_t *p = LocalAddress;
|
||||||
|
uint64_t ValueToWrite = Value + Addend;
|
||||||
|
for (unsigned i = 0; i < Size; ++i) {
|
||||||
|
*p++ = (uint8_t)(ValueToWrite & 0xff);
|
||||||
|
ValueToWrite >>= 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case macho::RIT_Difference:
|
||||||
|
case macho::RIT_Generic_LocalDifference:
|
||||||
|
case macho::RIT_Generic_PreboundLazyPointer:
|
||||||
|
return Error("Relocation type not implemented yet!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool RuntimeDyldMachO::
|
bool RuntimeDyldMachO::
|
||||||
resolveX86_64Relocation(uint8_t *LocalAddress,
|
resolveX86_64Relocation(uint8_t *LocalAddress,
|
||||||
uint64_t FinalAddress,
|
uint64_t FinalAddress,
|
||||||
|
@ -74,6 +74,13 @@ class RuntimeDyldMachO : public RuntimeDyldImpl {
|
|||||||
unsigned Type,
|
unsigned Type,
|
||||||
unsigned Size,
|
unsigned Size,
|
||||||
int64_t Addend);
|
int64_t Addend);
|
||||||
|
bool resolveI386Relocation(uint8_t *LocalAddress,
|
||||||
|
uint64_t FinalAddress,
|
||||||
|
uint64_t Value,
|
||||||
|
bool isPCRel,
|
||||||
|
unsigned Type,
|
||||||
|
unsigned Size,
|
||||||
|
int64_t Addend);
|
||||||
bool resolveX86_64Relocation(uint8_t *LocalAddress,
|
bool resolveX86_64Relocation(uint8_t *LocalAddress,
|
||||||
uint64_t FinalAddress,
|
uint64_t FinalAddress,
|
||||||
uint64_t Value,
|
uint64_t Value,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user