From f015afaf3d315ff34cece5ad7280585db15aa698 Mon Sep 17 00:00:00 2001 From: Sanjam Panda Date: Thu, 20 Apr 2023 15:48:49 +0200 Subject: [PATCH 1/8] added support for JITDEBUG_INFO --- src/mono/mono/mini/mini-runtime.c | 92 ++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index 18a237024c7515..d182f4d513f6d1 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -2015,7 +2015,7 @@ static clockid_t clock_id = CLOCK_MONOTONIC; enum { JIT_DUMP_MAGIC = 0x4A695444, - JIT_DUMP_VERSION = 2, + JIT_DUMP_VERSION = 1, #if HOST_X86 ELF_MACHINE = EM_386, #elif HOST_AMD64 @@ -2031,7 +2031,8 @@ enum { #elif HOST_RISCV ELF_MACHINE = EM_RISCV, #endif - JIT_CODE_LOAD = 0 + JIT_CODE_LOAD = 0, + JIT_DEBUG_INFO = 2 }; typedef struct { @@ -2062,7 +2063,22 @@ typedef struct // Null terminated function name // Native code } JitCodeLoadRecord; +typedef struct +{ + guint64 code_addr; + guint32 line; + guint32 discrim; + char name[]; +}DebugEntry; +typedef struct +{ + RecordHeader header; + guint64 code_addr; + guint64 nr_entry; + DebugEntry debug_entry[]; +}JitCodeDebug; +static void add_basic_JitCodeDebug_info(JitCodeDebug *record); static void add_file_header_info (FileHeader *header); static void add_basic_JitCodeLoadRecord_info (JitCodeLoadRecord *record); @@ -2128,6 +2144,72 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) record.code_index = ++code_index; + DebugEntry ent; + JitCodeDebug rec; + MonoDebugMethodInfo *minfo; + MonoDebugMethodJitInfo *dmji; + MonoDebugSourceLocation *loc; + int i; + + memset(&rec, 0, sizeof(rec)); + + minfo = mono_debug_lookup_method(jinfo->d.method); + dmji = mono_debug_find_method( jinfo->d.method, NULL); + + add_basic_JitCodeDebug_info(&rec); + rec.code_addr = (guint64)dmji->code_start; + rec.header.total_size = sizeof(rec) + sizeof(ent) + 1; + rec.nr_entry=1; + for(i=0;i < dmji->num_line_numbers;++i) + { + loc = mono_debug_lookup_source_location_by_il(jinfo->d.method,dmji->line_numbers[i].il_offset,NULL); + + if(!(loc)) + { + continue; + } + if(!(loc->source_file)) + { + mono_debug_free_source_location(loc); + continue; + } + + rec.header.total_size += sizeof(ent) + strlen(loc->source_file) + 1; + rec.nr_entry++; + } + + fwrite(&rec,sizeof(rec), 1 ,perf_dump_file); + + + for( i = 0; i < dmji->num_line_numbers;++i) + { + loc = mono_debug_lookup_source_location_by_il(jinfo->d.method,dmji->line_numbers[i].il_offset,NULL); + + if(!loc) + continue; + if(!(loc->source_file)) + { + mono_debug_free_source_location(loc); + continue; + } + + ent.code_addr = (guint64)dmji->code_start + dmji->line_numbers[i].native_offset; + ent.discrim = 0; + ent.line = (guint32)loc->row; + + + + fwrite(&ent, sizeof(ent),1,perf_dump_file); + fwrite(loc->source_file,strlen(loc->source_file)+1,1,perf_dump_file); + } + + // TODO: write unwindInfo immediately before the JitCodeLoadRecord (while lock is held). + ent.code_addr = (guint64)jinfo->code_start + jinfo->code_size; + ent.discrim = 0; + ent.line = 0; + fwrite(&ent,sizeof(ent),1,perf_dump_file); + fwrite("",1,1,perf_dump_file); + // TODO: write debugInfo and unwindInfo immediately before the JitCodeLoadRecord (while lock is held). record.header.timestamp = mono_clock_get_time_ns (clock_id); @@ -2139,7 +2221,13 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) mono_os_mutex_unlock (&perf_dump_mutex); } } +static void +add_basic_JitCodeDebug_info(JitCodeDebug *record) +{ + record->header.id = JIT_DEBUG_INFO; + record->header.timestamp = mono_clock_get_time_ns (clock_id); +} static void add_basic_JitCodeLoadRecord_info (JitCodeLoadRecord *record) { From 9c1fdd7282b264b1718c817b8959dda82b721699 Mon Sep 17 00:00:00 2001 From: Sanjam Panda <36253777+saitama951@users.noreply.github.com> Date: Thu, 20 Apr 2023 19:37:57 +0530 Subject: [PATCH 2/8] added comments --- src/mono/mono/mini/mini-runtime.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index d182f4d513f6d1..52c2ecde612199 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -2152,7 +2152,8 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) int i; memset(&rec, 0, sizeof(rec)); - + + //populating info relating debug methods minfo = mono_debug_lookup_method(jinfo->d.method); dmji = mono_debug_find_method( jinfo->d.method, NULL); @@ -2183,6 +2184,7 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) for( i = 0; i < dmji->num_line_numbers;++i) { + //get the line number using il offset loc = mono_debug_lookup_source_location_by_il(jinfo->d.method,dmji->line_numbers[i].il_offset,NULL); if(!loc) @@ -2203,14 +2205,14 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) fwrite(loc->source_file,strlen(loc->source_file)+1,1,perf_dump_file); } - // TODO: write unwindInfo immediately before the JitCodeLoadRecord (while lock is held). + ent.code_addr = (guint64)jinfo->code_start + jinfo->code_size; ent.discrim = 0; ent.line = 0; fwrite(&ent,sizeof(ent),1,perf_dump_file); fwrite("",1,1,perf_dump_file); - // TODO: write debugInfo and unwindInfo immediately before the JitCodeLoadRecord (while lock is held). + // TODO: write unwindInfo immediately before the JitCodeLoadRecord (while lock is held). record.header.timestamp = mono_clock_get_time_ns (clock_id); From bf5341359aa71cb42daaadc7b9c71d858faa3b1b Mon Sep 17 00:00:00 2001 From: Sanjam Panda <36253777+saitama951@users.noreply.github.com> Date: Thu, 20 Apr 2023 20:10:01 +0530 Subject: [PATCH 3/8] Update mini-runtime.c --- src/mono/mono/mini/mini-runtime.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index 52c2ecde612199..5ecdd948fdff59 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include From b8c7554f200b19157e237b1367406b1bfdba5d2d Mon Sep 17 00:00:00 2001 From: Sanjam Panda <36253777+saitama951@users.noreply.github.com> Date: Fri, 21 Apr 2023 10:17:54 +0530 Subject: [PATCH 4/8] made changes to coding conventions --- src/mono/mono/mini/mini-runtime.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index 5ecdd948fdff59..703c551a1ef0b9 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -2162,16 +2162,14 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) rec.code_addr = (guint64)dmji->code_start; rec.header.total_size = sizeof(rec) + sizeof(ent) + 1; rec.nr_entry=1; - for(i=0;i < dmji->num_line_numbers;++i) - { - loc = mono_debug_lookup_source_location_by_il(jinfo->d.method,dmji->line_numbers[i].il_offset,NULL); + for(i=0;i < dmji->num_line_numbers;++i){ + + loc = mono_debug_lookup_source_location_by_il(jinfo->d.method,dmji->line_numbers[i].il_offset,NULL); - if(!(loc)) - { + if(!(loc) continue; - } - if(!(loc->source_file)) - { + + if(!(loc->source_file)){ mono_debug_free_source_location(loc); continue; } @@ -2183,16 +2181,17 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) fwrite(&rec,sizeof(rec), 1 ,perf_dump_file); - for( i = 0; i < dmji->num_line_numbers;++i) - { + for( i = 0; i < dmji->num_line_numbers;++i){ + //get the line number using il offset loc = mono_debug_lookup_source_location_by_il(jinfo->d.method,dmji->line_numbers[i].il_offset,NULL); if(!loc) continue; - if(!(loc->source_file)) - { - mono_debug_free_source_location(loc); + + if(!(loc->source_file)){ + + mono_debug_free_source_location(loc); continue; } @@ -2200,8 +2199,6 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) ent.discrim = 0; ent.line = (guint32)loc->row; - - fwrite(&ent, sizeof(ent),1,perf_dump_file); fwrite(loc->source_file,strlen(loc->source_file)+1,1,perf_dump_file); } From 2abb0f44acaec1c6eebd96b2419c2cdfc64d5a63 Mon Sep 17 00:00:00 2001 From: Sanjam Panda <36253777+saitama951@users.noreply.github.com> Date: Mon, 24 Apr 2023 09:43:12 +0530 Subject: [PATCH 5/8] Update mini-runtime.c --- src/mono/mono/mini/mini-runtime.c | 44 +++++++++++++++---------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index 703c551a1ef0b9..d87ac01bbd8d74 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -2152,46 +2152,46 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) MonoDebugSourceLocation *loc; int i; - memset(&rec, 0, sizeof(rec)); + memset (&rec, 0, sizeof(rec)); //populating info relating debug methods - minfo = mono_debug_lookup_method(jinfo->d.method); - dmji = mono_debug_find_method( jinfo->d.method, NULL); + minfo = mono_debug_lookup_method (jinfo->d.method); + dmji = mono_debug_find_method (jinfo->d.method, NULL); - add_basic_JitCodeDebug_info(&rec); + add_basic_JitCodeDebug_info (&rec); rec.code_addr = (guint64)dmji->code_start; - rec.header.total_size = sizeof(rec) + sizeof(ent) + 1; - rec.nr_entry=1; - for(i=0;i < dmji->num_line_numbers;++i){ + rec.header.total_size = sizeof (rec) + sizeof (ent) + 1; + rec.nr_entry = 1; + for (i = 0; i < dmji->num_line_numbers; ++i){ - loc = mono_debug_lookup_source_location_by_il(jinfo->d.method,dmji->line_numbers[i].il_offset,NULL); + loc = mono_debug_lookup_source_location_by_il (jinfo->d.method,dmji->line_numbers[i].il_offset,NULL); - if(!(loc) + if(!loc) continue; - if(!(loc->source_file)){ - mono_debug_free_source_location(loc); + if(!loc->source_file){ + mono_debug_free_source_location (loc); continue; } - rec.header.total_size += sizeof(ent) + strlen(loc->source_file) + 1; + rec.header.total_size += sizeof (ent) + strlen (loc->source_file) + 1; rec.nr_entry++; } - fwrite(&rec,sizeof(rec), 1 ,perf_dump_file); + fwrite (&rec, sizeof (rec), 1 , perf_dump_file); - for( i = 0; i < dmji->num_line_numbers;++i){ + for( i = 0; i < dmji->num_line_numbers; ++i){ //get the line number using il offset - loc = mono_debug_lookup_source_location_by_il(jinfo->d.method,dmji->line_numbers[i].il_offset,NULL); + loc = mono_debug_lookup_source_location_by_il (jinfo->d.method, dmji->line_numbers[i].il_offset, NULL); if(!loc) continue; - if(!(loc->source_file)){ + if(!loc->source_file){ - mono_debug_free_source_location(loc); + mono_debug_free_source_location (loc); continue; } @@ -2199,16 +2199,16 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) ent.discrim = 0; ent.line = (guint32)loc->row; - fwrite(&ent, sizeof(ent),1,perf_dump_file); - fwrite(loc->source_file,strlen(loc->source_file)+1,1,perf_dump_file); + fwrite (&ent, sizeof(ent), 1, perf_dump_file); + fwrite (loc->source_file, strlen (loc->source_file) + 1, 1, perf_dump_file); } ent.code_addr = (guint64)jinfo->code_start + jinfo->code_size; ent.discrim = 0; ent.line = 0; - fwrite(&ent,sizeof(ent),1,perf_dump_file); - fwrite("",1,1,perf_dump_file); + fwrite (&ent, sizeof (ent), 1, perf_dump_file); + fwrite ("", 1, 1, perf_dump_file); // TODO: write unwindInfo immediately before the JitCodeLoadRecord (while lock is held). @@ -2222,7 +2222,7 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) } } static void -add_basic_JitCodeDebug_info(JitCodeDebug *record) +add_basic_JitCodeDebug_info (JitCodeDebug *record) { record->header.id = JIT_DEBUG_INFO; record->header.timestamp = mono_clock_get_time_ns (clock_id); From c68edd630acfa66e793f3e9f69eb3feddf6f1793 Mon Sep 17 00:00:00 2001 From: Sanjam Panda <36253777+saitama951@users.noreply.github.com> Date: Mon, 24 Apr 2023 09:44:26 +0530 Subject: [PATCH 6/8] Update mini-runtime.c --- src/mono/mono/mini/mini-runtime.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index d87ac01bbd8d74..935c435f5245f5 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -2070,16 +2070,16 @@ typedef struct guint32 line; guint32 discrim; char name[]; -}DebugEntry; +} DebugEntry; typedef struct { RecordHeader header; guint64 code_addr; guint64 nr_entry; DebugEntry debug_entry[]; -}JitCodeDebug; +} JitCodeDebug; -static void add_basic_JitCodeDebug_info(JitCodeDebug *record); +static void add_basic_JitCodeDebug_info (JitCodeDebug *record); static void add_file_header_info (FileHeader *header); static void add_basic_JitCodeLoadRecord_info (JitCodeLoadRecord *record); From 202c5decb7e3756e523fc3912f734db3ce63ffef Mon Sep 17 00:00:00 2001 From: Sanjam Panda <36253777+saitama951@users.noreply.github.com> Date: Mon, 24 Apr 2023 09:50:57 +0530 Subject: [PATCH 7/8] Update mini-runtime.c --- src/mono/mono/mini/mini-runtime.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index 935c435f5245f5..ff7fd08fd8a440 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -2164,7 +2164,7 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) rec.nr_entry = 1; for (i = 0; i < dmji->num_line_numbers; ++i){ - loc = mono_debug_lookup_source_location_by_il (jinfo->d.method,dmji->line_numbers[i].il_offset,NULL); + loc = mono_debug_lookup_source_location_by_il (jinfo->d.method, dmji->line_numbers[i].il_offset, NULL); if(!loc) continue; @@ -2178,7 +2178,7 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) rec.nr_entry++; } - fwrite (&rec, sizeof (rec), 1 , perf_dump_file); + fwrite (&rec, sizeof (rec), 1, perf_dump_file); for( i = 0; i < dmji->num_line_numbers; ++i){ From 4b359cf1d4f37bc3f532b461a888ec6f14c3cdd2 Mon Sep 17 00:00:00 2001 From: Sanjam Panda <36253777+saitama951@users.noreply.github.com> Date: Mon, 24 Apr 2023 09:51:47 +0530 Subject: [PATCH 8/8] Update mini-runtime.c --- src/mono/mono/mini/mini-runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index ff7fd08fd8a440..2a83ac9308bdb6 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -2152,7 +2152,7 @@ mono_emit_jit_dump (MonoJitInfo *jinfo, gpointer code) MonoDebugSourceLocation *loc; int i; - memset (&rec, 0, sizeof(rec)); + memset (&rec, 0, sizeof (rec)); //populating info relating debug methods minfo = mono_debug_lookup_method (jinfo->d.method);