bintools will now align the stack before calling a function
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401196
This commit is contained in:
parent
8556c6925d
commit
995f0231a8
@ -28,6 +28,7 @@
|
||||
#include "jit_call.h"
|
||||
|
||||
jit_uint32_t g_StackUsage = 0;
|
||||
jit_uint32_t g_StackAlign = 0;
|
||||
jit_uint32_t g_RegDecoder = 0;
|
||||
|
||||
/********************
|
||||
@ -70,6 +71,10 @@ inline void Write_Execution_Prologue(JitWriter *jit, bool is_void, bool has_para
|
||||
//if has_params
|
||||
// push ebx
|
||||
// mov ebx, [ebp+8]
|
||||
//push esi
|
||||
//mov esi, esp
|
||||
//and esp, 0xFFFFFFF0
|
||||
//sub esp, <alignment>
|
||||
IA32_Push_Reg(jit, REG_EBP);
|
||||
IA32_Mov_Reg_Rm(jit, REG_EBP, REG_ESP, MOD_REG);
|
||||
if (!is_void)
|
||||
@ -82,10 +87,26 @@ inline void Write_Execution_Prologue(JitWriter *jit, bool is_void, bool has_para
|
||||
IA32_Push_Reg(jit, REG_EBX);
|
||||
IA32_Mov_Reg_Rm_Disp8(jit, REG_EBX, REG_EBP, 8);
|
||||
}
|
||||
IA32_Push_Reg(jit, REG_ESI);
|
||||
IA32_Mov_Reg_Rm(jit, REG_ESI, REG_ESP, MOD_REG);
|
||||
IA32_And_Rm_Imm8(jit, REG_ESP, MOD_REG, -16);
|
||||
|
||||
if (!jit->outbase)
|
||||
{
|
||||
/* Alloc this instruction before knowing the real stack usage */
|
||||
IA32_Sub_Rm_Imm32(jit, REG_ESP, 1337, MOD_REG);
|
||||
} else {
|
||||
if (g_StackAlign)
|
||||
{
|
||||
IA32_Sub_Rm_Imm32(jit, REG_ESP, g_StackAlign, MOD_REG);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline void Write_Function_Epilogue(JitWriter *jit, bool is_void, bool has_params)
|
||||
{
|
||||
//mov esp, esi
|
||||
//pop esi
|
||||
//if has_params
|
||||
// pop ebx
|
||||
//if !is_void
|
||||
@ -93,6 +114,8 @@ inline void Write_Function_Epilogue(JitWriter *jit, bool is_void, bool has_param
|
||||
//mov esp, ebp
|
||||
//pop ebp
|
||||
//ret
|
||||
IA32_Mov_Reg_Rm(jit, REG_ESP, REG_ESI, MOD_REG);
|
||||
IA32_Pop_Reg(jit, REG_ESI);
|
||||
if (has_params)
|
||||
{
|
||||
IA32_Pop_Reg(jit, REG_EBX);
|
||||
@ -510,6 +533,8 @@ void JIT_Compile(CallWrapper *pWrapper, FuncAddrMethod method)
|
||||
const PassInfo *pRet = pWrapper->GetReturnInfo();
|
||||
bool hasParams = (ParamCount || Convention == CallConv_ThisCall);
|
||||
|
||||
g_StackUsage = 0;
|
||||
|
||||
writer.outbase = NULL;
|
||||
writer.outptr = NULL;
|
||||
|
||||
@ -607,6 +632,7 @@ skip_retbuffer:
|
||||
writer.outbase = (jitcode_t)g_SPEngine->ExecAlloc(CodeSize);
|
||||
writer.outptr = writer.outbase;
|
||||
pWrapper->m_Addrs[ADDR_CODEBASE] = writer.outbase;
|
||||
g_StackAlign = (g_StackUsage) ? ((g_StackUsage & 0xFFFFFFF0) + 16) - g_StackUsage : 0;
|
||||
g_StackUsage = 0;
|
||||
g_RegDecoder = 0;
|
||||
Needs_Retbuf = false;
|
||||
|
Loading…
Reference in New Issue
Block a user