* Copyright 2002-2003 Ximian Inc
* Copyright 2003-2011 Novell Inc
* Copyright 2011 Xamarin Inc
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
*/
#ifndef __MONO_MINI_H__
#define __MONO_MINI_H__
#include "regalloc.h"
#include "mini-unwind.h"
#include "jit.h"
+#include "cfgdump.h"
#include "mono/metadata/class-internals.h"
#include "mono/metadata/domain-internals.h"
#endif
/* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION 132
+#define MONO_AOT_FILE_VERSION 133
//TODO: This is x86/amd64 specific.
#define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6))
gpointer *memcpy_addr [17];
gpointer *bzero_addr [17];
gpointer llvm_module;
+ /* Maps MonoMethod -> GSlist of addresses */
+ GHashTable *llvm_jit_callees;
} MonoJitDomainInfo;
typedef struct {
LLVMArgFpStruct,
LLVMArgVtypeByRef,
/* Vtype returned as an int */
- LLVMArgVtypeAsScalar,
- /* Scalar returned by ref using an additional argument */
- LLVMArgScalarRetAddr,
- /* Scalar passed by ref */
- LLVMArgScalarByRef
+ LLVMArgVtypeAsScalar
} LLVMArgStorage;
typedef struct {
/* Points to a MonoGSharedVtMethodRuntimeInfo at runtime */
MonoInst *gsharedvt_info_var;
- /* For native-to-managed wrappers, the saved old domain */
- MonoInst *orig_domain_var;
+ /* For native-to-managed wrappers, CEE_MONO_JIT_(AT|DE)TACH opcodes */
+ MonoInst *attach_cookie;
+ MonoInst *attach_dummy;
MonoInst *lmf_var;
MonoInst *lmf_addr_var;
/* Error handling */
MonoError error;
+ /* pointer to context datastructure used for graph dumping */
+ MonoGraphDumper *gdump_ctx;
+
/* Stats */
int stat_allocate_var;
int stat_locals_stack_size;
* Translate Debugger.Break () into a native breakpoint signal
*/
gboolean native_debugger_break;
+ /*
+ * Disabling the frame pointer emit optimization can allow debuggers to more easily
+ * identify the stack on some platforms
+ */
+ gboolean disable_omit_fp;
} MonoDebugOptions;
enum {
MONO_API MonoDebugOptions *mini_get_debug_options (void);
MONO_API gboolean mini_parse_debug_option (const char *option);
+/* graph dumping */
+void mono_cfg_dump_create_context (MonoCompile *cfg);
+void mono_cfg_dump_begin_group (MonoCompile *cfg);
+void mono_cfg_dump_close_group (MonoCompile *cfg);
+void mono_cfg_dump_ir (MonoCompile *cfg, const char *phase_name);
+
/* helper methods */
void mini_jit_init (void);
void mini_jit_cleanup (void);
const char*mono_ji_type_to_string (MonoJumpInfoType type);
void mono_print_ji (const MonoJumpInfo *ji);
void mono_print_ins_index (int i, MonoInst *ins);
+GString *mono_print_ins_index_strbuf (int i, MonoInst *ins);
void mono_print_ins (MonoInst *ins);
void mono_print_bb (MonoBasicBlock *bb, const char *msg);
void mono_print_code (MonoCompile *cfg, const char *msg);
guint mono_patch_info_hash (gconstpointer data);
gint mono_patch_info_equal (gconstpointer ka, gconstpointer kb);
MonoJumpInfo *mono_patch_info_list_prepend (MonoJumpInfo *list, int ip, MonoJumpInfoType type, gconstpointer target);
-gpointer mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, MonoJumpInfo *patch_info, gboolean run_cctors) MONO_LLVM_INTERNAL;
-gpointer mono_resolve_patch_target_checked (MonoMethod *method, MonoDomain *domain, guint8 *code, MonoJumpInfo *patch_info, gboolean run_cctors, MonoError *error) MONO_LLVM_INTERNAL;
+gpointer mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, MonoJumpInfo *patch_info, gboolean run_cctors, MonoError *error) MONO_LLVM_INTERNAL;
gpointer mono_jit_find_compiled_method_with_jit_info (MonoDomain *domain, MonoMethod *method, MonoJitInfo **ji);
gpointer mono_jit_find_compiled_method (MonoDomain *domain, MonoMethod *method);
gpointer mono_jit_compile_method (MonoMethod *method, MonoError *error);
MonoLMF** mono_get_lmf_addr (void);
void mono_set_lmf (MonoLMF *lmf);
MonoJitTlsData* mono_get_jit_tls (void);
-MONO_API MonoDomain *mono_jit_thread_attach (MonoDomain *domain);
-MONO_API void mono_jit_set_domain (MonoDomain *domain);
+MONO_API gpointer mono_jit_thread_attach (MonoDomain *domain, gpointer *dummy);
+MONO_API void mono_jit_thread_detach (gpointer cookie, gpointer *dummy);
gint32 mono_get_jit_tls_offset (void);
gint32 mono_get_lmf_tls_offset (void);
gint32 mono_get_lmf_addr_tls_offset (void);
gpointer mono_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_type, MonoDomain *domain, guint32 *code_len);
gpointer mono_create_jump_trampoline (MonoDomain *domain,
MonoMethod *method,
- gboolean add_sync_wrapper);
+ gboolean add_sync_wrapper,
+ MonoError *error);
gpointer mono_create_class_init_trampoline (MonoVTable *vtable);
-gpointer mono_create_jit_trampoline (MonoMethod *method);
+gpointer mono_create_jit_trampoline (MonoDomain *domain, MonoMethod *method, MonoError *error) MONO_LLVM_INTERNAL;
gpointer mono_create_jit_trampoline_from_token (MonoImage *image, guint32 token);
-gpointer mono_create_jit_trampoline_in_domain (MonoDomain *domain, MonoMethod *method) MONO_LLVM_INTERNAL;
gpointer mono_create_delegate_trampoline (MonoDomain *domain, MonoClass *klass);
MonoDelegateTrampInfo* mono_create_delegate_trampoline_info (MonoDomain *domain, MonoClass *klass, MonoMethod *method);
gpointer mono_create_delegate_virtual_trampoline (MonoDomain *domain, MonoClass *klass, MonoMethod *method);
gboolean
mini_class_is_generic_sharable (MonoClass *klass);
+
+gboolean
+mini_generic_inst_is_sharable (MonoGenericInst *inst, gboolean allow_type_vars, gboolean allow_partial);
+
gboolean
mono_is_partially_sharable_inst (MonoGenericInst *inst);
* Signal handling
*/
+#ifdef DISABLE_HW_TRAPS
+ // Signal handlers not available
+#define MONO_ARCH_NEED_DIV_CHECK 1
+#endif
+
void MONO_SIG_HANDLER_SIGNATURE (mono_sigfpe_signal_handler) ;
void MONO_SIG_HANDLER_SIGNATURE (mono_sigill_signal_handler) ;
void MONO_SIG_HANDLER_SIGNATURE (mono_sigsegv_signal_handler);
#define ARCH_VARARG_ICALLS 0
#endif
+/*
+ * Native unwinder integration
+ */
+void mono_exception_native_unwind (void *ctx, MONO_SIG_HANDLER_INFO_TYPE *info);
+
+
#endif /* __MONO_MINI_H__ */