From f0f4a22ae1693f1df4aef43d2153b47dabc65df2 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Wed, 4 Oct 2017 08:34:31 +0200 Subject: [PATCH] [coverage-profiler] Collect coverage data at IL seq point locations. (#5667) * [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 | 50 ++++++++++++++++++++-------------------- mono/profiler/coverage.c | 6 ++--- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c index 54e8c3580bf..8df37c178d6 100644 --- a/mono/mini/method-to-ir.c +++ b/mono/mini/method-to-ir.c @@ -7286,7 +7286,10 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b 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; @@ -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->coverage_info = mono_profiler_coverage_alloc (cfg->method, header->code_size); - /* 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); - } - - 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)); diff --git a/mono/profiler/coverage.c b/mono/profiler/coverage.c index 5a9d5b69c4f..de8f5207b0a 100644 --- a/mono/profiler/coverage.c +++ b/mono/profiler/coverage.c @@ -47,8 +47,7 @@ * - token * - 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 @@ -200,12 +199,11 @@ obtain_coverage_for_method (MonoProfiler *prof, const MonoProfilerCoverageData * { 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; - 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; -- 2.25.1