From a1a4771ac1de95f2410c7fb8dfaf4a5986e5ebc6 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Mon, 23 Jan 2023 19:37:53 -0300 Subject: [PATCH] Remove use of GetFunctionPointerForDelegate to get JIT cache function pointer (#4337) * Remove use of GetFunctionPointerForDelegate to get JIT cache function pointer * Rename FuncPtr to FuncPointer --- ARMeilleure/CodeGen/CompiledFunction.cs | 16 ++++++++++++++-- ARMeilleure/Instructions/NativeInterface.cs | 2 +- ARMeilleure/Translation/PTC/Ptc.cs | 4 ++-- ARMeilleure/Translation/TranslatedFunction.cs | 7 +++---- ARMeilleure/Translation/Translator.cs | 12 ++++++------ 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/ARMeilleure/CodeGen/CompiledFunction.cs b/ARMeilleure/CodeGen/CompiledFunction.cs index ab5e88ebb..0560bf2e9 100644 --- a/ARMeilleure/CodeGen/CompiledFunction.cs +++ b/ARMeilleure/CodeGen/CompiledFunction.cs @@ -48,9 +48,21 @@ namespace ARMeilleure.CodeGen /// A delegate of type pointing to the mapped function public T Map() { - IntPtr codePtr = JitCache.Map(this); + return MapWithPointer(out _); + } - return Marshal.GetDelegateForFunctionPointer(codePtr); + /// + /// Maps the onto the and returns a delegate of type + /// pointing to the mapped function. + /// + /// Type of delegate + /// Pointer to the function code in memory + /// A delegate of type pointing to the mapped function + public T MapWithPointer(out IntPtr codePointer) + { + codePointer = JitCache.Map(this); + + return Marshal.GetDelegateForFunctionPointer(codePointer); } } } \ No newline at end of file diff --git a/ARMeilleure/Instructions/NativeInterface.cs b/ARMeilleure/Instructions/NativeInterface.cs index 2ac748a9a..57964cc8d 100644 --- a/ARMeilleure/Instructions/NativeInterface.cs +++ b/ARMeilleure/Instructions/NativeInterface.cs @@ -191,7 +191,7 @@ namespace ARMeilleure.Instructions { TranslatedFunction function = Context.Translator.GetOrTranslate(address, GetContext().ExecutionMode); - return (ulong)function.FuncPtr.ToInt64(); + return (ulong)function.FuncPointer.ToInt64(); } public static void InvalidateCacheLine(ulong address) diff --git a/ARMeilleure/Translation/PTC/Ptc.cs b/ARMeilleure/Translation/PTC/Ptc.cs index aeb5868c9..de2294b24 100644 --- a/ARMeilleure/Translation/PTC/Ptc.cs +++ b/ARMeilleure/Translation/PTC/Ptc.cs @@ -745,9 +745,9 @@ namespace ARMeilleure.Translation.PTC bool highCq) { var cFunc = new CompiledFunction(code, unwindInfo, RelocInfo.Empty); - var gFunc = cFunc.Map(); + var gFunc = cFunc.MapWithPointer(out IntPtr gFuncPointer); - return new TranslatedFunction(gFunc, callCounter, guestSize, highCq); + return new TranslatedFunction(gFunc, gFuncPointer, callCounter, guestSize, highCq); } private void UpdateInfo(InfoEntry infoEntry) diff --git a/ARMeilleure/Translation/TranslatedFunction.cs b/ARMeilleure/Translation/TranslatedFunction.cs index 04dd769c1..71eec08ac 100644 --- a/ARMeilleure/Translation/TranslatedFunction.cs +++ b/ARMeilleure/Translation/TranslatedFunction.cs @@ -1,6 +1,5 @@ using ARMeilleure.Common; using System; -using System.Runtime.InteropServices; namespace ARMeilleure.Translation { @@ -8,18 +7,18 @@ namespace ARMeilleure.Translation { private readonly GuestFunction _func; // Ensure that this delegate will not be garbage collected. + public IntPtr FuncPointer { get; } public Counter CallCounter { get; } public ulong GuestSize { get; } public bool HighCq { get; } - public IntPtr FuncPtr { get; } - public TranslatedFunction(GuestFunction func, Counter callCounter, ulong guestSize, bool highCq) + public TranslatedFunction(GuestFunction func, IntPtr funcPointer, Counter callCounter, ulong guestSize, bool highCq) { _func = func; + FuncPointer = funcPointer; CallCounter = callCounter; GuestSize = guestSize; HighCq = highCq; - FuncPtr = Marshal.GetFunctionPointerForDelegate(func); } public ulong Execute(State.ExecutionContext context) diff --git a/ARMeilleure/Translation/Translator.cs b/ARMeilleure/Translation/Translator.cs index cbf6baa00..0c05b2b49 100644 --- a/ARMeilleure/Translation/Translator.cs +++ b/ARMeilleure/Translation/Translator.cs @@ -211,7 +211,7 @@ namespace ARMeilleure.Translation if (oldFunc != func) { - JitCache.Unmap(func.FuncPtr); + JitCache.Unmap(func.FuncPointer); func = oldFunc; } @@ -230,7 +230,7 @@ namespace ARMeilleure.Translation { if (FunctionTable.IsValid(guestAddress) && (Optimizations.AllowLcqInFunctionTable || func.HighCq)) { - Volatile.Write(ref FunctionTable.GetValue(guestAddress), (ulong)func.FuncPtr); + Volatile.Write(ref FunctionTable.GetValue(guestAddress), (ulong)func.FuncPointer); } } @@ -292,11 +292,11 @@ namespace ARMeilleure.Translation _ptc.WriteCompiledFunction(address, funcSize, hash, highCq, compiledFunc); } - GuestFunction func = compiledFunc.Map(); + GuestFunction func = compiledFunc.MapWithPointer(out IntPtr funcPointer); Allocators.ResetAll(); - return new TranslatedFunction(func, counter, funcSize, highCq); + return new TranslatedFunction(func, funcPointer, counter, funcSize, highCq); } private void BackgroundTranslate() @@ -537,7 +537,7 @@ namespace ARMeilleure.Translation foreach (var func in functions) { - JitCache.Unmap(func.FuncPtr); + JitCache.Unmap(func.FuncPointer); func.CallCounter?.Dispose(); } @@ -546,7 +546,7 @@ namespace ARMeilleure.Translation while (_oldFuncs.TryDequeue(out var kv)) { - JitCache.Unmap(kv.Value.FuncPtr); + JitCache.Unmap(kv.Value.FuncPointer); kv.Value.CallCounter?.Dispose(); }