Tue Mar 18 11:50:14 CET 2008 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / mini / mini.h
index 64973d8bd0613db39fc5583919795f975da08cbd..9e66314fc26099a8f8aa906df98e4e1e9227d354 100644 (file)
 #define G_UNLIKELY(a) (a)
 #endif
 
+#ifndef G_MAXINT32
+#define G_MAXINT32 2147483647
+#endif
+
+#ifndef G_MININT32
+#define G_MININT32 (-G_MAXINT32 - 1)
+#endif
+
 #if DISABLE_LOGGING
 #define MINI_DEBUG(level,limit,code)
 #else
@@ -698,6 +706,7 @@ typedef enum {
        MONO_TRAMPOLINE_JUMP,
        MONO_TRAMPOLINE_CLASS_INIT,
        MONO_TRAMPOLINE_GENERIC_CLASS_INIT,
+       MONO_TRAMPOLINE_RGCTX_LAZY_FETCH,
        MONO_TRAMPOLINE_AOT,
        MONO_TRAMPOLINE_AOT_PLT,
        MONO_TRAMPOLINE_DELEGATE,
@@ -756,6 +765,7 @@ typedef struct {
        MonoMethod      *inlined_method; /* the method which is currently inlined */
        MonoInst        *domainvar; /* a cache for the current domain */
        MonoInst        *got_var; /* Global Offset Table variable */
+       MonoInst        *rgctx_var; /* Runtime generic context variable (for static generic methods) */
        MonoInst        **args;
 
        /* 
@@ -809,7 +819,6 @@ typedef struct {
        guint            skip_visibility : 1;
        gpointer         debug_info;
        guint32          lmf_offset;
-       guint16          *intvars;
        MonoProfileCoverageInfo *coverage_info;
        GHashTable       *token_info_hash;
        MonoCompileArch  arch;
@@ -1024,28 +1033,26 @@ enum {
        MONO_EXC_INTRINS_NUM
 };
 
-/*
- * Flags for which contexts were used in inflating a generic.
- */
-enum {
-       MONO_GENERIC_CONTEXT_USED_CLASS = 1,
-       MONO_GENERIC_CONTEXT_USED_METHOD = 2
-};
-
-#define MONO_GENERIC_CONTEXT_USED_BOTH         (MONO_GENERIC_CONTEXT_USED_CLASS | MONO_GENERIC_CONTEXT_USED_METHOD)
-
 enum {
        MINI_GENERIC_CLASS_RELATION_SELF,
        MINI_GENERIC_CLASS_RELATION_ARGUMENT,
+       MINI_GENERIC_CLASS_RELATION_OTHER_TABLE,
        MINI_GENERIC_CLASS_RELATION_OTHER
 };
 
 enum {
-       MINI_RGCTX_STATIC_DATA,
-       MINI_RGCTX_KLASS,
-       MINI_RGCTX_VTABLE
+       MINI_TOKEN_SOURCE_CLASS,
+       MINI_TOKEN_SOURCE_METHOD,
+       MINI_TOKEN_SOURCE_FIELD
 };
 
+typedef enum {
+       MINI_VERIFIER_MODE_OFF,
+       MINI_VERIFIER_MODE_VALID,
+       MINI_VERIFIER_MODE_VERIFIABLE,
+       MINI_VERIFIER_MODE_STRICT
+} MiniVerifierMode;
+
 typedef void (*MonoInstFunc) (MonoInst *tree, gpointer data);
 
 /* main function */
@@ -1193,6 +1200,8 @@ guchar*   mono_arch_create_trampoline_code      (MonoTrampolineType tramp_type)
 gpointer  mono_arch_create_jit_trampoline       (MonoMethod *method) MONO_INTERNAL;
 MonoJitInfo *mono_arch_create_jump_trampoline      (MonoMethod *method) MONO_INTERNAL;
 gpointer  mono_arch_create_class_init_trampoline(MonoVTable *vtable) MONO_INTERNAL;
+gpointer  mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 encoded_offset) MONO_INTERNAL;
+guint32          mono_arch_get_rgctx_lazy_fetch_offset (gpointer *regs) MONO_INTERNAL;
 GList    *mono_arch_get_allocatable_int_vars    (MonoCompile *cfg) MONO_INTERNAL;
 GList    *mono_arch_get_global_int_regs         (MonoCompile *cfg) MONO_INTERNAL;
 guint32   mono_arch_regalloc_cost               (MonoCompile *cfg, MonoMethodVar *vmv) MONO_INTERNAL;
@@ -1230,6 +1239,7 @@ void     mono_arch_handle_altstack_exception    (void *sigctx, gpointer fault_ad
 gpointer mono_arch_ip_from_context              (void *sigctx) MONO_INTERNAL;
 void     mono_arch_sigctx_to_monoctx            (void *sigctx, MonoContext *ctx) MONO_INTERNAL;
 void     mono_arch_monoctx_to_sigctx            (MonoContext *mctx, void *ctx) MONO_INTERNAL;
+gpointer mono_arch_context_get_int_reg         (MonoContext *ctx, int reg) MONO_INTERNAL;
 void     mono_arch_flush_register_windows       (void) MONO_INTERNAL;
 gboolean mono_arch_is_inst_imm                  (gint64 imm) MONO_INTERNAL;
 MonoInst* mono_arch_get_domain_intrinsic        (MonoCompile* cfg) MONO_INTERNAL;
@@ -1244,16 +1254,18 @@ 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         (MonoMethod *m, gpointer addr) MONO_INTERNAL;
-void     mono_arch_patch_callsite               (guint8 *code, guint8 *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;
 void     mono_arch_nullify_plt_entry            (guint8 *code) MONO_INTERNAL;
-gpointer mono_arch_get_this_arg_from_call       (MonoMethodSignature *sig, gssize *regs, guint8 *code);
-gpointer mono_arch_get_delegate_invoke_impl     (MonoMethodSignature *sig, gboolean has_target);
+int      mono_arch_get_this_arg_reg             (MonoMethodSignature *sig) MONO_INTERNAL;
+gpointer mono_arch_get_this_arg_from_call       (MonoMethodSignature *sig, gssize *regs, guint8 *code) MONO_INTERNAL;
+gpointer mono_arch_get_delegate_invoke_impl     (MonoMethodSignature *sig, gboolean has_target) MONO_INTERNAL;
 gpointer mono_arch_create_specific_trampoline   (gpointer arg1, MonoTrampolineType tramp_type, MonoDomain *domain, guint32 *code_len) MONO_INTERNAL;
 void        mono_arch_emit_imt_argument         (MonoCompile *cfg, MonoCallInst *call) MONO_INTERNAL;
 MonoMethod* mono_arch_find_imt_method           (gpointer *regs, guint8 *code) MONO_INTERNAL;
-MonoObject* mono_arch_find_this_argument        (gpointer *regs, MonoMethod *method) MONO_INTERNAL;
+MonoRuntimeGenericContext* mono_arch_find_static_call_rgctx (gpointer *regs, guint8 *code) MONO_INTERNAL;
+MonoObject* mono_arch_find_this_argument        (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) MONO_INTERNAL;
 gpointer    mono_arch_build_imt_thunk           (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckItem **imt_entries, int count) MONO_INTERNAL;
 void    mono_arch_notify_pending_exc (void) MONO_INTERNAL;
 
@@ -1338,22 +1350,22 @@ int mini_wapi_seminfo (int argc, char **argv);
 MonoGenericContext* mini_method_get_context (MonoMethod *method) MONO_INTERNAL;
 
 int mono_method_check_context_used (MonoMethod *method) MONO_INTERNAL;
-int mono_class_check_context_used (MonoClass *class) MONO_INTERNAL;
 
 gboolean mono_generic_context_equal_deep (MonoGenericContext *context1, MonoGenericContext *context2) MONO_INTERNAL;
 
-gboolean mono_generic_context_is_sharable (MonoGenericContext *context) MONO_INTERNAL;
+gboolean mono_generic_context_is_sharable (MonoGenericContext *context, gboolean allow_type_vars) MONO_INTERNAL;
 
 gboolean mono_method_is_generic_impl (MonoMethod *method) MONO_INTERNAL;
 gboolean mono_method_is_generic_sharable_impl (MonoMethod *method) MONO_INTERNAL;
 
 MonoMethod* mono_method_get_declaring_generic_method (MonoMethod *method) MONO_INTERNAL;
 
-int mono_class_generic_class_relation (MonoClass *klass, MonoClass *method_klass,
+int mono_class_generic_class_relation (MonoClass *klass, int info_type, MonoClass *method_klass,
                                       MonoGenericContext *generic_context, int *arg_num) MONO_INTERNAL;
 
 gpointer mono_helper_get_rgctx_other_ptr (MonoClass *caller_class, MonoRuntimeGenericContext *rgctx,
-                                         guint32 token, guint32 rgctx_type) MONO_INTERNAL;
+                                         guint32 token, guint32 token_source, guint32 rgctx_type,
+                                         gint32 rgctx_index) MONO_INTERNAL;
 
 void mono_generic_sharing_init (void) MONO_INTERNAL;
 
@@ -1364,4 +1376,7 @@ MonoType* mini_get_basic_type_from_generic (MonoGenericSharingContext *gsctx, Mo
 
 int mini_type_stack_size (MonoGenericSharingContext *gsctx, MonoType *t, int *align) MONO_INTERNAL;
 
+void mini_verifier_set_mode (MiniVerifierMode mode) MONO_INTERNAL;
+
+
 #endif /* __MONO_MINI_H__ */