#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
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,
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;
/*
guint skip_visibility : 1;
gpointer debug_info;
guint32 lmf_offset;
- guint16 *intvars;
MonoProfileCoverageInfo *coverage_info;
GHashTable *token_info_hash;
MonoCompileArch arch;
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 */
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;
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;
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;
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;
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__ */