X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini.h;h=6eb32809205aa44af20d634bfaf7607a344fa0e3;hb=6ac36d6c40a2dd0ab2800c23d08894856b193c2f;hp=d8e9f9ca547311b597c6fa42f6a1e599a26ec0b4;hpb=cb947b7a56c09febb89b02b89599c003874b23f3;p=mono.git diff --git a/mono/mini/mini.h b/mono/mini/mini.h index d8e9f9ca547..6eb32809205 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 @@ -121,7 +122,7 @@ #endif /* Version number of the AOT file format */ -#define MONO_AOT_FILE_VERSION 139 +#define MONO_AOT_FILE_VERSION 140 //TODO: This is x86/amd64 specific. #define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6)) @@ -365,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 { @@ -592,6 +595,20 @@ extern const gint8 ins_sreg_counts []; #define mono_bb_first_ins(bb) (bb)->code +/* + * Iterate through all used registers in the instruction. + * Relies on the existing order of the MONO_INST enum: MONO_INST_{DREG,SREG1,SREG2,SREG3,LEN} + * INS is the instruction, IDX is the register index, REG is the pointer to a register. + */ +#define MONO_INS_FOR_EACH_REG(ins, idx, reg) for ((idx) = INS_INFO ((ins)->opcode)[MONO_INST_DEST] != ' ' ? MONO_INST_DEST : \ + (mono_inst_get_num_src_registers (ins) ? MONO_INST_SRC1 : MONO_INST_LEN); \ + (reg) = (idx) == MONO_INST_DEST ? &(ins)->dreg : \ + ((idx) == MONO_INST_SRC1 ? &(ins)->sreg1 : \ + ((idx) == MONO_INST_SRC2 ? &(ins)->sreg2 : \ + ((idx) == MONO_INST_SRC3 ? &(ins)->sreg3 : NULL))), \ + idx < MONO_INST_LEN; \ + (idx) = (idx) > mono_inst_get_num_src_registers (ins) + (INS_INFO ((ins)->opcode)[MONO_INST_DEST] != ' ') ? MONO_INST_LEN : (idx) + 1) + struct MonoSpillInfo { int offset; }; @@ -1138,7 +1155,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; @@ -1200,6 +1216,12 @@ typedef struct { * 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; /* @@ -1208,7 +1230,10 @@ typedef struct { typedef struct { struct MonoLMF lmf; gboolean debugger_invoke; + gboolean interp_exit; MonoContext ctx; /* if debugger_invoke is TRUE */ + /* If interp_exit is TRUE */ + gpointer interp_exit_data; } MonoLMFExt; /* Generic sharing */ @@ -1277,6 +1302,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 { @@ -1709,7 +1736,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; @@ -2254,6 +2280,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); @@ -2398,7 +2426,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); @@ -2419,10 +2447,13 @@ 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); void mono_set_lmf (MonoLMF *lmf); +void mono_push_lmf (MonoLMFExt *ext); +void mono_pop_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); @@ -2449,6 +2480,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); @@ -2543,7 +2575,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); @@ -2612,9 +2644,25 @@ MonoInst *mono_branch_optimize_exception_target (MonoCompile *cfg, MonoB void mono_remove_critical_edges (MonoCompile *cfg); gboolean mono_is_regsize_var (MonoType *t); void mini_emit_memcpy (MonoCompile *cfg, int destreg, int doffset, int srcreg, int soffset, int size, int align); +void mini_emit_memset (MonoCompile *cfg, int destreg, int offset, int size, int val, int align); void mini_emit_stobj (MonoCompile *cfg, MonoInst *dest, MonoInst *src, MonoClass *klass, gboolean native); void mini_emit_initobj (MonoCompile *cfg, MonoInst *dest, const guchar *ip, MonoClass *klass); MonoInst* mini_emit_ldelema_1_ins (MonoCompile *cfg, MonoClass *klass, MonoInst *arr, MonoInst *index, gboolean bcheck); +MonoInst* mini_emit_get_gsharedvt_info_klass (MonoCompile *cfg, MonoClass *klass, MonoRgctxInfoType rgctx_type); +MonoInst* mini_emit_calli (MonoCompile *cfg, MonoMethodSignature *sig, MonoInst **args, MonoInst *addr, MonoInst *imt_arg, MonoInst *rgctx_arg); +MonoInst* mini_emit_memory_barrier (MonoCompile *cfg, int kind); +void mini_emit_write_barrier (MonoCompile *cfg, MonoInst *ptr, MonoInst *value); +gboolean mini_emit_wb_aware_memcpy (MonoCompile *cfg, MonoClass *klass, MonoInst *iargs[4], int size, int align); +MonoInst* mini_emit_memory_load (MonoCompile *cfg, MonoType *type, MonoInst *src, int offset, int ins_flag); +void mini_emit_memory_store (MonoCompile *cfg, MonoType *type, MonoInst *dest, MonoInst *value, int ins_flag); +void mini_emit_memory_copy_bytes (MonoCompile *cfg, MonoInst *dest, MonoInst *src, MonoInst *size, int ins_flag); +void mini_emit_memory_init_bytes (MonoCompile *cfg, MonoInst *dest, MonoInst *value, MonoInst *size, int ins_flag); + +MonoMethod* mini_get_memcpy_method (void); +MonoMethod* mini_get_memset_method (void); +int mini_class_check_context_used (MonoCompile *cfg, MonoClass *klass); + + CompRelation mono_opcode_to_cond (int opcode) MONO_LLVM_INTERNAL; CompType mono_opcode_to_type (int opcode, int cmp_opcode); CompRelation mono_negate_cond (CompRelation cond); @@ -2629,6 +2677,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; @@ -2796,7 +2845,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); @@ -3047,6 +3096,7 @@ MonoGenericContext* mini_class_get_context (MonoClass *klass); MonoType* mini_get_underlying_type (MonoType *type) MONO_LLVM_INTERNAL; MonoType* mini_type_get_underlying_type (MonoType *type); +MonoClass* mini_get_class (MonoMethod *method, guint32 token, MonoGenericContext *context); MonoMethod* mini_get_shared_method (MonoMethod *method); MonoMethod* mini_get_shared_method_to_register (MonoMethod *method); MonoMethod* mini_get_shared_method_full (MonoMethod *method, gboolean all_vt, gboolean is_gsharedvt); @@ -3095,6 +3145,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 */