Merge pull request #4048 from kumpera/iface_casting_cleanup
[mono.git] / mono / mini / mini.c
index 30609c8352c15ad84590eceef122c472d462c3ba..0f26b72293a7e9548bd6c1dd720f2406f906f66c 100644 (file)
@@ -86,6 +86,10 @@ int mono_break_at_bb_bb_num;
 gboolean mono_do_x86_stack_align = TRUE;
 gboolean mono_using_xdebug;
 
+/* Counters */
+static guint32 discarded_code;
+static double discarded_jit_time;
+
 #define mono_jit_lock() mono_os_mutex_lock (&jit_mutex)
 #define mono_jit_unlock() mono_os_mutex_unlock (&jit_mutex)
 static mono_mutex_t jit_mutex;
@@ -2143,8 +2147,10 @@ mono_compile_create_vars (MonoCompile *cfg)
 
        cfg->args = (MonoInst **)mono_mempool_alloc0 (cfg->mempool, (sig->param_count + sig->hasthis) * sizeof (MonoInst*));
 
-       if (sig->hasthis)
+       if (sig->hasthis) {
                cfg->args [0] = mono_compile_create_var (cfg, &cfg->method->klass->this_arg, OP_ARG);
+               cfg->this_arg = cfg->args [0];
+       }
 
        for (i = 0; i < sig->param_count; ++i) {
                cfg->args [i + sig->hasthis] = mono_compile_create_var (cfg, sig->params [i], OP_ARG);
@@ -2414,13 +2420,10 @@ mono_codegen (MonoCompile *cfg)
  
        if (cfg->verbose_level > 0) {
                char* nm = mono_method_get_full_name (cfg->method);
-               char *opt_descr = mono_opt_descr (cfg->opt);
-               g_print ("Method %s emitted at %p to %p (code length %d) [%s] with opts %s\n", 
+               g_print ("Method %s emitted at %p to %p (code length %d) [%s]\n",
                                 nm, 
-                                cfg->native_code, cfg->native_code + cfg->code_len, cfg->code_len, cfg->domain->friendly_name,
-                                opt_descr);
+                                cfg->native_code, cfg->native_code + cfg->code_len, cfg->code_len, cfg->domain->friendly_name);
                g_free (nm);
-               g_free (opt_descr);
        }
 
        {
@@ -2944,7 +2947,8 @@ is_open_method (MonoMethod *method)
        return FALSE;
 }
 
-static void mono_insert_nop_in_empty_bb (MonoCompile *cfg)
+static void
+mono_insert_nop_in_empty_bb (MonoCompile *cfg)
 {
        MonoBasicBlock *bb;
        for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
@@ -4286,7 +4290,9 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, in
 
        jit_timer = mono_time_track_start ();
        cfg = mini_method_compile (method, opt, target_domain, JIT_FLAG_RUN_CCTORS, 0, -1);
-       mono_time_track_end (&mono_jit_stats.jit_time, jit_timer);
+       double jit_time = 0.0;
+       mono_time_track_end (&jit_time, jit_timer);
+       mono_jit_stats.jit_time += jit_time;
 
        prof_method = cfg->method;
 
@@ -4354,7 +4360,8 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, in
                /* We can't use a domain specific method in another domain */
                if ((target_domain == mono_domain_get ()) || info->domain_neutral) {
                        code = info->code_start;
-//                     printf("Discarding code for method %s\n", method->name);
+                       discarded_code ++;
+                       discarded_jit_time += jit_time;
                }
        }
        if (code == NULL) {
@@ -4474,6 +4481,9 @@ mini_get_underlying_type (MonoType *type)
 void
 mini_jit_init (void)
 {
+       mono_counters_register ("Discarded method code", MONO_COUNTER_JIT | MONO_COUNTER_INT, &discarded_code);
+       mono_counters_register ("Time spent JITting discarded code", MONO_COUNTER_JIT | MONO_COUNTER_DOUBLE, &discarded_jit_time);
+
        mono_os_mutex_init_recursive (&jit_mutex);
 #ifndef DISABLE_JIT
        current_backend = g_new0 (MonoBackend, 1);