mirror of
https://git.naxdy.org/Mirror/Ryujinx.git
synced 2025-01-14 06:39:12 +00:00
Increment call depth on function start rather than before call
This commit is contained in:
parent
25f4178dda
commit
1d87e77834
5 changed files with 8 additions and 6 deletions
|
@ -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();
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue