| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- //-------------------------------------------------------------------------------------------------------
- // 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;
- 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 PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
- __in intptr_t codeAddress);
- 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
- #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
- static HRESULT DeserializeRPCData(
- _In_reads_(bufferSize) const byte* buffer,
- _In_ uint bufferSize,
- _Out_ CodeGenWorkItemIDL **workItemData
- );
- static HRESULT SerializeRPCData(
- _In_ CodeGenWorkItemIDL *workItemData,
- _Out_ size_t* bufferSize,
- _Outptr_result_buffer_(*bufferSize) const byte** outBuffer
- );
- #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);
- HRESULT ConnectProcess(RPC_BINDING_HANDLE rpcBindingHandle);
- RPC_BINDING_HANDLE m_rpcBindingHandle;
- UUID m_jitConnectionId;
- bool m_oopJitEnabled;
- bool m_isJITServer;
- HRESULT m_failingHRESULT;
- CriticalSection m_cs;
- 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); }
- 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 PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
- __in intptr_t codeAddress)
- { 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
- #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
- static HRESULT DeserializeRPCData(
- _In_reads_(bufferSize) const byte* buffer,
- _In_ uint bufferSize,
- _Out_ CodeGenWorkItemIDL **workItemData
- ) { *workItemData = nullptr; return E_NOTIMPL; }
- static HRESULT SerializeRPCData(
- _In_ CodeGenWorkItemIDL *workItemData,
- _Out_ size_t* bufferSize,
- _Outptr_result_buffer_(*bufferSize) const byte** outBuffer
- ) { *bufferSize = 0; *outBuffer = nullptr; return E_NOTIMPL; }
- #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
|