Merge pull request #5101 from alexrp/profiler-api
authorAlex Rønne Petersen <alex@alexrp.com>
Thu, 6 Jul 2017 22:57:16 +0000 (00:57 +0200)
committerGitHub <noreply@github.com>
Thu, 6 Jul 2017 22:57:16 +0000 (00:57 +0200)
[runtime] New profiler API.

1  2 
mono/metadata/gc.c
mono/mini/tramp-arm.c
mono/mini/tramp-arm64.c

diff --combined mono/metadata/gc.c
index ab983e7be53b994d893a55407cb72f67a97ade11,4d8075ffd20e95189d99455dbd83d8035b00e401..467a9239d19ce288cf071fb35f080a4de963a54d
@@@ -32,7 -32,6 +32,7 @@@
  #include <mono/metadata/marshal.h> /* for mono_delegate_free_ftnptr () */
  #include <mono/metadata/attach.h>
  #include <mono/metadata/console-io.h>
 +#include <mono/metadata/w32process.h>
  #include <mono/utils/mono-os-semaphore.h>
  #include <mono/utils/mono-memory-model.h>
  #include <mono/utils/mono-counters.h>
@@@ -306,11 -305,11 +306,11 @@@ mono_gc_run_finalize (void *obj, void *
        if (log_finalizers)
                g_log ("mono-gc-finalizers", G_LOG_LEVEL_MESSAGE, "<%s at %p> Calling finalizer.", o->vtable->klass->name, o);
  
-       mono_profiler_gc_finalize_object_begin (o);
+       MONO_PROFILER_RAISE (gc_finalizing_object, (o));
  
        runtime_invoke (o, NULL, &exc, NULL);
  
-       mono_profiler_gc_finalize_object_end (o);
+       MONO_PROFILER_RAISE (gc_finalized_object, (o));
  
        if (log_finalizers)
                g_log ("mono-gc-finalizers", G_LOG_LEVEL_MESSAGE, "<%s at %p> Returned from finalizer.", o->vtable->klass->name, o);
@@@ -708,7 -707,6 +708,7 @@@ static volatile gboolean finished
   *
   *   Notify the finalizer thread that finalizers etc.
   * are available to be processed.
 + * This is async signal safe.
   */
  void
  mono_gc_finalize_notify (void)
@@@ -875,21 -873,19 +875,21 @@@ finalizer_thread (gpointer unused
  
                finalize_domain_objects ();
  
-               mono_profiler_gc_finalize_begin ();
+               MONO_PROFILER_RAISE (gc_finalizing, ());
  
                /* If finished == TRUE, mono_gc_cleanup has been called (from mono_runtime_cleanup),
                 * before the domain is unloaded.
                 */
                mono_gc_invoke_finalizers ();
  
-               mono_profiler_gc_finalize_end ();
+               MONO_PROFILER_RAISE (gc_finalized, ());
  
                mono_threads_join_threads ();
  
                reference_queue_proccess_all ();
  
 +              mono_w32process_signal_finished ();
 +
                hazard_free_queue_pump ();
  
                /* Avoid posting the pending done event until there are pending finalizers */
diff --combined mono/mini/tramp-arm.c
index 743abcb79c0bc879dd5dc203ecf83006130f2f21,82d3e95868cbc7cfeb73749282c80fbe1a644594..935a2ee6882c14839f1b5bd6e6c3721c826990a7
@@@ -395,7 -395,7 +395,7 @@@ mono_arch_create_generic_trampoline (Mo
  
        /* Flush instruction cache, since we've generated code */
        mono_arch_flush_icache (buf, code - buf);
-       mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL);
+       MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL));
  
        /* Sanity check */
        g_assert ((code - buf) <= buf_len);
@@@ -465,7 -465,7 +465,7 @@@ mono_arch_create_specific_trampoline (g
  
        /* Flush instruction cache, since we've generated code */
        mono_arch_flush_icache (buf, code - buf);
-       mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_SPECIFIC_TRAMPOLINE, mono_get_generic_trampoline_simple_name (tramp_type));
+       MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_SPECIFIC_TRAMPOLINE, mono_get_generic_trampoline_simple_name (tramp_type)));
  
        g_assert ((code - buf) <= size);
  
@@@ -502,7 -502,7 +502,7 @@@ mono_arch_get_unbox_trampoline (MonoMet
        *(guint32*)code = (guint32)addr;
        code += 4;
        mono_arch_flush_icache (start, code - start);
-       mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, m);
+       MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, m));
        g_assert ((code - start) <= size);
        /*g_print ("unbox trampoline at %d for %s:%s\n", this_pos, m->klass->name, m->name);
        g_print ("unbox code is at %p for method at %p\n", start, addr);*/
