# HG changeset patch # User Borja Ferrer # Date 1185511020 0 # Node ID 948527637fc8cdc8b0443c9d1519995f0bf6bc8a # Parent 998004a6b4cf38a40778de272e4e4d218e94e321 bintools will now align the stack before calling a function diff -r 998004a6b4cf -r 948527637fc8 extensions/bintools/jit_call.cpp --- a/extensions/bintools/jit_call.cpp Fri Jul 27 03:29:15 2007 +0000 +++ b/extensions/bintools/jit_call.cpp Fri Jul 27 04:37:00 2007 +0000 @@ -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 @@ //if has_params // push ebx // mov ebx, [ebp+8] + //push esi + //mov esi, esp + //and esp, 0xFFFFFFF0 + //sub esp, IA32_Push_Reg(jit, REG_EBP); IA32_Mov_Reg_Rm(jit, REG_EBP, REG_ESP, MOD_REG); if (!is_void) @@ -82,10 +87,26 @@ 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 @@ //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 @@ const PassInfo *pRet = pWrapper->GetReturnInfo(); bool hasParams = (ParamCount || Convention == CallConv_ThisCall); + g_StackUsage = 0; + writer.outbase = NULL; writer.outptr = NULL; @@ -607,6 +632,7 @@ 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;