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:
Borja Ferrer 2007-07-27 04:37:00 +00:00
parent 8556c6925d
commit 995f0231a8

View File

@ -28,6 +28,7 @@
#include "jit_call.h" #include "jit_call.h"
jit_uint32_t g_StackUsage = 0; jit_uint32_t g_StackUsage = 0;
jit_uint32_t g_StackAlign = 0;
jit_uint32_t g_RegDecoder = 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 //if has_params
// push ebx // push ebx
// mov ebx, [ebp+8] // mov ebx, [ebp+8]
//push esi
//mov esi, esp
//and esp, 0xFFFFFFF0
//sub esp, <alignment>
IA32_Push_Reg(jit, REG_EBP); IA32_Push_Reg(jit, REG_EBP);
IA32_Mov_Reg_Rm(jit, REG_EBP, REG_ESP, MOD_REG); IA32_Mov_Reg_Rm(jit, REG_EBP, REG_ESP, MOD_REG);
if (!is_void) 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_Push_Reg(jit, REG_EBX);
IA32_Mov_Reg_Rm_Disp8(jit, REG_EBX, REG_EBP, 8); 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) inline void Write_Function_Epilogue(JitWriter *jit, bool is_void, bool has_params)
{ {
//mov esp, esi
//pop esi
//if has_params //if has_params
// pop ebx // pop ebx
//if !is_void //if !is_void
@ -93,6 +114,8 @@ inline void Write_Function_Epilogue(JitWriter *jit, bool is_void, bool has_param
//mov esp, ebp //mov esp, ebp
//pop ebp //pop ebp
//ret //ret
IA32_Mov_Reg_Rm(jit, REG_ESP, REG_ESI, MOD_REG);
IA32_Pop_Reg(jit, REG_ESI);
if (has_params) if (has_params)
{ {
IA32_Pop_Reg(jit, REG_EBX); IA32_Pop_Reg(jit, REG_EBX);
@ -510,6 +533,8 @@ void JIT_Compile(CallWrapper *pWrapper, FuncAddrMethod method)
const PassInfo *pRet = pWrapper->GetReturnInfo(); const PassInfo *pRet = pWrapper->GetReturnInfo();
bool hasParams = (ParamCount || Convention == CallConv_ThisCall); bool hasParams = (ParamCount || Convention == CallConv_ThisCall);
g_StackUsage = 0;
writer.outbase = NULL; writer.outbase = NULL;
writer.outptr = NULL; writer.outptr = NULL;
@ -607,6 +632,7 @@ skip_retbuffer:
writer.outbase = (jitcode_t)g_SPEngine->ExecAlloc(CodeSize); writer.outbase = (jitcode_t)g_SPEngine->ExecAlloc(CodeSize);
writer.outptr = writer.outbase; writer.outptr = writer.outbase;
pWrapper->m_Addrs[ADDR_CODEBASE] = writer.outbase; pWrapper->m_Addrs[ADDR_CODEBASE] = writer.outbase;
g_StackAlign = (g_StackUsage) ? ((g_StackUsage & 0xFFFFFFF0) + 16) - g_StackUsage : 0;
g_StackUsage = 0; g_StackUsage = 0;
g_RegDecoder = 0; g_RegDecoder = 0;
Needs_Retbuf = false; Needs_Retbuf = false;