#include <mono/metadata/mono-config.h>
#include <mono/metadata/environment.h>
#include <mono/metadata/mono-debug.h>
-#include <mono/metadata/gc-internal.h>
+#include <mono/metadata/gc-internals.h>
#include <mono/metadata/threads-types.h>
#include <mono/metadata/verify.h>
#include <mono/metadata/verify-internals.h>
#include <mono/utils/mono-compiler.h>
#include <mono/utils/mono-counters.h>
#include <mono/utils/mono-error-internals.h>
-#include <mono/utils/mono-logger-internal.h>
+#include <mono/utils/mono-logger-internals.h>
#include <mono/utils/mono-mmap.h>
#include <mono/utils/mono-path.h>
#include <mono/utils/mono-tls.h>
#include "mini-gc.h"
#include "debugger-agent.h"
+#include "llvm-runtime.h"
MonoTraceSpec *mono_jit_trace_calls;
MonoMethodDesc *mono_inject_async_exc_method;
#define mono_jit_unlock() mono_mutex_unlock (&jit_mutex)
static mono_mutex_t jit_mutex;
+MonoBackend *current_backend;
+
#ifndef DISABLE_JIT
gpointer
{
MonoInst* ins;
- if (!cfg->have_tls_get)
+ if (!cfg->backend->have_tls_get)
return NULL;
if (offset == -1)
gboolean
mini_tls_get_supported (MonoCompile *cfg, MonoTlsKey key)
{
- if (!cfg->have_tls_get)
+ if (!cfg->backend->have_tls_get)
return FALSE;
if (cfg->compile_aot)
- return cfg->have_tls_get_reg;
+ return cfg->backend->have_tls_get_reg;
else
return mini_get_tls_offset (key) != -1;
}
MonoInst*
mono_create_tls_get (MonoCompile *cfg, MonoTlsKey key)
{
- if (!cfg->have_tls_get)
+ if (!cfg->backend->have_tls_get)
return NULL;
/*
* use a different opcode.
*/
if (cfg->compile_aot) {
- if (cfg->have_tls_get_reg) {
+ if (cfg->backend->have_tls_get_reg) {
MonoInst *ins, *c;
EMIT_NEW_TLS_OFFSETCONST (cfg, c, key);
* Extend the try block backwards to include parts of the previous call
* instruction.
*/
- ei->try_start = (guint8*)ei->try_start - cfg->monitor_enter_adjustment;
+ ei->try_start = (guint8*)ei->try_start - cfg->backend->monitor_enter_adjustment;
}
tblock = cfg->cil_offset_to_bb [ec->try_offset + ec->try_len];
g_assert (tblock);
return FALSE;
}
-#if defined(__native_client_codegen__) || USE_COOP_GC
-
static void
mono_create_gc_safepoint (MonoCompile *cfg, MonoBasicBlock *bblock)
{
#if defined(__native_client_codegen__)
NEW_AOTCONST (cfg, poll_addr, MONO_PATCH_INFO_GC_SAFE_POINT_FLAG, (gpointer)&__nacl_thread_suspension_needed);
#else
+ g_assert (mono_threads_is_coop_enabled ());
NEW_AOTCONST (cfg, poll_addr, MONO_PATCH_INFO_GC_SAFE_POINT_FLAG, (gpointer)&mono_polling_required);
#endif
mono_insert_safepoints (MonoCompile *cfg)
{
MonoBasicBlock *bb;
+
+#if !defined(__native_client_codegen__)
+ if (!mono_threads_is_coop_enabled ())
+ return;
+#endif
+
if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) {
WrapperInfo *info = mono_marshal_get_wrapper_info (cfg->method);
#if defined(__native_client__) || defined(__native_client_codegen__)
gpointer poll_func = &mono_nacl_gc;
-#elif defined(USE_COOP_GC)
- gpointer poll_func = &mono_threads_state_poll;
#else
- gpointer poll_func = NULL;
+ g_assert (mono_threads_is_coop_enabled ());
+ gpointer poll_func = &mono_threads_state_poll;
#endif
if (info && info->subtype == WRAPPER_SUBTYPE_ICALL_WRAPPER && info->d.icall.func == poll_func) {
}
-#else
-
-static void
-mono_insert_safepoints (MonoCompile *cfg)
-{
-}
-
-#endif
-
static void
-init_compile (MonoCompile *cfg)
+init_backend (MonoBackend *backend)
{
#ifdef MONO_ARCH_NEED_GOT_VAR
- if (cfg->compile_aot)
- cfg->need_got_var = 1;
+ backend->need_got_var = 1;
#endif
#ifdef MONO_ARCH_HAVE_CARD_TABLE_WBARRIER
- cfg->have_card_table_wb = 1;
+ backend->have_card_table_wb = 1;
#endif
#ifdef MONO_ARCH_HAVE_OP_GENERIC_CLASS_INIT
- cfg->have_op_generic_class_init = 1;
+ backend->have_op_generic_class_init = 1;
#endif
#ifdef MONO_ARCH_EMULATE_MUL_DIV
- cfg->emulate_mul_div = 1;
+ backend->emulate_mul_div = 1;
#endif
#ifdef MONO_ARCH_EMULATE_DIV
- cfg->emulate_div = 1;
+ backend->emulate_div = 1;
#endif
#if !defined(MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS)
- cfg->emulate_long_shift_opts = 1;
+ backend->emulate_long_shift_opts = 1;
#endif
#ifdef MONO_ARCH_HAVE_OBJC_GET_SELECTOR
- cfg->have_objc_get_selector = 1;
+ backend->have_objc_get_selector = 1;
#endif
#ifdef MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK
- cfg->have_generalized_imt_thunk = 1;
+ backend->have_generalized_imt_thunk = 1;
#endif
#ifdef MONO_ARCH_GSHARED_SUPPORTED
- cfg->gshared_supported = 1;
+ backend->gshared_supported = 1;
#endif
if (MONO_ARCH_HAVE_TLS_GET)
- cfg->have_tls_get = 1;
+ backend->have_tls_get = 1;
#ifdef MONO_ARCH_HAVE_TLS_GET_REG
- cfg->have_tls_get_reg = 1;
+ backend->have_tls_get_reg = 1;
#endif
if (MONO_ARCH_USE_FPSTACK)
- cfg->use_fpstack = 1;
+ backend->use_fpstack = 1;
#ifdef MONO_ARCH_HAVE_LIVERANGE_OPS
- cfg->have_liverange_ops = 1;
+ backend->have_liverange_ops = 1;
#endif
#ifdef MONO_ARCH_HAVE_OP_TAIL_CALL
- cfg->have_op_tail_call = 1;
+ backend->have_op_tail_call = 1;
#endif
#ifndef MONO_ARCH_MONITOR_ENTER_ADJUSTMENT
- cfg->monitor_enter_adjustment = 1;
+ backend->monitor_enter_adjustment = 1;
#else
- cfg->monitor_enter_adjustment = MONO_ARCH_MONITOR_ENTER_ADJUSTMENT;
+ backend->monitor_enter_adjustment = MONO_ARCH_MONITOR_ENTER_ADJUSTMENT;
#endif
#if defined(__mono_ilp32__)
- cfg->ilp32 = 1;
+ backend->ilp32 = 1;
#endif
#ifdef MONO_ARCH_HAVE_DUMMY_INIT
- cfg->have_dummy_init = 1;
+ backend->have_dummy_init = 1;
+#endif
+#ifdef MONO_ARCH_NEED_DIV_CHECK
+ backend->need_div_check = 1;
+#endif
+#ifdef NO_UNALIGNED_ACCESS
+ backend->no_unaligned_access = 1;
#endif
#ifdef MONO_ARCH_DYN_CALL_PARAM_AREA
- cfg->dyn_call_param_area = MONO_ARCH_DYN_CALL_PARAM_AREA;
+ backend->dyn_call_param_area = MONO_ARCH_DYN_CALL_PARAM_AREA;
#endif
}
cfg->gen_seq_points = debug_options.gen_seq_points_compact_data || debug_options.gen_sdb_seq_points;
cfg->gen_sdb_seq_points = debug_options.gen_sdb_seq_points;
cfg->llvm_only = (flags & JIT_FLAG_LLVM_ONLY) != 0;
+ cfg->backend = current_backend;
#ifdef PLATFORM_ANDROID
if (cfg->method->wrapper_type != MONO_WRAPPER_NONE) {
}
#endif
/* coop / nacl requires loop detection to happen */
-#if defined(__native_client_codegen__) || defined(USE_COOP_GC)
+#if defined(__native_client_codegen__)
cfg->opt |= MONO_OPT_LOOP;
+#else
+ if (mono_threads_is_coop_enabled ())
+ cfg->opt |= MONO_OPT_LOOP;
#endif
cfg->explicit_null_checks = debug_options.explicit_null_checks || (flags & JIT_FLAG_EXPLICIT_NULL_CHECKS);
cfg->soft_breakpoints = debug_options.soft_breakpoints;
cfg->r4fp = (cfg->opt & MONO_OPT_FLOAT32) ? 1 : 0;
cfg->r4_stack_type = cfg->r4fp ? STACK_R4 : STACK_R8;
- init_compile (cfg);
-
if (cfg->gen_seq_points)
cfg->seq_points = g_ptr_array_new ();
mono_error_init (&cfg->error);
if (!COMPILE_LLVM (cfg))
mono_if_conversion (cfg);
- MONO_SUSPEND_CHECK ();
+ mono_threads_safepoint ();
/* Depth-first ordering on basic blocks */
cfg->bblocks = mono_mempool_alloc (cfg->mempool, sizeof (MonoBasicBlock*) * (cfg->num_bblocks + 1));
mini_jit_init (void)
{
mono_mutex_init_recursive (&jit_mutex);
+#ifndef DISABLE_JIT
+ current_backend = g_new0 (MonoBackend, 1);
+ init_backend (current_backend);
+#endif
}
void
g_assert_not_reached ();
}
+#endif
+
+#if !defined(ENABLE_LLVM_RUNTIME) && !defined(ENABLE_LLVM)
+
void
-mono_llvm_throw_corlib_exception (guint32 ex_token_index)
+mono_llvm_cpp_throw_exception (void)
{
g_assert_not_reached ();
}