[arm64] Implement aot support for handler block trampolines.
[mono.git] / mono / mini / tramp-arm64.c
index 50cf02095c3970d174b98e011b555edbd215ed77..6cc8be320f68e950e6f36e929aa1d68cb2fd0ab4 100644 (file)
@@ -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);