2002-09-14 Martin Baulig <martin@gnome.org>
authorMartin Baulig <martin@novell.com>
Sat, 14 Sep 2002 00:10:54 +0000 (00:10 -0000)
committerMartin Baulig <martin@novell.com>
Sat, 14 Sep 2002 00:10:54 +0000 (00:10 -0000)
* debug-mono-symfile.h (MonoSymbolFile): Added method range table for
fast method lookup.

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

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

index 0d2d16ecdda7802baa1e5aea98a43592c1dd84ad..24072883cc9f405deced86c1f3891a3c14c01c6e 100644 (file)
@@ -1,3 +1,7 @@
+2002-09-14  Martin Baulig  <martin@gnome.org>
+
+       * debug-mono-symfile.h (MonoSymbolFile): Added method range table for
+       fast method lookup.
 
 Fri Sep 13 16:04:54 CEST 2002 Paolo Molaro <lupus@ximian.com>
 
index 08a9da94efc1b3ee8e54340f7bcf812bd69abdf1..c3f03f94bf62eb7a2184fcf6cf62a9605943a659 100644 (file)
@@ -24,6 +24,7 @@ struct MonoSymbolFilePriv
        GHashTable *method_table;
        GHashTable *method_hash;
        MonoSymbolFileOffsetTable *offset_table;
+       GPtrArray *range_table;
 };
 
 typedef struct
@@ -94,6 +95,7 @@ load_symfile (MonoSymbolFile *symfile)
                        continue;
 
                minfo = g_new0 (MonoDebugMethodInfo, 1);
+               minfo->file_offset = ((const char *) me) - start;
                minfo->method = method;
                minfo->symfile = symfile;
                minfo->num_il_offsets = me->num_line_numbers;
@@ -332,6 +334,7 @@ update_method_func (gpointer key, gpointer value, gpointer user_data)
        MonoSymbolFileMethodEntryPriv *mep = (MonoSymbolFileMethodEntryPriv *) value;
        MonoSymbolFileMethodAddress *address;
        MonoSymbolFileLineNumberEntry *lne;
+       MonoDebugRangeInfo *range;
        int i;
 
        if (!mep->minfo) {
@@ -350,6 +353,13 @@ update_method_func (gpointer key, gpointer value, gpointer user_data)
        address->start_address = GPOINTER_TO_UINT (mep->minfo->jit->code_start);
        address->end_address = GPOINTER_TO_UINT (mep->minfo->jit->code_start + mep->minfo->jit->code_size);
 
+       range = g_new0 (MonoDebugRangeInfo, 1);
+       range->start_address = address->start_address;
+       range->end_address = address->end_address;
+       range->file_offset = mep->minfo->file_offset;
+
+       g_ptr_array_add (symfile->_priv->range_table, range);
+
        lne = (MonoSymbolFileLineNumberEntry *)
                (symfile->raw_contents + mep->entry->line_number_table_offset);
 
@@ -377,17 +387,48 @@ update_method_func (gpointer key, gpointer value, gpointer user_data)
        }
 }
 
+static gint
+range_table_compare_func (gconstpointer a, gconstpointer b)
+{
+       const MonoDebugRangeInfo *r1 = (const MonoDebugRangeInfo *) a;
+       const MonoDebugRangeInfo *r2 = (const MonoDebugRangeInfo *) b;
+
+       if (r1->start_address < r2->start_address)
+               return -1;
+       else if (r1->start_address > r2->start_address)
+               return 1;
+       else
+               return 0;
+}      
+
 void
 mono_debug_update_mono_symbol_file (MonoSymbolFile *symfile)
 {
-       g_message (G_STRLOC);
+       int i;
+
+       if (!symfile->_priv->method_table)
+               return;
 
-       if (symfile->_priv->method_table) {
-               if (!symfile->address_table)
-                       symfile->address_table = g_malloc0 (symfile->address_table_size);
+       symfile->_priv->range_table = g_ptr_array_new ();
 
-               g_hash_table_foreach (symfile->_priv->method_table, update_method_func, symfile);
+       if (!symfile->address_table)
+               symfile->address_table = g_malloc0 (symfile->address_table_size);
+
+       g_hash_table_foreach (symfile->_priv->method_table, update_method_func, symfile);
+
+       symfile->range_table_size = symfile->_priv->range_table->len * sizeof (MonoDebugRangeInfo);
+       symfile->range_table = g_malloc0 (symfile->range_table_size);
+
+       g_ptr_array_sort (symfile->_priv->range_table, range_table_compare_func);
+
+       for (i = 0; i < symfile->_priv->range_table->len; i++) {
+               MonoDebugRangeInfo *range = g_ptr_array_index (symfile->_priv->range_table, i);
+
+               symfile->range_table [i] = *range;
        }
+
+       g_ptr_array_free (symfile->_priv->range_table, TRUE);
+       symfile->_priv->range_table = NULL;
 }
 
 static void
@@ -432,6 +473,8 @@ write_method (gpointer key, gpointer value, gpointer user_data)
        if (symfile->_priv->error)
                return;
 
+       mep->minfo->file_offset = lseek (symfile->_priv->fd, 0, SEEK_CUR);
+
        if (write (symfile->_priv->fd, mep->entry, sizeof (MonoSymbolFileMethodEntry)) < 0) {
                symfile->_priv->error = TRUE;
                return;
index 8d9c07cab7e0a2c1d1283a447077c51b9cb89cb8..c247663a5613266ff74b192b3a96269d9f334ac9 100644 (file)
@@ -15,6 +15,7 @@ typedef struct MonoSymbolFileMethodAddress    MonoSymbolFileMethodAddress;
 typedef struct MonoDebugMethodInfo             MonoDebugMethodInfo;
 typedef struct MonoDebugMethodJitInfo          MonoDebugMethodJitInfo;
 typedef struct MonoDebugVarInfo                        MonoDebugVarInfo;
+typedef struct MonoDebugRangeInfo              MonoDebugRangeInfo;
 
 /* Keep in sync with OffsetTable in mcs/class/Mono.CSharp.Debugger/MonoSymbolTable.cs */
 struct MonoSymbolFileOffsetTable {
@@ -55,6 +56,7 @@ struct MonoSymbolFileLineNumberEntry {
 struct MonoDebugMethodInfo {
        MonoMethod *method;
        MonoSymbolFile *symfile;
+       guint32 file_offset;
        guint32 num_il_offsets;
        MonoSymbolFileLineNumberEntry *il_offsets;
        MonoDebugMethodJitInfo *jit;
@@ -102,6 +104,12 @@ struct MonoDebugVarInfo {
        guint32 end_scope;
 };
 
+struct MonoDebugRangeInfo {
+       guint64 start_address;
+       guint64 end_address;
+       guint32 file_offset;
+};
+
 struct MonoSymbolFile {
        guint64 magic;
        guint32 version;
@@ -113,11 +121,14 @@ struct MonoSymbolFile {
        /* Pointer to the malloced address table. */
        char *address_table;
        guint32 address_table_size;
+       /* Pointer to the malloced range table. */
+       MonoDebugRangeInfo *range_table;
+       guint32 range_table_size;
        /* Private. */
        MonoSymbolFilePriv *_priv;
 };
 
-#define MONO_SYMBOL_FILE_VERSION               18
+#define MONO_SYMBOL_FILE_VERSION               19
 #define MONO_SYMBOL_FILE_MAGIC                 0x45e82623fd7fa614
 
 MonoSymbolFile *