Do not push two return addresses on the stack when we call external functions who...
authorChris Lattner <sabre@nondot.org>
Mon, 22 Nov 2004 22:25:30 +0000 (22:25 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 22 Nov 2004 22:25:30 +0000 (22:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18134 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86JITInfo.cpp

index 4696b6541bd05e77dbd0b51b0275b2fe55c96879..4d7b2385da46ae3876d6dd658d1ffce233b8be15 100644 (file)
 #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