[profiler] Implement call context introspection for enter/leave events.
[mono.git] / mono / mini / mini-arm64.c
index 10acac62282508876ba07dc56e093fd53b739441..46fb083b2823efaf6034aa894bf141418bb2b31d 100644 (file)
@@ -1,5 +1,6 @@
-/*
- * mini-arm64.c: ARM64 backend for the Mono code generator
+/**
+ * \file
+ * ARM64 backend for the Mono code generator
  *
  * Copyright 2013 Xamarin, Inc (http://www.xamarin.com)
  * 
@@ -233,7 +234,6 @@ 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 ();
@@ -994,7 +994,7 @@ mono_arch_patch_code_new (MonoCompile *cfg, MonoDomain *domain, guint8 *code, Mo
        switch (ji->type) {
        case MONO_PATCH_INFO_METHOD_JUMP:
                /* ji->relocation is not set by the caller */
-               arm_patch_rel (ip, (guint8*)target, MONO_R_ARM64_B);
+               arm_patch_full (cfg, domain, ip, (guint8*)target, MONO_R_ARM64_B);
                break;
        default:
                arm_patch_full (cfg, domain, ip, (guint8*)target, ji->relocation);
@@ -1229,7 +1229,6 @@ add_param (CallInfo *cinfo, ArgInfo *ainfo, MonoType *t)
        case MONO_TYPE_I1:
                add_general (cinfo, ainfo, 1, TRUE);
                break;
-       case MONO_TYPE_BOOLEAN:
        case MONO_TYPE_U1:
                add_general (cinfo, ainfo, 1, FALSE);
                break;
@@ -1237,7 +1236,6 @@ add_param (CallInfo *cinfo, ArgInfo *ainfo, MonoType *t)
                add_general (cinfo, ainfo, 2, TRUE);
                break;
        case MONO_TYPE_U2:
-       case MONO_TYPE_CHAR:
                add_general (cinfo, ainfo, 2, FALSE);
                break;
        case MONO_TYPE_I4:
@@ -1250,11 +1248,7 @@ add_param (CallInfo *cinfo, ArgInfo *ainfo, MonoType *t)
        case MONO_TYPE_U:
        case MONO_TYPE_PTR:
        case MONO_TYPE_FNPTR:
-       case MONO_TYPE_CLASS:
        case MONO_TYPE_OBJECT:
-       case MONO_TYPE_SZARRAY:
-       case MONO_TYPE_ARRAY:
-       case MONO_TYPE_STRING:
        case MONO_TYPE_U8:
        case MONO_TYPE_I8:
                add_general (cinfo, ainfo, 8, FALSE);
