2009-05-20 Miguel de Icaza <miguel@novell.com>
[mono.git] / mono / mini / mini.h
index 5062f1d5441d4998fa5ed7ba1cbe9562f094bf57..147ff23065225af0ff865f5059b568742603d6e5 100644 (file)
@@ -60,16 +60,14 @@ typedef gint64 mgreg_t;
 
 #if ENABLE_LLVM
 #define COMPILE_LLVM(cfg) ((cfg)->compile_llvm)
+#define LLVM_ENABLED TRUE
 #else
 #define COMPILE_LLVM(cfg) (0)
+#define LLVM_ENABLED FALSE
 #endif
 
 #define NOT_IMPLEMENTED do { g_assert_not_reached (); } while (0)
 
-#ifndef DISABLE_AOT
-#define MONO_USE_AOT_COMPILER
-#endif
-
 /* for 32 bit systems */
 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
 #define MINI_LS_WORD_IDX 0
@@ -86,8 +84,12 @@ typedef gint64 mgreg_t;
 #define MONO_FAKE_IMT_METHOD ((MonoMethod*)GINT_TO_POINTER(-1))
 #define MONO_FAKE_VTABLE_METHOD ((MonoMethod*)GINT_TO_POINTER(-2))
 
+#ifndef DISABLE_AOT
+#define MONO_USE_AOT_COMPILER
+#endif
+
 /* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION "48"
+#define MONO_AOT_FILE_VERSION "54"
 
 /* Constants used to encode different types of methods in AOT */
 enum {
@@ -104,6 +106,26 @@ enum {
        /* Methods resolve using a METHODSPEC token */
        MONO_AOT_METHODREF_METHODSPEC = 255,
 };
+
+/* Trampolines which we have a lot of */
+typedef enum {
+       MONO_AOT_TRAMP_SPECIFIC = 0,
+       MONO_AOT_TRAMP_STATIC_RGCTX = 1,
+       MONO_AOT_TRAMP_IMT_THUNK = 2,
+       MONO_AOT_TRAMP_NUM = 3
+} MonoAotTrampoline;
+
+/* This structure is stored in the AOT file */
+typedef struct MonoAotFileInfo
+{
+       guint32 plt_got_offset_base;
+       guint32 got_size;
+       guint32 plt_size;
+
+       guint32 num_trampolines [MONO_AOT_TRAMP_NUM];
+       guint32 trampoline_got_offset_base [MONO_AOT_TRAMP_NUM];
+       guint32 trampoline_size [MONO_AOT_TRAMP_NUM];
+} MonoAotFileInfo;
  
 /* Per-domain information maintained by the JIT */
 typedef struct
@@ -116,6 +138,8 @@ typedef struct
        GHashTable *jump_trampoline_hash;
        GHashTable *jit_trampoline_hash;
        GHashTable *delegate_trampoline_hash;
+       GHashTable *static_rgctx_trampoline_hash;
+       GHashTable *llvm_vcall_trampoline_hash;
        /* maps MonoMethod -> MonoJitDynamicMethodInfo */
        GHashTable *dynamic_code_hash;
        GHashTable *method_code_hash;
@@ -372,6 +396,7 @@ struct MonoBasicBlock {
        /* The address of the generated code, used for fixups */
        int native_offset;
        int max_offset;
+       int max_length;
 
        /* Visited and reachable flags */
        guint32 flags;
@@ -451,6 +476,28 @@ typedef struct MonoMemcpyArgs {
        int size, align;
 } MonoMemcpyArgs;
 
+typedef enum {
+       LLVMArgNone,
+       LLVMArgInIReg,
+       LLVMArgInFPReg,
+       LLVMArgVtypeInReg,
+       LLVMArgVtypeByVal,
+       LLVMArgVtypeRetAddr /* On on cinfo->ret */
+} LLVMArgStorage;
+
+typedef struct {
+       LLVMArgStorage storage;
+
+       /* Only if storage == ArgValuetypeInReg */
+       LLVMArgStorage pair_storage [2];
+} LLVMArgInfo;
+
+typedef struct {
+       LLVMArgInfo ret;
+       /* args [0] is for the this argument if it exists */
+       LLVMArgInfo args [1];
+} LLVMCallInfo;
+
 #define MONO_MAX_SRC_REGS      3
 
 struct MonoInst {
@@ -535,6 +582,9 @@ struct MonoCallInst {
        regmask_t used_fregs;
        GSList *out_ireg_args;
        GSList *out_freg_args;
+#ifdef ENABLE_LLVM
+       LLVMCallInfo *cinfo;
+#endif
 };
 
 struct MonoCallArgParm {
@@ -557,7 +607,6 @@ enum {
        MONO_INST_IS_DEAD    = 2,
        MONO_INST_TAILCALL   = 4,
        MONO_INST_VOLATILE   = 4,
-       MONO_INST_BRLABEL    = 4,
        MONO_INST_NOTYPECHECK    = 4,
        MONO_INST_UNALIGNED  = 8,
     MONO_INST_CFOLD_TAKEN = 8, /* On branches */
@@ -765,6 +814,9 @@ typedef enum {
        MONO_TRAMPOLINE_GENERIC_VIRTUAL_REMOTING,
        MONO_TRAMPOLINE_MONITOR_ENTER,
        MONO_TRAMPOLINE_MONITOR_EXIT,
+#ifdef ENABLE_LLVM
+       MONO_TRAMPOLINE_LLVM_VCALL,
+#endif
        MONO_TRAMPOLINE_NUM
 } MonoTrampolineType;
 
@@ -823,6 +875,7 @@ typedef struct {
        gint             stack_offset;
        gint             max_ireg;
        gint             cil_offset_to_bb_len;
+       gint             locals_min_stack_offset, locals_max_stack_offset;
        MonoRegState    *rs;
        MonoSpillInfo   *spill_info [16]; /* machine register spills */
        gint             spill_count;
@@ -908,6 +961,7 @@ typedef struct {
        guint            disable_omit_fp : 1;
        guint            disable_vreg_to_lvreg : 1;
        guint            disable_deadce_vars : 1;
+       guint            extend_live_ranges : 1;
        guint            has_got_slots : 1;
        guint            uses_rgctx_reg : 1;
        guint            uses_vtable_reg : 1;
@@ -1205,6 +1259,17 @@ enum {
        MINI_TOKEN_SOURCE_FIELD
 };
 
+/* 
+ * This structures contains information about a trampoline function required by
+ * the AOT compiler in full-aot mode.
+ */
+typedef struct
+{
+       guint8 *code;
+       guint32 code_size;
+       char *name;
+} MonoAotTrampInfo;
+
 typedef void (*MonoInstFunc) (MonoInst *tree, gpointer data);
 
 /* main function */
@@ -1331,8 +1396,15 @@ gpointer mono_aot_create_specific_trampoline   (MonoImage *image, gpointer arg1,
 gpointer mono_aot_get_named_code            (const char *name) MONO_INTERNAL;
 gpointer mono_aot_get_unbox_trampoline      (MonoMethod *method) MONO_INTERNAL;
 gpointer mono_aot_get_lazy_fetch_trampoline (guint32 slot) MONO_INTERNAL;
+gpointer mono_aot_get_static_rgctx_trampoline (gpointer ctx, gpointer addr) MONO_INTERNAL;
+gpointer mono_aot_get_imt_thunk             (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckItem **imt_entries, int count, gpointer fail_tramp) MONO_INTERNAL;
 guint8*  mono_aot_get_unwind_info           (MonoJitInfo *ji, guint32 *unwind_info_len) MONO_INTERNAL;
 guint32  mono_aot_method_hash               (MonoMethod *method) MONO_INTERNAL;
+char*    mono_aot_wrapper_name              (MonoMethod *method) MONO_INTERNAL;
+MonoAotTrampInfo* mono_aot_tramp_info_create (const char *name, guint8 *code, guint32 code_len) MONO_INTERNAL;
+gboolean mono_aot_is_shared_got_patch       (MonoJumpInfo *patch_info) MONO_INTERNAL;
+guint    mono_aot_str_hash                  (gconstpointer v1) MONO_INTERNAL;
+
 /* This is an exported function */
 void     mono_aot_register_globals          (gpointer *globals);
 /* This too */
@@ -1344,7 +1416,11 @@ void     mono_save_trampoline_xdebug_info   (const char *tramp_name, guint8 *cod
 /* This is an exported function */
 void     mono_xdebug_emit                   (void) MONO_INTERNAL;
 
+/* LLVM backend */
+void     mono_llvm_init                     (void) MONO_INTERNAL;
+void     mono_llvm_cleanup                  (void) MONO_INTERNAL;
 void     mono_llvm_emit_method              (MonoCompile *cfg) MONO_INTERNAL;
+void     mono_llvm_emit_call                (MonoCompile *cfg, MonoCallInst *call) MONO_INTERNAL;
 
 gboolean  mono_method_blittable             (MonoMethod *method) MONO_INTERNAL;
 gboolean  mono_method_same_domain           (MonoJitInfo *caller, MonoJitInfo *callee) MONO_INTERNAL;
@@ -1378,6 +1454,8 @@ gpointer          mono_create_delegate_trampoline (MonoClass *klass) MONO_INTERN
 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;
+gpointer          mono_create_static_rgctx_trampoline (MonoMethod *m, gpointer addr) MONO_INTERNAL;
+gpointer          mono_create_llvm_vcall_trampoline (MonoMethod *method) MONO_INTERNAL;
 MonoVTable*       mono_find_class_init_trampoline_by_addr (gconstpointer addr) MONO_INTERNAL;
 MonoClass*        mono_find_delegate_trampoline_by_addr (gconstpointer addr) MONO_INTERNAL;
 guint32           mono_find_rgctx_lazy_fetch_trampoline_by_addr (gconstpointer addr) MONO_INTERNAL;
@@ -1394,6 +1472,7 @@ void              mono_monitor_enter_trampoline (gssize *regs, guint8 *code, Mon
 void              mono_monitor_exit_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL;
 gconstpointer     mono_get_trampoline_func (MonoTrampolineType tramp_type);
 gpointer          mini_get_vtable_trampoline (void) MONO_INTERNAL;
+gpointer*         mono_get_vcall_slot_addr (guint8* code, gpointer *regs) MONO_INTERNAL;
 
 gboolean          mono_running_on_valgrind (void) MONO_INTERNAL;
 void*             mono_global_codeman_reserve (int size) MONO_INTERNAL;
@@ -1422,7 +1501,7 @@ int               mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoB
                                                                         MonoInst *return_var, GList *dont_inline, MonoInst **inline_args, 
                                                                         guint inline_offset, gboolean is_virtual_call) MONO_INTERNAL;
 
-void              mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins) MONO_INTERNAL;
+MonoInst         *mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins) MONO_INTERNAL;
 void              mono_decompose_long_opts (MonoCompile *cfg) MONO_INTERNAL;
 void              mono_decompose_vtype_opts (MonoCompile *cfg) MONO_INTERNAL;
 void              mono_decompose_array_access_opts (MonoCompile *cfg) MONO_INTERNAL;
@@ -1439,6 +1518,7 @@ guint32   mono_arch_cpu_optimizazions           (guint32 *exclude_mask) MONO_INT
 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;
+void     *mono_arch_instrument_epilog_full     (MonoCompile *cfg, void *func, void *p, gboolean enable_arguments, gboolean preserve_argument_registers) MONO_INTERNAL;
 void      mono_codegen                          (MonoCompile *cfg) MONO_INTERNAL;
 void      mono_call_inst_add_outarg_reg         (MonoCompile *cfg, MonoCallInst *call, int vreg, int hreg, gboolean fp) MONO_INTERNAL;
 const char *mono_arch_regname                   (int reg) MONO_INTERNAL;
@@ -1488,6 +1568,8 @@ void      mono_arch_emit_setret                 (MonoCompile *cfg, MonoMethod *m
 MonoInst *mono_arch_emit_inst_for_method        (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args) MONO_INTERNAL;
 void      mono_arch_decompose_opts              (MonoCompile *cfg, MonoInst *ins) MONO_INTERNAL;
 void      mono_arch_decompose_long_opts         (MonoCompile *cfg, MonoInst *ins) MONO_INTERNAL;
+GSList*   mono_arch_get_delegate_invoke_impls   (void) MONO_INTERNAL;
+LLVMCallInfo* mono_arch_get_llvm_call_info      (MonoCompile *cfg, MonoMethodSignature *sig) MONO_INTERNAL;
 
 MonoJitInfo *mono_arch_find_jit_info            (MonoDomain *domain, 
                                                 MonoJitTlsData *jit_tls, 
@@ -1520,13 +1602,13 @@ MonoInst* mono_arch_get_thread_intrinsic        (MonoCompile* cfg) MONO_INTERNAL
 gboolean mono_arch_is_int_overflow              (void *sigctx, void *info) MONO_INTERNAL;
 void     mono_arch_invalidate_method            (MonoJitInfo *ji, void *func, gpointer func_arg) MONO_INTERNAL;
 guint32  mono_arch_get_patch_offset             (guint8 *code) MONO_INTERNAL;
-gpointer*mono_arch_get_vcall_slot_addr          (guint8* code, gpointer *regs) MONO_INTERNAL;
 gpointer mono_arch_get_vcall_slot               (guint8 *code, gpointer *regs, int *displacement) MONO_INTERNAL;
 gpointer*mono_arch_get_delegate_method_ptr_addr (guint8* code, gpointer *regs) MONO_INTERNAL;
 void     mono_arch_create_vars                  (MonoCompile *cfg) MONO_INTERNAL;
 void     mono_arch_save_unwind_info             (MonoCompile *cfg) MONO_INTERNAL;
 void     mono_arch_register_lowlevel_calls      (void) MONO_INTERNAL;
 gpointer mono_arch_get_unbox_trampoline         (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr) MONO_INTERNAL;
+gpointer mono_arch_get_static_rgctx_trampoline  (MonoMethod *m, MonoMethodRuntimeGenericContext *mrgctx, gpointer addr) MONO_INTERNAL;
 void     mono_arch_patch_callsite               (guint8 *method_start, guint8 *code, guint8 *addr) MONO_INTERNAL;
 void     mono_arch_patch_plt_entry              (guint8 *code, guint8 *addr) MONO_INTERNAL;
 void     mono_arch_nullify_class_init_trampoline(guint8 *code, gssize *regs) MONO_INTERNAL;
@@ -1541,7 +1623,6 @@ MonoMethod* mono_arch_find_imt_method           (gpointer *regs, guint8 *code) M
 MonoVTable* mono_arch_find_static_call_vtable   (gpointer *regs, guint8 *code) MONO_INTERNAL;
 gpointer    mono_arch_build_imt_thunk           (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckItem **imt_entries, int count, gpointer fail_tramp) MONO_INTERNAL;
 void    mono_arch_notify_pending_exc            (void) MONO_INTERNAL;
-void    mono_arch_fixup_jinfo                   (MonoCompile *cfg) MONO_INTERNAL;
 
 /* Exception handling */
 void     mono_exceptions_init                   (void) MONO_INTERNAL;