From f1c4cfc577704813c20e0a5ce5ff09fa68dc61ac Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Thu, 3 Jun 2010 17:24:57 +0000 Subject: [PATCH] 2010-06-03 Zoltan Varga * dwarfwriter.c: Update after the mono_debug_lookup_locals () changes. * debugger-agent.c (method_commands_internal): Ditto. Return scope information for locals. svn path=/trunk/mono/; revision=158421 --- mono/mini/ChangeLog | 7 +++++++ mono/mini/debugger-agent.c | 33 ++++++++++++++++++++++----------- mono/mini/dwarfwriter.c | 27 ++++++++++++++++----------- 3 files changed, 45 insertions(+), 22 deletions(-) diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog index bf98783c46a..018e010bfcb 100755 --- a/mono/mini/ChangeLog +++ b/mono/mini/ChangeLog @@ -1,3 +1,10 @@ +2010-06-03 Zoltan Varga + + * dwarfwriter.c: Update after the mono_debug_lookup_locals () changes. + + * debugger-agent.c (method_commands_internal): Ditto. Return scope information for + locals. + 2010-06-03 Zoltan Varga * debugger-agent.c (appdomain_unload): Clear all breakpoint instances in the dying diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index b1fe1556815..2c4d3009537 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -5983,8 +5983,7 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g } case CMD_METHOD_GET_LOCALS_INFO: { int i, j, num_locals; - char **local_names; - int *local_indexes; + MonoDebugLocalsInfo *locals; header = mono_method_get_header (method); g_assert (header); @@ -5996,27 +5995,39 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g buffer_add_typeid (buf, domain, mono_class_from_mono_type (header->locals [i])); /* Names */ - num_locals = mono_debug_lookup_locals (method, &local_names, &local_indexes); + locals = mono_debug_lookup_locals (method); + if (locals) + num_locals = locals->num_locals; + else + num_locals = 0; for (i = 0; i < header->num_locals; ++i) { for (j = 0; j < num_locals; ++j) - if (local_indexes [j] == i) + if (locals->locals [j].index == i) break; if (j < num_locals) - buffer_add_string (buf, local_names [j]); + buffer_add_string (buf, locals->locals [j].name); else buffer_add_string (buf, ""); } - g_free (local_names); - g_free (local_indexes); - /* Live ranges */ - /* FIXME: This works because we set debug_options.mdb_optimizations */ + /* Scopes */ for (i = 0; i < header->num_locals; ++i) { - buffer_add_int (buf, 0); - buffer_add_int (buf, header->code_size); + for (j = 0; j < num_locals; ++j) + if (locals->locals [j].index == i) + break; + if (j < num_locals && locals->locals [j].block) { + buffer_add_int (buf, locals->locals [j].block->start_offset); + buffer_add_int (buf, locals->locals [j].block->end_offset); + } else { + buffer_add_int (buf, 0); + buffer_add_int (buf, header->code_size); + } } mono_metadata_free_mh (header); + if (locals) + mono_debug_symfile_free_locals (locals); + break; } case CMD_METHOD_GET_INFO: diff --git a/mono/mini/dwarfwriter.c b/mono/mini/dwarfwriter.c index 1541629d4d1..730fab12ef6 100644 --- a/mono/mini/dwarfwriter.c +++ b/mono/mini/dwarfwriter.c @@ -1585,9 +1585,8 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod MonoMethodSignature *sig; MonoMethodHeader *header; char **names; - char **local_names; - int *local_indexes; - int i, num_locals; + MonoDebugLocalsInfo *locals_info; + int i; guint8 buf [128]; guint8 *p; @@ -1690,7 +1689,7 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod g_free (names); /* Locals */ - num_locals = mono_debug_lookup_locals (method, &local_names, &local_indexes); + locals_info = mono_debug_lookup_locals (method); for (i = 0; i < header->num_locals; ++i) { MonoInst *ins = locals [i]; @@ -1698,6 +1697,7 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod int j; MonoMethodVar *vmv = NULL; gboolean need_loclist = FALSE; + char *lname; /* ins->dreg no longer contains the original vreg */ vmv = find_vmv (cfg, ins); @@ -1710,11 +1710,16 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod emit_uleb128 (w, need_loclist ? ABBREV_VARIABLE_LOCLIST : ABBREV_VARIABLE); /* name */ - for (j = 0; j < num_locals; ++j) - if (local_indexes [j] == i) - break; - if (j < num_locals) { - emit_string (w, local_names [j]); + lname = NULL; + if (locals_info) { + for (j = 0; j < locals_info->num_locals; ++j) + if (locals_info->locals [j].index == i) + break; + if (j < locals_info->num_locals) + lname = locals_info->locals [j].name; + } + if (lname) { + emit_string (w, lname); } else { sprintf (name_buf, "V_%d", i); emit_string (w, name_buf); @@ -1739,8 +1744,8 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod } } - g_free (local_names); - g_free (local_indexes); + if (locals_info) + mono_debug_symfile_free_locals (locals_info); /* Subprogram end */ emit_uleb128 (w, 0x0); -- 2.25.1