2009-01-26 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / mini.h
index 4f10bea39450d65b79203b82ae2fac0d6db9e731..920e5126ea19bfcde64d44f5b7ae2485024f34f8 100644 (file)
@@ -66,7 +66,7 @@
 #define MONO_FAKE_VTABLE_METHOD ((MonoMethod*)GINT_TO_POINTER(-2))
 
 /* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION "39"
+#define MONO_AOT_FILE_VERSION "44"
  
 /* Per-domain information maintained by the JIT */
 typedef struct
@@ -187,7 +187,6 @@ enum {
 
 #define MONO_IS_SETCC(ins) ((((ins)->opcode >= OP_CEQ) && ((ins)->opcode <= OP_CLT_UN)) || (((ins)->opcode >= OP_ICEQ) && ((ins)->opcode <= OP_ICLT_UN)) || (((ins)->opcode >= OP_LCEQ) && ((ins)->opcode <= OP_LCLT_UN)) || (((ins)->opcode >= OP_FCEQ) && ((ins)->opcode <= OP_FCLT_UN)))
 
-#define MONO_IS_PHI(ins) (((ins)->opcode == OP_PHI) || ((ins)->opcode == OP_FPHI) || ((ins)->opcode == OP_VPHI))
 
 #define MONO_IS_LOAD_MEMBASE(ins) (((ins)->opcode >= OP_LOAD_MEMBASE) && ((ins)->opcode <= OP_LOADV_MEMBASE))
 #define MONO_IS_STORE_MEMBASE(ins) (((ins)->opcode >= OP_STORE_MEMBASE_REG) && ((ins)->opcode <= OP_STOREV_MEMBASE))
@@ -202,10 +201,12 @@ enum {
 /* FIXME: Add more instructions */
 #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_INEG) || (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))
 
+#define MONO_METHOD_IS_FINAL(m) (((m)->flags & METHOD_ATTRIBUTE_FINAL) || ((m)->klass && ((m)->klass->flags & TYPE_ATTRIBUTE_SEALED)))
 
 
 #ifdef MONO_ARCH_SIMD_INTRINSICS
 
+#define MONO_IS_PHI(ins) (((ins)->opcode == OP_PHI) || ((ins)->opcode == OP_FPHI) || ((ins)->opcode == OP_VPHI)  || ((ins)->opcode == OP_XPHI))
 #define MONO_IS_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_FMOVE) || ((ins)->opcode == OP_VMOVE) || ((ins)->opcode == OP_XMOVE))
 #define MONO_IS_NON_FP_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_VMOVE) || ((ins)->opcode == OP_XMOVE))
 #define MONO_IS_REAL_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_FMOVE) || ((ins)->opcode == OP_XMOVE))
@@ -215,6 +216,7 @@ enum {
 
 #else
 
+#define MONO_IS_PHI(ins) (((ins)->opcode == OP_PHI) || ((ins)->opcode == OP_FPHI) || ((ins)->opcode == OP_VPHI))
 #define MONO_IS_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_FMOVE) || ((ins)->opcode == OP_VMOVE))
 #define MONO_IS_NON_FP_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_VMOVE))
 /*A real MOVE is one that isn't decomposed such as a VMOVE or LMOVE*/
@@ -240,11 +242,7 @@ extern guint32 mono_jit_tls_id;
 extern MonoTraceSpec *mono_jit_trace_calls;
 extern gboolean mono_break_on_exc;
 extern int mono_exc_esp_offset;
-#ifdef DISABLE_AOT
-#define mono_compile_aot 0
-#else
 extern gboolean mono_compile_aot;
-#endif
 extern gboolean mono_aot_only;
 extern gboolean mono_use_imt;
 extern MonoMethodDesc *mono_inject_async_exc_method;
@@ -255,6 +253,8 @@ extern gboolean check_for_pending_exc;
 extern gboolean disable_vtypes_in_regs;
 extern gboolean mono_verify_all;
 extern gboolean mono_dont_free_global_codeman;
+extern gboolean mono_do_x86_stack_align;
+extern const char *mono_build_date;
 
 #define INS_INFO(opcode) (&ins_info [((opcode) - OP_START - 1) * 3])
 
@@ -744,6 +744,8 @@ typedef enum {
 typedef struct MonoJumpInfoToken {
        MonoImage *image;
        guint32 token;
+       gboolean has_context;
+       MonoGenericContext context;
 } MonoJumpInfoToken;
 
 typedef struct MonoJumpInfoBBTable {
@@ -802,9 +804,20 @@ typedef enum {
        MONO_TRAMPOLINE_AOT_PLT,
        MONO_TRAMPOLINE_DELEGATE,
        MONO_TRAMPOLINE_RESTORE_STACK_PROT,
+       MONO_TRAMPOLINE_GENERIC_VIRTUAL_REMOTING,
+       MONO_TRAMPOLINE_MONITOR_ENTER,
+       MONO_TRAMPOLINE_MONITOR_EXIT,
        MONO_TRAMPOLINE_NUM
 } MonoTrampolineType;
 
+#define MONO_TRAMPOLINE_TYPE_MUST_RETURN(t)            \
+       ((t) == MONO_TRAMPOLINE_CLASS_INIT ||           \
+        (t) == MONO_TRAMPOLINE_GENERIC_CLASS_INIT ||   \
+        (t) == MONO_TRAMPOLINE_RESTORE_STACK_PROT ||   \
+        (t) == MONO_TRAMPOLINE_RGCTX_LAZY_FETCH ||     \
+        (t) == MONO_TRAMPOLINE_MONITOR_ENTER ||        \
+        (t) == MONO_TRAMPOLINE_MONITOR_EXIT)
+
 /* optimization flags */
 #define OPTFLAG(id,shift,name,descr) MONO_OPT_ ## id = 1 << shift,
 enum {
@@ -939,6 +952,7 @@ typedef struct {
        guint            uses_rgctx_reg : 1;
        guint            uses_vtable_reg : 1;
        guint            uses_simd_intrinsics : 1;
+       guint            keep_cil_nops : 1;
        gpointer         debug_info;
        guint32          lmf_offset;
     guint16          *intvars;
@@ -984,6 +998,9 @@ typedef struct {
 
        /* Used to implement fconv_to_r8_x. This is a double (8 bytes) var.*/
        MonoInst *fconv_to_r8_x_var;
+
+       /* Used by AOT */
+       guint32 got_offset;
 } MonoCompile;
 
 typedef enum {
@@ -1259,9 +1276,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 */
-MonoJumpInfoToken * mono_jump_info_token_new (MonoMemPool *mp, MonoImage *image, guint32 token) 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;
 void      mono_precompile_assemblies        (void) MONO_INTERNAL;
 int       mono_parse_default_optimizations  (const char* p);
@@ -1416,10 +1435,13 @@ gpointer          mono_create_jit_trampoline_from_token (MonoImage *image, guint
 gpointer          mono_create_jit_trampoline_in_domain (MonoDomain *domain, MonoMethod *method) MONO_INTERNAL;
 gpointer          mono_create_delegate_trampoline (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;
 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;
 gpointer          mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) MONO_INTERNAL;
+gpointer          mono_generic_virtual_remoting_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8 *tramp) MONO_INTERNAL;
 gpointer          mono_delegate_trampoline (gssize *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) MONO_INTERNAL;
 gpointer          mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info, 
                                                                           guint8* tramp) MONO_INTERNAL;
@@ -1427,6 +1449,8 @@ gpointer          mono_aot_plt_trampoline (gssize *regs, guint8 *code, guint8 *t
                                                                                   guint8* tramp) MONO_INTERNAL;
 void              mono_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL;
 void              mono_generic_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL;
+void              mono_monitor_enter_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL;
+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;
 
@@ -1474,12 +1498,17 @@ gpointer  mono_arch_get_throw_exception         (void) MONO_INTERNAL;
 gpointer  mono_arch_get_rethrow_exception       (void) MONO_INTERNAL;
 gpointer  mono_arch_get_throw_exception_by_name (void) MONO_INTERNAL;
 gpointer  mono_arch_get_throw_corlib_exception  (void) MONO_INTERNAL;
+void      mono_arch_exceptions_init             (void) MONO_INTERNAL;
 guchar*   mono_arch_create_trampoline_code      (MonoTrampolineType tramp_type) MONO_INTERNAL;
 guchar*   mono_arch_create_trampoline_code_full (MonoTrampolineType tramp_type, guint32 *code_size, MonoJumpInfo **ji, gboolean aot) MONO_INTERNAL;
 gpointer  mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot) MONO_INTERNAL;
 gpointer  mono_arch_create_rgctx_lazy_fetch_trampoline_full (guint32 slot, guint32 *code_size, MonoJumpInfo **ji, gboolean aot) MONO_INTERNAL;
 gpointer  mono_arch_create_generic_class_init_trampoline (void) MONO_INTERNAL;
 gpointer  mono_arch_get_nullified_class_init_trampoline (guint32 *code_len) MONO_INTERNAL;
+gpointer  mono_arch_create_monitor_enter_trampoline (void) MONO_INTERNAL;
+gpointer  mono_arch_create_monitor_exit_trampoline (void) MONO_INTERNAL;
+gpointer  mono_arch_create_monitor_enter_trampoline_full (guint32 *code_size, MonoJumpInfo **ji, gboolean aot) MONO_INTERNAL;
+gpointer  mono_arch_create_monitor_exit_trampoline_full (guint32 *code_size, MonoJumpInfo **ji, gboolean aot) MONO_INTERNAL;
 GList    *mono_arch_get_allocatable_int_vars    (MonoCompile *cfg) MONO_INTERNAL;
 GList    *mono_arch_get_global_int_regs         (MonoCompile *cfg) MONO_INTERNAL;
 GList    *mono_arch_get_global_fp_regs          (MonoCompile *cfg) MONO_INTERNAL;
@@ -1693,9 +1722,50 @@ int mini_wapi_semdel (int argc, char **argv) MONO_INTERNAL;
 int mini_wapi_seminfo (int argc, char **argv) MONO_INTERNAL;
 
 /* SIMD support */
+
+/*
+This enum MUST be kept in sync with its managed mirror Mono.Simd.AccelMode.
+The AccelMode values are masks while the ones here are the bit indexes.
+ */
+enum {
+       SIMD_VERSION_SSE1       = 0,
+       SIMD_VERSION_SSE2       = 1,
+       SIMD_VERSION_SSE3       = 2,
+       SIMD_VERSION_SSSE3      = 3,
+       SIMD_VERSION_SSE41      = 4,
+       SIMD_VERSION_SSE42      = 5,
+       SIMD_VERSION_SSE4a      = 6,
+};
+
+enum {
+       SIMD_COMP_EQ,
+       SIMD_COMP_LT,
+       SIMD_COMP_LE,
+       SIMD_COMP_UNORD,
+       SIMD_COMP_NEQ,
+       SIMD_COMP_NLT,
+       SIMD_COMP_NLE,
+       SIMD_COMP_ORD
+};
+
+enum {
+       SIMD_PREFETCH_MODE_NTA,
+       SIMD_PREFETCH_MODE_0,
+       SIMD_PREFETCH_MODE_1,
+       SIMD_PREFETCH_MODE_2,
+};
+
 const char *mono_arch_xregname (int reg) MONO_INTERNAL;
 void mono_simd_simplify_indirection (MonoCompile *cfg) MONO_INTERNAL;
 MonoInst* mono_emit_simd_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args) MONO_INTERNAL;
+guint32   mono_arch_cpu_enumerate_simd_versions (void) MONO_INTERNAL;
+void mono_simd_intrinsics_init (void) MONO_INTERNAL;
 
+/* for MONO_WRAPPER_UNKNOWN subtypes */
+enum {
+       MONO_AOT_WRAPPER_MONO_ENTER,
+       MONO_AOT_WRAPPER_MONO_EXIT,
+       MONO_AOT_WRAPPER_LAST
+};
 
 #endif /* __MONO_MINI_H__ */