static void
emit_push_lmf (MonoCompile *cfg)
{
-#if defined(MONO_ARCH_ENABLE_LMF_IR)
/*
* Emit IR to push the LMF:
* lmf_addr = <lmf_addr from tls>
int lmf_reg, lmf_addr_reg, prev_lmf_reg;
MonoInst *ins, *lmf_ins;
- if (!mono_arch_enable_lmf_ir (cfg))
+ if (!cfg->lmf_ir)
return;
lmf_ins = mono_get_lmf_addr_intrinsic (cfg);
EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf), prev_lmf_reg);
/* Set new lmf */
EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_addr_reg, 0, lmf_reg);
-#endif
}
/*
static void
emit_pop_lmf (MonoCompile *cfg)
{
-#if defined(MONO_ARCH_ENABLE_LMF_IR)
int lmf_reg, lmf_addr_reg, prev_lmf_reg;
MonoInst *ins;
- if (!mono_arch_enable_lmf_ir (cfg))
+ if (!cfg->lmf_ir)
return;
/*
prev_lmf_reg = alloc_preg (cfg);
EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, prev_lmf_reg, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_addr_reg, 0, prev_lmf_reg);
-#endif
}
static int
#ifndef MONO_AMD64_NO_PUSHES
cfg->arch_eh_jit_info = 1;
#endif
+
+ cfg->create_lmf_var = 1;
+#if !defined(TARGET_WIN32) && !defined(MONO_ARCH_ENABLE_MONO_LMF_VAR)
+ cfg->lmf_ir = 1;
+#endif
}
static void
amd64_lea_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset);
amd64_mov_membase_reg (code, AMD64_RAX, 0, AMD64_R11, sizeof(gpointer));
#else
- /* Already handled by the MONO_ARCH_ENABLE_LMF_IR code in method-to-ir.c */
+ /* Already handled by emit_push_lmf () in method-to-ir.c */
/* FIXME: Use this on win32 as well */
return code;
#endif
return code;
}
-gboolean
-mono_arch_enable_lmf_ir (MonoCompile *cfg)
-{
-#if !defined(TARGET_WIN32) && !defined(MONO_ARCH_ENABLE_MONO_LMF_VAR)
- return TRUE;
-#else
- return FALSE;
-#endif
-}
-
#define REAL_PRINT_REG(text,reg) \
mono_assert (reg >= 0); \
amd64_push_reg (code, AMD64_RAX); \
#define MONO_ARCH_HAVE_CONTEXT_SET_INT_REG 1
#define MONO_ARCH_HAVE_SETUP_ASYNC_CALLBACK 1
#define MONO_ARCH_HAVE_CREATE_LLVM_NATIVE_THUNK 1
-#define MONO_ARCH_ENABLE_LMF_IR 1
#ifdef TARGET_OSX
#define MONO_ARCH_HAVE_TLS_GET_REG 1
}
cfg->arch_eh_jit_info = 1;
+ cfg->create_lmf_var = 1;
}
/*
return code;
}
-gboolean
-mono_arch_enable_lmf_ir (MonoCompile *cfg)
-{
- return FALSE;
-}
-
#define REAL_PRINT_REG(text,reg) \
mono_assert (reg >= 0); \
x86_push_reg (code, X86_EAX); \
#define MONO_ARCH_HAVE_CONTEXT_SET_INT_REG 1
#define MONO_ARCH_HAVE_SETUP_ASYNC_CALLBACK 1
#define MONO_ARCH_GSHAREDVT_SUPPORTED 1
-#define MONO_ARCH_ENABLE_LMF_IR 1
#ifdef TARGET_OSX
#define MONO_ARCH_HAVE_TLS_GET_REG 1
if (cfg->verbose_level > 2)
g_print ("locals done\n");
- if (cfg->method->save_lmf && ARCH_ENABLE_LMF_IR) {
+ mono_arch_create_vars (cfg);
+
+ if (cfg->method->save_lmf && cfg->create_lmf_var) {
MonoInst *lmf_var = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
lmf_var->flags |= MONO_INST_VOLATILE;
lmf_var->flags |= MONO_INST_LMF;
cfg->lmf_var = lmf_var;
}
-
- mono_arch_create_vars (cfg);
}
void
guint disable_vreg_to_lvreg : 1;
guint disable_deadce_vars : 1;
guint disable_out_of_line_bblocks : 1;
+ guint create_lmf_var : 1;
+ /*
+ * When this is set, the code to push/pop the LMF from the LMF stack is generated as IR
+ * instead of being generated in emit_prolog ()/emit_epilog ().
+ */
+ guint lmf_ir : 1;
guint gen_write_barriers : 1;
guint init_ref_vars : 1;
guint extend_live_ranges : 1;
gpointer mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot) MONO_INTERNAL;
gpointer mono_arch_get_gsharedvt_call_info (gpointer addr, MonoMethodSignature *normal_sig, MonoMethodSignature *gsharedvt_sig, MonoGenericSharingContext *gsctx, gboolean gsharedvt_in, gint32 vcall_offset, gboolean calli) MONO_INTERNAL;
gboolean mono_arch_opcode_needs_emulation (MonoCompile *cfg, int opcode) MONO_INTERNAL;
-gboolean mono_arch_enable_lmf_ir (MonoCompile *cfg) MONO_INTERNAL;
#ifdef MONO_ARCH_SOFT_FLOAT_FALLBACK
gboolean mono_arch_is_soft_float (void) MONO_INTERNAL;
#define ARCH_HAVE_TLS_GET_REG 0
#endif
-/*
- * When this is set, the code to push/pop the LMF from the LMF stack is generated as IR
- * instead of being generated in emit_prolog ()/emit_epilog ().
- */
-#ifdef MONO_ARCH_ENABLE_LMF_IR
-#define ARCH_ENABLE_LMF_IR 1
-#else
-#define ARCH_ENABLE_LMF_IR 0
-#endif
-
#endif /* __MONO_MINI_H__ */