[profiler] Split method_leave callback into a method_tail_call callback.
[mono.git] / mono / profiler / log.c
index 3d4c147cdaebf2d55c27fc10b6bc1b6b64382632..8a3790aac248ed44baa2d156137da838cfb65e42 100644 (file)
@@ -1791,6 +1791,12 @@ method_leave (MonoProfiler *prof, MonoMethod *method, MonoProfilerCallContext *c
        }
 }
 
+static void
+tail_call (MonoProfiler *prof, MonoMethod *method, MonoMethod *target)
+{
+       method_leave (prof, method, NULL);
+}
+
 static void
 method_exc_leave (MonoProfiler *prof, MonoMethod *method, MonoObject *exc)
 {
@@ -1810,7 +1816,10 @@ method_exc_leave (MonoProfiler *prof, MonoMethod *method, MonoObject *exc)
 static MonoProfilerCallInstrumentationFlags
 method_filter (MonoProfiler *prof, MonoMethod *method)
 {
-       return MONO_PROFILER_CALL_INSTRUMENTATION_PROLOGUE | MONO_PROFILER_CALL_INSTRUMENTATION_EPILOGUE;
+       return MONO_PROFILER_CALL_INSTRUMENTATION_ENTER |
+              MONO_PROFILER_CALL_INSTRUMENTATION_LEAVE |
+              MONO_PROFILER_CALL_INSTRUMENTATION_TAIL_CALL |
+              MONO_PROFILER_CALL_INSTRUMENTATION_EXCEPTION_LEAVE;
 }
 
 static void
@@ -4735,6 +4744,7 @@ mono_profiler_init_log (const char *desc)
                mono_profiler_set_call_instrumentation_filter_callback (handle, method_filter);
                mono_profiler_set_method_enter_callback (handle, method_enter);
                mono_profiler_set_method_leave_callback (handle, method_leave);
+               mono_profiler_set_method_tail_call_callback (handle, tail_call);
                mono_profiler_set_method_exception_leave_callback (handle, method_exc_leave);
        }