diff options
| author | Chris Lattner <sabre@nondot.org> | 2004-11-22 22:25:30 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2004-11-22 22:25:30 +0000 |
| commit | a76f09d0d3c07c04481ddc3e8b1f648be01ebff5 (patch) | |
| tree | 811801275e95c4dea5655f8a61b1acc75dbb24dc /llvm/lib/Target/X86/X86JITInfo.cpp | |
| parent | b769690ab31a4d60afff30f8007378fb87b497b7 (diff) | |
| download | bcm5719-llvm-a76f09d0d3c07c04481ddc3e8b1f648be01ebff5.tar.gz bcm5719-llvm-a76f09d0d3c07c04481ddc3e8b1f648be01ebff5.zip | |
Do not push two return addresses on the stack when we call external functions who have their addresses taken. This fixes test-call.ll
llvm-svn: 18134
Diffstat (limited to 'llvm/lib/Target/X86/X86JITInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86JITInfo.cpp | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/llvm/lib/Target/X86/X86JITInfo.cpp b/llvm/lib/Target/X86/X86JITInfo.cpp index 4696b6541bd..4d7b2385da4 100644 --- a/llvm/lib/Target/X86/X86JITInfo.cpp +++ b/llvm/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 |

