X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini.h;h=1fcb2f1d892789f35101633f0ec5c7a9f9498535;hb=d4bd4f00917bd9acac1f7c801ae04be53a73b4d1;hp=730c936de3c6a5103683ada79fe930cabdc9cb7c;hpb=45837e1a5aeabb3ea3c17391e70e69e4618fe825;p=mono.git diff --git a/mono/mini/mini.h b/mono/mini/mini.h index 730c936de3c..1fcb2f1d892 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -49,11 +49,6 @@ #include "mono/metadata/security-manager.h" #include "mono/metadata/exception.h" -#ifdef __native_client_codegen__ -#include -#endif - - /* * The mini code should not have any compile time dependencies on the GC being used, so the same object file from mini/ * can be linked into both mono and mono-sgen. @@ -122,7 +117,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)) @@ -595,6 +590,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; }; @@ -1202,6 +1211,13 @@ 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; + + gpointer interp_context; } MonoJitTlsData; /* @@ -1210,7 +1226,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 */ @@ -1655,11 +1674,6 @@ typedef struct { MonoInst *stack_inbalance_var; unsigned char *cil_start; -#ifdef __native_client_codegen__ - /* this alloc is not aligned, native_code */ - /* is the 32-byte aligned version of this */ - unsigned char *native_code_alloc; -#endif unsigned char *native_code; guint code_size; guint code_len; @@ -2257,6 +2271,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); @@ -2427,6 +2443,8 @@ gpointer mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *tar 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); @@ -2454,6 +2472,7 @@ MonoInst* mono_emit_jit_icall_by_info (MonoCompile *cfg, int il_offset, MonoJitI 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_should_insert_breakpoint (MonoMethod *method); gboolean mini_class_is_system_array (MonoClass *klass); MonoMethodSignature *mono_get_element_address_signature (int arity); @@ -2471,12 +2490,6 @@ void mono_liveness_handle_exception_clauses (MonoCompile *cfg); /* Native Client functions */ gpointer mono_realloc_native_code(MonoCompile *cfg); -#if defined(__native_client__) || defined(__native_client_codegen__) -extern volatile int __nacl_thread_suspension_needed; -void __nacl_suspend_thread_if_needed(void); -void mono_nacl_gc(void); -#endif - extern MonoDebugOptions debug_options; static inline MonoMethod* @@ -2617,9 +2630,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); +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); +void mini_emit_memory_copy (MonoCompile *cfg, MonoInst *dest, MonoInst *src, MonoClass *klass, gboolean native, 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); @@ -2769,6 +2798,9 @@ gboolean mono_arch_is_breakpoint_event (void *info, void *sigctx); void mono_arch_skip_breakpoint (MonoContext *ctx, MonoJitInfo *ji); void mono_arch_skip_single_step (MonoContext *ctx); gpointer mono_arch_get_seq_point_info (MonoDomain *domain, guint8 *code); +#endif + +#ifdef MONO_ARCH_HAVE_INIT_LMF_EXT void mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf); #endif @@ -3053,6 +3085,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);