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.

llvm-svn: 153466
This commit is contained in:
Sean Callanan 2012-03-26 20:45:52 +00:00
parent e63e59cc44
commit a375943d82
2 changed files with 44 additions and 0 deletions

View File

@ -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,

View File

@ -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,