X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini.h;h=f1ab4759122b03e3c5344d748619c3a6b411f902;hb=6e72e0ec9502cd4046fbe8ce166106f96b66bb6e;hp=bacb58402fff2fc1e96012081dc917ec0517c94f;hpb=6d37ffdf534eae04a5d06b2e097762bd64fc0591;p=mono.git diff --git a/mono/mini/mini.h b/mono/mini/mini.h index bacb58402ff..f1ab4759122 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -125,7 +125,7 @@ #endif /* Version number of the AOT file format */ -#define MONO_AOT_FILE_VERSION 137 +#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)) @@ -505,11 +505,11 @@ enum { /* FIXME: Add more instructions */ /* INEG sets the condition codes, and the OP_LNEG decomposition depends on this on x86 */ -#define MONO_INS_HAS_NO_SIDE_EFFECT(ins) (MONO_IS_MOVE (ins) || (ins->opcode == OP_ICONST) || (ins->opcode == OP_I8CONST) || MONO_IS_ZERO (ins) || (ins->opcode == OP_ADD_IMM) || (ins->opcode == OP_R8CONST) || (ins->opcode == OP_LADD_IMM) || (ins->opcode == OP_ISUB_IMM) || (ins->opcode == OP_IADD_IMM) || (ins->opcode == OP_LNEG) || (ins->opcode == OP_ISUB) || (ins->opcode == OP_CMOV_IGE) || (ins->opcode == OP_ISHL_IMM) || (ins->opcode == OP_ISHR_IMM) || (ins->opcode == OP_ISHR_UN_IMM) || (ins->opcode == OP_IAND_IMM) || (ins->opcode == OP_ICONV_TO_U1) || (ins->opcode == OP_ICONV_TO_I1) || (ins->opcode == OP_SEXT_I4) || (ins->opcode == OP_LCONV_TO_U1) || (ins->opcode == OP_ICONV_TO_U2) || (ins->opcode == OP_ICONV_TO_I2) || (ins->opcode == OP_LCONV_TO_I2) || (ins->opcode == OP_LDADDR) || (ins->opcode == OP_PHI) || (ins->opcode == OP_NOP) || (ins->opcode == OP_ZEXT_I4) || (ins->opcode == OP_NOT_NULL) || (ins->opcode == OP_IL_SEQ_POINT)) +#define MONO_INS_HAS_NO_SIDE_EFFECT(ins) (MONO_IS_MOVE (ins) || (ins->opcode == OP_ICONST) || (ins->opcode == OP_I8CONST) || MONO_IS_ZERO (ins) || (ins->opcode == OP_ADD_IMM) || (ins->opcode == OP_R8CONST) || (ins->opcode == OP_LADD_IMM) || (ins->opcode == OP_ISUB_IMM) || (ins->opcode == OP_IADD_IMM) || (ins->opcode == OP_LNEG) || (ins->opcode == OP_ISUB) || (ins->opcode == OP_CMOV_IGE) || (ins->opcode == OP_ISHL_IMM) || (ins->opcode == OP_ISHR_IMM) || (ins->opcode == OP_ISHR_UN_IMM) || (ins->opcode == OP_IAND_IMM) || (ins->opcode == OP_ICONV_TO_U1) || (ins->opcode == OP_ICONV_TO_I1) || (ins->opcode == OP_SEXT_I4) || (ins->opcode == OP_LCONV_TO_U1) || (ins->opcode == OP_ICONV_TO_U2) || (ins->opcode == OP_ICONV_TO_I2) || (ins->opcode == OP_LCONV_TO_I2) || (ins->opcode == OP_LDADDR) || (ins->opcode == OP_PHI) || (ins->opcode == OP_NOP) || (ins->opcode == OP_ZEXT_I4) || (ins->opcode == OP_NOT_NULL) || (ins->opcode == OP_IL_SEQ_POINT) || (ins->opcode == OP_XZERO)) #define MONO_INS_IS_PCONST_NULL(ins) ((ins)->opcode == OP_PCONST && (ins)->inst_p0 == 0) -#define MONO_METHOD_IS_FINAL(m) (((m)->flags & METHOD_ATTRIBUTE_FINAL) || ((m)->klass && ((m)->klass->flags & TYPE_ATTRIBUTE_SEALED))) +#define MONO_METHOD_IS_FINAL(m) (((m)->flags & METHOD_ATTRIBUTE_FINAL) || ((m)->klass && (mono_class_get_flags ((m)->klass) & TYPE_ATTRIBUTE_SEALED))) #ifdef MONO_ARCH_SIMD_INTRINSICS @@ -545,7 +545,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; @@ -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]) @@ -1193,6 +1193,14 @@ 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; } MonoJitTlsData; /* @@ -1487,8 +1495,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; @@ -1513,12 +1519,14 @@ typedef enum { JIT_FLAG_FULL_AOT = (1 << 2), /* Whenever to compile with LLVM */ JIT_FLAG_LLVM = (1 << 3), - /* Whenever to disable direct calls to direct calls to icall functions */ + /* Whenever to disable direct calls to icall functions */ JIT_FLAG_NO_DIRECT_ICALLS = (1 << 4), /* Emit explicit null checks */ JIT_FLAG_EXPLICIT_NULL_CHECKS = (1 << 5), /* 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) } JitFlags; /* Bit-fields in the MonoBasicBlock.region */ @@ -1583,6 +1591,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; @@ -1688,6 +1697,7 @@ typedef struct { guint disable_out_of_line_bblocks : 1; guint disable_direct_icalls : 1; guint disable_gc_safe_points : 1; + guint direct_pinvoke : 1; guint create_lmf_var : 1; /* * When this is set, the code to push/pop the LMF from the LMF stack is generated as IR @@ -2126,7 +2136,8 @@ typedef struct { 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. @@ -2419,17 +2430,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); @@ -2607,6 +2608,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); @@ -2616,6 +2618,7 @@ 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_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); 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); @@ -2638,6 +2641,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); @@ -2649,6 +2665,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); @@ -2679,6 +2697,7 @@ guint8* mono_arch_create_sdb_trampoline (gboolean single_step, MonoTrampInfo * gpointer mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean is_v4, gboolean aot); gpointer mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot); guint8 *mono_arch_create_llvm_native_thunk (MonoDomain *domain, guint8* addr) MONO_LLVM_INTERNAL; +gpointer mono_arch_get_get_tls_tramp (void); GList *mono_arch_get_allocatable_int_vars (MonoCompile *cfg); GList *mono_arch_get_global_int_regs (MonoCompile *cfg); GList *mono_arch_get_global_fp_regs (MonoCompile *cfg); @@ -2725,6 +2744,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); @@ -2821,7 +2841,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); @@ -3124,6 +3144,7 @@ enum { const char *mono_arch_xregname (int reg); void mono_simd_simplify_indirection (MonoCompile *cfg); MonoInst* mono_emit_simd_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args); +MonoInst* mono_emit_simd_field_load (MonoCompile *cfg, MonoClassField *field, MonoInst *addr); guint32 mono_arch_cpu_enumerate_simd_versions (void); void mono_simd_intrinsics_init (void); @@ -3152,11 +3173,12 @@ gboolean mono_jit_map_is_enabled (void); * Per-OS implementation functions. */ void mono_runtime_install_handlers (void); +gboolean mono_runtime_install_custom_handlers (const char *handlers); +void mono_runtime_install_custom_handlers_usage (void); 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); @@ -3176,21 +3198,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 */