Don't use System.Environment.Exit to finish a sdb session on iOS.
[mono.git] / mono / mini / mini.h
index 469f6c6e8d2f194e79054fd5271353fcd39d29e1..18b0050b62548ffe2699a4c4e87f415cac62d538 100644 (file)
 #include "regalloc.h"
 #include "declsec.h"
 #include "mini-unwind.h"
+#include "jit.h"
+
+/*
+ * 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.
+ */
+#if defined(HAVE_BOEHM_GC) || defined(HAVE_SGEN_GC)
+#error "The code in mini/ should not depend on these defines."
+#endif
 
 #ifndef G_LIKELY
 #define G_LIKELY(a) (a)
 #endif
 
 /* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION 80
+#define MONO_AOT_FILE_VERSION 84
 
 //TODO: This is x86/amd64 specific.
 #define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6))
@@ -152,7 +161,9 @@ enum {
        /* array */
        MONO_AOT_TYPEREF_ARRAY = 6,
        /* blob index of the type encoding */
-       MONO_AOT_TYPEREF_BLOB_INDEX = 7
+       MONO_AOT_TYPEREF_BLOB_INDEX = 7,
+       /* ptr */
+       MONO_AOT_TYPEREF_PTR = 8
 };
 
 /* Trampolines which we have a lot of */
@@ -239,6 +250,8 @@ typedef struct MonoAotFileInfo
        guint32 flags;
        /* Optimization flags used to compile the module */
        guint32 opts;
+       /* SIMD flags used to compile the module */
+       guint32 simd_opts;
        /* Index of the blob entry holding the GC used by this module */
        gint32 gc_name_index;
 
