3 * Dietmar Maurer (dietmar@ximian.com)
5 * (C) 2001 Ximian, Inc.
8 #ifndef _MONO_JIT_JIT_H_
9 #define _MONO_JIT_JIT_H_
12 * io-layer.h must be _BEFORE_ win32-exception.h to avoid problems when
13 * compiling with version 1.2 of mingw and w32api.
15 #include <mono/io-layer/io-layer.h>
18 #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/appdomain.h>
30 #include <mono/metadata/opcodes.h>
31 #include <mono/utils/monobitset.h>
35 /* fixme: configure should set that */
39 #define MB_TERM_LDIND_REF MB_TERM_LDIND_I4
40 #define MB_TERM_LDIND_U4 MB_TERM_LDIND_I4
41 #define MB_TERM_STIND_REF MB_TERM_STIND_I4
42 #define MB_TERM_REMOTE_STIND_REF MB_TERM_REMOTE_STIND_I4
45 #define VARINFO(cfg,num) (g_array_index (cfg->varinfo, MonoVarInfo, num))
47 #define SET_VARINFO(vi,t,k,o,s) do { vi.type=t; vi.vartype=k; vi.offset=o; vi.size=s; } while (0)
49 extern int mono_exc_esp_offset;
51 extern void (*mono_thread_attach_aborted_cb ) (MonoObject *obj);
53 typedef struct _MBTree MBTree;
60 VAL_DOUBLE, /* must be the last - do not reorder */
70 gpointer previous_lmf;
82 guint16 tid; /* tree number */
83 guint16 bid; /* block number */
89 MonoPosition first_use, last_use;
94 MonoVarType vartype:4;
95 unsigned isvolatile:1;
100 int varnum; /* only for debugging */
104 unsigned block_id:15;
105 unsigned is_block_start:1;
112 gint32 cli_addr; /* start instruction */
113 gint32 length; /* length of stream */
123 MonoBitSet *kill_set;
124 MonoBitSet *live_in_set;
125 MonoBitSet *live_out_set;
133 MONO_JUMP_INFO_EPILOG,
137 typedef struct _MonoJumpInfo MonoJumpInfo;
138 struct _MonoJumpInfo {
141 MonoJumpInfoType type;
150 unsigned has_vtarg:1;
151 unsigned share_code:1;
153 MonoBytecodeInfo *bcinfo;
171 guint32 args_start_index;
172 guint32 locals_start_index;
175 MonoJumpInfo *jump_info;
181 } MonoJitNonVirtualCallInfo;
185 MonoClassField *field;
197 } MonoJitArgumentInfo;
206 gulong methods_compiled;
207 gulong methods_lookups;
208 gulong method_trampolines;
210 gulong analyze_stack_repeat;
211 gulong cil_code_size;
212 gulong native_code_size;
213 gulong code_reallocs;
214 gulong max_code_size_ratio;
215 gulong biggest_method_size;
216 gulong allocated_code_size;
217 gulong inlineable_methods;
218 gulong inlined_methods;
220 gulong max_basic_blocks;
221 MonoMethod *max_ratio_method;
222 MonoMethod *biggest_method;
227 gpointer end_of_stack;
229 void (*abort_func) (MonoObject *object);
232 extern MonoJitStats mono_jit_stats;
233 extern gboolean mono_jit_dump_asm;
234 extern gboolean mono_jit_dump_forest;
235 extern gboolean mono_jit_trace_calls;
236 extern gboolean mono_jit_profile;
237 extern gboolean mono_jit_share_code;
238 extern gboolean mono_jit_inline_code;
239 extern gboolean mono_use_linear_scan;
240 extern gboolean mono_use_fast_iconv;
241 extern gboolean mono_break_on_exc;
242 extern gboolean mono_inline_memcpy;
243 extern guint32 mono_jit_tls_id;
244 extern gboolean mono_jit_boundcheck;
246 extern CRITICAL_SECTION *metadata_section;
248 /* architecture independent functions */
251 mono_jit_init (const char *file);
254 mono_jit_exec (MonoDomain *domain, MonoAssembly *assembly,
255 int argc, char *argv[]);
257 mono_jit_cleanup (MonoDomain *domain);
260 mono_jit_compile_image (MonoImage *image, int verbose);
263 mono_jit_compile_class (MonoAssembly *assembly, char *compile_class,
264 int compile_times, int verbose);
267 mono_jit_create_remoting_trampoline (MonoMethod *method);
270 mono_add_jump_info (MonoFlowGraph *cfg, gpointer ip,
271 MonoJumpInfoType type, gpointer target);
274 mono_get_lmf_addr (void);
277 mono_cpu_detect (void);
279 /* architecture dependent functions */
282 mono_jit_walk_stack (MonoStackWalk func, gpointer user_data);
285 arch_get_argument_info (MonoMethodSignature *csig, int param_count,
286 MonoJitArgumentInfo *arg_info);
289 ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
290 MonoReflectionMethod **method,
291 gint32 *iloffset, gint32 *native_offset,
292 MonoString **file, gint32 *line, gint32 *column);
295 ves_icall_get_trace (MonoException *exc, gint32 skip,
296 MonoBoolean need_file_info);
299 arch_handle_exception (struct sigcontext *ctx, gpointer obj, gboolean test_only);
302 arch_get_throw_exception (void);
305 arch_get_throw_exception_by_name (void);
308 arch_jit_compile_cfg (MonoDomain *target_domain, MonoFlowGraph *cfg);
311 arch_create_jit_trampoline (MonoMethod *method);
314 arch_allocate_arg (MonoFlowGraph *cfg, MonoJitArgumentInfo *info, MonoValueType type);
317 arch_allocate_var (MonoFlowGraph *cfg, int size, int align,
318 MonoVarType vartype, MonoValueType type);
321 mono_linear_scan (MonoFlowGraph *cfg, guint32 *used_mask);
324 arch_get_reg_name (int regnum);
327 arch_activation_frame_size (MonoMethodSignature *sig);
330 mono_has_unwind_info (MonoMethod *method);
333 mono_method_blittable (MonoMethod *method);