1.1 --- a/extensions/bintools/jit_call.cpp Fri Jul 27 03:29:15 2007 +0000
1.2 +++ b/extensions/bintools/jit_call.cpp Fri Jul 27 04:37:00 2007 +0000
1.3 @@ -28,6 +28,7 @@
1.4 #include "jit_call.h"
1.5
1.6 jit_uint32_t g_StackUsage = 0;
1.7 +jit_uint32_t g_StackAlign = 0;
1.8 jit_uint32_t g_RegDecoder = 0;
1.9
1.10 /********************
1.11 @@ -70,6 +71,10 @@
1.12 //if has_params
1.13 // push ebx
1.14 // mov ebx, [ebp+8]
1.15 + //push esi
1.16 + //mov esi, esp
1.17 + //and esp, 0xFFFFFFF0
1.18 + //sub esp, <alignment>
1.19 IA32_Push_Reg(jit, REG_EBP);
1.20 IA32_Mov_Reg_Rm(jit, REG_EBP, REG_ESP, MOD_REG);
1.21 if (!is_void)
1.22 @@ -82,10 +87,26 @@
1.23 IA32_Push_Reg(jit, REG_EBX);
1.24 IA32_Mov_Reg_Rm_Disp8(jit, REG_EBX, REG_EBP, 8);
1.25 }
1.26 + IA32_Push_Reg(jit, REG_ESI);
1.27 + IA32_Mov_Reg_Rm(jit, REG_ESI, REG_ESP, MOD_REG);
1.28 + IA32_And_Rm_Imm8(jit, REG_ESP, MOD_REG, -16);
1.29 +
1.30 + if (!jit->outbase)
1.31 + {
1.32 + /* Alloc this instruction before knowing the real stack usage */
1.33 + IA32_Sub_Rm_Imm32(jit, REG_ESP, 1337, MOD_REG);
1.34 + } else {
1.35 + if (g_StackAlign)
1.36 + {
1.37 + IA32_Sub_Rm_Imm32(jit, REG_ESP, g_StackAlign, MOD_REG);
1.38 + }
1.39 + }
1.40 }
1.41
1.42 inline void Write_Function_Epilogue(JitWriter *jit, bool is_void, bool has_params)
1.43 {
1.44 + //mov esp, esi
1.45 + //pop esi
1.46 //if has_params
1.47 // pop ebx
1.48 //if !is_void
1.49 @@ -93,6 +114,8 @@
1.50 //mov esp, ebp
1.51 //pop ebp
1.52 //ret
1.53 + IA32_Mov_Reg_Rm(jit, REG_ESP, REG_ESI, MOD_REG);
1.54 + IA32_Pop_Reg(jit, REG_ESI);
1.55 if (has_params)
1.56 {
1.57 IA32_Pop_Reg(jit, REG_EBX);
1.58 @@ -510,6 +533,8 @@
1.59 const PassInfo *pRet = pWrapper->GetReturnInfo();
1.60 bool hasParams = (ParamCount || Convention == CallConv_ThisCall);
1.61
1.62 + g_StackUsage = 0;
1.63 +
1.64 writer.outbase = NULL;
1.65 writer.outptr = NULL;
1.66
1.67 @@ -607,6 +632,7 @@
1.68 writer.outbase = (jitcode_t)g_SPEngine->ExecAlloc(CodeSize);
1.69 writer.outptr = writer.outbase;
1.70 pWrapper->m_Addrs[ADDR_CODEBASE] = writer.outbase;
1.71 + g_StackAlign = (g_StackUsage) ? ((g_StackUsage & 0xFFFFFFF0) + 16) - g_StackUsage : 0;
1.72 g_StackUsage = 0;
1.73 g_RegDecoder = 0;
1.74 Needs_Retbuf = false;