2
0

JITManager.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. // We need real JITManager code when on _WIN32 or explict ENABLE_OOP_NATIVE_CODEGEN.
  7. // Otherwise we use a dummy JITManager which disables OOP JIT to reduce code noise.
  8. enum class RemoteCallType
  9. {
  10. CodeGen,
  11. ThunkCreation,
  12. HeapQuery,
  13. StateUpdate,
  14. MemFree
  15. };
  16. #if _WIN32 || ENABLE_OOP_NATIVE_CODEGEN
  17. class JITManager
  18. {
  19. public:
  20. HRESULT ConnectRpcServer(__in HANDLE jitProcessHandle, __in_opt void* serverSecurityDescriptor, __in UUID connectionUuid);
  21. bool IsConnected() const;
  22. bool IsJITServer() const;
  23. void SetIsJITServer();
  24. bool IsOOPJITEnabled() const;
  25. void EnableOOPJIT();
  26. void SetJITFailed(HRESULT hr);
  27. bool HasJITFailed() const;
  28. HRESULT InitializeThreadContext(
  29. __in ThreadContextDataIDL * data,
  30. __out PPTHREADCONTEXT_HANDLE threadContextInfoAddress,
  31. __out intptr_t * prereservedRegionAddr,
  32. __out intptr_t * jitThunkAddr);
  33. HRESULT CleanupThreadContext(
  34. __inout PPTHREADCONTEXT_HANDLE threadContextInfoAddress);
  35. HRESULT UpdatePropertyRecordMap(
  36. __in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
  37. __in_opt BVSparseNodeIDL * updatedPropsBVHead);
  38. HRESULT DecommitInterpreterBufferManager(
  39. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  40. __in boolean asmJsThunk);
  41. HRESULT NewInterpreterThunkBlock(
  42. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  43. __in InterpreterThunkInputIDL * thunkInput,
  44. __out InterpreterThunkOutputIDL * thunkOutput);
  45. HRESULT AddDOMFastPathHelper(
  46. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  47. __in intptr_t funcInfoAddr,
  48. __in int helper);
  49. HRESULT AddModuleRecordInfo(
  50. /* [in] */ PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  51. /* [in] */ unsigned int moduleId,
  52. /* [in] */ intptr_t localExportSlotsAddr);
  53. HRESULT SetWellKnownHostTypeId(
  54. __in PTHREADCONTEXT_HANDLE threadContextRoot,
  55. __in int typeId);
  56. HRESULT InitializeScriptContext(
  57. __in ScriptContextDataIDL * data,
  58. __in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
  59. __out PPSCRIPTCONTEXT_HANDLE scriptContextInfoAddress);
  60. HRESULT CleanupScriptContext(
  61. __inout PPSCRIPTCONTEXT_HANDLE scriptContextInfoAddress);
  62. HRESULT CloseScriptContext(
  63. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress);
  64. HRESULT FreeAllocation(
  65. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  66. __in intptr_t codeAddress);
  67. HRESULT SetIsPRNGSeeded(
  68. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  69. __in boolean value);
  70. HRESULT IsNativeAddr(
  71. __in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
  72. __in intptr_t address,
  73. __out boolean * result);
  74. HRESULT RemoteCodeGenCall(
  75. __in CodeGenWorkItemIDL *workItemData,
  76. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  77. __out JITOutputIDL *jitData);
  78. #if DBG
  79. HRESULT IsInterpreterThunkAddr(
  80. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  81. __in intptr_t address,
  82. __in boolean asmjsThunk,
  83. __out boolean * result);
  84. #endif
  85. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  86. static HRESULT DeserializeRPCData(
  87. _In_reads_(bufferSize) const byte* buffer,
  88. _In_ uint bufferSize,
  89. _Out_ CodeGenWorkItemIDL **workItemData
  90. );
  91. static HRESULT SerializeRPCData(
  92. _In_ CodeGenWorkItemIDL *workItemData,
  93. _Out_ size_t* bufferSize,
  94. _Outptr_result_buffer_(*bufferSize) const byte** outBuffer
  95. );
  96. #endif
  97. HRESULT Shutdown();
  98. static JITManager * GetJITManager();
  99. static bool HandleServerCallResult(HRESULT hr, RemoteCallType callType);
  100. private:
  101. JITManager();
  102. ~JITManager();
  103. HRESULT CreateBinding(
  104. __in HANDLE serverProcessHandle,
  105. __in_opt void* serverSecurityDescriptor,
  106. __in UUID* connectionUuid,
  107. __out RPC_BINDING_HANDLE* bindingHandle);
  108. HRESULT ConnectProcess(RPC_BINDING_HANDLE rpcBindingHandle);
  109. RPC_BINDING_HANDLE m_rpcBindingHandle;
  110. UUID m_jitConnectionId;
  111. bool m_oopJitEnabled;
  112. bool m_isJITServer;
  113. HRESULT m_failingHRESULT;
  114. CriticalSection m_cs;
  115. static JITManager s_jitManager;
  116. };
  117. #else // !ENABLE_OOP_NATIVE_CODEGEN
  118. class JITManager
  119. {
  120. public:
  121. HRESULT ConnectRpcServer(__in HANDLE jitProcessHandle, __in_opt void* serverSecurityDescriptor, __in UUID connectionUuid)
  122. { Assert(false); return E_FAIL; }
  123. bool IsConnected() const { return false; }
  124. bool IsJITServer() const { return false; }
  125. void SetIsJITServer() { Assert(false); }
  126. bool IsOOPJITEnabled() const { return false; }
  127. void EnableOOPJIT() { Assert(false); }
  128. void SetJITFailed(HRESULT hr) { Assert(false); }
  129. HRESULT InitializeThreadContext(
  130. __in ThreadContextDataIDL * data,
  131. __out PPTHREADCONTEXT_HANDLE threadContextInfoAddress,
  132. __out intptr_t *prereservedRegionAddr,
  133. __out intptr_t * jitThunkAddr)
  134. { Assert(false); return E_FAIL; }
  135. HRESULT DecommitInterpreterBufferManager(
  136. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  137. __in boolean asmJsThunk)
  138. { Assert(false); return E_FAIL; }
  139. HRESULT CleanupThreadContext(
  140. __inout PPTHREADCONTEXT_HANDLE threadContextInfoAddress)
  141. { Assert(false); return E_FAIL; }
  142. HRESULT UpdatePropertyRecordMap(
  143. __in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
  144. __in_opt BVSparseNodeIDL * updatedPropsBVHead)
  145. { Assert(false); return E_FAIL; }
  146. HRESULT AddDOMFastPathHelper(
  147. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  148. __in intptr_t funcInfoAddr,
  149. __in int helper)
  150. { Assert(false); return E_FAIL; }
  151. HRESULT AddModuleRecordInfo(
  152. /* [in] */ PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  153. /* [in] */ unsigned int moduleId,
  154. /* [in] */ intptr_t localExportSlotsAddr)
  155. { Assert(false); return E_FAIL; }
  156. HRESULT SetWellKnownHostTypeId(
  157. __in PTHREADCONTEXT_HANDLE threadContextRoot,
  158. __in int typeId)
  159. { Assert(false); return E_FAIL; }
  160. HRESULT InitializeScriptContext(
  161. __in ScriptContextDataIDL * data,
  162. __in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
  163. __out PPSCRIPTCONTEXT_HANDLE scriptContextInfoAddress)
  164. { Assert(false); return E_FAIL; }
  165. HRESULT CleanupScriptContext(
  166. __inout PPSCRIPTCONTEXT_HANDLE scriptContextInfoAddress)
  167. { Assert(false); return E_FAIL; }
  168. HRESULT CloseScriptContext(
  169. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress)
  170. { Assert(false); return E_FAIL; }
  171. HRESULT FreeAllocation(
  172. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  173. __in intptr_t codeAddress)
  174. { Assert(false); return E_FAIL; }
  175. HRESULT SetIsPRNGSeeded(
  176. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  177. __in boolean value)
  178. { Assert(false); return E_FAIL; }
  179. HRESULT IsNativeAddr(
  180. __in PTHREADCONTEXT_HANDLE threadContextInfoAddress,
  181. __in intptr_t address,
  182. __out boolean * result)
  183. { Assert(false); return E_FAIL; }
  184. HRESULT RemoteCodeGenCall(
  185. __in CodeGenWorkItemIDL *workItemData,
  186. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  187. __out JITOutputIDL *jitData)
  188. { Assert(false); return E_FAIL; }
  189. #if DBG
  190. HRESULT IsInterpreterThunkAddr(
  191. __in PSCRIPTCONTEXT_HANDLE scriptContextInfoAddress,
  192. __in intptr_t address,
  193. __in boolean asmjsThunk,
  194. __out boolean * result)
  195. { Assert(false); return E_FAIL; }
  196. #endif
  197. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  198. static HRESULT DeserializeRPCData(
  199. _In_reads_(bufferSize) const byte* buffer,
  200. _In_ uint bufferSize,
  201. _Out_ CodeGenWorkItemIDL **workItemData
  202. ) { *workItemData = nullptr; return E_NOTIMPL; }
  203. static HRESULT SerializeRPCData(
  204. _In_ CodeGenWorkItemIDL *workItemData,
  205. _Out_ size_t* bufferSize,
  206. _Outptr_result_buffer_(*bufferSize) const byte** outBuffer
  207. ) { *bufferSize = 0; *outBuffer = nullptr; return E_NOTIMPL; }
  208. #endif
  209. HRESULT Shutdown()
  210. { Assert(false); return E_FAIL; }
  211. static JITManager * GetJITManager()
  212. { return &s_jitManager; }
  213. static bool HandleServerCallResult(HRESULT hr, RemoteCallType callType) { Assert(UNREACHED); }
  214. private:
  215. static JITManager s_jitManager;
  216. };
  217. #endif // !ENABLE_OOP_NATIVE_CODEGEN