+/*
+ * Copyright 2002-2003 Ximian Inc
+ * Copyright 2003-2011 Novell Inc
+ * Copyright 2011 Xamarin Inc
+ */
#ifndef __MONO_MINI_H__
#define __MONO_MINI_H__
#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))
/* 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 */
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;
LLVMCallInfo *cinfo;
int rgctx_arg_reg, imt_arg_reg;
#endif
+#if defined(TARGET_ARM)
+ GSList *r4_args;
+#endif
};
struct MonoCallArgParm {
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"
MonoMethod *method;
gboolean in_mrgctx;
MonoJumpInfo *data; /* describes the data to be loaded */
- int info_type;
+ MonoRgctxInfoType info_type;
};
typedef enum {
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;
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;
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);
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;
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
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_MONITOR_ENTER,
MONO_AOT_WRAPPER_MONITOR_EXIT,
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
};