3 * Dietmar Maurer (dietmar@ximian.com)
5 * (C) 2001 Ximian, Inc.
8 #ifndef _MONO_JIT_JIT_H_
9 #define _MONO_JIT_JIT_H_
13 * io-layer.h must be _BEFORE_ win32-exception.h to avoid problems when
14 * compiling with version 1.2 of mingw and w32api.
16 #include <mono/io-layer/io-layer.h>
19 #include "win32-exception.h"
24 #include <mono/metadata/loader.h>
25 #include <mono/metadata/object.h>
26 #include <mono/metadata/exception.h>
27 #include <mono/metadata/mempool.h>
28 #include <mono/metadata/reflection.h>
29 #include <mono/metadata/opcodes.h>
33 #define ISSTRUCT(t) (!t->byref && t->type == MONO_TYPE_VALUETYPE && !t->data.klass->enumtype)
35 #define VARINFO(cfg,num) (g_array_index (cfg->varinfo, MonoVarInfo, num))
37 typedef struct _MBTree MBTree;
44 VAL_DOUBLE, /* must be the last - do not reorder */
54 gpointer previous_lmf;
66 guint16 tid; /* tree number */
67 guint16 bid; /* block number */
73 MonoPosition first_use, last_use;
82 unsigned isvolatile:1;
84 int varnum; /* only for debugging */
89 unsigned is_block_start:1;
92 typedef guint32 * MonoBitSet;
98 gint32 cli_addr; /* start instruction */
99 gint32 length; /* length of stream */
110 MonoBitSet live_in_set;
111 MonoBitSet live_out_set;
119 MONO_JUMP_INFO_EPILOG,
123 typedef struct _MonoJumpInfo MonoJumpInfo;
124 struct _MonoJumpInfo {
127 MonoJumpInfoType type;
136 unsigned has_vtarg:1;
137 unsigned share_code:1;
139 MonoBytecodeInfo *bcinfo;
156 guint32 args_start_index;
157 guint32 locals_start_index;
161 MonoJumpInfo *jump_info;
172 MonoClassField *field;
181 gulong methods_compiled;
182 gulong methods_lookups;
183 gulong method_trampolines;
185 gulong analyze_stack_repeat;
186 gulong cil_code_size;
187 gulong native_code_size;
188 gulong code_reallocs;
189 gulong max_code_size_ratio;
190 gulong biggest_method_size;
191 gulong allocated_code_size;
192 gulong inlineable_methods;
193 gulong inlined_methods;
194 MonoMethod *max_ratio_method;
195 MonoMethod *biggest_method;
199 extern MonoJitStats mono_jit_stats;
200 extern gboolean mono_jit_dump_asm;
201 extern gboolean mono_jit_dump_forest;
202 extern gboolean mono_jit_trace_calls;
203 extern gboolean mono_jit_profile;
204 extern gboolean mono_jit_share_code;
205 extern gboolean mono_jit_inline_code;
206 extern gboolean mono_use_linear_scan;
208 extern gpointer mono_end_of_stack;
209 extern int mono_worker_threads;
210 extern guint32 lmf_thread_id;
211 extern guint32 exc_cleanup_id;
212 extern guint32 async_result_id;
214 extern CRITICAL_SECTION *metadata_section;
217 arch_handle_exception (struct sigcontext *ctx, gpointer obj);
220 arch_get_throw_exception (void);
223 arch_get_throw_exception_by_name (void);
226 mono_cfg_new (MonoMethod *method, MonoMemPool *mp);
229 mono_cfg_free (MonoFlowGraph *cfg);
232 mono_ctree_new (MonoMemPool *mp, int op, MBTree *left,
235 mono_ctree_new_leaf (MonoMemPool *mp, int op);
238 mono_analyze_flow (MonoFlowGraph *cfg);
241 mono_analyze_stack (MonoFlowGraph *cfg);
244 mono_add_jump_info (MonoFlowGraph *cfg, gpointer ip,
245 MonoJumpInfoType type, gpointer target);
248 mono_disassemble_code (guint8 *code, int size, char *id);
251 arch_compile_method (MonoMethod *method);
254 arch_create_jit_trampoline (MonoMethod *method);
257 arch_create_remoting_trampoline (MonoMethod *method);
260 arch_runtime_invoke (MonoMethod *method, void *obj, void **params);
263 arch_create_native_wrapper (MonoMethod *method);
266 arch_allocate_var (MonoFlowGraph *cfg, int size, int align,
267 MonoValueKind kind, MonoValueType type);
270 mono_linear_scan (MonoFlowGraph *cfg, guint32 *used_mask);
272 /* delegate support functions */
275 mono_delegate_init (void);
278 mono_delegate_cleanup (void);
281 mono_delegate_ctor (MonoDelegate *this, MonoObject *target, gpointer addr);
284 arch_begin_invoke (MonoMethod *method, gpointer ret_ip, MonoObject *delegate);
287 arch_end_invoke (MonoMethod *method, gpointer first_arg, ...);
290 arch_get_delegate_invoke (MonoMethod *method, int *size);
293 mono_load_remote_field (MonoObject *this, MonoClass *klass, MonoClassField *field, gpointer *res);
296 mono_store_remote_field (MonoObject *this, MonoClass *klass, MonoClassField *field, gpointer val);
299 mono_cpu_detect (void);
302 mono_jit_init (char *file);
305 mono_jit_exec (MonoDomain *domain, MonoAssembly *assembly,
306 int argc, char *argv[]);
309 mono_jit_cleanup (MonoDomain *domain);
312 arch_method_call_message_new (MonoMethod *method, gpointer stack, MonoMethod *invoke,
313 MonoDelegate **cb, MonoObject **state);
316 arch_return_value (MonoType *return_type, MonoObject *result, gpointer stack);
319 arch_method_return_message_restore (MonoMethod *method, gpointer stack,
320 MonoObject *result, MonoArray *out_args);
323 /* some handy debugging functions */
326 mono_print_ctree (MonoFlowGraph *cfg, MBTree *tree);
329 mono_print_forest (MonoFlowGraph *cfg, GPtrArray *forest);