forked from OSchip/llvm-project
<rdar://problem/11022964>
Patched LLVM to handle generic i386 relocations. This avoids some sudden termination problems on i386 where the JIT would exit() out reporting "Invalid CPU type!" llvm-svn: 153467
This commit is contained in:
parent
a375943d82
commit
91e1080bcb
|
@ -0,0 +1,73 @@
|
|||
Index: lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
|
||||
===================================================================
|
||||
--- lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp (revision 153361)
|
||||
+++ lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp (working copy)
|
||||
@@ -32,6 +32,14 @@
|
||||
// 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,
|
||||
@@ -52,6 +60,35 @@
|
||||
}
|
||||
|
||||
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,
|
||||
uint64_t Value,
|
||||
Index: lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h
|
||||
===================================================================
|
||||
--- lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h (revision 153361)
|
||||
+++ lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h (working copy)
|
||||
@@ -74,6 +74,13 @@
|
||||
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…
Reference in New Issue