[profiler] Avoid instrumenting inlined methods
authorUri Simchoni <uri@vfunction.com>
Mon, 7 Aug 2017 04:39:12 +0000 (07:39 +0300)
committerUri Simchoni <uri@vfunction.com>
Mon, 7 Aug 2017 16:54:45 +0000 (19:54 +0300)
An inlined method does not require instrumentation (if it
did, it would not have been inlined). The flags that
control instrumentation options are valid for the caller
method and are not to be consulted.

This patch replaces an assertion with a check and early
return. A method that "wants to be instrumented" does not
get inlined, but a method that "doesn't want to be instrumented"
can get inlined. However, the flags that control instrumention
options have been calculated against the caller method, hence
they should not be consulted at all. The extra check renders
the assertion unnecessary.

mono/mini/mini-profiler.c

index 1e79ecc4099b661d95d670ce0f3e9a1187adf50d..33d39e26df6dfd138048a92d165837685dc546ea 100644 (file)
@@ -20,6 +20,13 @@ mini_profiler_emit_instrumentation_call (MonoCompile *cfg, void *func, gboolean
 {
        gboolean instrument, capture;
 
+       /*
+        * Do not instrument an inlined method - it becomes
+        * part of the current method.
+        */
+       if (cfg->current_method != cfg->method)
+               return;
+
        if (entry) {
                instrument = cfg->prof_flags & MONO_PROFILER_CALL_INSTRUMENTATION_PROLOGUE;
                capture = cfg->prof_flags & MONO_PROFILER_CALL_INSTRUMENTATION_PROLOGUE_CONTEXT;
@@ -31,8 +38,6 @@ mini_profiler_emit_instrumentation_call (MonoCompile *cfg, void *func, gboolean
        if (!instrument)
                return;
 
-       g_assert (cfg->current_method == cfg->method);
-
        MonoInst *iargs [2];
 
        EMIT_NEW_METHODCONST (cfg, iargs [0], cfg->method);