case MONO_PATCH_INFO_JIT_ICALL_ADDR:
case MONO_PATCH_INFO_ICALL_ADDR:
case MONO_PATCH_INFO_RGCTX_FETCH:
- case MONO_PATCH_INFO_LLVM_IMT_TRAMPOLINE:
return TRUE;
default:
return FALSE;
case MONO_PATCH_INFO_SEQ_POINT_INFO:
case MONO_PATCH_INFO_AOT_MODULE:
break;
- case MONO_PATCH_INFO_LLVM_IMT_TRAMPOLINE:
- encode_method_ref (acfg, patch_info->data.imt_tramp->method, p, &p);
- encode_value (patch_info->data.imt_tramp->vt_offset, p, &p);
- break;
case MONO_PATCH_INFO_SIGNATURE:
encode_signature (acfg, (MonoMethodSignature*)patch_info->data.target, p, &p);
break;
case MONO_PATCH_INFO_AOT_MODULE:
case MONO_PATCH_INFO_MSCORLIB_GOT_ADDR:
break;
- case MONO_PATCH_INFO_LLVM_IMT_TRAMPOLINE: {
- MonoJumpInfoImtTramp *imt_tramp = mono_mempool_alloc0 (mp, sizeof (MonoJumpInfoImtTramp));
-
- imt_tramp->method = decode_resolve_method_ref (aot_module, p, &p);
- imt_tramp->vt_offset = decode_value (p, &p);
-
- ji->data.imt_tramp = imt_tramp;
- break;
- }
case MONO_PATCH_INFO_SIGNATURE:
ji->data.target = decode_signature (aot_module, p, &p);
break;
target = mono_arch_get_seq_point_info (domain, code);
break;
#endif
- case MONO_PATCH_INFO_LLVM_IMT_TRAMPOLINE:
-#ifdef MONO_ARCH_LLVM_SUPPORTED
- g_assert (mono_use_llvm);
- target = mono_create_llvm_imt_trampoline (domain, patch_info->data.imt_tramp->method, patch_info->data.imt_tramp->vt_offset);
-#else
- g_assert_not_reached ();
-#endif
- break;
case MONO_PATCH_INFO_GC_CARD_TABLE_ADDR: {
int card_table_shift_bits;
gpointer card_table_mask;
return ptr;
}
-
-#ifdef MONO_ARCH_LLVM_SUPPORTED
-/*
- * mono_create_llvm_imt_trampoline:
- *
- * LLVM compiled code can't pass in the IMT argument, so we use this trampoline, which
- * sets the IMT argument, then branches to the contents of the vtable slot given by
- * vt_offset in the vtable which is obtained from the argument list.
- */
-gpointer
-mono_create_llvm_imt_trampoline (MonoDomain *domain, MonoMethod *m, int vt_offset)
-{
-#ifdef MONO_ARCH_HAVE_LLVM_IMT_TRAMPOLINE
- return mono_arch_get_llvm_imt_trampoline (domain, m, vt_offset);
-#else
- g_assert_not_reached ();
- return NULL;
-#endif
-}
-#endif
guint32
mono_find_rgctx_lazy_fetch_trampoline_by_addr (gconstpointer addr)
#endif
/* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION 127
+#define MONO_AOT_FILE_VERSION 128
//TODO: This is x86/amd64 specific.
#define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6))
gpointer mono_create_monitor_enter_v4_trampoline (void);
gpointer mono_create_monitor_exit_trampoline (void);
gpointer mono_create_static_rgctx_trampoline (MonoMethod *m, gpointer addr);
-gpointer mono_create_llvm_imt_trampoline (MonoDomain *domain, MonoMethod *m, int vt_offset) MONO_LLVM_INTERNAL;
MonoVTable* mono_find_class_init_trampoline_by_addr (gconstpointer addr);
guint32 mono_find_rgctx_lazy_fetch_trampoline_by_addr (gconstpointer addr);
gpointer mono_magic_trampoline (mgreg_t *regs, guint8 *code, gpointer arg, guint8* tramp);
PATCH_INFO(MONITOR_EXIT, "monitor_exit")
PATCH_INFO(MSCORLIB_GOT_ADDR, "mscorlib_got_addr")
PATCH_INFO(SEQ_POINT_INFO, "seq_point_info")
-PATCH_INFO(LLVM_IMT_TRAMPOLINE, "llvm_imt_trampoline")
PATCH_INFO(GC_CARD_TABLE_ADDR, "gc_card_table_addr")
PATCH_INFO(CASTCLASS_CACHE, "castclass_cache")
PATCH_INFO(SIGNATURE, "signature")
return start;
}
-gpointer
-mono_arch_get_llvm_imt_trampoline (MonoDomain *domain, MonoMethod *m, int vt_offset)
-{
- guint8 *code, *start;
- int buf_len;
- int this_reg;
-
- buf_len = 32;
-
- start = code = mono_domain_code_reserve (domain, buf_len);
-
- this_reg = mono_arch_get_this_arg_reg (NULL);
-
- /* Set imt arg */
- amd64_mov_reg_imm (code, MONO_ARCH_IMT_REG, m);
- /* Load vtable address */
- amd64_mov_reg_membase (code, AMD64_RAX, this_reg, 0, 8);
- amd64_jump_membase (code, AMD64_RAX, vt_offset);
- amd64_ret (code);
-
- g_assert ((code - start) < buf_len);
-
- nacl_domain_code_validate (domain, &start, buf_len, &code);
-
- mono_arch_flush_icache (start, code - start);
- mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, NULL);
-
- return start;
-}
-
#ifdef _WIN64
// Workaround lack of Valgrind support for 64-bit Windows
#define VALGRIND_DISCARD_TRANSLATIONS(...)
return start;
}
-gpointer
-mono_arch_get_llvm_imt_trampoline (MonoDomain *domain, MonoMethod *m, int vt_offset)
-{
- guint8 *code, *start;
- int buf_len;
- int this_offset;
-
- buf_len = 32;
-
- start = code = mono_domain_code_reserve (domain, buf_len);
-
- this_offset = mono_x86_get_this_arg_offset (mono_method_signature (m));
-
- /* Set imt arg */
- x86_mov_reg_imm (code, MONO_ARCH_IMT_REG, m);
- /* Load this */
- x86_mov_reg_membase (code, X86_EAX, X86_ESP, this_offset + 4, 4);
- /* Load vtable address */
- x86_mov_reg_membase (code, X86_EAX, X86_EAX, 0, 4);
- x86_jump_membase (code, X86_EAX, vt_offset);
-
- g_assert ((code - start) < buf_len);
-
- nacl_domain_code_validate (domain, &start, buf_len, &code);
-
- mono_arch_flush_icache (start, code - start);
- mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, NULL);
-
- return start;
-}
-
void
mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr)
{