mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Do not push two return addresses on the stack when we call external functions who have their addresses taken. This fixes test-call.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18134 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e55cb54a90
commit
90b1b457ef
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user