2003-03-13 Martin Baulig <martin@ximian.com>
authorMartin Baulig <martin@novell.com>
Thu, 13 Mar 2003 22:26:23 +0000 (22:26 -0000)
committerMartin Baulig <martin@novell.com>
Thu, 13 Mar 2003 22:26:23 +0000 (22:26 -0000)
* debug-mono-symfile.h (MonoSymbolFileLexicalBlockEntry): New type.
(MonoDebugLexicalBlockEntry): New types.

* debug-mono-symfile.c
(_mono_debug_address_from_il_offset): Moved here from ../jit/debug.c.

svn path=/trunk/mono/; revision=12483

mono/metadata/ChangeLog
mono/metadata/debug-mono-symfile.c
mono/metadata/debug-mono-symfile.h

index a410f3c600ffd8e4eb1344f70d249c9fdd2970a6..1321ca502415676be65f51c2efb6db05a02f55dd 100644 (file)
@@ -1,3 +1,11 @@
+2003-03-13  Martin Baulig  <martin@ximian.com>
+
+       * debug-mono-symfile.h (MonoSymbolFileLexicalBlockEntry): New type.
+       (MonoDebugLexicalBlockEntry): New types.
+
+       * debug-mono-symfile.c
+       (_mono_debug_address_from_il_offset): Moved here from ../jit/debug.c.
+
 2003-03-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
 
        * process.c: ret can be any non-zero value accroding to MS doc.
index a6cd979d59d266efe8b96a6e257e6ff2ad5c7b55..746ed63b9bccf2d07d6ace2597bfcb6cd2d60916 100644 (file)
@@ -280,17 +280,38 @@ mono_debug_find_source_location (MonoSymbolFile *symfile, MonoMethod *method, gu
        return NULL;
 }
 
+gint32
+_mono_debug_address_from_il_offset (MonoDebugMethodInfo *minfo, guint32 il_offset)
+{
+       int i;
+
+       if (!minfo->jit || !minfo->jit->line_numbers)
+               return -1;
+
+       for (i = minfo->jit->line_numbers->len - 1; i >= 0; i--) {
+               MonoDebugLineNumberEntry lne = g_array_index (
+                       minfo->jit->line_numbers, MonoDebugLineNumberEntry, i);
+
+               if (lne.offset <= il_offset)
+                       return lne.address;
+       }
+
+       return -1;
+}
+
 void
 mono_debug_symfile_add_method (MonoSymbolFile *symfile, MonoMethod *method)
 {
        MonoSymbolFileMethodEntryPriv *mep;
        MonoSymbolFileMethodAddress *address;
+       MonoSymbolFileLexicalBlockEntry *block;
        MonoDebugVarInfo *var_table;
        MonoDebugRangeInfo *range;
        MonoMethodHeader *header;
        guint32 size, num_variables, variable_size, variable_offset;
-       guint32 type_size, type_offset, *type_index_table;
-       guint32 line_size, line_offset, has_this;
+       guint32 type_size, type_offset, *type_index_table, has_this;
+       guint32 line_size, line_offset, block_offset, block_size;
+       MonoDebugLexicalBlockEntry *block_table;
        MonoDebugLineNumberEntry *line_table;
        guint32 *type_table;
        guint8 *ptr;
@@ -335,9 +356,22 @@ mono_debug_symfile_add_method (MonoSymbolFile *symfile, MonoMethod *method)
                size += line_size;
        }
 
+       block_size = mep->entry->num_lexical_blocks * sizeof (MonoSymbolFileLexicalBlockEntry);
+       block_offset = size;
+       size += block_size;
+
        address = g_malloc0 (size);
        ptr = (guint8 *) address;
 
+       block = (MonoSymbolFileLexicalBlockEntry *)
+               (symfile->_priv->raw_contents + mep->entry->lexical_block_table_offset);
+       block_table = (MonoDebugLexicalBlockEntry *) (ptr + block_offset);
+
+       for (i = 0; i < mep->entry->num_lexical_blocks; i++, block++) {
+               block_table [i].start_address = _mono_debug_address_from_il_offset (mep->minfo, block->start_offset);
+               block_table [i].end_address = _mono_debug_address_from_il_offset (mep->minfo, block->end_offset);
+       }
+
        address->size = size;
        address->has_this = has_this;
        address->start_address = mep->minfo->jit->code_start;
