blob: 6d4e26fb79d43b090abaf22a45ce405398a61cdd [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
// We need real JITManager code when on _WIN32 or explict ENABLE_OOP_NATIVE_CODEGEN.
// Otherwise we use a dummy JITManager which disables OOP JIT to reduce code noise.
enum class RemoteCallType
{
CodeGen,
ThunkCreation,
HeapQuery,
StateUpdate,
MemFree
};
#if _WIN32 || ENABLE_OOP_NATIVE_CODEGEN
class JITManager
{
public:
HRESULT ConnectRpcServer(__in HANDLE jitProcessHandle, __in_opt void* serverSecurityDescriptor, __in UUID connectionUuid);
bool IsConnected() const;
bool IsJITServer() const;
void SetIsJITServer();
bool IsOOPJITEnabled() const;
void EnableOOPJIT();
void SetJITFailed(HRESULT hr);
bool HasJITFailed() const;
HANDLE GetServerHandle() const;
HRESULT InitializeThreadContext(
__in ThreadContextDataIDL * data,
__out PPTHREADCONTEXT_HANDLE threadContextInfoAddress,
__out intptr_t * prereservedRegionAddr,
__out intptr_t * jitThunkAddr);
HRESULT CleanupThreadContext(
__inout PPTHREADCONTEXT_HANDLE threadContextInfoAddress);
HRESULT UpdatePropertyRecordMap(
__in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
__in_opt BVSparseNodeIDL * updatedPropsBVHead);
HRESULT DecommitInterpreterBufferManager(
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
__in boolean asmJsThunk);
HRESULT NewInterpreterThunkBlock(
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
__in InterpreterThunkInputIDL * thunkInput,
__out InterpreterThunkOutputIDL * thunkOutput);
HRESULT AddDOMFastPathHelper(
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
__in intptr_t funcInfoAddr,
__in int helper);
HRESULT AddModuleRecordInfo(
/* [in] */ PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
/* [in] */ unsigned int moduleId,
/* [in] */ intptr_t localExportSlotsAddr);
HRESULT SetWellKnownHostTypeId(
__in PTHREADCONTEXT_HANDLE threadContextRoot,
__in int typeId);
HRESULT InitializeScriptContext(
__in ScriptContextDataIDL * data,
__in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
__out PPSCRIPTCONTEXT_HANDLE scriptContextInfoAddress);
HRESULT CleanupScriptContext(
__inout PPSCRIPTCONTEXT_HANDLE scriptContextInfoAddress);
HRESULT CloseScriptContext(
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress);
HRESULT FreeAllocation(
__in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
__in intptr_t codeAddress,
__in intptr_t thunkAddress);
HRESULT SetIsPRNGSeeded(
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
__in boolean value);
HRESULT IsNativeAddr(
__in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
__in intptr_t address,
__out boolean * result);
HRESULT RemoteCodeGenCall(
__in CodeGenWorkItemIDL *workItemData,
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
__out JITOutputIDL *jitData);
#if DBG
HRESULT IsInterpreterThunkAddr(
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
__in intptr_t address,
__in boolean asmjsThunk,
__out boolean * result);
#endif
HRESULT Shutdown();
static JITManager * GetJITManager();
static bool HandleServerCallResult(HRESULT hr, RemoteCallType callType);
private:
JITManager();
~JITManager();
HRESULT CreateBinding(
__in HANDLE serverProcessHandle,
__in_opt void* serverSecurityDescriptor,
__in UUID* connectionUuid,
__out RPC_BINDING_HANDLE* bindingHandle);
RPC_BINDING_HANDLE m_rpcBindingHandle;
HANDLE m_serverHandle;
UUID m_jitConnectionId;
bool m_oopJitEnabled;
bool m_isJITServer;
HRESULT m_failingHRESULT;
static JITManager s_jitManager;
};
#else // !ENABLE_OOP_NATIVE_CODEGEN
class JITManager
{
public:
HRESULT ConnectRpcServer(__in HANDLE jitProcessHandle, __in_opt void* serverSecurityDescriptor, __in UUID connectionUuid)
{ Assert(false); return E_FAIL; }
bool IsConnected() const { return false; }
bool IsJITServer() const { return false; }
void SetIsJITServer() { Assert(false); }
bool IsOOPJITEnabled() const { return false; }
void EnableOOPJIT() { Assert(false); }
void SetJITFailed(HRESULT hr) { Assert(false); }
HANDLE GetServerHandle() const
{
Assert(false); return HANDLE();
}
HRESULT InitializeThreadContext(
__in ThreadContextDataIDL * data,
__out PPTHREADCONTEXT_HANDLE threadContextInfoAddress,
__out intptr_t *prereservedRegionAddr,
__out intptr_t * jitThunkAddr)
{ Assert(false); return E_FAIL; }
HRESULT DecommitInterpreterBufferManager(
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
__in boolean asmJsThunk)
{ Assert(false); return E_FAIL; }
HRESULT CleanupThreadContext(
__inout PPTHREADCONTEXT_HANDLE threadContextInfoAddress)
{ Assert(false); return E_FAIL; }
HRESULT UpdatePropertyRecordMap(
__in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
__in_opt BVSparseNodeIDL * updatedPropsBVHead)
{ Assert(false); return E_FAIL; }
HRESULT AddDOMFastPathHelper(
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
__in intptr_t funcInfoAddr,
__in int helper)
{ Assert(false); return E_FAIL; }
HRESULT AddModuleRecordInfo(
/* [in] */ PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
/* [in] */ unsigned int moduleId,
/* [in] */ intptr_t localExportSlotsAddr)
{ Assert(false); return E_FAIL; }
HRESULT SetWellKnownHostTypeId(
__in PTHREADCONTEXT_HANDLE threadContextRoot,
__in int typeId)
{ Assert(false); return E_FAIL; }
HRESULT InitializeScriptContext(
__in ScriptContextDataIDL * data,
__in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
__out PPSCRIPTCONTEXT_HANDLE scriptContextInfoAddress)
{ Assert(false); return E_FAIL; }
HRESULT CleanupScriptContext(
__inout PPSCRIPTCONTEXT_HANDLE scriptContextInfoAddress)
{ Assert(false); return E_FAIL; }
HRESULT CloseScriptContext(
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress)
{ Assert(false); return E_FAIL; }
HRESULT FreeAllocation(
__in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
__in intptr_t codeAddress,
__in intptr_t thunkAddress)
{ Assert(false); return E_FAIL; }
HRESULT SetIsPRNGSeeded(
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
__in boolean value)
{ Assert(false); return E_FAIL; }
HRESULT IsNativeAddr(
__in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
__in intptr_t address,
__out boolean * result)
{ Assert(false); return E_FAIL; }
HRESULT RemoteCodeGenCall(
__in CodeGenWorkItemIDL *workItemData,
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
__out JITOutputIDL *jitData)
{ Assert(false); return E_FAIL; }
#if DBG
HRESULT IsInterpreterThunkAddr(
__in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
__in intptr_t address,
__in boolean asmjsThunk,
__out boolean * result)
{ Assert(false); return E_FAIL; }
#endif
HRESULT Shutdown()
{ Assert(false); return E_FAIL; }
static JITManager * GetJITManager()
{ return &s_jitManager; }
static bool HandleServerCallResult(HRESULT hr, RemoteCallType callType) { Assert(UNREACHED); }
private:
static JITManager s_jitManager;
};
#endif // !ENABLE_OOP_NATIVE_CODEGEN