From 81a4224c7dbbf72903036c837ab86460c520a296 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Tue, 7 Mar 2017 18:20:02 -0500 Subject: [PATCH] [arm64] Implement aot support for handler block trampolines. --- mono/mini/mini-arm64.c | 1 + mono/mini/mini-arm64.h | 3 +++ mono/mini/tramp-arm64.c | 21 +++++++++++++-------- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/mono/mini/mini-arm64.c b/mono/mini/mini-arm64.c index 472c7791f0f..10acac62282 100644 --- a/mono/mini/mini-arm64.c +++ b/mono/mini/mini-arm64.c @@ -233,6 +233,7 @@ mono_arch_init (void) { mono_aot_register_jit_icall ("mono_arm_throw_exception", mono_arm_throw_exception); mono_aot_register_jit_icall ("mono_arm_resume_unwind", mono_arm_resume_unwind); + mono_aot_register_jit_icall ("mono_arm_handler_block_trampoline_helper", mono_arm_handler_block_trampoline_helper); if (!mono_aot_only) bp_trampoline = mini_get_breakpoint_trampoline (); diff --git a/mono/mini/mini-arm64.h b/mono/mini/mini-arm64.h index 28745040b6b..179d34ca4da 100644 --- a/mono/mini/mini-arm64.h +++ b/mono/mini/mini-arm64.h @@ -158,6 +158,7 @@ typedef struct { #define MONO_ARCH_HAVE_OPCODE_NEEDS_EMULATION 1 #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1 #define MONO_ARCH_HAVE_HANDLER_BLOCK_GUARD 1 +#define MONO_ARCH_HAVE_HANDLER_BLOCK_GUARD_AOT 1 #ifdef TARGET_IOS @@ -259,6 +260,8 @@ GSList* mono_arm_get_exception_trampolines (gboolean aot); void mono_arm_resume_unwind (gpointer arg, mgreg_t pc, mgreg_t *int_regs, gdouble *fp_regs, gboolean corlib, gboolean rethrow); +gpointer mono_arm_handler_block_trampoline_helper (gpointer *ptr); + CallInfo* mono_arch_get_call_info (MonoMemPool *mp, MonoMethodSignature *sig); #endif /* __MONO_MINI_ARM64_H__ */ diff --git a/mono/mini/tramp-arm64.c b/mono/mini/tramp-arm64.c index 50cf02095c3..6cc8be320f6 100644 --- a/mono/mini/tramp-arm64.c +++ b/mono/mini/tramp-arm64.c @@ -507,8 +507,8 @@ mono_arch_create_general_rgctx_lazy_fetch_trampoline (MonoTrampInfo **info, gboo return buf; } -static gpointer -handler_block_trampoline_helper (gpointer *ptr) +gpointer +mono_arm_handler_block_trampoline_helper (gpointer *ptr) { MonoJitTlsData *jit_tls = mono_tls_get_jit_tls (); return jit_tls->handler_block_return_address; @@ -523,14 +523,10 @@ mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot) MonoJumpInfo *ji = NULL; GSList *unwind_ops = NULL; - g_assert (!aot); - code = buf = mono_global_codeman_reserve (tramp_size); unwind_ops = NULL; - tramp = mono_arch_create_specific_trampoline (NULL, MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD, NULL, NULL); - /* This trampoline restore the call chain of the handler block then jumps into the code that deals with it. */ @@ -538,12 +534,21 @@ mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot) /* * We are in a method frame after the call emitted by OP_CALL_HANDLER. */ - code = mono_arm_emit_imm64 (code, ARMREG_IP0, (guint64)handler_block_trampoline_helper); + if (aot) + code = mono_arm_emit_aotconst (&ji, code, buf, ARMREG_IP0, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_arm_handler_block_trampoline_helper"); + else + code = mono_arm_emit_imm64 (code, ARMREG_IP0, (guint64)mono_arm_handler_block_trampoline_helper); /* Set it as the return address so the trampoline will return to it */ arm_movx (code, ARMREG_LR, ARMREG_IP0); /* Call the trampoline */ - code = mono_arm_emit_imm64 (code, ARMREG_IP0, (guint64)tramp); + if (aot) { + char *name = g_strdup_printf ("trampoline_func_%d", MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD); + code = mono_arm_emit_aotconst (&ji, code, buf, ARMREG_IP0, MONO_PATCH_INFO_JIT_ICALL_ADDR, name); + } else { + tramp = mono_arch_create_specific_trampoline (NULL, MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD, NULL, NULL); + code = mono_arm_emit_imm64 (code, ARMREG_IP0, (guint64)tramp); + } arm_brx (code, ARMREG_IP0); mono_arch_flush_icache (buf, code - buf); -- 2.25.1