#define inst_ms_word data.op[0].const_val
#endif
-#if SIZEOF_VOID_P == 8
-#define OP_PCONST OP_I8CONST
-#else
-#define OP_PCONST OP_ICONST
-#endif
-
/* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION "21"
+#define MONO_AOT_FILE_VERSION "25"
#if 1
#define mono_bitset_test_fast(set,n) (((guint32*)set)[2+(n)/32] & (1 << ((n) % 32)))
(dest)->inst.opcode = (op); \
} while (0)
+#define MONO_INST_NEW_CALL_ARG(cfg,dest,op) do { \
+ (dest) = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoCallArgParm)); \
+ (dest)->ins.opcode = (op); \
+ } while (0)
+
#define MONO_ADD_INS(b,inst) do { \
if ((b)->last_ins) { \
(b)->last_ins->next = (inst); \
typedef struct MonoInst MonoInst;
typedef struct MonoCallInst MonoCallInst;
+typedef struct MonoCallArgParm MonoCallArgParm;
typedef struct MonoEdge MonoEdge;
typedef struct MonoMethodVar MonoMethodVar;
typedef struct MonoBasicBlock MonoBasicBlock;
};
/* BBlock flags */
-#define BB_VISITED 1
-#define BB_REACHABLE 2
+enum {
+ BB_VISITED = 1 << 0,
+ BB_REACHABLE = 1 << 1,
+ BB_EXCEPTION_DEAD_OBJ = 1 << 2,
+ BB_EXCEPTION_UNSAFE = 1 << 3,
+ BB_EXCEPTION_HANDLER = 1 << 4
+};
struct MonoInst {
union {
#endif
};
+struct MonoCallArgParm {
+ MonoInst ins;
+ gint32 size;
+ gint32 offset;
+ gint32 offPrm;
+};
+
/*
* flags for MonoInst
* Note: some of the values overlap, because they can't appear
MONO_TRAMPOLINE_JUMP,
MONO_TRAMPOLINE_CLASS_INIT,
MONO_TRAMPOLINE_AOT,
+ MONO_TRAMPOLINE_DELEGATE,
MONO_TRAMPOLINE_NUM
} MonoTrampolineType;
MONO_OPT_AOT = 1 << 16,
MONO_OPT_PRECOMP = 1 << 17,
MONO_OPT_ABCREM = 1 << 18,
- MONO_OPT_SSAPRE = 1 << 19
+ MONO_OPT_SSAPRE = 1 << 19,
+ MONO_OPT_EXCEPTION= 1 << 20,
+ MONO_OPT_SSA = 1 << 21
};
/* Bit-fields in the MonoBasicBlock.region */
MonoMethod *inlined_method; /* the method which is currently inlined */
MonoInst *domainvar; /* a cache for the current domain */
MonoInst *got_var; /* Global Offset Table variable */
+
+ struct MonoAliasingInformation *aliasing_info;
/* A hashtable of region ID-> SP var mappings */
/* An SP var is a place to store the stack pointer (used by handlers)*/
MONO_CFG_HAS_CALLS = 1 << 1,
MONO_CFG_HAS_LDELEMA = 1 << 2,
MONO_CFG_HAS_VARARGS = 1 << 3,
- MONO_CFG_HAS_TAIL = 1 << 4
+ MONO_CFG_HAS_TAIL = 1 << 4,
+ MONO_CFG_HAS_FPOUT = 1 << 5, /* there are fp values passed in int registers */
+ MONO_CFG_HAS_SPILLUP = 1 << 6 /* spill var slots are allocated from bottom to top */
} MonoCompileFlags;
typedef struct {
/* values for MonoInst.ssa_op */
enum {
- MONO_SSA_NOP,
- MONO_SSA_LOAD,
- MONO_SSA_STORE,
- MONO_SSA_MAYBE_LOAD,
- MONO_SSA_MAYBE_STORE
+ MONO_SSA_NOP = 0,
+ MONO_SSA_ADDRESS_TAKEN = 1,
+ MONO_SSA_LOAD = 2,
+ MONO_SSA_STORE = 4,
+ MONO_SSA_LOAD_STORE = MONO_SSA_LOAD|MONO_SSA_STORE,
+ MONO_SSA_INDIRECT_LOAD = MONO_SSA_LOAD|MONO_SSA_ADDRESS_TAKEN,
+ MONO_SSA_INDIRECT_STORE = MONO_SSA_STORE|MONO_SSA_ADDRESS_TAKEN,
+ MONO_SSA_INDIRECT_LOAD_STORE =
+ MONO_SSA_LOAD|MONO_SSA_STORE|MONO_SSA_ADDRESS_TAKEN
};
#define OP_CEQ (256+CEE_CEQ)
#undef MINI_OP
#if SIZEOF_VOID_P == 8
+#define OP_PCONST OP_I8CONST
#define OP_PADD OP_LADD
#define OP_PNEG OP_LNEG
#define OP_PCONV_TO_U2 OP_LCONV_TO_U2
#define OP_STOREP_MEMBASE_REG OP_STOREI8_MEMBASE_REG
#define OP_STOREP_MEMBASE_IMM OP_STOREI8_MEMBASE_IMM
#else
+#define OP_PCONST OP_ICONST
#define OP_PADD CEE_ADD
#define OP_PNEG CEE_NEG
#define OP_PCONV_TO_U2 CEE_CONV_U2
typedef struct {
gboolean handle_sigint;
gboolean keep_delegates;
- gboolean abort_on_sigsegv;
+ gboolean collect_pagefault_stats;
} MonoDebugOptions;
enum {
void mono_print_tree_nl (MonoInst *tree);
void mono_print_code (MonoCompile *cfg);
void mono_print_method_from_ip (void *ip);
+char *mono_pmip (void *ip);
void mono_select_instructions (MonoCompile *cfg);
const char* mono_inst_name (int op);
void mono_inst_foreach (MonoInst *tree, MonoInstFunc func, gpointer data);
-void mono_disassemble_code (guint8 *code, int size, char *id);
+void mono_disassemble_code (MonoCompile *cfg, guint8 *code, int size, char *id);
guint mono_type_to_ldind (MonoType *t);
guint mono_type_to_stind (MonoType *t);
void mono_add_patch_info (MonoCompile *cfg, int ip, MonoJumpInfoType type, gconstpointer target);
int mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options);
MonoCompile *mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gboolean run_cctors, gboolean compile_aot, int parts);
void mono_destroy_compile (MonoCompile *cfg);
+
void mono_aot_init (void);
MonoJitInfo* mono_aot_get_method (MonoDomain *domain,
MonoMethod *method);
gboolean mono_aot_init_vtable (MonoVTable *vtable);
gboolean mono_aot_get_cached_class_info (MonoClass *klass, MonoCachedClassInfo *res);
MonoJitInfo* mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr);
+void mono_aot_set_make_unreadable (gboolean unreadable);
+gboolean mono_aot_is_pagefault (void *ptr);
+void mono_aot_handle_pagefault (void *ptr);
+guint32 mono_aot_get_n_pagefaults (void);
gboolean mono_method_blittable (MonoMethod *method);
gboolean mono_method_same_domain (MonoJitInfo *caller, MonoJitInfo *callee);
-void mono_register_opcode_emulation (int opcode, const char* name, MonoMethodSignature *sig, gpointer func, gboolean no_throw);
+
+void mono_register_opcode_emulation (int opcode, const char* name, const char *sigstr, gpointer func, gboolean no_throw);
void mono_draw_graph (MonoCompile *cfg, MonoGraphOptions draw_options);
void mono_add_varcopy_to_end (MonoCompile *cfg, MonoBasicBlock *bb, int src, int dest);
void mono_add_ins_to_end (MonoBasicBlock *bb, MonoInst *inst);
+gpointer mono_create_ftnptr (MonoDomain *domain, gpointer addr);
int mono_find_method_opcode (MonoMethod *method);
MonoJitICallInfo *mono_find_jit_icall_by_name (const char *name);
gpointer mono_create_jit_trampoline (MonoMethod *method);
gpointer mono_create_jit_trampoline_from_token (MonoImage *image, guint32 token);
MonoVTable* mono_find_class_init_trampoline_by_addr (gconstpointer addr);
+gpointer mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp);
+gpointer mono_delegate_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp);
+gpointer mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info,
+ guint8* tramp);
+void mono_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp);
gboolean mono_running_on_valgrind (void);
void* mono_global_codeman_reserve (int size);
const char *mono_regname_full (int reg, gboolean fp);
+gint32* mono_allocate_stack_slots_full (MonoCompile *cfg, gboolean backward, guint32 *stack_size, guint32 *stack_align);
gint32* mono_allocate_stack_slots (MonoCompile *cfg, guint32 *stack_size, guint32 *stack_align);
void mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb);
+MonoInst *mono_branch_optimize_exception_target (MonoCompile *cfg, MonoBasicBlock *bb, const char * exname);
/* methods that must be provided by the arch-specific port */
void mono_arch_cpu_init (void);
gpointer mono_arch_get_throw_corlib_exception (void);
guchar* mono_arch_create_trampoline_code (MonoTrampolineType tramp_type);
gpointer mono_arch_create_jit_trampoline (MonoMethod *method);
-gpointer mono_arch_create_jit_trampoline_from_token (MonoImage *image, guint32 token);
MonoJitInfo *mono_arch_create_jump_trampoline (MonoMethod *method);
gpointer mono_arch_create_class_init_trampoline(MonoVTable *vtable);
+gpointer mono_create_delegate_trampoline (MonoMethod *method, gpointer addr);
GList *mono_arch_get_allocatable_int_vars (MonoCompile *cfg);
GList *mono_arch_get_global_int_regs (MonoCompile *cfg);
guint32 mono_arch_regalloc_cost (MonoCompile *cfg, MonoMethodVar *vmv);
void mono_arch_create_vars (MonoCompile *cfg);
void mono_arch_save_unwind_info (MonoCompile *cfg);
void mono_arch_register_lowlevel_calls (void);
+gpointer mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr);
+void mono_arch_patch_callsite (guint8 *code, guint8 *addr);
+void mono_arch_nullify_class_init_trampoline(guint8 *code, gssize *regs);
+void mono_arch_patch_delegate_trampoline (guint8 *code, guint8 *tramp, gssize *regs, guint8 *addr);
+gpointer mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_type, MonoDomain *domain, guint32 *code_len);
/* Exception handling */
gboolean mono_handle_exception (MonoContext *ctx, gpointer obj,
gpointer original_ip, gboolean test_only);
-void mono_jit_walk_stack (MonoStackWalk func, gboolean do_il_offset, gpointer user_data);
+void mono_handle_native_sigsegv (void *sigctx);
+void mono_jit_walk_stack (MonoStackWalk func, gboolean do_il_offset, gpointer user_data);
+void mono_setup_altstack (MonoJitTlsData *tls);
+void mono_free_altstack (MonoJitTlsData *tls);
/* the new function to do stack walks */
typedef gboolean (*MonoStackFrameWalk) (MonoDomain *domain, MonoContext *ctx, MonoJitInfo *ji, gpointer data);
MonoMethod *method, guint8 *code_start,
guint8 *debug_info, guint32 debug_info_len);
void mono_debug_add_icall_wrapper (MonoMethod *method, MonoJitICallInfo* info);
-
+void mono_debugger_run_finally (MonoContext *start_ctx);
/* Tracing */
MonoTraceSpec *mono_trace_parse_options (char *options);