@@ -347,6 +381,7 @@ mono_debug_symfile_add_method (MonoSymbolFile *symfile, MonoMethod *method)
        address->wrapper_address = mep->minfo->jit->wrapper_addr;
        address->variable_table_offset = variable_offset;
        address->type_table_offset = type_offset;
+       address->lexical_block_table_offset = block_offset;
 
        if (mep->minfo->jit->line_numbers) {
                address->num_line_numbers = mep->minfo->jit->line_numbers->len;
@@ -392,11 +427,9 @@ mono_debug_symfile_add_method (MonoSymbolFile *symfile, MonoMethod *method)
        }
 
        if (mep->minfo->jit->num_locals < mep->entry->num_locals) {
-#if 1
                g_warning (G_STRLOC ": Method %s.%s has %d locals, but symbol file claims it has %d.",
                           mep->method->klass->name, mep->method->name, mep->minfo->jit->num_locals,
                           mep->entry->num_locals);
-#endif
                var_table += mep->entry->num_locals;
        } else {
                g_assert ((header != NULL) || (mep->entry->num_locals == 0));
index 666690b12809633ddd2a06e58d055cb3c87dc0f2..910241ca362da19a03b929bbeba159ca2fcdcf5a 100644 (file)
@@ -15,10 +15,12 @@ typedef struct MonoSymbolFileMethodAddress  MonoSymbolFileMethodAddress;
 typedef struct MonoSymbolFileDynamicTable      MonoSymbolFileDynamicTable;
 typedef struct MonoSymbolFileSourceEntry       MonoSymbolFileSourceEntry;
 typedef struct MonoSymbolFileMethodIndexEntry  MonoSymbolFileMethodIndexEntry;
+typedef struct MonoSymbolFileLexicalBlockEntry MonoSymbolFileLexicalBlockEntry;
 
 typedef struct MonoDebugMethodInfo             MonoDebugMethodInfo;
 typedef struct MonoDebugMethodJitInfo          MonoDebugMethodJitInfo;
 typedef struct MonoDebugVarInfo                        MonoDebugVarInfo;
+typedef struct MonoDebugLexicalBlockEntry      MonoDebugLexicalBlockEntry;
 typedef struct MonoDebugLineNumberEntry                MonoDebugLineNumberEntry;
 typedef struct MonoDebugRangeInfo              MonoDebugRangeInfo;
 typedef struct MonoDebugClassInfo              MonoDebugClassInfo;
@@ -51,6 +53,8 @@ struct MonoSymbolFileMethodEntry {
        guint32 type_index_table_offset;
        guint32 local_variable_table_offset;
        guint32 line_number_table_offset;
+       guint32 num_lexical_blocks;
+       guint32 lexical_block_table_offset;
        guint32 namespace_idx;
 };
 
@@ -81,9 +85,15 @@ struct MonoSymbolFileMethodAddress {
        guint32 type_table_offset;
        guint32 num_line_numbers;
        guint32 line_number_offset;
+       guint32 lexical_block_table_offset;
        guint8 data [MONO_ZERO_LEN_ARRAY];
 };
 
+struct MonoSymbolFileLexicalBlockEntry {
+       guint32 start_offset;
+       guint32 end_offset;
+};
+
 struct MonoSymbolFileLineNumberEntry {
        guint32 row;
        guint32 offset;
@@ -101,6 +111,11 @@ struct MonoDebugMethodInfo {
        gpointer user_data;
 };
 
+struct MonoDebugLexicalBlockEntry {
+       guint32 start_address;
+       guint32 end_address;
+};
+
 struct MonoDebugLineNumberEntry {
        guint32 line;
        guint32 offset;
@@ -224,7 +239,7 @@ struct MonoSymbolFile {
        MonoSymbolFilePriv *_priv;
 };
 
-#define MONO_SYMBOL_FILE_VERSION               33
+#define MONO_SYMBOL_FILE_VERSION               34
 #define MONO_SYMBOL_FILE_MAGIC                 0x45e82623fd7fa614
 
 #define MONO_SYMBOL_FILE_DYNAMIC_VERSION       26
@@ -257,6 +272,10 @@ MonoDebugMethodInfo *
 mono_debug_find_method             (MonoSymbolFile           *symfile,
                                    MonoMethod               *method);
 
+gint32
+_mono_debug_address_from_il_offset (MonoDebugMethodInfo      *minfo,
+                                   guint32                   il_offset);
+
 MonoReflectionMethod *
 ves_icall_MonoDebugger_GetMethod   (MonoReflectionAssembly   *assembly,
                                    guint32                   token);