Skip to content

Commit

Permalink
Fix passing variant_t parameters + fix codegen stack on Win64 (#2117)
Browse files Browse the repository at this point in the history
* Fix 64-bit JIT not allocating stack space for params on stack
Fix wrong cond check for passing objects by value

* Fix wrong FireOutput detour proto on win64
  • Loading branch information
KitRifty committed May 5, 2024
1 parent 5cb2d68 commit f08f1ef
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 3 deletions.
10 changes: 9 additions & 1 deletion extensions/bintools/jit_call_x64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -787,7 +787,7 @@ inline void Write_PushObject(JitWriter *jit, const SourceHook::PassInfo *info, u
return;

#elif defined PLATFORM_WINDOWS
if (info->size < 64 && (info->size & (info->size - 1)) == 0)
if (info->size > 8 || (info->size & (info->size - 1)) != 0)
goto push_byref;
else {
SourceHook::PassInfo podInfo;
Expand Down Expand Up @@ -1055,7 +1055,11 @@ void *JIT_CallCompile(CallWrapper *pWrapper, FuncAddrMethod method)
int numWords;
#endif

#ifdef PLATFORM_POSIX
g_StackUsage = 0;
#elif defined PLATFORM_WINDOWS
g_StackUsage = 32; // Shadow space
#endif

writer.outbase = NULL;
writer.outptr = NULL;
Expand Down Expand Up @@ -1155,8 +1159,12 @@ void *JIT_CallCompile(CallWrapper *pWrapper, FuncAddrMethod method)
#endif

/* Clean up the calling stack */
#ifdef PLATFORM_POSIX
if (hasParams && g_StackUsage)
#endif
{
Write_RectifyStack(jit, g_StackAlign);
}

/* Copy the return type to the return buffer if the function is not void */
if (pRet && !Needs_Retbuf)
Expand Down
2 changes: 1 addition & 1 deletion extensions/sdktools/output.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ bool EntityOutputManager::IsEnabled()
return enabled;
}

#ifdef PLATFORM_WINDOWS
#if defined PLATFORM_WINDOWS && defined PLATFORM_X86
DETOUR_DECL_MEMBER8(FireOutput, void, int, what, int, the, int, hell, int, msvc, void *, variant_t, CBaseEntity *, pActivator, CBaseEntity *, pCaller, float, fDelay)
{
bool fireOutput = g_OutputManager.FireEventDetour((void *)this, pActivator, pCaller, fDelay);
Expand Down
2 changes: 1 addition & 1 deletion extensions/sdktools/outputnatives.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ static cell_t FireEntityOutput(IPluginContext *pContext, const cell_t *params)
{
return pContext->ThrowNativeError("\"FireEntityOutput\" not supported by this mod");
}
#ifdef PLATFORM_WINDOWS
#if defined PLATFORM_WINDOWS && defined PLATFORM_X86
int iMaxParam = 8;
//Instead of being one param, MSVC broke variant_t param into 5 params..
PassInfo pass[8];
Expand Down

0 comments on commit f08f1ef

Please sign in to comment.