X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini.h;h=60db6a8abc3f913ba513f9a9c0aa545e4bb17ecd;hb=38edc367c44ccb09b27e670d5e9e0d1be34c8fe8;hp=79dd2508644f8caa19081750c793a9cdfdf3112c;hpb=5fd0ee87b8bdeefd1f49e7ef013311f41518a822;p=mono.git diff --git a/mono/mini/mini.h b/mono/mini/mini.h index 79dd2508644..60db6a8abc3 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -1,3 +1,8 @@ +/* + * Copyright 2002-2003 Ximian Inc + * Copyright 2003-2011 Novell Inc + * Copyright 2011 Xamarin Inc + */ #ifndef __MONO_MINI_H__ #define __MONO_MINI_H__ @@ -23,6 +28,7 @@ #include #include #include +#include #define MONO_BREAKPOINT_ARRAY_SIZE 64 @@ -112,7 +118,7 @@ #endif /* Version number of the AOT file format */ -#define MONO_AOT_FILE_VERSION 75 +#define MONO_AOT_FILE_VERSION 79 //TODO: This is x86/amd64 specific. #define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6)) @@ -120,17 +126,33 @@ /* Constants used to encode different types of methods in AOT */ enum { MONO_AOT_METHODREF_MIN = 240, - /* Method encoded using its name */ - MONO_AOT_METHODREF_WRAPPER_NAME = 250, /* Runtime provided methods on arrays */ - MONO_AOT_METHODREF_ARRAY = 251, - MONO_AOT_METHODREF_NO_AOT_TRAMPOLINE = 252, + MONO_AOT_METHODREF_ARRAY = 250, + MONO_AOT_METHODREF_NO_AOT_TRAMPOLINE = 251, /* Wrappers */ - MONO_AOT_METHODREF_WRAPPER = 253, + MONO_AOT_METHODREF_WRAPPER = 252, /* Methods on generic instances */ - MONO_AOT_METHODREF_GINST = 254, + MONO_AOT_METHODREF_GINST = 253, /* Methods resolve using a METHODSPEC token */ - MONO_AOT_METHODREF_METHODSPEC = 255, + MONO_AOT_METHODREF_METHODSPEC = 254, +}; + +/* Constants used to encode different types of types in AOT */ +enum { + /* typedef index */ + MONO_AOT_TYPEREF_TYPEDEF_INDEX = 1, + /* typedef index + image index */ + MONO_AOT_TYPEREF_TYPEDEF_INDEX_IMAGE = 2, + /* typespec token */ + MONO_AOT_TYPEREF_TYPESPEC_TOKEN = 3, + /* generic inst */ + MONO_AOT_TYPEREF_GINST = 4, + /* type/method variable */ + MONO_AOT_TYPEREF_VAR = 5, + /* array */ + MONO_AOT_TYPEREF_ARRAY = 6, + /* blob index of the type encoding */ + MONO_AOT_TYPEREF_BLOB_INDEX = 7 }; /* Trampolines which we have a lot of */ @@ -200,6 +222,10 @@ typedef struct MonoAotFileInfo gpointer globals; /* Points to a string containing the assembly name*/ gpointer assembly_name; + /* Points to a table mapping methods to their unbox trampolines */ + gpointer unbox_trampolines; + /* Points to the end of the previous table */ + gpointer unbox_trampolines_end; /* The index of the first GOT slot used by the PLT */ guint32 plt_got_offset_base; @@ -440,7 +466,7 @@ typedef struct MonoLMF MonoLMF; typedef struct MonoSpillInfo MonoSpillInfo; typedef struct MonoTraceSpec MonoTraceSpec; -extern guint32 mono_jit_tls_id; +extern MonoNativeTlsKey mono_jit_tls_id; extern MonoTraceSpec *mono_jit_trace_calls; extern gboolean mono_break_on_exc; extern int mono_exc_esp_offset; @@ -735,6 +761,7 @@ struct MonoInst { MonoInst *spill_var; /* for OP_ICONV_TO_R8_RAW and OP_FCONV_TO_R8_X */ guint16 source_opcode; /*OP_XCONV_R8_TO_I4 needs to know which op was used to do proper widening*/ int pc_offset; /* OP_GC_LIVERANGE_START/END */ + int memory_barrier_kind; /* see mono-memory-model.h for valid values */ } backend; MonoClass *klass; @@ -771,6 +798,9 @@ struct MonoCallInst { LLVMCallInfo *cinfo; int rgctx_arg_reg, imt_arg_reg; #endif +#if defined(TARGET_ARM) + GSList *r4_args; +#endif }; struct MonoCallArgParm { @@ -982,6 +1012,48 @@ typedef struct { MonoContext ctx; /* if debugger_invoke is TRUE */ } MonoLMFExt; +/* Generic sharing */ +typedef enum { + MONO_RGCTX_INFO_STATIC_DATA, + MONO_RGCTX_INFO_KLASS, + MONO_RGCTX_INFO_VTABLE, + MONO_RGCTX_INFO_TYPE, + MONO_RGCTX_INFO_REFLECTION_TYPE, + MONO_RGCTX_INFO_METHOD, + MONO_RGCTX_INFO_GENERIC_METHOD_CODE, + MONO_RGCTX_INFO_CLASS_FIELD, + MONO_RGCTX_INFO_METHOD_RGCTX, + MONO_RGCTX_INFO_METHOD_CONTEXT, + MONO_RGCTX_INFO_REMOTING_INVOKE_WITH_CHECK, + MONO_RGCTX_INFO_METHOD_DELEGATE_CODE, + MONO_RGCTX_INFO_CAST_CACHE +} MonoRgctxInfoType; + +typedef struct _MonoRuntimeGenericContextOtherInfoTemplate { + MonoRgctxInfoType info_type; + gpointer data; + struct _MonoRuntimeGenericContextOtherInfoTemplate *next; +} MonoRuntimeGenericContextOtherInfoTemplate; + +typedef struct { + MonoClass *next_subclass; + MonoRuntimeGenericContextOtherInfoTemplate *other_infos; + GSList *method_templates; +} MonoRuntimeGenericContextTemplate; + +typedef struct { + MonoVTable *class_vtable; /* must be the first element */ + MonoGenericInst *method_inst; + gpointer infos [MONO_ZERO_LEN_ARRAY]; +} MonoMethodRuntimeGenericContext; + +#define MONO_SIZEOF_METHOD_RUNTIME_GENERIC_CONTEXT (sizeof (MonoMethodRuntimeGenericContext) - MONO_ZERO_LEN_ARRAY * SIZEOF_VOID_P) + +#define MONO_RGCTX_SLOT_MAKE_RGCTX(i) (i) +#define MONO_RGCTX_SLOT_MAKE_MRGCTX(i) ((i) | 0x80000000) +#define MONO_RGCTX_SLOT_INDEX(s) ((s) & 0x7fffffff) +#define MONO_RGCTX_SLOT_IS_MRGCTX(s) (((s) & 0x80000000) ? TRUE : FALSE) + typedef enum { #define PATCH_INFO(a,b) MONO_PATCH_INFO_ ## a, #include "patch-info.h" @@ -1051,7 +1123,7 @@ struct MonoJumpInfoRgctxEntry { MonoMethod *method; gboolean in_mrgctx; MonoJumpInfo *data; /* describes the data to be loaded */ - int info_type; + MonoRgctxInfoType info_type; }; typedef enum { @@ -1099,6 +1171,7 @@ enum { #define MONO_BBLOCK_IS_IN_REGION(bblock, regtype) (((bblock)->region & (0xf << 4)) == (regtype)) #define MONO_REGION_FLAGS(region) ((region) & 0x7) +#define MONO_REGION_CLAUSE_INDEX(region) (((region) >> 8) - 1) #define get_vreg_to_inst(cfg, vreg) ((vreg) < (cfg)->vreg_to_inst_len ? (cfg)->vreg_to_inst [(vreg)] : NULL) @@ -1735,7 +1808,7 @@ MonoLMF * mono_get_lmf (void) MONO_INTERNAL; MonoLMF** mono_get_lmf_addr (void) MONO_INTERNAL; void mono_set_lmf (MonoLMF *lmf) MONO_INTERNAL; void mono_jit_thread_attach (MonoDomain *domain); -guint32 mono_get_jit_tls_key (void) MONO_INTERNAL; +MonoNativeTlsKey mono_get_jit_tls_key (void) MONO_INTERNAL; gint32 mono_get_jit_tls_offset (void) MONO_INTERNAL; gint32 mono_get_lmf_tls_offset (void) MONO_INTERNAL; gint32 mono_get_lmf_addr_tls_offset (void) MONO_INTERNAL; @@ -1835,6 +1908,7 @@ void mono_aot_set_make_unreadable (gboolean unreadable) MONO_INTERNAL; gboolean mono_aot_is_pagefault (void *ptr) MONO_INTERNAL; void mono_aot_handle_pagefault (void *ptr) MONO_INTERNAL; void mono_aot_register_jit_icall (const char *name, gpointer addr) MONO_INTERNAL; +void* mono_aot_readonly_field_override (MonoClassField *field) MONO_INTERNAL; /* This is an exported function */ void mono_aot_register_globals (gpointer *globals); @@ -2014,8 +2088,6 @@ void mono_arch_start_single_stepping (void) MONO_INTERNAL; void mono_arch_stop_single_stepping (void) MONO_INTERNAL; gboolean mono_arch_is_single_step_event (void *info, void *sigctx) MONO_INTERNAL; gboolean mono_arch_is_breakpoint_event (void *info, void *sigctx) MONO_INTERNAL; -guint8* mono_arch_get_ip_for_single_step (MonoJitInfo *ji, MonoContext *ctx) MONO_INTERNAL; -guint8* mono_arch_get_ip_for_breakpoint (MonoJitInfo *ji, MonoContext *ctx) MONO_INTERNAL; void mono_arch_skip_breakpoint (MonoContext *ctx) MONO_INTERNAL; void mono_arch_skip_single_step (MonoContext *ctx) MONO_INTERNAL; gpointer mono_arch_get_seq_point_info (MonoDomain *domain, guint8 *code) MONO_INTERNAL; @@ -2035,7 +2107,7 @@ gpointer mono_arch_get_throw_exception (MonoTrampInfo **info, gboolean gpointer mono_arch_get_rethrow_exception (MonoTrampInfo **info, gboolean aot) MONO_INTERNAL; gpointer mono_arch_get_throw_corlib_exception (MonoTrampInfo **info, gboolean aot) MONO_INTERNAL; gpointer mono_arch_get_throw_pending_exception (MonoTrampInfo **info, gboolean aot) MONO_INTERNAL; -gboolean mono_arch_handle_exception (void *sigctx, gpointer obj, gboolean test_only) MONO_INTERNAL; +gboolean mono_arch_handle_exception (void *sigctx, gpointer obj) MONO_INTERNAL; void mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean stack_ovf) MONO_INTERNAL; gboolean mono_handle_soft_stack_ovf (MonoJitTlsData *jit_tls, MonoJitInfo *ji, void *ctx, guint8* fault_addr) MONO_INTERNAL; void mono_handle_hard_stack_ovf (MonoJitTlsData *jit_tls, MonoJitInfo *ji, void *ctx, guint8* fault_addr) MONO_INTERNAL; @@ -2095,8 +2167,7 @@ mono_thread_state_init_from_handle (MonoThreadUnwindState *tctx, MonoNativeThrea typedef gboolean (*MonoJitStackWalk) (StackFrameInfo *frame, MonoContext *ctx, gpointer data); void mono_exceptions_init (void) MONO_INTERNAL; -gboolean mono_handle_exception (MonoContext *ctx, gpointer obj, - gpointer original_ip, gboolean test_only) MONO_INTERNAL; +gboolean mono_handle_exception (MonoContext *ctx, gpointer obj) MONO_INTERNAL; void mono_handle_native_sigsegv (int signal, void *sigctx) MONO_INTERNAL; void mono_print_thread_dump (void *sigctx); void mono_print_thread_dump_from_ctx (MonoContext *ctx); @@ -2231,7 +2302,7 @@ mono_class_rgctx_get_array_size (int n, gboolean mrgctx) MONO_INTERNAL; guint32 mono_method_lookup_or_register_other_info (MonoMethod *method, gboolean in_mrgctx, gpointer data, - int info_type, MonoGenericContext *generic_context) MONO_INTERNAL; + MonoRgctxInfoType info_type, MonoGenericContext *generic_context) MONO_INTERNAL; MonoGenericContext mono_method_construct_object_context (MonoMethod *method) MONO_INTERNAL; @@ -2377,7 +2448,7 @@ void mono_runtime_setup_stat_profiler (void) MONO_INTERNAL; void mono_runtime_shutdown_stat_profiler (void) MONO_INTERNAL; void mono_runtime_posix_install_handlers (void) MONO_INTERNAL; pid_t mono_runtime_syscall_fork (void) MONO_INTERNAL; -gboolean mono_gdb_render_native_backtraces (void) MONO_INTERNAL; +gboolean mono_gdb_render_native_backtraces (pid_t crashed_pid) MONO_INTERNAL; /* * Signal handling @@ -2425,15 +2496,28 @@ void SIG_HANDLER_SIGNATURE (mono_sigsegv_signal_handler) MONO_INTERNAL; void SIG_HANDLER_SIGNATURE (mono_sigint_signal_handler) MONO_INTERNAL; gboolean SIG_HANDLER_SIGNATURE (mono_chain_signal) MONO_INTERNAL; -/* for MONO_WRAPPER_UNKNOWN/MANAGED_TO_MANAGED subtypes */ +/* Subtypes of some wrapper types */ enum { - MONO_AOT_WRAPPER_MONO_ENTER, - MONO_AOT_WRAPPER_MONO_EXIT, + MONO_AOT_WRAPPER_MONITOR_ENTER, + MONO_AOT_WRAPPER_MONITOR_EXIT, MONO_AOT_WRAPPER_ELEMENT_ADDR, MONO_AOT_WRAPPER_PTR_TO_STRUCTURE, MONO_AOT_WRAPPER_STRUCTURE_TO_PTR, MONO_AOT_WRAPPER_CASTCLASS_WITH_CACHE, MONO_AOT_WRAPPER_ISINST_WITH_CACHE, + MONO_AOT_WRAPPER_MONITOR_ENTER_V4, + MONO_AOT_WRAPPER_JIT_ICALL, + MONO_AOT_WRAPPER_RUNTIME_INVOKE_DYNAMIC, + MONO_AOT_WRAPPER_RUNTIME_INVOKE_DIRECT, + MONO_AOT_WRAPPER_RUNTIME_INVOKE_VIRTUAL, + /* + * We can't encode this wrapper directly, so we emit its name instead. + * This means that its not possible to decode this into a method, only to check + * that the method reference matches a given method. This is normally not a problem + * as these wrappers only occur in the extra_methods table, where we already have + * a method we want to lookup. + */ + MONO_AOT_WRAPPER_BY_NAME, MONO_AOT_WRAPPER_LAST };