[netcore] Clear system last error before P/Invoke calls with SetLastError=true (...
[mono-project.git] / mono / metadata / jit-icall-reg.h
blobc48724cf355f0e27c9c4b4964f184993e30a3818
1 /**
2 * \file
3 * Enum for JIT icalls: MonoJitICallId MONO_JIT_ICALL_mono_foo, etc.
4 * Static storage for JIT icall info: mono_get_jit_icall_info().
6 * mono_find_jit_icall_info (MonoJitICallId)
7 * Convert enum to pointer.
9 * mono_find_jit_icall_info ((MonoJitICallId)int)
10 * Convert int to pointer.
12 * mono_jit_icall_info_id (MonoJitICallInfo*)
13 * Convert pointer to enum.
15 * mono_jit_icall_info_index (MonoJitICallInfo*)
16 * Convert pointer to int.
18 * &mono_get_icall_info ()->name
19 * Convert name to pointer.
21 * MONO_JIT_ICALL_ ## name
22 * Convert name to enum.
24 * All conversions are just a few instructions.
26 * Author:
27 * Jay Krell (jaykrell@microsoft.com)
29 * Copyright 2019 Microsoft
30 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
33 // No include guard needed.
35 // Changes within MONO_JIT_ICALLS require revising MONO_AOT_FILE_VERSION.
36 #define MONO_JIT_ICALLS \
38 MONO_JIT_ICALL (ZeroIsReserved) \
40 /* These must be ordered like MonoTrampolineType. */ \
41 MONO_JIT_ICALL (generic_trampoline_jit) \
42 MONO_JIT_ICALL (generic_trampoline_jump) \
43 MONO_JIT_ICALL (generic_trampoline_rgctx_lazy_fetch) \
44 MONO_JIT_ICALL (generic_trampoline_aot) \
45 MONO_JIT_ICALL (generic_trampoline_aot_plt) \
46 MONO_JIT_ICALL (generic_trampoline_delegate) \
47 MONO_JIT_ICALL (generic_trampoline_generic_virtual_remoting) \
48 MONO_JIT_ICALL (generic_trampoline_vcall) \
50 /* These must be ordered like MonoTlsKey (alphabetical). */ \
51 MONO_JIT_ICALL (mono_tls_get_domain) \
52 MONO_JIT_ICALL (mono_tls_get_jit_tls) \
53 MONO_JIT_ICALL (mono_tls_get_lmf_addr) \
54 MONO_JIT_ICALL (mono_tls_get_sgen_thread_info) \
55 MONO_JIT_ICALL (mono_tls_get_thread) \
57 MONO_JIT_ICALL (__emul_fadd) \
58 MONO_JIT_ICALL (__emul_fcmp_ceq) \
59 MONO_JIT_ICALL (__emul_fcmp_cgt) \
60 MONO_JIT_ICALL (__emul_fcmp_cgt_un) \
61 MONO_JIT_ICALL (__emul_fcmp_clt) \
62 MONO_JIT_ICALL (__emul_fcmp_clt_un) \
63 MONO_JIT_ICALL (__emul_fcmp_eq) \
64 MONO_JIT_ICALL (__emul_fcmp_ge) \
65 MONO_JIT_ICALL (__emul_fcmp_ge_un) \
66 MONO_JIT_ICALL (__emul_fcmp_gt) \
67 MONO_JIT_ICALL (__emul_fcmp_gt_un) \
68 MONO_JIT_ICALL (__emul_fcmp_le) \
69 MONO_JIT_ICALL (__emul_fcmp_le_un) \
70 MONO_JIT_ICALL (__emul_fcmp_lt) \
71 MONO_JIT_ICALL (__emul_fcmp_lt_un) \
72 MONO_JIT_ICALL (__emul_fcmp_ne_un) \
73 MONO_JIT_ICALL (__emul_fconv_to_i) \
74 MONO_JIT_ICALL (__emul_fconv_to_i1) \
75 MONO_JIT_ICALL (__emul_fconv_to_i2) \
76 MONO_JIT_ICALL (__emul_fconv_to_i4) \
77 MONO_JIT_ICALL (__emul_fconv_to_i8) \
78 MONO_JIT_ICALL (__emul_fconv_to_ovf_i8) \
79 MONO_JIT_ICALL (__emul_fconv_to_ovf_u8) \
80 MONO_JIT_ICALL (__emul_fconv_to_ovf_u8_un) \
81 MONO_JIT_ICALL (__emul_fconv_to_r4) \
82 MONO_JIT_ICALL (__emul_fconv_to_u) \
83 MONO_JIT_ICALL (__emul_fconv_to_u1) \
84 MONO_JIT_ICALL (__emul_fconv_to_u2) \
85 MONO_JIT_ICALL (__emul_fconv_to_u4) \
86 MONO_JIT_ICALL (__emul_fconv_to_u8) \
87 MONO_JIT_ICALL (__emul_fdiv) \
88 MONO_JIT_ICALL (__emul_fmul) \
89 MONO_JIT_ICALL (__emul_fneg) \
90 MONO_JIT_ICALL (__emul_frem) \
91 MONO_JIT_ICALL (__emul_fsub) \
92 MONO_JIT_ICALL (__emul_iconv_to_r_un) \
93 MONO_JIT_ICALL (__emul_iconv_to_r4) \
94 MONO_JIT_ICALL (__emul_iconv_to_r8) \
95 MONO_JIT_ICALL (__emul_lconv_to_r4) \
96 MONO_JIT_ICALL (__emul_lconv_to_r8) \
97 MONO_JIT_ICALL (__emul_lconv_to_r8_un) \
98 MONO_JIT_ICALL (__emul_ldiv) \
99 MONO_JIT_ICALL (__emul_ldiv_un) \
100 MONO_JIT_ICALL (__emul_lmul) \
101 MONO_JIT_ICALL (__emul_lmul_ovf) \
102 MONO_JIT_ICALL (__emul_lmul_ovf_un) \
103 MONO_JIT_ICALL (__emul_lrem) \
104 MONO_JIT_ICALL (__emul_lrem_un) \
105 MONO_JIT_ICALL (__emul_lshl) \
106 MONO_JIT_ICALL (__emul_lshr) \
107 MONO_JIT_ICALL (__emul_lshr_un) \
108 MONO_JIT_ICALL (__emul_op_idiv) \
109 MONO_JIT_ICALL (__emul_op_idiv_un) \
110 MONO_JIT_ICALL (__emul_op_imul) \
111 MONO_JIT_ICALL (__emul_op_imul_ovf) \
112 MONO_JIT_ICALL (__emul_op_imul_ovf_un) \
113 MONO_JIT_ICALL (__emul_op_irem) \
114 MONO_JIT_ICALL (__emul_op_irem_un) \
115 MONO_JIT_ICALL (__emul_rconv_to_i8) \
116 MONO_JIT_ICALL (__emul_rconv_to_ovf_i8) \
117 MONO_JIT_ICALL (__emul_rconv_to_ovf_u8) \
118 MONO_JIT_ICALL (__emul_rconv_to_ovf_u8_un) \
119 MONO_JIT_ICALL (__emul_rconv_to_u8) \
120 MONO_JIT_ICALL (__emul_rrem) \
121 MONO_JIT_ICALL (cominterop_get_ccw) \
122 MONO_JIT_ICALL (cominterop_get_ccw_object) \
123 MONO_JIT_ICALL (cominterop_get_function_pointer) \
124 MONO_JIT_ICALL (cominterop_get_interface) \
125 MONO_JIT_ICALL (cominterop_get_method_interface) \
126 MONO_JIT_ICALL (cominterop_object_is_rcw) \
127 MONO_JIT_ICALL (cominterop_type_from_handle) \
128 MONO_JIT_ICALL (g_free) \
129 MONO_JIT_ICALL (interp_to_native_trampoline) \
130 MONO_JIT_ICALL (mini_llvm_init_gshared_method_mrgctx) \
131 MONO_JIT_ICALL (mini_llvm_init_gshared_method_this) \
132 MONO_JIT_ICALL (mini_llvm_init_gshared_method_vtable) \
133 MONO_JIT_ICALL (mini_llvm_init_method) \
134 MONO_JIT_ICALL (mini_llvmonly_init_delegate) \
135 MONO_JIT_ICALL (mini_llvmonly_init_delegate_virtual) \
136 MONO_JIT_ICALL (mini_llvmonly_init_vtable_slot) \
137 MONO_JIT_ICALL (mini_llvmonly_resolve_generic_virtual_call) \
138 MONO_JIT_ICALL (mini_llvmonly_resolve_generic_virtual_iface_call) \
139 MONO_JIT_ICALL (mini_llvmonly_resolve_iface_call_gsharedvt) \
140 MONO_JIT_ICALL (mini_llvmonly_resolve_vcall_gsharedvt) \
141 MONO_JIT_ICALL (mini_llvmonly_throw_nullref_exception) \
142 MONO_JIT_ICALL (mono_amd64_resume_unwind) \
143 MONO_JIT_ICALL (mono_amd64_start_gsharedvt_call) \
144 MONO_JIT_ICALL (mono_amd64_throw_corlib_exception) \
145 MONO_JIT_ICALL (mono_amd64_throw_exception) \
146 MONO_JIT_ICALL (mono_arch_rethrow_exception) \
147 MONO_JIT_ICALL (mono_arch_throw_corlib_exception) \
148 MONO_JIT_ICALL (mono_arch_throw_exception) \
149 MONO_JIT_ICALL (mono_arm_resume_unwind) \
150 MONO_JIT_ICALL (mono_arm_start_gsharedvt_call) \
151 MONO_JIT_ICALL (mono_arm_throw_exception) \
152 MONO_JIT_ICALL (mono_arm_throw_exception_by_token) \
153 MONO_JIT_ICALL (mono_arm_unaligned_stack) \
154 MONO_JIT_ICALL (mono_array_new_1) \
155 MONO_JIT_ICALL (mono_array_new_2) \
156 MONO_JIT_ICALL (mono_array_new_3) \
157 MONO_JIT_ICALL (mono_array_new_4) \
158 MONO_JIT_ICALL (mono_array_new_n_icall) \
159 MONO_JIT_ICALL (mono_array_to_byte_byvalarray) \
160 MONO_JIT_ICALL (mono_array_to_lparray) \
161 MONO_JIT_ICALL (mono_array_to_savearray) \
162 MONO_JIT_ICALL (mono_break) \
163 MONO_JIT_ICALL (mono_byvalarray_to_byte_array) \
164 MONO_JIT_ICALL (mono_chkstk_win64) \
165 MONO_JIT_ICALL (mono_ckfinite) \
166 MONO_JIT_ICALL (mono_class_interface_match) \
167 MONO_JIT_ICALL (mono_class_static_field_address) \
168 MONO_JIT_ICALL (mono_compile_method_icall) \
169 MONO_JIT_ICALL (mono_context_get_icall) \
170 MONO_JIT_ICALL (mono_context_set_icall) \
171 MONO_JIT_ICALL (mono_create_corlib_exception_0) \
172 MONO_JIT_ICALL (mono_create_corlib_exception_1) \
173 MONO_JIT_ICALL (mono_create_corlib_exception_2) \
174 MONO_JIT_ICALL (mono_debug_personality) \
175 MONO_JIT_ICALL (mono_debugger_agent_breakpoint_from_context) \
176 MONO_JIT_ICALL (mono_debugger_agent_single_step_from_context) \
177 MONO_JIT_ICALL (mono_debugger_agent_user_break) \
178 MONO_JIT_ICALL (mono_delegate_begin_invoke) \
179 MONO_JIT_ICALL (mono_delegate_end_invoke) \
180 MONO_JIT_ICALL (mono_delegate_to_ftnptr) \
181 MONO_JIT_ICALL (mono_domain_get) \
182 MONO_JIT_ICALL (mono_dummy_jit_icall) \
183 MONO_JIT_ICALL (mono_exception_from_token) \
184 MONO_JIT_ICALL (mono_fill_class_rgctx) \
185 MONO_JIT_ICALL (mono_fill_method_rgctx) \
186 MONO_JIT_ICALL (mono_fload_r4) \
187 MONO_JIT_ICALL (mono_fload_r4_arg) \
188 MONO_JIT_ICALL (mono_free_bstr) \
189 MONO_JIT_ICALL (mono_free_lparray) \
190 MONO_JIT_ICALL (mono_fstore_r4) \
191 MONO_JIT_ICALL (mono_ftnptr_to_delegate) \
192 MONO_JIT_ICALL (mono_gc_alloc_obj) \
193 MONO_JIT_ICALL (mono_gc_alloc_string) \
194 MONO_JIT_ICALL (mono_gc_alloc_vector) \
195 MONO_JIT_ICALL (mono_gc_wbarrier_generic_nostore_internal) \
196 MONO_JIT_ICALL (mono_gc_wbarrier_range_copy) \
197 MONO_JIT_ICALL (mono_gchandle_get_target_internal) \
198 MONO_JIT_ICALL (mono_generic_class_init) \
199 MONO_JIT_ICALL (mono_get_assembly_object) \
200 MONO_JIT_ICALL (mono_get_method_object) \
201 MONO_JIT_ICALL (mono_get_native_calli_wrapper) \
202 MONO_JIT_ICALL (mono_get_special_static_data) \
203 MONO_JIT_ICALL (mono_gsharedvt_constrained_call) \
204 MONO_JIT_ICALL (mono_gsharedvt_value_copy) \
205 MONO_JIT_ICALL (mono_helper_compile_generic_method) \
206 MONO_JIT_ICALL (mono_helper_ldstr) \
207 MONO_JIT_ICALL (mono_helper_ldstr_mscorlib) \
208 MONO_JIT_ICALL (mono_helper_newobj_mscorlib) \
209 MONO_JIT_ICALL (mono_helper_stelem_ref_check) \
210 MONO_JIT_ICALL (mono_init_vtable_slot) \
211 MONO_JIT_ICALL (mono_interp_entry_from_trampoline) \
212 MONO_JIT_ICALL (mono_interp_to_native_trampoline) \
213 MONO_JIT_ICALL (mono_isfinite_double) \
214 MONO_JIT_ICALL (mono_jit_set_domain) \
215 MONO_JIT_ICALL (mono_ldftn) \
216 MONO_JIT_ICALL (mono_ldtoken_wrapper) \
217 MONO_JIT_ICALL (mono_ldtoken_wrapper_generic_shared) \
218 MONO_JIT_ICALL (mono_ldvirtfn) \
219 MONO_JIT_ICALL (mono_ldvirtfn_gshared) \
220 MONO_JIT_ICALL (mono_llvm_clear_exception) \
221 MONO_JIT_ICALL (mono_llvm_load_exception) \
222 MONO_JIT_ICALL (mono_llvm_match_exception) \
223 MONO_JIT_ICALL (mono_llvm_resume_exception) \
224 MONO_JIT_ICALL (mono_llvm_resume_unwind_trampoline) \
225 MONO_JIT_ICALL (mono_llvm_rethrow_exception) \
226 MONO_JIT_ICALL (mono_llvm_rethrow_exception_trampoline) \
227 MONO_JIT_ICALL (mono_llvm_set_unhandled_exception_handler) \
228 MONO_JIT_ICALL (mono_llvm_throw_corlib_exception) \
229 MONO_JIT_ICALL (mono_llvm_throw_corlib_exception_abs_trampoline) \
230 MONO_JIT_ICALL (mono_llvm_throw_corlib_exception_trampoline) \
231 MONO_JIT_ICALL (mono_llvm_throw_exception) \
232 MONO_JIT_ICALL (mono_llvm_throw_exception_trampoline) \
233 MONO_JIT_ICALL (mono_llvmonly_init_delegate) \
234 MONO_JIT_ICALL (mono_llvmonly_init_delegate_virtual) \
235 MONO_JIT_ICALL (mono_marshal_asany) \
236 MONO_JIT_ICALL (mono_marshal_check_domain_image) \
237 MONO_JIT_ICALL (mono_marshal_clear_last_error) \
238 MONO_JIT_ICALL (mono_marshal_free) \
239 MONO_JIT_ICALL (mono_marshal_free_array) \
240 MONO_JIT_ICALL (mono_marshal_free_asany) \
241 MONO_JIT_ICALL (mono_marshal_get_type_object) \
242 MONO_JIT_ICALL (mono_marshal_isinst_with_cache) \
243 MONO_JIT_ICALL (mono_marshal_safearray_begin) \
244 MONO_JIT_ICALL (mono_marshal_safearray_create) \
245 MONO_JIT_ICALL (mono_marshal_safearray_end) \
246 MONO_JIT_ICALL (mono_marshal_safearray_free_indices) \
247 MONO_JIT_ICALL (mono_marshal_safearray_get_value) \
248 MONO_JIT_ICALL (mono_marshal_safearray_next) \
249 MONO_JIT_ICALL (mono_marshal_safearray_set_value) \
250 MONO_JIT_ICALL (mono_marshal_set_domain_by_id) \
251 MONO_JIT_ICALL (mono_marshal_set_last_error) \
252 MONO_JIT_ICALL (mono_marshal_set_last_error_windows) \
253 MONO_JIT_ICALL (mono_marshal_string_to_utf16) \
254 MONO_JIT_ICALL (mono_marshal_string_to_utf16_copy) \
255 MONO_JIT_ICALL (mono_marshal_xdomain_copy_out_value) \
256 MONO_JIT_ICALL (mono_monitor_enter_fast) \
257 MONO_JIT_ICALL (mono_monitor_enter_internal) \
258 MONO_JIT_ICALL (mono_monitor_enter_v4_fast) \
259 MONO_JIT_ICALL (mono_monitor_enter_v4_internal) \
260 MONO_JIT_ICALL (mono_object_castclass_unbox) \
261 MONO_JIT_ICALL (mono_object_castclass_with_cache) \
262 MONO_JIT_ICALL (mono_object_isinst_icall) \
263 MONO_JIT_ICALL (mono_object_isinst_with_cache) \
264 MONO_JIT_ICALL (mono_ppc_throw_exception) \
265 MONO_JIT_ICALL (mono_profiler_raise_exception_clause) \
266 MONO_JIT_ICALL (mono_profiler_raise_gc_allocation) \
267 MONO_JIT_ICALL (mono_profiler_raise_method_enter) \
268 MONO_JIT_ICALL (mono_profiler_raise_method_leave) \
269 MONO_JIT_ICALL (mono_profiler_raise_method_tail_call) \
270 MONO_JIT_ICALL (mono_remoting_update_exception) \
271 MONO_JIT_ICALL (mono_remoting_wrapper) \
272 MONO_JIT_ICALL (mono_resolve_generic_virtual_call) \
273 MONO_JIT_ICALL (mono_resolve_generic_virtual_iface_call) \
274 MONO_JIT_ICALL (mono_resolve_iface_call_gsharedvt) \
275 MONO_JIT_ICALL (mono_resolve_vcall_gsharedvt) \
276 MONO_JIT_ICALL (mono_resume_unwind) \
277 MONO_JIT_ICALL (mono_rethrow_preserve_exception) \
278 MONO_JIT_ICALL (mono_string_builder_to_utf16) \
279 MONO_JIT_ICALL (mono_string_builder_to_utf8) \
280 MONO_JIT_ICALL (mono_string_from_bstr_icall) \
281 MONO_JIT_ICALL (mono_string_from_byvalstr) \
282 MONO_JIT_ICALL (mono_string_from_byvalwstr) \
283 MONO_JIT_ICALL (mono_string_new_len_wrapper) \
284 MONO_JIT_ICALL (mono_string_new_wrapper_internal) \
285 MONO_JIT_ICALL (mono_string_to_ansibstr) \
286 MONO_JIT_ICALL (mono_string_to_bstr) \
287 MONO_JIT_ICALL (mono_string_to_byvalstr) \
288 MONO_JIT_ICALL (mono_string_to_byvalwstr) \
289 MONO_JIT_ICALL (mono_string_to_utf16_internal) \
290 MONO_JIT_ICALL (mono_string_to_utf8str) \
291 MONO_JIT_ICALL (mono_string_utf16_to_builder) \
292 MONO_JIT_ICALL (mono_string_utf16_to_builder2) \
293 MONO_JIT_ICALL (mono_string_utf8_to_builder) \
294 MONO_JIT_ICALL (mono_string_utf8_to_builder2) \
295 MONO_JIT_ICALL (mono_struct_delete_old) \
296 MONO_JIT_ICALL (mono_thread_force_interruption_checkpoint_noraise) \
297 MONO_JIT_ICALL (mono_thread_get_undeniable_exception) \
298 MONO_JIT_ICALL (mono_thread_interruption_checkpoint) \
299 MONO_JIT_ICALL (mono_threads_attach_coop) \
300 MONO_JIT_ICALL (mono_threads_detach_coop) \
301 MONO_JIT_ICALL (mono_threads_enter_gc_safe_region_unbalanced) \
302 MONO_JIT_ICALL (mono_threads_enter_gc_unsafe_region_unbalanced) \
303 MONO_JIT_ICALL (mono_threads_exit_gc_safe_region_unbalanced) \
304 MONO_JIT_ICALL (mono_threads_exit_gc_unsafe_region_unbalanced) \
305 MONO_JIT_ICALL (mono_threads_state_poll) \
306 MONO_JIT_ICALL (mono_throw_exception) \
307 MONO_JIT_ICALL (mono_throw_method_access) \
308 MONO_JIT_ICALL (mono_throw_bad_image) \
309 MONO_JIT_ICALL (mono_trace_enter_method) \
310 MONO_JIT_ICALL (mono_trace_leave_method) \
311 MONO_JIT_ICALL (mono_upgrade_remote_class_wrapper) \
312 MONO_JIT_ICALL (mono_value_copy_internal) \
313 MONO_JIT_ICALL (mono_x86_start_gsharedvt_call) \
314 MONO_JIT_ICALL (mono_x86_throw_corlib_exception) \
315 MONO_JIT_ICALL (mono_x86_throw_exception) \
316 MONO_JIT_ICALL (native_to_interp_trampoline) \
317 MONO_JIT_ICALL (personality) \
318 MONO_JIT_ICALL (pthread_getspecific) \
319 MONO_JIT_ICALL (rgctx_fetch_trampoline_general) \
320 MONO_JIT_ICALL (sdb_breakpoint_trampoline) \
321 MONO_JIT_ICALL (sdb_single_step_trampoline) \
322 MONO_JIT_ICALL (type_from_handle) \
323 MONO_JIT_ICALL (ves_icall_array_new) \
324 MONO_JIT_ICALL (ves_icall_array_new_specific) \
325 MONO_JIT_ICALL (ves_icall_marshal_alloc) \
326 MONO_JIT_ICALL (ves_icall_mono_delegate_ctor) \
327 MONO_JIT_ICALL (ves_icall_mono_delegate_ctor_interp) \
328 MONO_JIT_ICALL (ves_icall_mono_ldstr) \
329 MONO_JIT_ICALL (ves_icall_mono_marshal_xdomain_copy_value) \
330 MONO_JIT_ICALL (ves_icall_mono_string_from_utf16) \
331 MONO_JIT_ICALL (ves_icall_mono_string_to_utf8) \
332 MONO_JIT_ICALL (ves_icall_object_new) \
333 MONO_JIT_ICALL (ves_icall_object_new_specific) \
334 MONO_JIT_ICALL (ves_icall_runtime_class_init) \
335 MONO_JIT_ICALL (ves_icall_string_alloc) \
336 MONO_JIT_ICALL (ves_icall_string_new_wrapper) \
337 MONO_JIT_ICALL (ves_icall_thread_finish_async_abort) \
339 MONO_JIT_ICALL (count) \
341 #define MONO_JIT_ICALL_mono_get_lmf_addr MONO_JIT_ICALL_mono_tls_get_lmf_addr
343 #ifdef __cplusplus
344 typedef enum MonoJitICallId : gsize // Widen to gsize for use in MonoJumpInfo union.
345 #else
346 typedef enum MonoJitICallId
347 #endif
349 #define MONO_JIT_ICALL(x) MONO_JIT_ICALL_ ## x,
350 MONO_JIT_ICALLS
351 #undef MONO_JIT_ICALL
352 } MonoJitICallId;
354 typedef union MonoJitICallInfos {
355 struct {
356 #define MONO_JIT_ICALL(x) MonoJitICallInfo x;
357 MONO_JIT_ICALLS
358 #undef MONO_JIT_ICALL
360 MonoJitICallInfo array [MONO_JIT_ICALL_count];
361 } MonoJitICallInfos;
363 // Indirect mono_jit_icall_info access through a function or macro due to loaded LLVM.
365 #if MONO_LLVM_LOADED
367 MonoJitICallInfos*
368 mono_get_jit_icall_info (void) MONO_LLVM_INTERNAL;
370 #else
372 extern MonoJitICallInfos mono_jit_icall_info;
374 #define mono_get_jit_icall_info() (&mono_jit_icall_info)
376 #endif
378 // Convert MonoJitICallInfo* to an int or enum.
380 #define mono_jit_icall_info_index(x) ((x) - mono_get_jit_icall_info ()->array)
381 #define mono_jit_icall_info_id(x) ((MonoJitICallId)mono_jit_icall_info_index(x))
383 // Given an enum/id, get the MonoJitICallInfo*.
385 static inline MonoJitICallInfo*
386 mono_find_jit_icall_info (MonoJitICallId id)
388 const guint index = (guint)id;
390 g_assert (index < MONO_JIT_ICALL_count);
391 g_static_assert (MONO_JIT_ICALL_count < 0x200); // fits in 9 bits
393 return &mono_get_jit_icall_info ()->array [index];