X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini.h;h=23f048881db7d08408bf81b82a47158b15d003e8;hb=ef0ddf45c3081e799edcb4e95770186514b80cf1;hp=e7a9d148a218028ef20c8fdce0d84be15c42278f;hpb=87a427c8dba054b41d91e126bca8dc929c50e15c;p=mono.git diff --git a/mono/mini/mini.h b/mono/mini/mini.h index e7a9d148a21..23f048881db 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -2,6 +2,7 @@ * Copyright 2002-2003 Ximian Inc * Copyright 2003-2011 Novell Inc * Copyright 2011 Xamarin Inc + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #ifndef __MONO_MINI_H__ #define __MONO_MINI_H__ @@ -114,7 +115,7 @@ #endif /* Version number of the AOT file format */ -#define MONO_AOT_FILE_VERSION 132 +#define MONO_AOT_FILE_VERSION 133 //TODO: This is x86/amd64 specific. #define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6)) @@ -354,6 +355,8 @@ typedef struct gpointer *memcpy_addr [17]; gpointer *bzero_addr [17]; gpointer llvm_module; + /* Maps MonoMethod -> GSlist of addresses */ + GHashTable *llvm_jit_callees; } MonoJitDomainInfo; typedef struct { @@ -761,6 +764,7 @@ typedef enum { LLVMArgInIReg, /* Only in ainfo->pair_storage */ LLVMArgInFPReg, + /* Valuetype passed in 1-2 consecutive register */ LLVMArgVtypeInReg, LLVMArgVtypeByVal, LLVMArgVtypeRetAddr, /* On on cinfo->ret */ @@ -782,11 +786,7 @@ typedef enum { LLVMArgFpStruct, LLVMArgVtypeByRef, /* Vtype returned as an int */ - LLVMArgVtypeAsScalar, - /* Scalar returned by ref using an additional argument */ - LLVMArgScalarRetAddr, - /* Scalar passed by ref */ - LLVMArgScalarByRef + LLVMArgVtypeAsScalar } LLVMArgStorage; typedef struct { @@ -1604,8 +1604,9 @@ typedef struct { /* Points to a MonoGSharedVtMethodRuntimeInfo at runtime */ MonoInst *gsharedvt_info_var; - /* For native-to-managed wrappers, the saved old domain */ - MonoInst *orig_domain_var; + /* For native-to-managed wrappers, CEE_MONO_JIT_(AT|DE)TACH opcodes */ + MonoInst *attach_cookie; + MonoInst *attach_dummy; MonoInst *lmf_var; MonoInst *lmf_addr_var; @@ -1892,6 +1893,43 @@ typedef struct { int methods_without_llvm; char *max_ratio_method; char *biggest_method; + double jit_method_to_ir; + double jit_liveness_handle_exception_clauses; + double jit_handle_out_of_line_bblock; + double jit_decompose_long_opts; + double jit_local_cprop; + double jit_local_emulate_ops; + double jit_optimize_branches; + double jit_handle_global_vregs; + double jit_local_deadce; + double jit_local_alias_analysis; + double jit_if_conversion; + double jit_bb_ordering; + double jit_compile_dominator_info; + double jit_compute_natural_loops; + double jit_insert_safepoints; + double jit_ssa_compute; + double jit_ssa_cprop; + double jit_ssa_deadce; + double jit_perform_abc_removal; + double jit_ssa_remove; + double jit_local_cprop2; + double jit_handle_global_vregs2; + double jit_local_deadce2; + double jit_optimize_branches2; + double jit_decompose_vtype_opts; + double jit_decompose_array_access_opts; + double jit_liveness_handle_exception_clauses2; + double jit_analyze_liveness; + double jit_linear_scan; + double jit_arch_allocate_vars; + double jit_spill_global_vars; + double jit_local_cprop3; + double jit_local_deadce3; + double jit_codegen; + double jit_create_jit_info; + double jit_gc_create_gc_map; + double jit_save_seq_point_info; double jit_time; gboolean enabled; } MonoJitStats; @@ -2096,6 +2134,11 @@ typedef struct { * Translate Debugger.Break () into a native breakpoint signal */ gboolean native_debugger_break; + /* + * Disabling the frame pointer emit optimization can allow debuggers to more easily + * identify the stack on some platforms + */ + gboolean disable_omit_fp; } MonoDebugOptions; enum { @@ -2322,7 +2365,7 @@ MonoJumpInfo* mono_patch_info_dup_mp (MonoMemPool *mp, MonoJumpInfo *patc guint mono_patch_info_hash (gconstpointer data); gint mono_patch_info_equal (gconstpointer ka, gconstpointer kb); MonoJumpInfo *mono_patch_info_list_prepend (MonoJumpInfo *list, int ip, MonoJumpInfoType type, gconstpointer target); -gpointer mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, MonoJumpInfo *patch_info, gboolean run_cctors) MONO_LLVM_INTERNAL; +gpointer mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, MonoJumpInfo *patch_info, gboolean run_cctors, MonoError *error) MONO_LLVM_INTERNAL; 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); @@ -2331,8 +2374,8 @@ MonoLMF * mono_get_lmf (void); MonoLMF** mono_get_lmf_addr (void); 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); +MONO_API gpointer mono_jit_thread_attach (MonoDomain *domain, gpointer *dummy); +MONO_API void mono_jit_thread_detach (gpointer cookie, gpointer *dummy); gint32 mono_get_jit_tls_offset (void); gint32 mono_get_lmf_tls_offset (void); gint32 mono_get_lmf_addr_tls_offset (void); @@ -2437,7 +2480,7 @@ guint32 mono_aot_get_plt_info_offset (mgreg_t *regs, guint8 *code); gboolean mono_aot_get_cached_class_info (MonoClass *klass, MonoCachedClassInfo *res); gboolean mono_aot_get_class_from_name (MonoImage *image, const char *name_space, const char *name, MonoClass **klass); MonoJitInfo* mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr); -gpointer mono_aot_plt_resolve (gpointer aot_module, guint32 plt_info_offset, guint8 *code); +gpointer mono_aot_plt_resolve (gpointer aot_module, guint32 plt_info_offset, guint8 *code, MonoError *error); void mono_aot_patch_plt_entry (guint8 *code, guint8 *plt_entry, gpointer *got, mgreg_t *regs, guint8 *addr); gpointer mono_aot_get_method_from_vt_slot (MonoDomain *domain, MonoVTable *vtable, int slot); gpointer mono_aot_create_specific_trampoline (MonoImage *image, gpointer arg1, MonoTrampolineType tramp_type, MonoDomain *domain, guint32 *code_len); @@ -2502,11 +2545,11 @@ guint8 * mono_get_trampoline_code (MonoTrampolineType tramp_type); gpointer mono_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_type, MonoDomain *domain, guint32 *code_len); gpointer mono_create_jump_trampoline (MonoDomain *domain, MonoMethod *method, - gboolean add_sync_wrapper); + gboolean add_sync_wrapper, + MonoError *error); gpointer mono_create_class_init_trampoline (MonoVTable *vtable); -gpointer mono_create_jit_trampoline (MonoMethod *method); +gpointer mono_create_jit_trampoline (MonoDomain *domain, MonoMethod *method, MonoError *error) MONO_LLVM_INTERNAL; gpointer mono_create_jit_trampoline_from_token (MonoImage *image, guint32 token); -gpointer mono_create_jit_trampoline_in_domain (MonoDomain *domain, MonoMethod *method) MONO_LLVM_INTERNAL; gpointer mono_create_delegate_trampoline (MonoDomain *domain, MonoClass *klass); MonoDelegateTrampInfo* mono_create_delegate_trampoline_info (MonoDomain *domain, MonoClass *klass, MonoMethod *method); gpointer mono_create_delegate_virtual_trampoline (MonoDomain *domain, MonoClass *klass, MonoMethod *method); @@ -2967,6 +3010,10 @@ mono_method_is_generic_sharable_full (MonoMethod *method, gboolean allow_type_va gboolean mini_class_is_generic_sharable (MonoClass *klass); + +gboolean +mini_generic_inst_is_sharable (MonoGenericInst *inst, gboolean allow_type_vars, gboolean allow_partial); + gboolean mono_is_partially_sharable_inst (MonoGenericInst *inst); @@ -3007,6 +3054,18 @@ void mono_cfg_add_try_hole (MonoCompile *cfg, MonoExceptionClause *clause, guint void mono_cfg_set_exception (MonoCompile *cfg, int type); void mono_cfg_set_exception_invalid_program (MonoCompile *cfg, char *msg); +#define MONO_TIME_TRACK(a, phase) \ + { \ + GTimer *timer = mono_time_track_start (); \ + (phase) ; \ + mono_time_track_end (&(a), timer); \ + } + +GTimer *mono_time_track_start (void); +void mono_time_track_end (double *time, GTimer *timer); + +void mono_update_jit_stats (MonoCompile *cfg); + gboolean mini_type_is_reference (MonoType *type); gboolean mini_type_is_vtype (MonoType *t) MONO_LLVM_INTERNAL; gboolean mini_type_var_is_vt (MonoType *type) MONO_LLVM_INTERNAL; @@ -3114,6 +3173,11 @@ void mono_cross_helpers_run (void); * Signal handling */ +#ifdef DISABLE_HW_TRAPS + // Signal handlers not available +#define MONO_ARCH_NEED_DIV_CHECK 1 +#endif + void MONO_SIG_HANDLER_SIGNATURE (mono_sigfpe_signal_handler) ; void MONO_SIG_HANDLER_SIGNATURE (mono_sigill_signal_handler) ; void MONO_SIG_HANDLER_SIGNATURE (mono_sigsegv_signal_handler); @@ -3130,4 +3194,10 @@ gboolean MONO_SIG_HANDLER_SIGNATURE (mono_chain_signal); #define ARCH_VARARG_ICALLS 0 #endif +/* + * Native unwinder integration + */ +void mono_exception_native_unwind (void *ctx, MONO_SIG_HANDLER_INFO_TYPE *info); + + #endif /* __MONO_MINI_H__ */