#endif
/* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION 131
+#define MONO_AOT_FILE_VERSION 132
//TODO: This is x86/amd64 specific.
#define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6))
LLVMArgInIReg,
/* Only in ainfo->pair_storage */
LLVMArgInFPReg,
+ /* Valuetype passed in 1-2 consecutive register */
LLVMArgVtypeInReg,
LLVMArgVtypeByVal,
LLVMArgVtypeRetAddr, /* On on cinfo->ret */
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 {
/* 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;
guint check_pinvoke_callconv : 1;
guint has_unwind_info_for_epilog : 1;
guint disable_inline : 1;
+ /* Disable inlining into caller */
+ guint no_inline : 1;
guint gshared : 1;
guint gsharedvt : 1;
guint r4fp : 1;
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;
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);
-gpointer mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, int opt, MonoException **jit_ex);
+gpointer mono_jit_compile_method (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);
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);
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);
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);
void mono_allocate_gsharedvt_vars (MonoCompile *cfg);
void mono_if_conversion (MonoCompile *cfg);
-/* virtual function delegate */
+/* Delegates */
+gpointer mini_get_delegate_arg (MonoMethod *method, gpointer method_ptr);
+void mini_init_delegate (MonoDelegate *del);
gpointer mono_get_delegate_virtual_invoke_impl (MonoMethodSignature *sig, MonoMethod *method);
/* methods that must be provided by the arch-specific port */
gpointer mono_get_restore_context (void);
gpointer mono_get_throw_exception_by_name (void);
gpointer mono_get_throw_corlib_exception (void);
-
+gpointer mono_get_throw_exception_addr (void);
MonoArray *ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info);
MonoBoolean ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
MonoReflectionMethod **method,
mono_class_generic_sharing_enabled (MonoClass *klass);
gpointer
-mono_class_fill_runtime_generic_context (MonoVTable *class_vtable, guint32 slot);
+mono_class_fill_runtime_generic_context (MonoVTable *class_vtable, guint32 slot, MonoError *error);
gpointer
-mono_method_fill_runtime_generic_context (MonoMethodRuntimeGenericContext *mrgctx, guint32 slot);
+mono_method_fill_runtime_generic_context (MonoMethodRuntimeGenericContext *mrgctx, guint32 slot, MonoError *error);
MonoMethodRuntimeGenericContext*
mono_method_lookup_rgctx (MonoVTable *class_vtable, MonoGenericInst *method_inst);
void mono_cfg_add_try_hole (MonoCompile *cfg, MonoExceptionClause *clause, guint8 *start, MonoBasicBlock *bb);
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;
* 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);