X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini.h;h=191386a06bb5032ddeeb6e57b40e2fc81763080a;hb=e9518198e56d16e30c38b2ca9f3974217312f902;hp=3f9f1b162ee06450abd3b7f0f73d94f456d0c52c;hpb=4f738f8b32901425b35dec2e2b553811e7d70ea2;p=mono.git diff --git a/mono/mini/mini.h b/mono/mini/mini.h index 3f9f1b162ee..191386a06bb 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -1,4 +1,5 @@ -/* +/** + * \file * Copyright 2002-2003 Ximian Inc * Copyright 2003-2011 Novell Inc * Copyright 2011 Xamarin Inc @@ -43,14 +44,10 @@ #include "jit.h" #include "cfgdump.h" -#include "mono/metadata/class-internals.h" -#include "mono/metadata/domain-internals.h" -#include "mono/metadata/object.h" #include "mono/metadata/tabledefs.h" #include "mono/metadata/marshal.h" #include "mono/metadata/security-manager.h" #include "mono/metadata/exception.h" -#include "mono/utils/mono-compiler.h" #ifdef __native_client_codegen__ #include @@ -125,7 +122,7 @@ #endif /* Version number of the AOT file format */ -#define MONO_AOT_FILE_VERSION 138 +#define MONO_AOT_FILE_VERSION 139 //TODO: This is x86/amd64 specific. #define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6)) @@ -369,6 +366,8 @@ typedef struct gpointer llvm_module; /* Maps MonoMethod -> GSlist of addresses */ GHashTable *llvm_jit_callees; + /* Maps MonoMethod -> RuntimeMethod */ + MonoInternalHashTable interp_code_hash; } MonoJitDomainInfo; typedef struct { @@ -545,7 +544,6 @@ typedef struct MonoLMF MonoLMF; typedef struct MonoSpillInfo MonoSpillInfo; typedef struct MonoTraceSpec MonoTraceSpec; -extern MonoNativeTlsKey mono_jit_tls_id; extern MonoTraceSpec *mono_jit_trace_calls; extern gboolean mono_break_on_exc; extern int mono_exc_esp_offset; @@ -563,6 +561,7 @@ extern const char *mono_build_date; extern gboolean mono_do_signal_chaining; extern gboolean mono_do_crash_chaining; extern MONO_API gboolean mono_use_llvm; +extern MONO_API gboolean mono_use_interpreter; extern gboolean mono_do_single_method_regression; extern guint32 mono_single_method_regression_opt; extern MonoMethod *mono_current_single_method; @@ -571,6 +570,7 @@ extern GHashTable *mono_single_method_hash; extern gboolean mono_using_xdebug; extern int mini_verbose; extern int valgrind_register; +extern GList* mono_aot_paths; #define INS_INFO(opcode) (&ins_info [((opcode) - OP_START - 1) * 4]) @@ -589,6 +589,8 @@ extern const gint8 ins_sreg_counts []; #define MONO_BB_FOR_EACH_INS_SAFE(bb, n, ins) for ((ins) = (bb)->code, n = (ins) ? (ins)->next : NULL; (ins); (ins) = (n), (n) = (ins) ? (ins)->next : NULL) +#define MONO_BB_FOR_EACH_INS_REVERSE(bb, ins) for ((ins) = (bb)->last_ins; (ins); (ins) = (ins)->prev) + #define MONO_BB_FOR_EACH_INS_REVERSE_SAFE(bb, p, ins) for ((ins) = (bb)->last_ins, p = (ins) ? (ins)->prev : NULL; (ins); (ins) = (p), (p) = (ins) ? (ins)->prev : NULL) #define mono_bb_first_ins(bb) (bb)->code @@ -827,7 +829,7 @@ typedef struct { * in the structure. */ int nslots; - /* Only if storage == LLVMArgAsFpArgs/LLVMArgFpStruct (4/8) */ + /* Only if storage == LLVMArgAsIArgs/LLVMArgAsFpArgs/LLVMArgFpStruct (4/8) */ int esize; /* Parameter index in the LLVM signature */ int pindex; @@ -1139,7 +1141,6 @@ typedef struct { typedef struct { gpointer end_of_stack; guint32 stack_size; - /* !defined(HAVE_KW_THREAD) || !defined(MONO_ARCH_ENABLE_MONO_LMF_VAR) */ MonoLMF *lmf; MonoLMF *first_lmf; gpointer restore_stack_prot; @@ -1193,6 +1194,20 @@ typedef struct { * The calling assembly in llvmonly mode. */ MonoImage *calling_image; + + /* + * The stack frame "high water mark" for ThreadAbortExceptions. + * We will rethrow the exception upon exiting a catch clause that's + * in a function stack frame above the water mark(isn't being called by + * the catch block that caught the ThreadAbortException). + */ + gpointer abort_exc_stack_threshold; + + + /* + * List of methods being JIT'd in the current thread. + */ + int active_jit_methods; } MonoJitTlsData; /* @@ -1270,6 +1285,8 @@ typedef enum { * which implements the method. */ MONO_RGCTX_INFO_VIRT_METHOD_BOX_TYPE, + /* Resolve to 2 (TRUE) or 1 (FALSE) */ + MONO_RGCTX_INFO_CLASS_IS_REF_OR_CONTAINS_REFS } MonoRgctxInfoType; typedef struct _MonoRuntimeGenericContextInfoTemplate { @@ -1487,8 +1504,6 @@ typedef struct { guint emulate_long_shift_opts : 1; guint have_objc_get_selector : 1; guint have_generalized_imt_trampoline : 1; - guint have_tls_get : 1; - guint have_tls_get_reg : 1; guint have_liverange_ops: 1; guint have_op_tail_call : 1; guint have_dummy_init : 1; @@ -1520,7 +1535,9 @@ typedef enum { /* Whenever to compile in llvm-only mode */ JIT_FLAG_LLVM_ONLY = (1 << 6), /* Whenever calls to pinvoke functions are made directly */ - JIT_FLAG_DIRECT_PINVOKE = (1 << 7) + JIT_FLAG_DIRECT_PINVOKE = (1 << 7), + /* Whenever this is a compile-all run and the result should be discarded */ + JIT_FLAG_DISCARD_RESULTS = (1 << 8), } JitFlags; /* Bit-fields in the MonoBasicBlock.region */ @@ -1585,6 +1602,7 @@ typedef struct { MonoMethod *current_method; /* The method currently processed by method_to_ir () */ MonoMethod *method_to_register; /* The method to register in JIT info tables */ MonoGenericContext *generic_context; + MonoInst *this_arg; MonoBackend *backend; @@ -1701,7 +1719,6 @@ typedef struct { * Whenever to use the mono_lmf TLS variable instead of indirection through the * mono_lmf_addr TLS variable. */ - guint lmf_ir_mono_lmf : 1; guint gen_write_barriers : 1; guint init_ref_vars : 1; guint extend_live_ranges : 1; @@ -2077,12 +2094,6 @@ typedef struct { int type; } StackSlot; -#if HAVE_ARRAY_ELEM_INIT -extern const guint8 mono_burg_arity []; -#else -extern guint8 mono_burg_arity []; -#endif - extern const char MONO_ARCH_CPU_SPEC []; #define MONO_ARCH_CPU_SPEC_IDX_COMBINE(a) a ## _idx #define MONO_ARCH_CPU_SPEC_IDX(a) MONO_ARCH_CPU_SPEC_IDX_COMBINE(a) @@ -2124,12 +2135,13 @@ typedef struct { gboolean better_cast_details; gboolean mdb_optimizations; gboolean no_gdb_backtrace; - gboolean suspend_on_sigsegv; + gboolean suspend_on_native_crash; gboolean suspend_on_exception; gboolean suspend_on_unhandled; gboolean dyn_runtime_invoke; gboolean gdb; - gboolean arm_use_fallback_tls; + gboolean lldb; + gboolean use_fallback_tls; /* * Whenever data such as next sequence points and flags is required. * Next sequence points and flags are required by the debugger agent. @@ -2251,6 +2263,8 @@ enum { */ guint8 *uw_info; guint32 uw_info_len; + /* Whenever uw_info is owned by this structure */ + gboolean owns_uw_info; } MonoTrampInfo; typedef void (*MonoInstFunc) (MonoInst *tree, gpointer data); @@ -2325,6 +2339,7 @@ MonoDomain* mini_init (const char *filename, const char *ru void mini_cleanup (MonoDomain *domain); MONO_API MonoDebugOptions *mini_get_debug_options (void); MONO_API gboolean mini_parse_debug_option (const char *option); +void mini_profiler_enable_with_options (const char *profile_options); /* graph dumping */ void mono_cfg_dump_create_context (MonoCompile *cfg); @@ -2384,7 +2399,7 @@ void mono_merge_basic_blocks (MonoCompile *cfg, MonoBasicBlock *b void mono_optimize_branches (MonoCompile *cfg); void mono_blockset_print (MonoCompile *cfg, MonoBitSet *set, const char *name, guint idom); -const char*mono_ji_type_to_string (MonoJumpInfoType type); +const char*mono_ji_type_to_string (MonoJumpInfoType type) MONO_LLVM_INTERNAL; void mono_print_ji (const MonoJumpInfo *ji); void mono_print_ins_index (int i, MonoInst *ins); GString *mono_print_ins_index_strbuf (int i, MonoInst *ins); @@ -2394,7 +2409,7 @@ void mono_print_code (MonoCompile *cfg, const char *msg); MONO_API void mono_print_method_from_ip (void *ip); MONO_API char *mono_pmip (void *ip); gboolean mono_debug_count (void); -MONO_API const char* mono_inst_name (int op); +MONO_LLVM_INTERNAL const char* mono_inst_name (int op); int mono_op_to_op_imm (int opcode); int mono_op_imm_to_op (int opcode); int mono_load_membase_to_load_mem (int opcode); @@ -2415,6 +2430,7 @@ gpointer mono_resolve_patch_target (MonoMethod *method, MonoDomain *dom gpointer mono_jit_find_compiled_method_with_jit_info (MonoDomain *domain, MonoMethod *method, MonoJitInfo **ji); gpointer mono_jit_find_compiled_method (MonoDomain *domain, MonoMethod *method); gpointer mono_jit_compile_method (MonoMethod *method, MonoError *error); +gpointer mono_jit_compile_method_jit_only (MonoMethod *method, MonoError *error); gpointer mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, int opt, MonoError *error); MonoLMF * mono_get_lmf (void); MonoLMF** mono_get_lmf_addr (void); @@ -2422,17 +2438,7 @@ void mono_set_lmf (MonoLMF *lmf); MonoJitTlsData* mono_get_jit_tls (void); MONO_API MonoDomain* mono_jit_thread_attach (MonoDomain *domain); MONO_API void mono_jit_set_domain (MonoDomain *domain); -gint32 mono_get_jit_tls_offset (void); -gint32 mono_get_lmf_tls_offset (void); -gint32 mono_get_lmf_addr_tls_offset (void); -int mini_get_tls_offset (MonoTlsKey key); -gboolean mini_tls_get_supported (MonoCompile *cfg, MonoTlsKey key); MonoInst* mono_create_tls_get (MonoCompile *cfg, MonoTlsKey key); -MonoInst* mono_get_jit_tls_intrinsic (MonoCompile *cfg); -MonoInst* mono_get_domain_intrinsic (MonoCompile* cfg); -MonoInst* mono_get_thread_intrinsic (MonoCompile* cfg); -MonoInst* mono_get_lmf_intrinsic (MonoCompile* cfg); -MonoInst* mono_get_lmf_addr_intrinsic (MonoCompile* cfg); GList *mono_varlist_insert_sorted (MonoCompile *cfg, GList *list, MonoMethodVar *mv, int sort_type); GList *mono_varlist_sort (MonoCompile *cfg, GList *list, int sort_type); void mono_analyze_liveness (MonoCompile *cfg); @@ -2455,6 +2461,7 @@ MonoInst* mono_emit_jit_icall (MonoCompile *cfg, gconstpointer func, MonoInst ** MonoInst* mono_emit_jit_icall_by_info (MonoCompile *cfg, int il_offset, MonoJitICallInfo *info, MonoInst **args); MonoInst* mono_emit_method_call (MonoCompile *cfg, MonoMethod *method, MonoInst **args, MonoInst *this_ins); void mono_create_helper_signatures (void); +MonoInst* mono_emit_native_call (MonoCompile *cfg, gconstpointer func, MonoMethodSignature *sig, MonoInst **args); gboolean mini_class_is_system_array (MonoClass *klass); MonoMethodSignature *mono_get_element_address_signature (int arity); @@ -2549,7 +2556,7 @@ void mono_draw_graph (MonoCompile *cfg, MonoGraphOptions void mono_add_ins_to_end (MonoBasicBlock *bb, MonoInst *inst); gpointer mono_create_ftnptr (MonoDomain *domain, gpointer addr); -MONO_API void mono_replace_ins (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *ins, MonoInst **prev, MonoBasicBlock *first_bb, MonoBasicBlock *last_bb); +void mono_replace_ins (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *ins, MonoInst **prev, MonoBasicBlock *first_bb, MonoBasicBlock *last_bb); int mono_find_method_opcode (MonoMethod *method); MonoJitICallInfo *mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save); @@ -2610,6 +2617,7 @@ MonoFtnDesc *mini_create_llvmonly_ftndesc (MonoDomain *domain, gpointer add gboolean mono_running_on_valgrind (void); void* mono_global_codeman_reserve (int size); +void mono_global_codeman_foreach (MonoCodeManagerFunc func, void *user_data); const char *mono_regname_full (int reg, int bank); gint32* mono_allocate_stack_slots (MonoCompile *cfg, gboolean backward, guint32 *stack_size, guint32 *stack_align); void mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb); @@ -2634,6 +2642,7 @@ void mono_emit_unwind_op (MonoCompile *cfg, int when, int val); MonoTrampInfo* mono_tramp_info_create (const char *name, guint8 *code, guint32 code_size, MonoJumpInfo *ji, GSList *unwind_ops); void mono_tramp_info_free (MonoTrampInfo *info); +void mono_aot_tramp_info_register (MonoTrampInfo *info, MonoDomain *domain); void mono_tramp_info_register (MonoTrampInfo *info, MonoDomain *domain); int mini_exception_id_by_name (const char *name); gboolean mini_type_is_hfa (MonoType *t, int *out_nfields, int *out_esize) MONO_LLVM_INTERNAL; @@ -2642,6 +2651,19 @@ int mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoB MonoInst *return_var, MonoInst **inline_args, guint inline_offset, gboolean is_virtual_call); +//the following methods could just be renamed/moved from method-to-ir.c +int mini_inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **sp, guchar *ip, + guint real_offset, gboolean inline_always); + +MonoInst* mini_emit_get_rgctx_klass (MonoCompile *cfg, int context_used, MonoClass *klass, MonoRgctxInfoType rgctx_type); +MonoInst* mini_emit_runtime_constant (MonoCompile *cfg, MonoJumpInfoType patch_type, gpointer data); +void mini_save_cast_details (MonoCompile *cfg, MonoClass *klass, int obj_reg, gboolean null_check); +void mini_reset_cast_details (MonoCompile *cfg); +void mini_emit_class_check (MonoCompile *cfg, int klass_reg, MonoClass *klass); + +gboolean mini_class_has_reference_variant_generic_argument (MonoCompile *cfg, MonoClass *klass, int context_used); + + MonoInst *mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins); void mono_decompose_long_opts (MonoCompile *cfg); void mono_decompose_vtype_opts (MonoCompile *cfg); @@ -2653,6 +2675,8 @@ void mono_spill_global_vars (MonoCompile *cfg, gboolean *need_local void mono_allocate_gsharedvt_vars (MonoCompile *cfg); void mono_if_conversion (MonoCompile *cfg); + + /* Delegates */ gpointer mini_get_delegate_arg (MonoMethod *method, gpointer method_ptr); void mini_init_delegate (MonoDelegate *del); @@ -2730,6 +2754,7 @@ gboolean mono_arch_tail_call_supported (MonoCompile *cfg, MonoMethodSig int mono_arch_translate_tls_offset (int offset); gboolean mono_arch_opcode_supported (int opcode); void mono_arch_setup_resume_sighandler_ctx (MonoContext *ctx, gpointer func); +gboolean mono_arch_have_fast_tls (void); #ifdef MONO_ARCH_SOFT_FLOAT_FALLBACK gboolean mono_arch_is_soft_float (void); @@ -2785,7 +2810,7 @@ void mono_arch_create_vars (MonoCompile *cfg) MONO_LLVM_INT void mono_arch_save_unwind_info (MonoCompile *cfg); void mono_arch_register_lowlevel_calls (void); gpointer mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr); -gpointer mono_arch_get_static_rgctx_trampoline (MonoMethod *m, MonoMethodRuntimeGenericContext *mrgctx, gpointer addr); +gpointer mono_arch_get_static_rgctx_trampoline (gpointer arg, gpointer addr); gpointer mono_arch_get_llvm_imt_trampoline (MonoDomain *domain, MonoMethod *method, int vt_offset); gpointer mono_arch_get_gsharedvt_arg_trampoline (MonoDomain *domain, gpointer arg, gpointer addr); void mono_arch_patch_callsite (guint8 *method_start, guint8 *code, guint8 *addr); @@ -2803,6 +2828,7 @@ void mono_arch_notify_pending_exc (MonoThreadInfo *info); guint8* mono_arch_get_call_target (guint8 *code); guint32 mono_arch_get_plt_info_offset (guint8 *plt_entry, mgreg_t *regs, guint8 *code); GSList *mono_arch_get_trampolines (gboolean aot); +gpointer mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info); /* Handle block guard */ gpointer mono_arch_install_handler_block_guard (MonoJitInfo *ji, MonoJitExceptionInfo *clause, MonoContext *ctx, gpointer new_value); @@ -2826,7 +2852,7 @@ typedef gboolean (*MonoJitStackWalk) (StackFrameInfo *frame, MonoCont void mono_exceptions_init (void); gboolean mono_handle_exception (MonoContext *ctx, MonoObject *obj); -void mono_handle_native_sigsegv (int signal, void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *siginfo); +void mono_handle_native_crash (const char *signal, void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *siginfo); MONO_API void mono_print_thread_dump (void *sigctx); MONO_API void mono_print_thread_dump_from_ctx (MonoContext *ctx); void mono_walk_stack_with_ctx (MonoJitStackWalk func, MonoContext *start_ctx, MonoUnwindOptions unwind_options, void *user_data); @@ -3083,6 +3109,7 @@ MonoMethod* mini_get_gsharedvt_in_sig_wrapper (MonoMethodSignature *sig); MonoMethod* mini_get_gsharedvt_out_sig_wrapper (MonoMethodSignature *sig); MonoMethodSignature* mini_get_gsharedvt_out_sig_wrapper_signature (gboolean has_this, gboolean has_ret, int param_count); gboolean mini_gsharedvt_runtime_invoke_supported (MonoMethodSignature *sig); +MonoMethod* mini_get_interp_in_wrapper (MonoMethodSignature *sig); /* SIMD support */ @@ -3164,7 +3191,6 @@ void mono_runtime_cleanup_handlers (void); void mono_runtime_setup_stat_profiler (void); void mono_runtime_shutdown_stat_profiler (void); void mono_runtime_posix_install_handlers (void); -pid_t mono_runtime_syscall_fork (void); void mono_gdb_render_native_backtraces (pid_t crashed_pid); void mono_cross_helpers_run (void); @@ -3184,21 +3210,12 @@ void MONO_SIG_HANDLER_SIGNATURE (mono_sigsegv_signal_handler); void MONO_SIG_HANDLER_SIGNATURE (mono_sigint_signal_handler) ; gboolean MONO_SIG_HANDLER_SIGNATURE (mono_chain_signal); -#ifndef MONO_ARCH_HAVE_TLS_GET -#define MONO_ARCH_HAVE_TLS_GET 0 -#endif - #ifdef MONO_ARCH_VARARG_ICALLS #define ARCH_VARARG_ICALLS 1 #else #define ARCH_VARARG_ICALLS 0 #endif -/* - * Native unwinder integration - */ -void mono_exception_native_unwind (void *ctx, MONO_SIG_HANDLER_INFO_TYPE *info); - /* * Coop support for trampolines */