#define MONO_FAKE_VTABLE_METHOD ((MonoMethod*)GINT_TO_POINTER(-2))
/* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION "36"
+#define MONO_AOT_FILE_VERSION "38"
/* Per-domain information maintained by the JIT */
typedef struct
guint stack_usage;
guint virtual : 1;
guint tail_call : 1;
+ /* If this is TRUE, 'fptr' points to a MonoJumpInfo instead of an address. */
+ guint fptr_is_patch : 1;
/*
* If this is true, then the call returns a vtype in a register using the same
* calling convention as OP_CALL.
*/
guint vret_in_reg : 1;
+ /* Whenever there is an IMT argument and it is dynamic */
+ guint dynamic_imt_arg : 1;
regmask_t used_iregs;
regmask_t used_fregs;
GSList *out_ireg_args;
int table_size;
} MonoJumpInfoBBTable;
+typedef struct MonoJumpInfoRgctxEntry MonoJumpInfoRgctxEntry;
+
typedef struct MonoJumpInfo MonoJumpInfo;
struct MonoJumpInfo {
MonoJumpInfo *next;
const char *name;
MonoJumpInfoToken *token;
MonoJumpInfoBBTable *table;
+ MonoJumpInfoRgctxEntry *rgctx_entry;
} data;
};
+
+/* Contains information describing an rgctx entry */
+struct MonoJumpInfoRgctxEntry {
+ MonoMethod *method;
+ gboolean in_mrgctx;
+ MonoJumpInfo *data; /* describes the data to be loaded */
+ int info_type;
+};
typedef enum {
MONO_TRAMPOLINE_JIT,
guint disable_initlocals_opt : 1;
guint disable_omit_fp : 1;
guint has_got_slots : 1;
+ guint uses_rgctx_reg : 1;
+ guint uses_vtable_reg : 1;
gpointer debug_info;
guint32 lmf_offset;
guint16 *intvars;
* sharing.
*/
MonoMethod *orig_method;
+
+ /* Patches which describe absolute addresses embedded into the native code */
+ GHashTable *abs_patches;
} MonoCompile;
typedef enum {
gpointer mono_aot_create_specific_trampoline (MonoImage *image, gpointer arg1, MonoTrampolineType tramp_type, MonoDomain *domain, guint32 *code_len) MONO_INTERNAL;
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;
/* This is an exported function */
void mono_aot_register_globals (gpointer *globals);
/* This too */
MonoMethod *method,
gboolean add_sync_wrapper) MONO_INTERNAL;
gpointer mono_create_class_init_trampoline (MonoVTable *vtable) MONO_INTERNAL;
+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, gboolean add_sync_wrapper) MONO_INTERNAL;
+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;
MonoVTable* mono_find_class_init_trampoline_by_addr (gconstpointer addr) 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;
-guint32 mono_arch_get_rgctx_lazy_fetch_offset (gpointer *regs) 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;
GList *mono_arch_get_allocatable_int_vars (MonoCompile *cfg) MONO_INTERNAL;
GList *mono_arch_get_global_int_regs (MonoCompile *cfg) MONO_INTERNAL;
MonoObject* mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) 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;
+void mono_arch_emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoInst *imt_arg) MONO_INTERNAL;
MonoMethod* mono_arch_find_imt_method (gpointer *regs, guint8 *code) MONO_INTERNAL;
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) MONO_INTERNAL;
MonoGenericContext* mini_class_get_context (MonoClass *class) MONO_INTERNAL;
MonoType* mini_get_basic_type_from_generic (MonoGenericSharingContext *gsctx, MonoType *type) MONO_INTERNAL;
+MonoType* mini_type_get_underlying_type (MonoGenericSharingContext *gsctx, MonoType *type) MONO_INTERNAL;
int mini_type_stack_size (MonoGenericSharingContext *gsctx, MonoType *t, int *align) MONO_INTERNAL;
+int mini_type_stack_size_full (MonoGenericSharingContext *gsctx, MonoType *t, guint32 *align, gboolean pinvoke) MONO_INTERNAL;
/* wapihandles.c */
int mini_wapi_hps (int argc, char **argv) MONO_INTERNAL;