@@ -776,6 +789,7 @@ struct MonoCallInst {
        MonoInst *vret_var;
        gconstpointer fptr;
        guint stack_usage;
+       guint stack_align_amount;
        guint virtual : 1;
        guint tail_call : 1;
        /* If this is TRUE, 'fptr' points to a MonoJumpInfo instead of an address. */
@@ -789,6 +803,8 @@ struct MonoCallInst {
        guint dynamic_imt_arg : 1;
        /* Whenever there is an RGCTX argument */
        guint32 rgctx_reg : 1;
+       /* Whenever the call will need an unbox trampoline */
+       guint need_unbox_trampoline : 1;
        regmask_t used_iregs;
        regmask_t used_fregs;
        GSList *out_ireg_args;
@@ -1026,15 +1042,15 @@ typedef enum {
        MONO_RGCTX_INFO_CAST_CACHE
 } MonoRgctxInfoType;
 
-typedef struct _MonoRuntimeGenericContextOtherInfoTemplate {
+typedef struct _MonoRuntimeGenericContextInfoTemplate {
        MonoRgctxInfoType info_type;
        gpointer data;
-       struct _MonoRuntimeGenericContextOtherInfoTemplate *next;
-} MonoRuntimeGenericContextOtherInfoTemplate;
+       struct _MonoRuntimeGenericContextInfoTemplate *next;
+} MonoRuntimeGenericContextInfoTemplate;
 
 typedef struct {
        MonoClass *next_subclass;
-       MonoRuntimeGenericContextOtherInfoTemplate *other_infos;
+       MonoRuntimeGenericContextInfoTemplate *infos;
        GSList *method_templates;
 } MonoRuntimeGenericContextTemplate;
 
@@ -1255,6 +1271,9 @@ typedef struct {
 
        MonoGenericSharingContext *generic_sharing_context;
 
+       /* For native-to-managed wrappers, the saved old domain */
+       MonoInst *orig_domain_var;
+
        unsigned char   *cil_start;
 #ifdef __native_client_codegen__
        /* this alloc is not aligned, native_code */
@@ -1411,6 +1430,12 @@ typedef struct {
 
        GSList *try_block_holes;
 
+       /* DWARF location list for 'this' */
+       GSList *this_loclist;
+
+       /* DWARF location list for 'rgctx_var' */
+       GSList *rgctx_loclist;
+
        /* GC Maps */
    
        /* The offsets of the locals area relative to the frame pointer */
@@ -1650,6 +1675,14 @@ typedef struct {
         * is hit.
         */
        gboolean soft_breakpoints;
+       /*
+        * Whenever to break in the debugger using G_BREAKPOINT on unhandled exceptions.
+        */
+       gboolean break_on_exc;
+       /*
+        * Load AOT JIT info eagerly.
+        */
+       gboolean load_aot_jit_info_eagerly;
 } MonoDebugOptions;
 
 enum {
@@ -1729,10 +1762,11 @@ void        mono_set_defaults              (int verbose_level, guint32 opts);
 MonoDomain* mini_init                      (const char *filename, const char *runtime_version) MONO_INTERNAL;
 void        mini_cleanup                   (MonoDomain *domain) MONO_INTERNAL;
 MonoDebugOptions *mini_get_debug_options   (void) MONO_INTERNAL;
-char*       mono_get_runtime_build_info    (void) MONO_INTERNAL;
 
 /* helper methods */
 void      mono_disable_optimizations       (guint32 opts) MONO_INTERNAL;
+void      mono_set_optimizations           (guint32 opts) MONO_INTERNAL;
+void      mono_set_verbose_level           (guint32 level) MONO_INTERNAL;
 MonoJumpInfoToken* mono_jump_info_token_new (MonoMemPool *mp, MonoImage *image, guint32 token) MONO_INTERNAL;
 MonoJumpInfoToken* mono_jump_info_token_new2 (MonoMemPool *mp, MonoImage *image, guint32 token, MonoGenericContext *context) MONO_INTERNAL;
 MonoInst* mono_find_spvar_for_region        (MonoCompile *cfg, int region) MONO_INTERNAL;
@@ -1782,6 +1816,7 @@ void      mono_print_bb                     (MonoBasicBlock *bb, const char *msg
 void      mono_print_code                   (MonoCompile *cfg, const char *msg) MONO_INTERNAL;
 void      mono_print_method_from_ip         (void *ip);
 char     *mono_pmip                         (void *ip);
+gboolean  mono_debug_count                  (void) MONO_INTERNAL;
 const char* mono_inst_name                  (int op);
 void      mono_inst_set_src_registers       (MonoInst *ins, int *regs) MONO_INTERNAL;
 int       mono_op_to_op_imm                 (int opcode) MONO_INTERNAL;
@@ -1805,7 +1840,8 @@ gpointer  mono_jit_compile_method           (MonoMethod *method) MONO_INTERNAL;
 MonoLMF * mono_get_lmf                      (void) MONO_INTERNAL;
 MonoLMF** mono_get_lmf_addr                 (void) MONO_INTERNAL;
 void      mono_set_lmf                      (MonoLMF *lmf) MONO_INTERNAL;
-void      mono_jit_thread_attach            (MonoDomain *domain);
+MonoDomain *mono_jit_thread_attach          (MonoDomain *domain);
+void      mono_jit_set_domain               (MonoDomain *domain);
 MonoNativeTlsKey mono_get_jit_tls_key       (void) MONO_INTERNAL;
 gint32    mono_get_jit_tls_offset           (void) MONO_INTERNAL;
 gint32    mono_get_lmf_tls_offset           (void) MONO_INTERNAL;
@@ -1813,6 +1849,7 @@ gint32    mono_get_lmf_addr_tls_offset      (void) MONO_INTERNAL;
 MonoInst* mono_get_jit_tls_intrinsic        (MonoCompile *cfg) MONO_INTERNAL;
 MonoInst* mono_get_domain_intrinsic         (MonoCompile* cfg) MONO_INTERNAL;
 MonoInst* mono_get_thread_intrinsic         (MonoCompile* cfg) MONO_INTERNAL;
+MonoInst* mono_get_lmf_intrinsic            (MonoCompile* cfg) MONO_INTERNAL;
 GList    *mono_varlist_insert_sorted        (MonoCompile *cfg, GList *list, MonoMethodVar *mv, int sort_type) MONO_INTERNAL;
 GList    *mono_varlist_sort                 (MonoCompile *cfg, GList *list, int sort_type) MONO_INTERNAL;
 void      mono_analyze_liveness             (MonoCompile *cfg) MONO_INTERNAL;
@@ -1830,6 +1867,7 @@ gboolean  mini_assembly_can_skip_verification (MonoDomain *domain, MonoMethod *m
 gboolean mono_compile_is_broken (MonoCompile *cfg, MonoMethod *method, gboolean fail_compile) MONO_INTERNAL;
 MonoInst *mono_get_got_var (MonoCompile *cfg) MONO_INTERNAL;
 void      mono_add_seq_point (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *ins, int native_offset) MONO_INTERNAL;
+void      mono_add_var_location (MonoCompile *cfg, MonoInst *var, gboolean is_reg, int reg, int offset, int from, int to) MONO_INTERNAL;
 MonoInst* mono_emit_jit_icall (MonoCompile *cfg, gconstpointer func, MonoInst **args) MONO_INTERNAL;
 MonoInst* mono_emit_method_call (MonoCompile *cfg, MonoMethod *method, MonoInst **args, MonoInst *this) MONO_INTERNAL;
 void      mono_create_helper_signatures (void) MONO_INTERNAL;
@@ -1954,7 +1992,7 @@ gpointer          mono_create_generic_class_init_trampoline (void) MONO_INTERNAL
 gpointer          mono_create_jit_trampoline (MonoMethod *method) MONO_INTERNAL;
 gpointer          mono_create_jit_trampoline_from_token (MonoImage *image, guint32 token) MONO_INTERNAL;
 gpointer          mono_create_jit_trampoline_in_domain (MonoDomain *domain, MonoMethod *method) MONO_LLVM_INTERNAL;
-gpointer          mono_create_delegate_trampoline (MonoClass *klass) MONO_INTERNAL;
+gpointer          mono_create_delegate_trampoline (MonoDomain *domain, MonoClass *klass) MONO_INTERNAL;
 gpointer          mono_create_rgctx_lazy_fetch_trampoline (guint32 offset) MONO_INTERNAL;
 gpointer          mono_create_monitor_enter_trampoline (void) MONO_INTERNAL;
 gpointer          mono_create_monitor_exit_trampoline (void) MONO_INTERNAL;
@@ -2020,9 +2058,10 @@ void              mono_if_conversion (MonoCompile *cfg) MONO_INTERNAL;
 
 /* methods that must be provided by the arch-specific port */
 void      mono_arch_init                        (void) MONO_INTERNAL;
+void      mono_arch_finish_init                 (void) MONO_INTERNAL;
 void      mono_arch_cleanup                     (void) MONO_INTERNAL;
 void      mono_arch_cpu_init                    (void) MONO_INTERNAL;
-guint32   mono_arch_cpu_optimizazions           (guint32 *exclude_mask) MONO_INTERNAL;
+guint32   mono_arch_cpu_optimizations           (guint32 *exclude_mask) MONO_INTERNAL;
 void      mono_arch_instrument_mem_needs        (MonoMethod *method, int *stack, int *code) MONO_INTERNAL;
 void     *mono_arch_instrument_prolog           (MonoCompile *cfg, void *func, void *p, gboolean enable_arguments) MONO_INTERNAL;
 void     *mono_arch_instrument_epilog           (MonoCompile *cfg, void *func, void *p, gboolean enable_arguments) MONO_INTERNAL;
@@ -2055,11 +2094,10 @@ void      mono_arch_lowering_pass               (MonoCompile *cfg, MonoBasicBloc
 void      mono_arch_peephole_pass_1             (MonoCompile *cfg, MonoBasicBlock *bb) MONO_INTERNAL;
 void      mono_arch_peephole_pass_2             (MonoCompile *cfg, MonoBasicBlock *bb) MONO_INTERNAL;
 void      mono_arch_output_basic_block          (MonoCompile *cfg, MonoBasicBlock *bb) MONO_INTERNAL;
-void      mono_arch_setup_jit_tls_data          (MonoJitTlsData *tls) MONO_INTERNAL;
 void      mono_arch_free_jit_tls_data           (MonoJitTlsData *tls) MONO_INTERNAL;
 void      mono_arch_fill_argument_info          (MonoCompile *cfg) MONO_INTERNAL;
 void      mono_arch_allocate_vars               (MonoCompile *m) MONO_INTERNAL;
-int       mono_arch_get_argument_info           (MonoMethodSignature *csig, int param_count, MonoJitArgumentInfo *arg_info) MONO_INTERNAL;
+int       mono_arch_get_argument_info           (MonoGenericSharingContext *gsctx, MonoMethodSignature *csig, int param_count, MonoJitArgumentInfo *arg_info) MONO_INTERNAL;
 gboolean  mono_arch_print_tree                 (MonoInst *tree, int arity) MONO_INTERNAL;
 void      mono_arch_emit_call                   (MonoCompile *cfg, MonoCallInst *call) MONO_INTERNAL;
 void      mono_arch_emit_outarg_vt              (MonoCompile *cfg, MonoInst *ins, MonoInst *src) MONO_INTERNAL;
@@ -2206,6 +2244,14 @@ MonoBoolean ves_icall_get_frame_info            (gint32 skip, MonoBoolean need_f
 MonoString *ves_icall_System_Exception_get_trace (MonoException *exc) MONO_INTERNAL;
 void mono_set_cast_details                      (MonoClass *from, MonoClass *to) MONO_INTERNAL;
 
+/* Installs a function which is called when the runtime encounters an unhandled exception.
+ * This hook isn't expected to return.
+ * If no hook has been installed, the runtime will print a message before aborting.
+ */
+typedef void  (*MonoUnhandledExceptionFunc)         (MonoObject *exc, gpointer user_data);
+void          mono_install_unhandled_exception_hook (MonoUnhandledExceptionFunc func, gpointer user_data);
+void          mono_invoke_unhandled_exception_hook  (MonoObject *exc);
+
 /* Dominator/SSA methods */
 void        mono_compile_dominator_info         (MonoCompile *cfg, int dom_flags) MONO_INTERNAL;
 void        mono_compute_natural_loops          (MonoCompile *cfg) MONO_INTERNAL;
@@ -2299,7 +2345,7 @@ int
 mono_class_rgctx_get_array_size (int n, gboolean mrgctx) MONO_INTERNAL;
 
 guint32
-mono_method_lookup_or_register_other_info (MonoMethod *method, gboolean in_mrgctx, gpointer data,
+mono_method_lookup_or_register_info (MonoMethod *method, gboolean in_mrgctx, gpointer data,
        MonoRgctxInfoType info_type, MonoGenericContext *generic_context) MONO_INTERNAL;
 
 MonoGenericContext
@@ -2446,7 +2492,7 @@ void mono_runtime_setup_stat_profiler (void) MONO_INTERNAL;
 void mono_runtime_shutdown_stat_profiler (void) MONO_INTERNAL;
 void mono_runtime_posix_install_handlers (void) MONO_INTERNAL;
 pid_t mono_runtime_syscall_fork (void) MONO_INTERNAL;
-gboolean mono_gdb_render_native_backtraces (pid_t crashed_pid) MONO_INTERNAL;
+void mono_gdb_render_native_backtraces (pid_t crashed_pid) MONO_INTERNAL;
 
 /*
  * Signal handling
@@ -2494,29 +2540,4 @@ void SIG_HANDLER_SIGNATURE (mono_sigsegv_signal_handler) MONO_INTERNAL;
 void SIG_HANDLER_SIGNATURE (mono_sigint_signal_handler)  MONO_INTERNAL;
 gboolean SIG_HANDLER_SIGNATURE (mono_chain_signal) MONO_INTERNAL;
 
-/* Subtypes of some wrapper types */
-enum {
-       MONO_AOT_WRAPPER_MONITOR_ENTER,
-       MONO_AOT_WRAPPER_MONITOR_EXIT,
-       MONO_AOT_WRAPPER_ELEMENT_ADDR,
-       MONO_AOT_WRAPPER_PTR_TO_STRUCTURE,
-       MONO_AOT_WRAPPER_STRUCTURE_TO_PTR,
-       MONO_AOT_WRAPPER_CASTCLASS_WITH_CACHE,
-       MONO_AOT_WRAPPER_ISINST_WITH_CACHE,
-       MONO_AOT_WRAPPER_MONITOR_ENTER_V4,
-       MONO_AOT_WRAPPER_JIT_ICALL,
-       MONO_AOT_WRAPPER_RUNTIME_INVOKE_DYNAMIC,
-       MONO_AOT_WRAPPER_RUNTIME_INVOKE_DIRECT,
-       MONO_AOT_WRAPPER_RUNTIME_INVOKE_VIRTUAL,
-       /*
-        * We can't encode this wrapper directly, so we emit its name instead.
-        * This means that its not possible to decode this into a method, only to check
-        * that the method reference matches a given method. This is normally not a problem
-        * as these wrappers only occur in the extra_methods table, where we already have
-        * a method we want to lookup.
-        */
-       MONO_AOT_WRAPPER_BY_NAME,
-       MONO_AOT_WRAPPER_LAST
-};
-
 #endif /* __MONO_MINI_H__ */