internal TranslatedFunction GetOrTranslate(ulong address, ExecutionMode mode, bool hintRejit = false) { if (!_funcs.TryGetValue(address, out TranslatedFunction func)) { func = Translate(_memory, _jumpTable, address, mode, highCq: false); TranslatedFunction getFunc = _funcs.GetOrAdd(address, func); if (getFunc != func) { JitCache.Unmap(func.FuncPtr); func = getFunc; } if (PtcProfiler.Enabled) { PtcProfiler.AddEntry(address, mode, highCq: false); } } if (hintRejit && func.ShouldRejit()) { _backgroundStack.Push(new RejitRequest(address, mode)); _backgroundTranslatorEvent.Set(); } return(func); }
internal TranslatedFunction GetOrTranslate(ulong address, ExecutionMode mode) { // TODO: Investigate how we should handle code at unaligned addresses. // Currently, those low bits are used to store special flags. bool isCallTarget = (address & CallFlag) != 0; address &= ~CallFlag; if (!_funcs.TryGetValue(address, out TranslatedFunction func)) { func = Translate(_memory, _jumpTable, address, mode, highCq: false); _funcs.TryAdd(address, func); if (PtcProfiler.Enabled) { PtcProfiler.AddEntry(address, mode, highCq: false); } } if (isCallTarget && func.ShouldRejit()) { _backgroundStack.Push(new RejitRequest(address, mode)); _backgroundTranslatorEvent.Set(); } return(func); }