case MONO_PATCH_INFO_JIT_ICALL_ADDR:
case MONO_PATCH_INFO_ICALL_ADDR_CALL:
case MONO_PATCH_INFO_RGCTX_FETCH:
- case MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR:
case MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR:
return TRUE;
case MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL:
case MONO_PATCH_INFO_AOT_JIT_INFO:
case MONO_PATCH_INFO_GET_TLS_TRAMP:
case MONO_PATCH_INFO_SET_TLS_TRAMP:
- case MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR:
case MONO_PATCH_INFO_CASTCLASS_CACHE:
encode_value (patch_info->data.index, p, &p);
break;
g_free (s);
break;
}
- case MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR:
- debug_sym = g_strdup_printf ("%s_jit_icall_native_trampoline_func_%li", prefix, ji->data.index);
- break;
case MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR:
debug_sym = g_strdup_printf ("%s_jit_icall_native_specific_trampoline_lazy_fetch_%lu", prefix, ji->data.uindex);
break;
case MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR:
ji->data.uindex = decode_value (p, &p);
break;
- case MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR:
case MONO_PATCH_INFO_CASTCLASS_CACHE:
ji->data.index = decode_value (p, &p);
break;
* patches, so have to translate between the two.
* FIXME: Clean this up, but how ?
*/
- if (ji.type == MONO_PATCH_INFO_ABS || ji.type == MONO_PATCH_INFO_JIT_ICALL_ID
+ if (ji.type == MONO_PATCH_INFO_ABS
+ || ji.type == MONO_PATCH_INFO_JIT_ICALL_ID
|| ji.type == MONO_PATCH_INFO_ICALL_ADDR
- || ji.type == MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR || ji.type == MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR
- || ji.type == MONO_PATCH_INFO_JIT_ICALL_ADDR || ji.type == MONO_PATCH_INFO_RGCTX_FETCH) {
+ || ji.type == MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR
+ || ji.type == MONO_PATCH_INFO_JIT_ICALL_ADDR
+ || ji.type == MONO_PATCH_INFO_RGCTX_FETCH) {
/* These should already have a function descriptor */
#ifdef PPC_USES_FUNCTION_DESCRIPTOR
/* Our function descriptors have a 0 environment, gcc created ones don't */
if (ji.type != MONO_PATCH_INFO_JIT_ICALL_ID
- && ji.type != MONO_PATCH_INFO_JIT_ICALL_ADDR && ji.type != MONO_PATCH_INFO_ICALL_ADDR
- && ji.type != MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR && ji.type != MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR)
+ && ji.type != MONO_PATCH_INFO_JIT_ICALL_ADDR
+ && ji.type != MONO_PATCH_INFO_ICALL_ADDR
+ && ji.type != MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR)
g_assert (((gpointer*)target) [2] == 0);
#endif
/* Empty */
* When this code is executed, the runtime may not be initalized yet, so
* resolve the patch info by hand.
*/
- if (ji->type == MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR) {
- target = (gpointer)mono_get_trampoline_func ((MonoTrampolineType)ji->data.index);
- } else if (ji->type == MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR) {
+ if (ji->type == MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR) {
target = mono_create_specific_trampoline (GUINT_TO_POINTER (ji->data.uindex), MONO_TRAMPOLINE_RGCTX_LAZY_FETCH, mono_get_root_domain (), NULL);
target = mono_create_ftnptr_malloc ((guint8 *)target);
} else if (ji->type == MONO_PATCH_INFO_JIT_ICALL_ADDR) {
case MONO_JIT_ICALL_generic_trampoline_delegate:
case MONO_JIT_ICALL_generic_trampoline_generic_virtual_remoting:
case MONO_JIT_ICALL_generic_trampoline_vcall:
- g_assert (0); // FIXME replace MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR with MONO_PATCH_INFO_JIT_ICALL_ADDR.
- g_static_assert (MONO_TRAMPOLINE_JIT == 0);
- target = (gpointer)mono_get_trampoline_func ((MonoTrampolineType)(jit_icall_id - MONO_JIT_ICALL_generic_trampoline_jit));
+ target = (gpointer)mono_get_trampoline_func (mono_jit_icall_id_to_trampoline_type (jit_icall_id));
break;
default:
target = mono_arch_load_function (jit_icall_id);
#include "mini.h"
/* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION 162
+#define MONO_AOT_FILE_VERSION 163
#define MONO_AOT_TRAMP_PAGE_SIZE 16384
NULLIFY_INS (addr);
goto calli_end;
} else if (info_type == MONO_PATCH_INFO_JIT_ICALL_ADDR
- || info_type == MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR
- || info_type == MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR) {
- // FIXME change MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR to MONO_PATCH_INFO_JIT_ICALL_ADDR
+ || info_type == MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR) {
tailcall = FALSE;
ins = (MonoInst*)mini_emit_abs_call (cfg, info_type, info_data, fsig, sp);
NULLIFY_INS (addr);
case MONO_PATCH_INFO_ABS:
case MONO_PATCH_INFO_RGCTX_FETCH:
case MONO_PATCH_INFO_JIT_ICALL_ADDR:
- case MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR:
case MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR:
is_fd = TRUE;
/* fall through */
case MONO_PATCH_INFO_JIT_ICALL_ID:
case MONO_PATCH_INFO_JIT_ICALL_ADDR:
case MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL:
- case MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR:
case MONO_PATCH_INFO_CASTCLASS_CACHE:
return hash | ji->data.index;
case MONO_PATCH_INFO_SWITCH:
return ji1->data.del_tramp->klass == ji2->data.del_tramp->klass && ji1->data.del_tramp->method == ji2->data.del_tramp->method && ji1->data.del_tramp->is_virtual == ji2->data.del_tramp->is_virtual;
case MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR:
return ji1->data.uindex == ji2->data.uindex;
- case MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR:
case MONO_PATCH_INFO_CASTCLASS_CACHE:
return ji1->data.index == ji2->data.index;
case MONO_PATCH_INFO_JIT_ICALL_ID:
case MONO_PATCH_INFO_EXC:
s390_patch_addr (ip, (guint64) target);
continue;
- case MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR:
case MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR:
case MONO_PATCH_INFO_METHOD:
case MONO_PATCH_INFO_JIT_ICALL_ID:
if (cfg->abs_patches) {
jinfo = (MonoJumpInfo*)g_hash_table_lookup (cfg->abs_patches, data);
if (jinfo && (jinfo->type == MONO_PATCH_INFO_JIT_ICALL_ADDR
- || jinfo->type == MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR
|| jinfo->type == MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR))
needs_paddings = FALSE;
}
case MONO_PATCH_INFO_LABEL:
case MONO_PATCH_INFO_RGCTX_FETCH:
case MONO_PATCH_INFO_JIT_ICALL_ADDR:
- case MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR:
case MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR:
x86_patch (ip, (unsigned char*)target);
break;
MONO_TRAMPOLINE_NUM = 8,
} MonoTrampolineType;
+// Assuming MONO_TRAMPOLINE_JIT / MONO_JIT_ICALL_generic_trampoline_jit are first.
+#if __cplusplus
+g_static_assert (MONO_TRAMPOLINE_JIT == 0);
+#endif
+#define mono_trampoline_type_to_jit_icall_id(a) ((a) + MONO_JIT_ICALL_generic_trampoline_jit)
+#define mono_jit_icall_id_to_trampoline_type(a) ((MonoTrampolineType)((a) - MONO_JIT_ICALL_generic_trampoline_jit))
+
/* These trampolines return normally to their caller */
#define MONO_TRAMPOLINE_TYPE_MUST_RETURN(t) \
((t) == MONO_TRAMPOLINE_RGCTX_LAZY_FETCH)
*/
PATCH_INFO(METHOD_FTNDESC, "method_ftndesc")
-PATCH_INFO(TRAMPOLINE_FUNC_ADDR, "trampoline_func_addr")
PATCH_INFO(SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR, "specific_trampoline_lazy_fetch_addr")
amd64_mov_reg_membase (code, AMD64_ARG_REG4, AMD64_RBP, tramp_offset, sizeof (target_mgreg_t));
if (aot) {
- code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR, GINT_TO_POINTER (tramp_type));
+ code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, GINT_TO_POINTER (mono_trampoline_type_to_jit_icall_id (tramp_type)));
} else {
tramp = (guint8*)mono_get_trampoline_func (tramp_type);
amd64_mov_reg_imm (code, AMD64_R11, tramp);
ARM_MOV_REG_REG (code, ARMREG_R2, ARMREG_V2);
if (aot) {
- ji = mono_patch_info_list_prepend (ji, code - buf, MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR, GINT_TO_POINTER (tramp_type));
+ ji = mono_patch_info_list_prepend (ji, code - buf, MONO_PATCH_INFO_JIT_ICALL_ADDR, GINT_TO_POINTER (mono_trampoline_type_to_jit_icall_id (tramp_type)));
ARM_LDR_IMM (code, ARMREG_IP, ARMREG_PC, 0);
ARM_B (code, 0);
*(gpointer*)code = NULL;
arm_movx (code, ARMREG_R3, ARMREG_RZR);
if (aot) {
- code = mono_arm_emit_aotconst (&ji, code, buf, ARMREG_IP0, MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR, GINT_TO_POINTER (tramp_type));
+ code = mono_arm_emit_aotconst (&ji, code, buf, ARMREG_IP0, MONO_PATCH_INFO_JIT_ICALL_ADDR, GINT_TO_POINTER (mono_trampoline_type_to_jit_icall_id (tramp_type)));
} else {
tramp = (guint8*)mono_get_trampoline_func (tramp_type);
code = mono_arm_emit_imm64 (code, ARMREG_IP0, (guint64)tramp);
ppc_ldr (code, ppc_r5, GREGS_OFFSET, ppc_r1);
if (aot) {
- code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR, GINT_TO_POINTER (tramp_type));
+ code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, GINT_TO_POINTER (mono_trampoline_type_to_jit_icall_id (tramp_type)));
#ifdef PPC_USES_FUNCTION_DESCRIPTOR
ppc_ldptr (code, ppc_r2, sizeof (target_mgreg_t), ppc_r12);
ppc_ldptr (code, ppc_r12, 0, ppc_r12);
#endif
if (aot) {
- code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR, GINT_TO_POINTER (tramp_type));
+ code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, GINT_TO_POINTER (mono_trampoline_type_to_jit_icall_id (tramp_type)));
x86_call_reg (code, X86_EAX);
} else {
tramp = (guint8*)mono_get_trampoline_func (tramp_type);