aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Translation/JumpTable.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ARMeilleure/Translation/JumpTable.cs')
-rw-r--r--ARMeilleure/Translation/JumpTable.cs22
1 files changed, 7 insertions, 15 deletions
diff --git a/ARMeilleure/Translation/JumpTable.cs b/ARMeilleure/Translation/JumpTable.cs
index 5cad2944..e444e96d 100644
--- a/ARMeilleure/Translation/JumpTable.cs
+++ b/ARMeilleure/Translation/JumpTable.cs
@@ -9,13 +9,6 @@ namespace ARMeilleure.Translation
{
class JumpTable
{
- public static JumpTable Instance { get; }
-
- static JumpTable()
- {
- Instance = new JumpTable();
- }
-
// The jump table is a block of (guestAddress, hostAddress) function mappings.
// Each entry corresponds to one branch in a JIT compiled function. The entries are
// reserved specifically for each call.
@@ -60,23 +53,23 @@ namespace ARMeilleure.Translation
public IntPtr JumpPointer => _jumpRegion.Pointer;
public IntPtr DynamicPointer => _dynamicRegion.Pointer;
- public JumpTable()
+ public JumpTable(IJitMemoryAllocator allocator)
{
- _jumpRegion = new ReservedRegion(JumpTableByteSize);
- _dynamicRegion = new ReservedRegion(DynamicTableByteSize);
+ _jumpRegion = new ReservedRegion(allocator, JumpTableByteSize);
+ _dynamicRegion = new ReservedRegion(allocator, DynamicTableByteSize);
_targets = new ConcurrentDictionary<ulong, TranslatedFunction>();
_dependants = new ConcurrentDictionary<ulong, LinkedList<int>>();
}
- public void RegisterFunction(ulong address, TranslatedFunction func) {
+ public void RegisterFunction(ulong address, TranslatedFunction func)
+ {
address &= ~3UL;
_targets.AddOrUpdate(address, func, (key, oldFunc) => func);
long funcPtr = func.GetPointer().ToInt64();
// Update all jump table entries that target this address.
- LinkedList<int> myDependants;
- if (_dependants.TryGetValue(address, out myDependants))
+ if (_dependants.TryGetValue(address, out LinkedList<int> myDependants))
{
lock (myDependants)
{
@@ -125,8 +118,7 @@ namespace ARMeilleure.Translation
// Is the address we have already registered? If so, put the function address in the jump table.
// If not, it will point to the direct call stub.
long value = (long)DirectCallStubs.DirectCallStub(isJump);
- TranslatedFunction func;
- if (_targets.TryGetValue((ulong)address, out func))
+ if (_targets.TryGetValue((ulong)address, out TranslatedFunction func))
{
value = func.GetPointer().ToInt64();
}