diff options
-rw-r--r-- | lib/Target/X86/X86JITInfo.cpp | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/lib/Target/X86/X86JITInfo.cpp b/lib/Target/X86/X86JITInfo.cpp index 4696b6541b..4d7b2385da 100644 --- a/lib/Target/X86/X86JITInfo.cpp +++ b/lib/Target/X86/X86JITInfo.cpp @@ -18,16 +18,6 @@ #include "llvm/Config/alloca.h" using namespace llvm; -void *X86JITInfo::emitFunctionStub(void *Fn, MachineCodeEmitter &MCE) { - MCE.startFunctionStub(6); - MCE.emitByte(0xE8); // Call with 32 bit pc-rel destination... - - MCE.emitWord((intptr_t)Fn-MCE.getCurrentPCValue()-4); - - MCE.emitByte(0xCD); // Interrupt - Just a marker identifying the stub! - return MCE.finishFunctionStub(0); -} - void X86JITInfo::replaceMachineCodeForFunction(void *Old, void *New) { unsigned char *OldByte = (unsigned char *)Old; *OldByte++ = 0xE9; // Emit JMP opcode. @@ -113,6 +103,22 @@ X86JITInfo::getLazyResolverFunction(JITCompilerFn F) { return CompilationCallback; } +void *X86JITInfo::emitFunctionStub(void *Fn, MachineCodeEmitter &MCE) { + if (Fn != CompilationCallback) { + MCE.startFunctionStub(5); + MCE.emitByte(0xE9); + MCE.emitWord((intptr_t)Fn-MCE.getCurrentPCValue()-4); + return MCE.finishFunctionStub(0); + } + + MCE.startFunctionStub(6); + MCE.emitByte(0xE8); // Call with 32 bit pc-rel destination... + + MCE.emitWord((intptr_t)Fn-MCE.getCurrentPCValue()-4); + + MCE.emitByte(0xCD); // Interrupt - Just a marker identifying the stub! + return MCE.finishFunctionStub(0); +} /// relocate - Before the JIT can run a block of code that has been emitted, /// it must rewrite the code to contain the actual addresses of any |