@@ -1545,7 +1539,6 @@ mono_arch_start_dyn_call (MonoDynCallInfo *info, gpointer **args, guint8 *ret, g
 
                        /* Special case arguments smaller than 1 machine word */
                        switch (t->type) {
-                       case MONO_TYPE_BOOLEAN:
                        case MONO_TYPE_U1:
                                *(guint8*)stack_arg = *(guint8*)arg;
                                break;
@@ -1553,7 +1546,6 @@ mono_arch_start_dyn_call (MonoDynCallInfo *info, gpointer **args, guint8 *ret, g
                                *(gint8*)stack_arg = *(gint8*)arg;
                                break;
                        case MONO_TYPE_U2:
-                       case MONO_TYPE_CHAR:
                                *(guint16*)stack_arg = *(guint16*)arg;
                                break;
                        case MONO_TYPE_I2:
@@ -1574,10 +1566,6 @@ mono_arch_start_dyn_call (MonoDynCallInfo *info, gpointer **args, guint8 *ret, g
                }
 
                switch (t->type) {
-               case MONO_TYPE_STRING:
-               case MONO_TYPE_CLASS:
-               case MONO_TYPE_ARRAY:
-               case MONO_TYPE_SZARRAY:
                case MONO_TYPE_OBJECT:
                case MONO_TYPE_PTR:
                case MONO_TYPE_I:
@@ -1586,7 +1574,6 @@ mono_arch_start_dyn_call (MonoDynCallInfo *info, gpointer **args, guint8 *ret, g
                case MONO_TYPE_U8:
                        p->regs [slot] = (mgreg_t)*arg;
                        break;
-               case MONO_TYPE_BOOLEAN:
                case MONO_TYPE_U1:
                        p->regs [slot] = *(guint8*)arg;
                        break;
@@ -1597,7 +1584,6 @@ mono_arch_start_dyn_call (MonoDynCallInfo *info, gpointer **args, guint8 *ret, g
                        p->regs [slot] = *(gint16*)arg;
                        break;
                case MONO_TYPE_U2:
-               case MONO_TYPE_CHAR:
                        p->regs [slot] = *(guint16*)arg;
                        break;
                case MONO_TYPE_I4:
@@ -1691,10 +1677,6 @@ mono_arch_finish_dyn_call (MonoDynCallInfo *info, guint8 *buf)
        case MONO_TYPE_VOID:
                *(gpointer*)ret = NULL;
                break;
-       case MONO_TYPE_STRING:
-       case MONO_TYPE_CLASS:
-       case MONO_TYPE_ARRAY:
-       case MONO_TYPE_SZARRAY:
        case MONO_TYPE_OBJECT:
        case MONO_TYPE_I:
        case MONO_TYPE_U:
@@ -1705,14 +1687,12 @@ mono_arch_finish_dyn_call (MonoDynCallInfo *info, guint8 *buf)
                *(gint8*)ret = res;
                break;
        case MONO_TYPE_U1:
-       case MONO_TYPE_BOOLEAN:
                *(guint8*)ret = res;
                break;
        case MONO_TYPE_I2:
                *(gint16*)ret = res;
                break;
        case MONO_TYPE_U2:
-       case MONO_TYPE_CHAR:
                *(guint16*)ret = res;
                break;
        case MONO_TYPE_I4:
@@ -1904,9 +1884,6 @@ mono_arch_create_vars (MonoCompile *cfg)
        if (cfg->method->save_lmf) {
                cfg->create_lmf_var = TRUE;
                cfg->lmf_ir = TRUE;
-#ifdef HAVE_GET_TLS_ADDR
-               cfg->lmf_ir_mono_lmf = TRUE;
-#endif
        }
 }
 
@@ -4160,6 +4137,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        } else {
                                mono_add_patch_info_rel (cfg, code - cfg->native_code, MONO_PATCH_INFO_METHOD_JUMP, call->method, MONO_R_ARM64_B);
                                arm_b (code, code);
+                               cfg->thunk_area += THUNK_SIZE;
                        }
                        ins->flags |= MONO_INST_GC_CALLSITE;
                        ins->backend.pc_offset = code - cfg->native_code;
@@ -4351,7 +4329,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
 #endif
                        break;
                }
-
+               case OP_FILL_PROF_CALL_CTX:
+                       for (int i = 0; i < MONO_MAX_IREGS; i++)
+                               if ((MONO_ARCH_CALLEE_SAVED_REGS & (1 << i)) || i == ARMREG_SP || i == ARMREG_FP)
+                                       arm_strx (code, i, ins->sreg1, MONO_STRUCT_OFFSET (MonoContext, regs) + i * sizeof (mgreg_t));
+                       break;
                default:
                        g_warning ("unknown opcode %s in %s()\n", mono_inst_name (ins->opcode), __FUNCTION__);
                        g_assert_not_reached ();
@@ -5262,22 +5244,3 @@ mono_arch_get_call_info (MonoMemPool *mp, MonoMethodSignature *sig)
        return get_call_info (mp, sig);
 }
 
-gpointer
-mono_arch_install_handler_block_guard (MonoJitInfo *ji, MonoJitExceptionInfo *clause, MonoContext *ctx, gpointer new_value)
-{
-       gpointer *lr_loc;
-       char *old_value;
-       char *bp;
-
-       /*Load the spvar*/
-       bp = MONO_CONTEXT_GET_BP (ctx);
-       lr_loc = (gpointer*)(bp + clause->exvar_offset);
-
-       old_value = *lr_loc;
-       if ((char*)old_value < (char*)ji->code_start || (char*)old_value > ((char*)ji->code_start + ji->code_size))
-               return old_value;
-
-       *lr_loc = new_value;
-
-       return old_value;
-}