@@@ -534,7 -534,7 +534,7 @@@ mono_arch_get_static_rgctx_trampoline (
        g_assert ((code - start) <= buf_len);
  
        mono_arch_flush_icache (start, code - start);
-       mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL);
+       MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL));
  
        mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, unwind_ops), domain);
  
@@@ -648,7 -648,7 +648,7 @@@ mono_arch_create_rgctx_lazy_fetch_tramp
        }
  
        mono_arch_flush_icache (buf, code - buf);
-       mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL);
+       MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL));
  
        g_assert (code - buf <= tramp_size);
  
@@@ -683,7 -683,7 +683,7 @@@ mono_arch_create_general_rgctx_lazy_fet
        code = emit_bx (code, ARMREG_R1);
  
        mono_arch_flush_icache (buf, code - buf);
-       mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL);
+       MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL));
  
        g_assert (code - buf <= tramp_size);
  
@@@ -717,13 -717,14 +717,13 @@@ mono_arch_create_handler_block_trampoli
        /* Obtain jit_tls->handler_block_return_address */
        if (aot) {
                code = mono_arm_emit_aotconst (&ji, code, buf, ARMREG_R0, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_arm_handler_block_trampoline_helper");
 -              ARM_B (code, 0);
        } else {
                ARM_LDR_IMM (code, ARMREG_R0, ARMREG_PC, 0);
                ARM_B (code, 0);
                *(gpointer*)code = mono_arm_handler_block_trampoline_helper;
                code += 4;
        }
 -
 +      ARM_BLX_REG (code, ARMREG_R0);
        /* Set it as the return address so the trampoline will return to it */
        ARM_MOV_REG_REG (code, ARMREG_LR, ARMREG_R0);
  
        }
  
        mono_arch_flush_icache (buf, code - buf);
-       mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL);
+       MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL));
        g_assert (code - buf <= tramp_size);
  
        *info = mono_tramp_info_create ("handler_block_trampoline", buf, code - buf, ji, unwind_ops);
@@@ -823,7 -824,7 +823,7 @@@ mono_arch_create_sdb_trampoline (gboole
        ARM_LDM (code, ARMREG_IP, 0xffff);
  
        mono_arch_flush_icache (buf, code - buf);
-       mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL);
+       MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL));
  
        const char *tramp_name = single_step ? "sdb_single_step_trampoline" : "sdb_breakpoint_trampoline";
        *info = mono_tramp_info_create (tramp_name, buf, code - buf, ji, unwind_ops);
@@@ -979,7 -980,7 +979,7 @@@ mono_arch_get_enter_icall_trampoline (M
        g_assert (code - start < buf_len);
  
        mono_arch_flush_icache (start, code - start);
-       mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL);
+       MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL));
  
        if (info)
                *info = mono_tramp_info_create ("enter_icall_trampoline", start, code - start, ji, unwind_ops);
@@@ -1155,7 -1156,7 +1155,7 @@@ mono_arch_get_gsharedvt_arg_trampoline 
        g_assert ((code - buf) <= buf_len);
  
        mono_arch_flush_icache (buf, code - buf);
-       mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL);
+       MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL));
  
        mono_tramp_info_register (mono_tramp_info_create (NULL, buf, code - buf, NULL, NULL), domain);
  
diff --combined mono/mini/tramp-arm64.c
index 7bacbab79dd46171404c078d90abb7a3a5be5ccc,45e18d880aad9724d70a4bffa49cb106393ceebb..dab24adaf70ae6747a2ba60f30a0627559dd92c2
@@@ -539,16 -539,14 +539,16 @@@ mono_arch_create_handler_block_trampoli
        /*
         * We are in a method frame after the call emitted by OP_CALL_HANDLER.
         */
 +      /* Call a helper to obtain jit_tls->handler_block_return_address */
        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);
 +      arm_blrx (code, ARMREG_IP0);
        /* Set it as the return address so the trampoline will return to it */
        arm_movx (code, ARMREG_LR, ARMREG_IP0);
  
 -      /* Call the trampoline */
 +      /* Call the C trampoline function */
        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);
        arm_brx (code, ARMREG_IP0);
  
        mono_arch_flush_icache (buf, code - buf);
-       mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL);
+       MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL));
        g_assert (code - buf <= tramp_size);
  
        *info = mono_tramp_info_create ("handler_block_trampoline", buf, code - buf, ji, unwind_ops);
@@@ -808,7 -806,7 +808,7 @@@ mono_arch_get_enter_icall_trampoline (M
        g_assert (code - start < buf_len);
  
        mono_arch_flush_icache (start, code - start);
-       mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL);
+       MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL));
  
        if (info)
                *info = mono_tramp_info_create ("enter_icall_trampoline", start, code - start, ji, unwind_ops);