From 2961e54ab4533db1cddf8e7e0301e680e1c7c5f5 Mon Sep 17 00:00:00 2001 From: Bernhard Urban-Forster Date: Mon, 2 Dec 2019 19:04:13 +0100 Subject: [PATCH] [profiler] disable inlining when coverage profiler is used and fix allocation sizes (mono/mono#17986) * [profiler] let compiler decide about the size of an entry * [profiler] disable inlining when coverage profiler is used Commit migrated from https://github.com/mono/mono/commit/a9a0a1e5b95a93cd3d3f73c8eeafe7e64da4acd8 --- src/mono/mono/metadata/profiler-private.h | 10 ++++++---- src/mono/mono/metadata/profiler.c | 2 +- src/mono/mono/mini/method-to-ir.c | 5 +++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/mono/mono/metadata/profiler-private.h b/src/mono/mono/metadata/profiler-private.h index e03d332..6fe7249 100644 --- a/src/mono/mono/metadata/profiler-private.h +++ b/src/mono/mono/metadata/profiler-private.h @@ -98,11 +98,13 @@ typedef struct { extern MonoProfilerState mono_profiler_state; typedef struct { + guchar *cil_code; + guint32 count; +} MonoProfilerCoverageInfoEntry; + +typedef struct { guint32 entries; - struct { - guchar *cil_code; - guint32 count; - } data [1]; + MonoProfilerCoverageInfoEntry data [MONO_ZERO_LEN_ARRAY]; } MonoProfilerCoverageInfo; void mono_profiler_started (void); diff --git a/src/mono/mono/metadata/profiler.c b/src/mono/mono/metadata/profiler.c index 7b6b971..1435981 100644 --- a/src/mono/mono/metadata/profiler.c +++ b/src/mono/mono/metadata/profiler.c @@ -435,7 +435,7 @@ mono_profiler_coverage_alloc (MonoMethod *method, guint32 entries) coverage_lock (); - MonoProfilerCoverageInfo *info = g_malloc0 (sizeof (MonoProfilerCoverageInfo) + SIZEOF_VOID_P * 2 * entries); + MonoProfilerCoverageInfo *info = g_malloc0 (sizeof (MonoProfilerCoverageInfo) + sizeof (MonoProfilerCoverageInfoEntry) * entries); info->entries = entries; diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c index 7d73606..65e1947 100644 --- a/src/mono/mono/mini/method-to-ir.c +++ b/src/mono/mono/mini/method-to-ir.c @@ -6005,6 +6005,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b gboolean emitted_funccall_seq_point = FALSE; cfg->disable_inline = is_jit_optimizer_disabled (method); + cfg->current_method = method; image = m_class_get_image (method->klass); @@ -6049,6 +6050,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (cfg->compile_aot) g_error ("Coverage profiling is not supported with AOT."); + INLINE_FAILURE ("coverage profiling"); + cfg->coverage_info = mono_profiler_coverage_alloc (cfg->method, header->code_size); } @@ -6133,8 +6136,6 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b cfg->cil_offset_to_bb = (MonoBasicBlock **)mono_mempool_alloc0 (cfg->mempool, sizeof (MonoBasicBlock*) * header->code_size); cfg->cil_offset_to_bb_len = header->code_size; - cfg->current_method = method; - if (cfg->verbose_level > 2) printf ("method to IR %s\n", mono_method_full_name (method, TRUE)); -- 2.7.4