Increment call depth on function start rather than before call

This commit is contained in:
gdk 2022-07-10 02:20:58 -03:00 committed by Mary
parent 25f4178dda
commit 1d87e77834
5 changed files with 8 additions and 6 deletions

View file

@ -224,14 +224,14 @@ namespace ARMeilleure.Instructions
if (isJump) if (isJump)
{ {
DecreaseCallDepth(context, nativeContext);
context.Tailcall(hostAddress, nativeContext); context.Tailcall(hostAddress, nativeContext);
} }
else else
{ {
OpCode op = context.CurrOp; OpCode op = context.CurrOp;
EmitCallDepthCheckAndIncrement(context, nativeContext, guestAddress);
Operand returnAddress = context.Call(hostAddress, OperandType.I64, nativeContext); Operand returnAddress = context.Call(hostAddress, OperandType.I64, nativeContext);
context.LoadFromContext(); context.LoadFromContext();
@ -253,13 +253,14 @@ namespace ARMeilleure.Instructions
} }
} }
private static void EmitCallDepthCheckAndIncrement(EmitterContext context, Operand nativeContext, Operand guestAddress) public static void EmitCallDepthCheckAndIncrement(EmitterContext context, Operand guestAddress)
{ {
if (!Optimizations.EnableDeepCallRecursionProtection) if (!Optimizations.EnableDeepCallRecursionProtection)
{ {
return; return;
} }
Operand nativeContext = context.LoadArgument(OperandType.I64, 0);
Operand callDepthAddr = context.Add(nativeContext, Const((ulong)NativeContext.GetCallDepthOffset())); Operand callDepthAddr = context.Add(nativeContext, Const((ulong)NativeContext.GetCallDepthOffset()));
Operand currentCallDepth = context.Load(OperandType.I32, callDepthAddr); Operand currentCallDepth = context.Load(OperandType.I32, callDepthAddr);
Operand lblDoCall = Label(); Operand lblDoCall = Label();

View file

@ -183,7 +183,7 @@ namespace ARMeilleure.State
public bool GetRunning() => GetStorage().Running != 0; public bool GetRunning() => GetStorage().Running != 0;
public void SetRunning(bool value) => GetStorage().Running = value ? 1 : 0; public void SetRunning(bool value) => GetStorage().Running = value ? 1 : 0;
public void ResetCallDepth() => GetStorage().CallDepth = 1; public void ResetCallDepth() => GetStorage().CallDepth = 0;
public unsafe static int GetRegisterOffset(Register reg) public unsafe static int GetRegisterOffset(Register reg)
{ {

View file

@ -29,7 +29,7 @@ namespace ARMeilleure.Translation.PTC
private const string OuterHeaderMagicString = "PTCohd\0\0"; private const string OuterHeaderMagicString = "PTCohd\0\0";
private const string InnerHeaderMagicString = "PTCihd\0\0"; private const string InnerHeaderMagicString = "PTCihd\0\0";
private const uint InternalVersion = 3431; //! To be incremented manually for each change to the ARMeilleure project. private const uint InternalVersion = 3430; //! To be incremented manually for each change to the ARMeilleure project.
private const string ActualDir = "0"; private const string ActualDir = "0";
private const string BackupDir = "1"; private const string BackupDir = "1";

View file

@ -271,6 +271,7 @@ namespace ARMeilleure.Translation
Logger.StartPass(PassName.Translation); Logger.StartPass(PassName.Translation);
InstEmitFlowHelper.EmitCallDepthCheckAndIncrement(context, Const(address));
EmitSynchronization(context); EmitSynchronization(context);
if (blocks[0].Address != address) if (blocks[0].Address != address)

View file

@ -271,7 +271,7 @@ namespace ARMeilleure.Translation
if (Optimizations.EnableDeepCallRecursionProtection) if (Optimizations.EnableDeepCallRecursionProtection)
{ {
// Reset the call depth counter, since this is our first guest function call. // Reset the call depth counter, since this is our first guest function call.
context.Store(callDepthAddress, Const(1)); context.Store(callDepthAddress, Const(0));
} }
context.Store(dispatchAddress, guestAddress); context.Store(dispatchAddress, guestAddress);