mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-19 04:32:19 +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.
|
||||
switch (CPUType) {
|
||||
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:
|
||||
return resolveX86_64Relocation(LocalAddress,
|
||||
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::
|
||||
resolveX86_64Relocation(uint8_t *LocalAddress,
|
||||
uint64_t FinalAddress,
|
||||
|
@ -74,6 +74,13 @@ class RuntimeDyldMachO : public RuntimeDyldImpl {
|
||||
unsigned Type,
|
||||
unsigned Size,
|
||||
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,
|
||||
uint64_t FinalAddress,
|
||||
uint64_t Value,
|
||||
|
Loading…
x
Reference in New Issue
Block a user