bintools will now align the stack before calling a function
authorBorja Ferrer <faluco@alliedmods.net>
Fri Jul 27 04:37:00 2007 +0000 (2007-07-27)
changeset 1190948527637fc8
parent 1189 998004a6b4cf
child 1191 054147e50960
bintools will now align the stack before calling a function
extensions/bintools/jit_call.cpp
     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;