[mono] Add a 'inline_method' profiler event. (#61454)
authorZoltan Varga <vargaz@gmail.com>
Sat, 13 Nov 2021 19:30:09 +0000 (14:30 -0500)
committerGitHub <noreply@github.com>
Sat, 13 Nov 2021 19:30:09 +0000 (14:30 -0500)
Emit it in the interpreter when a method is inlined or replaced with
an intrinsic. This is needed so the AOT profiler can track these
methods.

src/mono/mono/metadata/profiler-events.h
src/mono/mono/mini/interp/transform.c
src/mono/mono/profiler/aot.c

index c7ab3f6..20300bf 100644 (file)
@@ -106,3 +106,5 @@ MONO_PROFILER_EVENT_1(thread_exited, ThreadExited, uintptr_t, tid)
 MONO_PROFILER_EVENT_2(thread_name, ThreadName, uintptr_t, tid, const char *, name)
 
 MONO_PROFILER_EVENT_2(sample_hit, SampleHit, const mono_byte *, ip, const void *, context)
+
+MONO_PROFILER_EVENT_2(inline_method, InlineMethod, MonoMethod *, method, MonoMethod *, inlined_method)
index 476f98e..0101251 100644 (file)
@@ -2936,6 +2936,7 @@ interp_inline_method (TransformData *td, MonoMethod *target_method, MonoMethodHe
                        td->last_ins->next = NULL;
                UnlockedIncrement (&mono_interp_stats.inline_failures);
        } else {
+               MONO_PROFILER_RAISE (inline_method, (td->rtm->method, target_method));
                if (td->verbose_level)
                        g_print ("Inline end method %s.%s\n", m_class_get_name (target_method->klass), target_method->name);
                UnlockedIncrement (&mono_interp_stats.inlined_methods);
@@ -3240,8 +3241,10 @@ interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target
        }
 
        /* Intrinsics */
-       if (target_method && interp_handle_intrinsics (td, target_method, constrained_class, csignature, readonly, &op))
+       if (target_method && interp_handle_intrinsics (td, target_method, constrained_class, csignature, readonly, &op)) {
+               MONO_PROFILER_RAISE (inline_method, (td->rtm->method, target_method));
                return TRUE;
+       }
 
        if (constrained_class) {
                if (m_class_is_enumtype (constrained_class) && !strcmp (target_method->name, "GetHashCode")) {
@@ -3269,8 +3272,10 @@ interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target
                g_print ("                    : %s::%s.  %s (%p)\n", target_method->klass->name, target_method->name, mono_signature_full_name (target_method->signature), target_method);
 #endif
                /* Intrinsics: Try again, it could be that `mono_get_method_constrained_with_method` resolves to a method that we can substitute */
-               if (target_method && interp_handle_intrinsics (td, target_method, constrained_class, csignature, readonly, &op))
+               if (target_method && interp_handle_intrinsics (td, target_method, constrained_class, csignature, readonly, &op)) {
+                       MONO_PROFILER_RAISE (inline_method, (td->rtm->method, target_method));
                        return TRUE;
+               }
 
                return_val_if_nok (error, FALSE);
                mono_class_setup_vtable (target_method->klass);
@@ -5770,6 +5775,7 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header,
                                        !strcmp (m_class_get_name (m->klass), "ByReference`1") &&
                                        !strcmp (m->name, ".ctor")) {
                                /* public ByReference(ref T value) */
+                               MONO_PROFILER_RAISE (inline_method, (td->rtm->method, m));
                                g_assert (csignature->hasthis && csignature->param_count == 1);
                                td->sp--;
                                /* We already have the vt on top of the stack. Just do a dummy mov that should be optimized out */
@@ -5784,6 +5790,7 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header,
                                        csignature->params [0]->type == MONO_TYPE_PTR &&
                                        !type_has_references (mono_method_get_context (m)->class_inst->type_argv [0])) {
                                /* ctor frequently used with ReadOnlySpan over static arrays */
+                               MONO_PROFILER_RAISE (inline_method, (td->rtm->method, m));
                                interp_add_ins (td, MINT_INTRINS_SPAN_CTOR);
                                td->sp -= 2;
                                interp_ins_set_sregs2 (td->last_ins, td->sp [0].local, td->sp [1].local);
index 71be9f1..7988d23 100644 (file)
@@ -82,6 +82,12 @@ prof_jit_done (MonoProfiler *prof, MonoMethod *method, MonoJitInfo *jinfo)
 }
 
 static void
+prof_inline_method (MonoProfiler *prof, MonoMethod *method, MonoMethod *inlined_method)
+{
+       prof_jit_done (prof, inlined_method, NULL);
+}
+
+static void
 usage (void)
 {
        mono_profiler_printf ("AOT profiler.");
@@ -396,6 +402,7 @@ mono_profiler_init_aot (const char *desc)
        MonoProfilerHandle handle = mono_profiler_create (&aot_profiler);
        mono_profiler_set_runtime_initialized_callback (handle, runtime_initialized);
        mono_profiler_set_jit_done_callback (handle, prof_jit_done);
+       mono_profiler_set_inline_method_callback (handle, prof_inline_method);
 }
 
 static void