[coverage-profiler] Collect coverage data at IL seq point locations. (#5667)
authorZoltan Varga <vargaz@gmail.com>
Wed, 4 Oct 2017 06:34:31 +0000 (08:34 +0200)
committerGitHub <noreply@github.com>
Wed, 4 Oct 2017 06:34:31 +0000 (08:34 +0200)
* [coverage-profiler] Collect coverage data at IL seq point locations.

* [coverage-profiler] Emit IL offsets instead of offsets between IL offsets. Bump format version.

mono/mini/method-to-ir.c
mono/profiler/coverage.c

index 54e8c3580bf1ac6270c750908ad59a82b1165102..8df37c178d64cab31e36c9db208bbe40d02f8163 100644 (file)
@@ -7286,7 +7286,10 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                seq_points = FALSE;
        }
 
                seq_points = FALSE;
        }
 
-       if (cfg->gen_sdb_seq_points && cfg->method == method) {
+       if (cfg->method == method)
+               cfg->coverage_info = mono_profiler_coverage_alloc (cfg->method, header->code_size);
+
+       if ((cfg->gen_sdb_seq_points && cfg->method == method) || cfg->coverage_info) {
                minfo = mono_debug_lookup_method (method);
                if (minfo) {
                        MonoSymSeqPoint *sps;
                minfo = mono_debug_lookup_method (method);
                if (minfo) {
                        MonoSymSeqPoint *sps;
@@ -7381,9 +7384,6 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
 
        cfg->dont_inline = g_list_prepend (cfg->dont_inline, method);
        if (cfg->method == method) {
 
        cfg->dont_inline = g_list_prepend (cfg->dont_inline, method);
        if (cfg->method == method) {
-
-               cfg->coverage_info = mono_profiler_coverage_alloc (cfg->method, header->code_size);
-
                /* ENTRY BLOCK */
                NEW_BBLOCK (cfg, start_bblock);
                cfg->bb_entry = start_bblock;
                /* ENTRY BLOCK */
                NEW_BBLOCK (cfg, start_bblock);
                cfg->bb_entry = start_bblock;
@@ -7774,33 +7774,33 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
 
                        if (sym_seq_points)
                                mono_bitset_set_fast (seq_point_set_locs, ip - header->code);
 
                        if (sym_seq_points)
                                mono_bitset_set_fast (seq_point_set_locs, ip - header->code);
-               }
-
-               cfg->cbb->real_offset = cfg->real_offset;
 
 
-               if ((cfg->method == method) && cfg->coverage_info) {
-                       guint32 cil_offset = ip - header->code;
-                       gpointer counter = &cfg->coverage_info->data [cil_offset].count;
-                       cfg->coverage_info->data [cil_offset].cil_code = ip;
+                       if ((cfg->method == method) && cfg->coverage_info) {
+                               guint32 cil_offset = ip - header->code;
+                               gpointer counter = &cfg->coverage_info->data [cil_offset].count;
+                               cfg->coverage_info->data [cil_offset].cil_code = ip;
 
 
-                       if (mono_arch_opcode_supported (OP_ATOMIC_ADD_I4)) {
-                               MonoInst *one_ins, *load_ins;
+                               if (mono_arch_opcode_supported (OP_ATOMIC_ADD_I4)) {
+                                       MonoInst *one_ins, *load_ins;
 
 
-                               EMIT_NEW_PCONST (cfg, load_ins, counter);
-                               EMIT_NEW_ICONST (cfg, one_ins, 1);
-                               MONO_INST_NEW (cfg, ins, OP_ATOMIC_ADD_I4);
-                               ins->dreg = mono_alloc_ireg (cfg);
-                               ins->inst_basereg = load_ins->dreg;
-                               ins->inst_offset = 0;
-                               ins->sreg2 = one_ins->dreg;
-                               ins->type = STACK_I4;
-                               MONO_ADD_INS (cfg->cbb, ins);
-                       } else {
-                               EMIT_NEW_PCONST (cfg, ins, counter);
-                               MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STORE_MEMBASE_IMM, ins->dreg, 0, 1);
+                                       EMIT_NEW_PCONST (cfg, load_ins, counter);
+                                       EMIT_NEW_ICONST (cfg, one_ins, 1);
+                                       MONO_INST_NEW (cfg, ins, OP_ATOMIC_ADD_I4);
+                                       ins->dreg = mono_alloc_ireg (cfg);
+                                       ins->inst_basereg = load_ins->dreg;
+                                       ins->inst_offset = 0;
+                                       ins->sreg2 = one_ins->dreg;
+                                       ins->type = STACK_I4;
+                                       MONO_ADD_INS (cfg->cbb, ins);
+                               } else {
+                                       EMIT_NEW_PCONST (cfg, ins, counter);
+                                       MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STORE_MEMBASE_IMM, ins->dreg, 0, 1);
+                               }
                        }
                }
 
                        }
                }
 
+               cfg->cbb->real_offset = cfg->real_offset;
+
                if (cfg->verbose_level > 3)
                        printf ("converting (in B%d: stack: %d) %s", cfg->cbb->block_num, (int)(sp - stack_start), mono_disasm_code_one (NULL, method, ip, NULL));
 
                if (cfg->verbose_level > 3)
                        printf ("converting (in B%d: stack: %d) %s", cfg->cbb->block_num, (int)(sp - stack_start), mono_disasm_code_one (NULL, method, ip, NULL));
 
index 5a9d5b69c4fa0f2083f23df6bd06ef3344dd03f9..de8f5207b0afde32a72ae0666d796726ad1ce4fa 100644 (file)
@@ -47,8 +47,7 @@
  *                 - token
  *   <statement> - Contains data about IL statements. Has no child elements
  *                 Attributes:
  *                 - token
  *   <statement> - Contains data about IL statements. Has no child elements
  *                 Attributes:
- *                    - offset: The offset of the statement in the IL code after the previous
- *                              statement's offset
+ *                    - offset: The offset of the statement in the IL code
  *                    - counter: 1 if the line was covered, 0 if it was not
  *                    - line: The line number in the parent method's file
  *                    - column: The column on the line
  *                    - counter: 1 if the line was covered, 0 if it was not
  *                    - line: The line number in the parent method's file
  *                    - column: The column on the line
@@ -200,12 +199,11 @@ obtain_coverage_for_method (MonoProfiler *prof, const MonoProfilerCoverageData *
 {
        g_assert (prof == &coverage_profiler);
 
 {
        g_assert (prof == &coverage_profiler);
 
-       int offset = entry->il_offset - coverage_profiler.previous_offset;
        CoverageEntry *e = g_new (CoverageEntry, 1);
 
        coverage_profiler.previous_offset = entry->il_offset;
 
        CoverageEntry *e = g_new (CoverageEntry, 1);
 
        coverage_profiler.previous_offset = entry->il_offset;
 
-       e->offset = offset;
+       e->offset = entry->il_offset;
        e->counter = entry->counter;
        e->filename = g_strdup(entry->file_name ? entry->file_name : "");
        e->line = entry->line;
        e->counter = entry->counter;
        e->filename = g_strdup(entry->file_name ? entry->file_name : "");
        e->line = entry->line;