2003-05-02 Martin Baulig <martin@ximian.com>
authorMartin Baulig <martin@novell.com>
Sun, 4 May 2003 12:24:27 +0000 (12:24 -0000)
committerMartin Baulig <martin@novell.com>
Sun, 4 May 2003 12:24:27 +0000 (12:24 -0000)
* debug-mono-symfile.h
(MonoSymbolFile): Moved declaration into mono-debug.h.
(MonoDebugMethodJitInfo): Likewise.
(mono_debug_open_mono_symbol_file): Take the MonoDebugHandle as
argument.
(_mono_debug_address_from_il_offset): Take a
MonoDebugMethodJitInfo instead of a MonoDebugMethodInfo.

* mono-debug.h
(MonoDebugDomainData): New struct.
(mono_debug_get_domain_data): New function.
(mono_debug_add_method): Take an additional `MonoDomain *'
argument.
(mono_debug_source_location_from_address): Likewise.
(mono_debug_il_offset_from_address): Likewise.
(mono_debug_address_from_il_offset): Likewise.

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

12 files changed:
mono/jit/debug-jit.c
mono/jit/exception.c
mono/jit/jit.c
mono/metadata/ChangeLog
mono/metadata/debug-mono-symfile.c
mono/metadata/debug-mono-symfile.h
mono/metadata/mono-debug-debugger.c
mono/metadata/mono-debug-debugger.h
mono/metadata/mono-debug.c
mono/metadata/mono-debug.h
mono/mini/debug-mini.c
mono/mini/exceptions-x86.c

index 05e857f2de26c7b3c0728d323e223cfef09e0071..02f2e07c328de79690cbd1b6736f4a4a836ba654 100644 (file)
@@ -194,5 +194,5 @@ mono_debug_jit_add_method (MonoFlowGraph *cfg)
                jit->locals = locals;
        }
 
-       mono_debug_add_method (method, jit);
+       mono_debug_add_method (method, jit, cfg->domain);
 }
index 28843603123540209298b04a8b49efa2aba1ed28..59b4c811a9ce0504d699148e13b69c429478a932 100644 (file)
@@ -601,8 +601,8 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf
                                *managed = TRUE;
 
                if (trace) {
-                       source_location = mono_debug_source_location_from_address (ji->method, address, NULL);
-                       iloffset = mono_debug_il_offset_from_address (ji->method, address);
+                       source_location = mono_debug_source_location_from_address (ji->method, address, NULL, domain);
+                       iloffset = mono_debug_il_offset_from_address (ji->method, address, domain);
 
                        if (iloffset < 0)
                                tmpaddr = g_strdup_printf ("<0x%05x>", address);
@@ -716,12 +716,12 @@ ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info
 
                sf->method = mono_method_get_object (domain, ji->method, NULL);
                sf->native_offset = (char *)ip - (char *)ji->code_start;
-               sf->il_offset = mono_debug_il_offset_from_address (ji->method, sf->native_offset);
+               sf->il_offset = mono_debug_il_offset_from_address (ji->method, sf->native_offset, domain);
 
                if (need_file_info) {
                        gchar *filename;
 
-                       filename = mono_debug_source_location_from_address (ji->method, sf->native_offset, &sf->line);
+                       filename = mono_debug_source_location_from_address (ji->method, sf->native_offset, &sf->line, domain);
 
                        sf->filename = mono_string_new (domain, filename ? filename : "<unknown>");
                        sf->column = 0;
@@ -757,7 +757,7 @@ mono_jit_walk_stack (MonoStackWalk func, gpointer user_data) {
                if (ji == (gpointer)-1)
                        return;
 
-               il_offset = mono_debug_il_offset_from_address (ji->method, native_offset);
+               il_offset = mono_debug_il_offset_from_address (ji->method, native_offset, domain);
 
                if (func (ji->method, native_offset, il_offset, managed, user_data))
                        return;
@@ -798,12 +798,12 @@ ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
        } while (skip >= 0);
 
        *method = mono_method_get_object (domain, ji->method, NULL);
-       *iloffset = mono_debug_il_offset_from_address (ji->method, *native_offset);
+       *iloffset = mono_debug_il_offset_from_address (ji->method, *native_offset, domain);
 
        if (need_file_info) {
                gchar *filename;
 
-               filename = mono_debug_source_location_from_address (ji->method, *native_offset, line);
+               filename = mono_debug_source_location_from_address (ji->method, *native_offset, line, domain);
 
                *file = mono_string_new (domain, filename ? filename : "<unknown>");
                *column = 0;
index 0ae5003a023538006ec2b6e83f7a2d5412c48ae5..67ef1fe8d789a550fc9dea77d0795d08f761da2a 100644 (file)
@@ -3817,6 +3817,11 @@ mono_jit_compile_method (MonoMethod *method)
        guint8 *addr;
        GHashTable *jit_code_hash;
 
+       if (mono_jit_share_code)
+               target_domain = mono_root_domain;
+       else 
+               target_domain = domain;
+
        if ((method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) ||
            (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)) {
 
@@ -3834,7 +3839,7 @@ mono_jit_compile_method (MonoMethod *method)
                                method->info = mono_compile_method (nm);
 
                                if (mono_debug_format != MONO_DEBUG_FORMAT_NONE) 
-                                       mono_debug_add_wrapper (method, nm);
+                                       mono_debug_add_wrapper (method, nm, target_domain);
 #ifdef MONO_USE_EXC_TABLES
                        }
 #endif
@@ -3843,11 +3848,6 @@ mono_jit_compile_method (MonoMethod *method)
                return method->info;
        }
 
-       if (mono_jit_share_code)
-               target_domain = mono_root_domain;
-       else 
-               target_domain = domain;
-
        jit_code_hash = target_domain->jit_code_hash;
 
        if ((addr = g_hash_table_lookup (jit_code_hash, method))) {
index 11d37f99e7ee633125522a67368b252516ff3ec4..b92803d657f5303c8a08eb51e58e0fbee4230aa6 100644 (file)
@@ -1,3 +1,21 @@
+2003-05-02  Martin Baulig  <martin@ximian.com>
+
+       * debug-mono-symfile.h
+       (MonoSymbolFile): Moved declaration into mono-debug.h.
+       (MonoDebugMethodJitInfo): Likewise.
+       (mono_debug_open_mono_symbol_file): Take the MonoDebugHandle as
+       argument.
+       (_mono_debug_address_from_il_offset): Take a
+       MonoDebugMethodJitInfo instead of a MonoDebugMethodInfo.
+
+       * mono-debug.h
+       (MonoDebugDomainData): New struct.
+       (mono_debug_get_domain_data): New function.
+       (mono_debug_add_method): Take an additional `MonoDomain *'
+       argument.
+       (mono_debug_source_location_from_address): Likewise.
+       (mono_debug_il_offset_from_address): Likewise.
+       (mono_debug_address_from_il_offset): Likewise.
 
 Thu May 1 19:40:37 CEST 2003 Paolo Molaro <lupus@ximian.com>
 
index f530d8e8f2820c55090e3933670cb2aec2276bb8..4ca82766412b2d9aad01bbe65dad43b4bb937910 100644 (file)
@@ -9,6 +9,7 @@
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/exception.h>
 #include <mono/metadata/debug-helpers.h>
+#include <mono/metadata/mono-debug.h>
 #include <mono/metadata/debug-mono-symfile.h>
 
 #include <fcntl.h>
@@ -22,7 +23,6 @@
 static void
 free_method_info (MonoDebugMethodInfo *minfo)
 {
-       g_free (minfo->jit);
        g_free (minfo);
 }
 
@@ -41,7 +41,7 @@ get_class_name (MonoClass *klass)
 }
 
 static int
-load_symfile (MonoSymbolFile *symfile)
+load_symfile (MonoDebugHandle *handle, MonoSymbolFile *symfile)
 {
        MonoSymbolFileMethodEntry *me;
        MonoSymbolFileMethodIndexEntry *ie;
@@ -56,14 +56,14 @@ load_symfile (MonoSymbolFile *symfile)
 
        magic = *((guint64 *) ptr)++;
        if (magic != MONO_SYMBOL_FILE_MAGIC) {
-               g_warning ("Symbol file %s has is not a mono symbol file", symfile->image_file);
+               g_warning ("Symbol file %s has is not a mono symbol file", handle->image_file);
                return FALSE;
        }
 
        version = *((guint32 *) ptr)++;
        if (version != MONO_SYMBOL_FILE_VERSION) {
                g_warning ("Symbol file %s has incorrect version "
-                          "(expected %d, got %ld)", symfile->image_file,
+                          "(expected %d, got %ld)", handle->image_file,
                           MONO_SYMBOL_FILE_VERSION, version);
                return FALSE;
        }
@@ -76,7 +76,7 @@ load_symfile (MonoSymbolFile *symfile)
         */
 
        symfile->method_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL,
-                                                     (GDestroyNotify) free_method_info);
+                                                            (GDestroyNotify) free_method_info);
 
        ie = (MonoSymbolFileMethodIndexEntry *)
                (symfile->raw_contents + symfile->offset_table->method_table_offset);
@@ -87,7 +87,7 @@ load_symfile (MonoSymbolFile *symfile)
 
                me = (MonoSymbolFileMethodEntry *) (symfile->raw_contents + ie->file_offset);
 
-               method = mono_get_method (symfile->image, me->token, NULL);
+               method = mono_get_method (handle->image, me->token, NULL);
 
                if (!method)
                        continue;
@@ -95,7 +95,7 @@ load_symfile (MonoSymbolFile *symfile)
                minfo = g_new0 (MonoDebugMethodInfo, 1);
                minfo->index = i + 1;
                minfo->method = method;
-               minfo->symfile = symfile;
+               minfo->handle = handle;
                minfo->num_il_offsets = me->num_line_numbers;
                minfo->il_offsets = (MonoSymbolFileLineNumberEntry *)
                        (symfile->raw_contents + me->line_number_table_offset);
@@ -129,20 +129,15 @@ open_symfile (MonoImage *image, guint32 *size)
 }
 
 MonoSymbolFile *
-mono_debug_open_mono_symbol_file (MonoImage *image, gboolean create_symfile)
+mono_debug_open_mono_symbol_file (MonoDebugHandle *handle, gboolean create_symfile)
 {
        MonoSymbolFile *symfile;
 
        symfile = g_new0 (MonoSymbolFile, 1);
-       symfile->dynamic_magic = MONO_SYMBOL_FILE_DYNAMIC_MAGIC;
-       symfile->dynamic_version = MONO_SYMBOL_FILE_DYNAMIC_VERSION;
-       symfile->image_file = image->name;
 
-       symfile->image = image;
+       symfile->raw_contents = open_symfile (handle->image, &symfile->raw_contents_size);
 
-       symfile->raw_contents = open_symfile (image, &symfile->raw_contents_size);
-
-       if (load_symfile (symfile))
+       if (load_symfile (handle, symfile))
                return symfile;
        else if (!create_symfile) {
                mono_debug_close_mono_symbol_file (symfile);
@@ -223,16 +218,16 @@ mono_debug_find_source_location (MonoSymbolFile *symfile, MonoMethod *method, gu
 }
 
 gint32
-_mono_debug_address_from_il_offset (MonoDebugMethodInfo *minfo, guint32 il_offset)
+_mono_debug_address_from_il_offset (MonoDebugMethodJitInfo *jit, guint32 il_offset)
 {
        int i;
 
-       if (!minfo->jit || !minfo->jit->line_numbers)
+       if (!jit || !jit->line_numbers)
                return -1;
 
-       for (i = minfo->jit->line_numbers->len - 1; i >= 0; i--) {
+       for (i = jit->line_numbers->len - 1; i >= 0; i--) {
                MonoDebugLineNumberEntry lne = g_array_index (
-                       minfo->jit->line_numbers, MonoDebugLineNumberEntry, i);
+                       jit->line_numbers, MonoDebugLineNumberEntry, i);
 
                if (lne.offset <= il_offset)
                        return lne.address;
index faf4135c245c88c99808fa8aaef949f1d1e4e6a6..750d7aac666d5015136ae362c8ac7ed2d7b186fe 100644 (file)
@@ -4,8 +4,8 @@
 #include <glib.h>
 #include <mono/metadata/class.h>
 #include <mono/metadata/reflection.h>
+#include <mono/metadata/mono-debug.h>
 
-typedef struct MonoSymbolFile                  MonoSymbolFile;
 typedef struct MonoSymbolFileOffsetTable       MonoSymbolFileOffsetTable;
 typedef struct MonoSymbolFileLineNumberEntry   MonoSymbolFileLineNumberEntry;
 typedef struct MonoSymbolFileMethodEntry       MonoSymbolFileMethodEntry;
@@ -16,8 +16,6 @@ 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;
 
@@ -98,13 +96,11 @@ struct MonoSymbolFileLineNumberEntry {
 
 struct MonoDebugMethodInfo {
        MonoMethod *method;
-       MonoSymbolFile *symfile;
+       MonoDebugHandle *handle;
        guint32 index;
        guint32 num_il_offsets;
        MonoSymbolFileLineNumberEntry *il_offsets;
        MonoSymbolFileMethodEntry *entry;
-       MonoDebugMethodJitInfo *jit;
-       gpointer user_data;
 };
 
 struct MonoDebugLexicalBlockEntry {
@@ -117,69 +113,18 @@ struct MonoDebugLineNumberEntry {
        guint32 address;
 };
 
-struct MonoDebugMethodJitInfo {
-       const guint8 *code_start;
-       guint32 code_size;
-       guint32 prologue_end;
-       guint32 epilogue_begin;
-       const guint8 *wrapper_addr;
-       // Array of MonoDebugLineNumberEntry
-       GArray *line_numbers;
-       guint32 num_params;
-       MonoDebugVarInfo *this_var;
-       MonoDebugVarInfo *params;
-       guint32 num_locals;
-       MonoDebugVarInfo *locals;
-};
-
-/*
- * These bits of the MonoDebugLocalInfo's "index" field are flags specifying
- * where the variable is actually stored.
- *
- * See relocate_variable() in debug-symfile.c for more info.
- */
-#define MONO_DEBUG_VAR_ADDRESS_MODE_FLAGS              0xf0000000
-
-/* If "index" is zero, the variable is at stack offset "offset". */
-#define MONO_DEBUG_VAR_ADDRESS_MODE_STACK              0
-
-/* The variable is in the register whose number is contained in bits 0..4 of the
- * "index" field plus an offset of "offset" (which can be zero).
- */
-#define MONO_DEBUG_VAR_ADDRESS_MODE_REGISTER           0x10000000
-
-/* The variables in in the two registers whose numbers are contained in bits 0..4
- * and 5..9 of the "index" field plus an offset of "offset" (which can be zero).
- */
-#define MONO_DEBUG_VAR_ADDRESS_MODE_TWO_REGISTERS      0x20000000
-
-struct MonoDebugVarInfo {
-       guint32 index;
-       guint32 offset;
-       guint32 size;
-       guint32 begin_scope;
-       guint32 end_scope;
-};
-
-struct MonoSymbolFile {
-       guint64 dynamic_magic;
-       guint32 dynamic_version;
-       const char *image_file;
-       GHashTable *method_hash;
+struct _MonoSymbolFile {
        const guint8 *raw_contents;
        int raw_contents_size;
-       MonoImage *image;
+       GHashTable *method_hash;
        MonoSymbolFileOffsetTable *offset_table;
 };
 
 #define MONO_SYMBOL_FILE_VERSION               35
 #define MONO_SYMBOL_FILE_MAGIC                 0x45e82623fd7fa614
 
-#define MONO_SYMBOL_FILE_DYNAMIC_VERSION       27
-#define MONO_SYMBOL_FILE_DYNAMIC_MAGIC         0x7aff65af4253d427
-
 MonoSymbolFile *
-mono_debug_open_mono_symbol_file   (MonoImage                 *image,
+mono_debug_open_mono_symbol_file   (MonoDebugHandle           *handle,
                                    gboolean                   create_symfile);
 
 void
@@ -191,13 +136,13 @@ mono_debug_find_source_location    (MonoSymbolFile           *symfile,
                                    guint32                   offset,
                                    guint32                  *line_number);
 
+gint32
+_mono_debug_address_from_il_offset (MonoDebugMethodJitInfo   *jit,
+                                   guint32                   il_offset);
+
 MonoDebugMethodInfo *
 mono_debug_find_method             (MonoSymbolFile           *symfile,
                                    MonoMethod               *method);
 
-gint32
-_mono_debug_address_from_il_offset (MonoDebugMethodInfo      *minfo,
-                                   guint32                   il_offset);
-
 #endif /* __MONO_SYMFILE_H__ */
 
index 32831e0a117bc269c7d0b30137a4529ad1532377..553bc86da47f67c717795daf8d535e7a5d8352a5 100644 (file)
@@ -84,8 +84,8 @@ mono_debugger_initialize (void)
        mono_debugger_lock ();
 
        symbol_table = g_new0 (MonoDebuggerSymbolTable, 1);
-       symbol_table->magic = MONO_SYMBOL_FILE_DYNAMIC_MAGIC;
-       symbol_table->version = MONO_SYMBOL_FILE_DYNAMIC_VERSION;
+       symbol_table->magic = MONO_DEBUGGER_MAGIC;
+       symbol_table->version = MONO_DEBUGGER_VERSION;
        symbol_table->total_size = sizeof (MonoDebuggerSymbolTable);
 
        mono_debugger_symbol_table = symbol_table;
@@ -95,15 +95,14 @@ mono_debugger_initialize (void)
 }
 
 MonoDebuggerSymbolFile *
-mono_debugger_add_symbol_file (MonoSymbolFile *symfile)
+mono_debugger_add_symbol_file (MonoDebugHandle *handle)
 {
        MonoDebuggerSymbolFile *info;
 
        g_assert (mono_debugger_initialized);
 
        info = allocate_symbol_file_entry (mono_debugger_symbol_table);
-       info->symfile = symfile;
-       info->image_file = symfile->image_file;
+       info->symfile = handle->symfile;
 
        mono_debugger_add_type (info, mono_defaults.object_class);
 
@@ -142,11 +141,11 @@ mono_debugger_add_type (MonoDebuggerSymbolFile *symfile, MonoClass *klass)
 }
 
 void
-mono_debugger_add_method (MonoDebuggerSymbolFile *symfile, MonoMethod *method)
+mono_debugger_add_method (MonoDebuggerSymbolFile *symfile, MonoDebugMethodInfo *minfo,
+                         MonoDebugMethodJitInfo *jit)
 {
        MonoSymbolFileMethodAddress *address;
        MonoSymbolFileLexicalBlockEntry *block;
-       MonoDebugMethodInfo *minfo;
        MonoDebugVarInfo *var_table;
        MonoDebuggerRangeInfo *range;
        MonoMethodHeader *header;
@@ -162,18 +161,14 @@ mono_debugger_add_method (MonoDebuggerSymbolFile *symfile, MonoMethod *method)
        if (!symfile->symfile->method_hash)
                return;
 
-       header = ((MonoMethodNormal *) method)->header;
-
-       minfo = g_hash_table_lookup (symfile->symfile->method_hash, method);
-       if (!minfo || !minfo->jit)
-               return;
+       header = ((MonoMethodNormal *) minfo->method)->header;
 
        symfile->generation++;
 
        size = sizeof (MonoSymbolFileMethodAddress);
 
        num_variables = minfo->entry->num_parameters + minfo->entry->num_locals;
-       has_this = minfo->jit->this_var != NULL;
+       has_this = jit->this_var != NULL;
 
        variable_size = (num_variables + has_this) * sizeof (MonoDebugVarInfo);
        variable_offset = size;
@@ -183,9 +178,9 @@ mono_debugger_add_method (MonoDebuggerSymbolFile *symfile, MonoMethod *method)
        type_offset = size;
        size += type_size;
 
-       if (minfo->jit->line_numbers) {
+       if (jit->line_numbers) {
                line_offset = size;
-               line_size = minfo->jit->line_numbers->len * sizeof (MonoDebugLineNumberEntry);
+               line_size = jit->line_numbers->len * sizeof (MonoDebugLineNumberEntry);
                size += line_size;
        }
 
@@ -201,27 +196,27 @@ mono_debugger_add_method (MonoDebuggerSymbolFile *symfile, MonoMethod *method)
        block_table = (MonoDebugLexicalBlockEntry *) (ptr + block_offset);
 
        for (i = 0; i < minfo->entry->num_lexical_blocks; i++, block++) {
-               block_table [i].start_address = _mono_debug_address_from_il_offset (minfo, block->start_offset);
-               block_table [i].end_address = _mono_debug_address_from_il_offset (minfo, block->end_offset);
+               block_table [i].start_address = _mono_debug_address_from_il_offset (jit, block->start_offset);
+               block_table [i].end_address = _mono_debug_address_from_il_offset (jit, block->end_offset);
        }
 
        address->size = size;
        address->has_this = has_this;
-       address->start_address = minfo->jit->code_start;
-       address->end_address = minfo->jit->code_start + minfo->jit->code_size;
-       address->method_start_address = address->start_address + minfo->jit->prologue_end;
-       address->method_end_address = address->start_address + minfo->jit->epilogue_begin;
-       address->wrapper_address = minfo->jit->wrapper_addr;
+       address->start_address = jit->code_start;
+       address->end_address = jit->code_start + jit->code_size;
+       address->method_start_address = address->start_address + jit->prologue_end;
+       address->method_end_address = address->start_address + jit->epilogue_begin;
+       address->wrapper_address = jit->wrapper_addr;
        address->variable_table_offset = variable_offset;
        address->type_table_offset = type_offset;
        address->lexical_block_table_offset = block_offset;
 
-       if (minfo->jit->line_numbers) {
-               address->num_line_numbers = minfo->jit->line_numbers->len;
+       if (jit->line_numbers) {
+               address->num_line_numbers = jit->line_numbers->len;
                address->line_number_offset = line_offset;
 
                line_table = (MonoDebugLineNumberEntry *) (ptr + line_offset);
-               memcpy (line_table, minfo->jit->line_numbers->data, line_size);
+               memcpy (line_table, jit->line_numbers->data, line_size);
        }
 
        range = allocate_range_entry (symfile);
@@ -231,9 +226,9 @@ mono_debugger_add_method (MonoDebuggerSymbolFile *symfile, MonoMethod *method)
        range->dynamic_data = address;
        range->dynamic_size = size;
 
-       if ((method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) ||
-           (method->iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME) ||
-           (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))
+       if ((minfo->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) ||
+           (minfo->method->iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME) ||
+           (minfo->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))
                return;
 
        var_table = (MonoDebugVarInfo *) (ptr + variable_offset);
@@ -242,31 +237,31 @@ mono_debugger_add_method (MonoDebuggerSymbolFile *symfile, MonoMethod *method)
        type_index_table = (guint32 *)
                (symfile->symfile->raw_contents + minfo->entry->type_index_table_offset);
 
-       if (minfo->jit->this_var)
-               *var_table++ = *minfo->jit->this_var;
-       *type_table++ = write_type (mono_debugger_symbol_table, &method->klass->this_arg);
+       if (jit->this_var)
+               *var_table++ = *jit->this_var;
+       *type_table++ = write_type (mono_debugger_symbol_table, &minfo->method->klass->this_arg);
 
-       if (minfo->jit->num_params != minfo->entry->num_parameters) {
+       if (jit->num_params != minfo->entry->num_parameters) {
                g_warning (G_STRLOC ": Method %s.%s has %d parameters, but symbol file claims it has %d.",
-                          minfo->method->klass->name, minfo->method->name, minfo->jit->num_params,
+                          minfo->method->klass->name, minfo->method->name, jit->num_params,
                           minfo->entry->num_parameters);
                var_table += minfo->entry->num_parameters;
        } else {
-               for (i = 0; i < minfo->jit->num_params; i++) {
-                       *var_table++ = minfo->jit->params [i];
-                       *type_table++ = write_type (mono_debugger_symbol_table, method->signature->params [i]);
+               for (i = 0; i < jit->num_params; i++) {
+                       *var_table++ = jit->params [i];
+                       *type_table++ = write_type (mono_debugger_symbol_table, minfo->method->signature->params [i]);
                }
        }
 
-       if (minfo->jit->num_locals < minfo->entry->num_locals) {
+       if (jit->num_locals < minfo->entry->num_locals) {
                g_warning (G_STRLOC ": Method %s.%s has %d locals, but symbol file claims it has %d.",
-                          minfo->method->klass->name, minfo->method->name, minfo->jit->num_locals,
+                          minfo->method->klass->name, minfo->method->name, jit->num_locals,
                           minfo->entry->num_locals);
                var_table += minfo->entry->num_locals;
        } else {
                g_assert ((header != NULL) || (minfo->entry->num_locals == 0));
                for (i = 0; i < minfo->entry->num_locals; i++) {
-                       *var_table++ = minfo->jit->locals [i];
+                       *var_table++ = jit->locals [i];
                        *type_table++ = write_type (mono_debugger_symbol_table, header->locals [i]);
                }
        }
index 0927c3130c438820850c3473c32ff4ff7f19f4aa..9ec1c1cce92ea16d8c66ef509ed32efecd20a992 100644 (file)
@@ -152,9 +152,11 @@ void            mono_debugger_lock                    (void);
 void            mono_debugger_unlock                  (void);
 void            mono_debugger_event                   (MonoDebuggerEvent event, gpointer data, guint32 arg);
 
-MonoDebuggerSymbolFile *mono_debugger_add_symbol_file (MonoSymbolFile *symfile);
+MonoDebuggerSymbolFile *mono_debugger_add_symbol_file (MonoDebugHandle *handle);
 void            mono_debugger_add_type                (MonoDebuggerSymbolFile *symfile, MonoClass *klass);
-void            mono_debugger_add_method              (MonoDebuggerSymbolFile *symfile, MonoMethod *method);
+void            mono_debugger_add_method              (MonoDebuggerSymbolFile *symfile,
+                                                      MonoDebugMethodInfo *minfo,
+                                                      MonoDebugMethodJitInfo *jit);
 
 int             mono_debugger_insert_breakpoint_full  (MonoMethodDesc *desc);
 int             mono_debugger_remove_breakpoint       (int breakpoint_id);
index 58c0743340f74ea5198b231434d704c1f20a7560..df422f4b4467a9f86a6c0669eb7b467a38a36814 100644 (file)
@@ -2,13 +2,20 @@
 #include <mono/metadata/assembly.h>
 #include <mono/metadata/tabledefs.h>
 #include <mono/metadata/tokentype.h>
+#include <mono/metadata/appdomain.h>
 #include <mono/metadata/mono-debug.h>
 #include <mono/metadata/mono-debug-debugger.h>
 
 struct _MonoDebugHandlePriv
 {
-       GHashTable *wrapper_info;
        MonoDebuggerSymbolFile *debugger_info;
+       MonoDebugDomainData *domain_table;
+};
+
+struct _MonoDebugDomainDataPriv
+{
+       GHashTable *wrapper_info;
+       MonoDebugDomainData *next;
 };
 
 MonoDebugFormat mono_debug_format;
@@ -145,17 +152,17 @@ mono_debug_open_image (MonoImage *image)
        handle = g_new0 (MonoDebugHandle, 1);
        handle->image = image;
        handle->image->ref_count++;
+       handle->image_file = g_strdup (image->name);
        handle->_priv = g_new0 (MonoDebugHandlePriv, 1);
-       handle->_priv->wrapper_info = g_hash_table_new (g_direct_hash, g_direct_equal);
 
        g_hash_table_insert (mono_debug_handles, image, handle);
 
        if (image->assembly->dynamic)
                return handle;
 
-       handle->symfile = mono_debug_open_mono_symbol_file (handle->image, in_the_mono_debugger);
+       handle->symfile = mono_debug_open_mono_symbol_file (handle, in_the_mono_debugger);
        if (in_the_mono_debugger)
-               handle->_priv->debugger_info = mono_debugger_add_symbol_file (handle->symfile);
+               handle->_priv->debugger_info = mono_debugger_add_symbol_file (handle);
 
        return handle;
 }
@@ -165,7 +172,6 @@ mono_debug_close_image (MonoDebugHandle *handle)
 {
        if (handle->symfile)
                mono_debug_close_mono_symbol_file (handle->symfile);
-       g_hash_table_destroy (handle->_priv->wrapper_info);
        handle->image->ref_count--;
        g_free (handle->_priv);
        g_free (handle);
@@ -231,12 +237,13 @@ _mono_debug_lookup_method (MonoMethod *method)
  * wrapper method.
  */
 void
-mono_debug_add_wrapper (MonoMethod *method, MonoMethod *wrapper_method)
+mono_debug_add_wrapper (MonoMethod *method, MonoMethod *wrapper_method, MonoDomain *domain)
 {
        MonoClass *klass = method->klass;
        MonoDebugHandle *handle;
        MonoDebugMethodInfo *minfo;
        MonoDebugMethodJitInfo *jit;
+       MonoDebugDomainData *domain_data;
 
        if (!(method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
                return;
@@ -247,19 +254,22 @@ mono_debug_add_wrapper (MonoMethod *method, MonoMethod *wrapper_method)
        g_assert (handle);
 
        minfo = _mono_debug_lookup_method (method);
-       if (!minfo || minfo->jit)
+       if (!minfo)
                return;
 
-       jit = g_hash_table_lookup (handle->_priv->wrapper_info, wrapper_method);
+       domain_data = mono_debug_get_domain_data (handle, domain);
+       g_assert (!domain_data->jit [minfo->index]);
+
+       jit = g_hash_table_lookup (domain_data->_priv->wrapper_info, wrapper_method);
        g_assert (jit);
 
        mono_debugger_lock ();
 
-       minfo->jit = jit;
-       minfo->jit->wrapper_addr = method->addr;
+       domain_data->jit [minfo->index] = jit;
+       jit->wrapper_addr = method->addr;
 
        if (handle->_priv->debugger_info)
-               mono_debugger_add_method (handle->_priv->debugger_info, method);
+               mono_debugger_add_method (handle->_priv->debugger_info, minfo, jit);
 
        mono_debugger_unlock ();
 }
@@ -269,9 +279,10 @@ mono_debug_add_wrapper (MonoMethod *method, MonoMethod *wrapper_method)
  * compiled method.
  */
 void
-mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit)
+mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDomain *domain)
 {
        MonoClass *klass = method->klass;
+       MonoDebugDomainData *domain_data;
        MonoDebugHandle *handle;
        MonoDebugMethodInfo *minfo;
 
@@ -286,37 +297,40 @@ mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit)
        handle = _mono_debug_get_image (klass->image);
        g_assert (handle);
 
-       if (method->wrapper_type != MONO_WRAPPER_NONE) {
-               g_hash_table_insert (handle->_priv->wrapper_info, method, jit);
-               return;
-       }
-
        minfo = _mono_debug_lookup_method (method);
        if (!minfo)
                return;
 
        mono_debugger_lock ();
 
-       g_assert (!minfo->jit);
-       minfo->jit = jit;
+       domain_data = mono_debug_get_domain_data (handle, domain);
+       g_assert (!domain_data->jit [minfo->index]);
+
+       if (method->wrapper_type != MONO_WRAPPER_NONE) {
+               g_hash_table_insert (domain_data->_priv->wrapper_info, method, jit);
+               mono_debugger_unlock ();
+               return;
+       }
+
+       domain_data->jit [minfo->index] = jit;
 
        if (handle->_priv->debugger_info)
-               mono_debugger_add_method (handle->_priv->debugger_info, method);
+               mono_debugger_add_method (handle->_priv->debugger_info, minfo, jit);
 
        mono_debugger_unlock ();
 }
 
 static gint32
-il_offset_from_address (MonoDebugMethodInfo *minfo, guint32 address)
+il_offset_from_address (MonoDebugMethodJitInfo *jit, guint32 address)
 {
        int i;
 
-       if (!minfo->jit || !minfo->jit->line_numbers)
+       if (!jit || !jit->line_numbers)
                return -1;
 
-       for (i = minfo->jit->line_numbers->len - 1; i >= 0; i--) {
+       for (i = jit->line_numbers->len - 1; i >= 0; i--) {
                MonoDebugLineNumberEntry lne = g_array_index (
-                       minfo->jit->line_numbers, MonoDebugLineNumberEntry, i);
+                       jit->line_numbers, MonoDebugLineNumberEntry, i);
 
                if (lne.address <= address)
                        return lne.offset;
@@ -336,20 +350,26 @@ il_offset_from_address (MonoDebugMethodInfo *minfo, guint32 address)
  * line number 8 in the variable pointed to by @line_number).
  */
 gchar *
-mono_debug_source_location_from_address (MonoMethod *method, guint32 address, guint32 *line_number)
+mono_debug_source_location_from_address (MonoMethod *method, guint32 address, guint32 *line_number,
+                                        MonoDomain *domain)
 {
        MonoDebugMethodInfo *minfo = _mono_debug_lookup_method (method);
+       MonoDebugDomainData *domain_data;
 
        if (!minfo)
                return NULL;
 
-       if (minfo->symfile) {
-               gint32 offset = il_offset_from_address (minfo, address);
+       domain_data = mono_debug_get_domain_data (minfo->handle, domain);
+       if (!domain_data->jit [minfo->index])
+               return NULL;
+
+       if (minfo->handle) {
+               gint32 offset = il_offset_from_address (domain_data->jit [minfo->index], address);
                
                if (offset < 0)
                        return NULL;
 
-               return mono_debug_find_source_location (minfo->symfile, method, offset, line_number);
+               return mono_debug_find_source_location (minfo->handle->symfile, method, offset, line_number);
        }
 
        return NULL;
@@ -370,10 +390,10 @@ mono_debug_source_location_from_il_offset (MonoMethod *method, guint32 offset, g
 {
        MonoDebugMethodInfo *minfo = _mono_debug_lookup_method (method);
 
-       if (!minfo || !minfo->symfile)
+       if (!minfo || !minfo->handle)
                return NULL;
 
-       return mono_debug_find_source_location (minfo->symfile, method, offset, line_number);
+       return mono_debug_find_source_location (minfo->handle->symfile, method, offset, line_number);
 }
 
 /*
@@ -381,9 +401,10 @@ mono_debug_source_location_from_il_offset (MonoMethod *method, guint32 offset, g
  * relative to the beginning of the method @method.
  */
 gint32
-mono_debug_il_offset_from_address (MonoMethod *method, gint32 address)
+mono_debug_il_offset_from_address (MonoMethod *method, gint32 address, MonoDomain *domain)
 {
        MonoDebugMethodInfo *minfo;
+       MonoDebugDomainData *domain_data;
 
        if (address < 0)
                return -1;
@@ -392,7 +413,9 @@ mono_debug_il_offset_from_address (MonoMethod *method, gint32 address)
        if (!minfo || !minfo->il_offsets)
                return -1;
 
-       return il_offset_from_address (minfo, address);
+       domain_data = mono_debug_get_domain_data (minfo->handle, domain);
+
+       return il_offset_from_address (domain_data->jit [minfo->index], address);
 }
 
 /*
@@ -400,9 +423,10 @@ mono_debug_il_offset_from_address (MonoMethod *method, gint32 address)
  * The returned value is an offset relative to the beginning of the method @method.
  */
 gint32
-mono_debug_address_from_il_offset (MonoMethod *method, gint32 il_offset)
+mono_debug_address_from_il_offset (MonoMethod *method, gint32 il_offset, MonoDomain *domain)
 {
        MonoDebugMethodInfo *minfo;
+       MonoDebugDomainData *domain_data;
 
        if (il_offset < 0)
                return -1;
@@ -411,5 +435,28 @@ mono_debug_address_from_il_offset (MonoMethod *method, gint32 il_offset)
        if (!minfo || !minfo->il_offsets)
                return -1;
 
-       return _mono_debug_address_from_il_offset (minfo, il_offset);
+       domain_data = mono_debug_get_domain_data (minfo->handle, domain);
+
+       return _mono_debug_address_from_il_offset (domain_data->jit [minfo->index], il_offset);
+}
+
+MonoDebugDomainData *
+mono_debug_get_domain_data (MonoDebugHandle *handle, MonoDomain *domain)
+{
+       MonoDebugDomainData *data;
+
+       for (data = handle->_priv->domain_table; data; data = data->_priv->next)
+               if (data->domain_id == domain->domain_id)
+                       return data;
+
+       data = g_new0 (MonoDebugDomainData, 1);
+       data->domain_id = domain->domain_id;
+       data->jit = g_new0 (MonoDebugMethodJitInfo *, handle->symfile->offset_table->method_count + 1);
+
+       data->_priv = g_new0 (MonoDebugDomainDataPriv, 1);
+       data->_priv->next = handle->_priv->domain_table;
+       data->_priv->wrapper_info = g_hash_table_new (g_direct_hash, g_direct_equal);
+       handle->_priv->domain_table = data;
+
+       return data;
 }
index e6dd23114f55e46814bf4a36c88be8c251a80a0f..64760b73cbcc508d8076de3be23241754c4ec417 100644 (file)
@@ -2,10 +2,19 @@
 #define __MONO_DEBUG_H__
 
 #include <glib.h>
-#include <mono/metadata/debug-mono-symfile.h>
+#include <mono/metadata/image.h>
+#include <mono/metadata/appdomain.h>
+
+typedef struct _MonoSymbolFile                 MonoSymbolFile;
+typedef struct _MonoSymbolFilePriv             MonoSymbolFilePriv;
 
 typedef struct _MonoDebugHandle                        MonoDebugHandle;
 typedef struct _MonoDebugHandlePriv            MonoDebugHandlePriv;
+typedef struct _MonoDebugDomainData            MonoDebugDomainData;
+typedef struct _MonoDebugDomainDataPriv                MonoDebugDomainDataPriv;
+
+typedef struct _MonoDebugVarInfo               MonoDebugVarInfo;
+typedef struct _MonoDebugMethodJitInfo         MonoDebugMethodJitInfo;
 
 typedef enum {
        MONO_DEBUG_FORMAT_NONE,
@@ -14,24 +23,79 @@ typedef enum {
 } MonoDebugFormat;
 
 struct _MonoDebugHandle {
+       const char *image_file;
        MonoImage *image;
        MonoSymbolFile *symfile;
        MonoDebugHandlePriv *_priv;
 };
 
+struct _MonoDebugMethodJitInfo {
+       const guint8 *code_start;
+       guint32 code_size;
+       guint32 prologue_end;
+       guint32 epilogue_begin;
+       const guint8 *wrapper_addr;
+       // Array of MonoDebugLineNumberEntry
+       GArray *line_numbers;
+       guint32 num_params;
+       MonoDebugVarInfo *this_var;
+       MonoDebugVarInfo *params;
+       guint32 num_locals;
+       MonoDebugVarInfo *locals;
+};
+
+struct _MonoDebugDomainData {
+       guint32 domain_id;
+       MonoDebugMethodJitInfo **jit;
+       MonoDebugDomainDataPriv *_priv;
+};
+
+/*
+ * These bits of the MonoDebugLocalInfo's "index" field are flags specifying
+ * where the variable is actually stored.
+ *
+ * See relocate_variable() in debug-symfile.c for more info.
+ */
+#define MONO_DEBUG_VAR_ADDRESS_MODE_FLAGS              0xf0000000
+
+/* If "index" is zero, the variable is at stack offset "offset". */
+#define MONO_DEBUG_VAR_ADDRESS_MODE_STACK              0
+
+/* The variable is in the register whose number is contained in bits 0..4 of the
+ * "index" field plus an offset of "offset" (which can be zero).
+ */
+#define MONO_DEBUG_VAR_ADDRESS_MODE_REGISTER           0x10000000
+
+/* The variables in in the two registers whose numbers are contained in bits 0..4
+ * and 5..9 of the "index" field plus an offset of "offset" (which can be zero).
+ */
+#define MONO_DEBUG_VAR_ADDRESS_MODE_TWO_REGISTERS      0x20000000
+
+struct _MonoDebugVarInfo {
+       guint32 index;
+       guint32 offset;
+       guint32 size;
+       guint32 begin_scope;
+       guint32 end_scope;
+};
+
+#define MONO_DEBUGGER_VERSION                          28
+#define MONO_DEBUGGER_MAGIC                            0x7aff65af4253d427
+
 extern MonoDebugFormat mono_debug_format;
 extern GHashTable *mono_debug_handles;
 
 void mono_debug_init (MonoDebugFormat format);
 void mono_debug_init_2 (MonoAssembly *assembly);
 void mono_debug_cleanup (void);
-void mono_debug_add_wrapper (MonoMethod *method, MonoMethod *wrapper_method);
-void mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit);
+MonoDebugDomainData *mono_debug_get_domain_data (MonoDebugHandle *handle, MonoDomain *domain);
+void mono_debug_add_wrapper (MonoMethod *method, MonoMethod *wrapper_method, MonoDomain *domain);
+void mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDomain *domain);
 gchar *mono_debug_source_location_from_address (MonoMethod *method, guint32 address,
-                                               guint32 *line_number);
+                                               guint32 *line_number, MonoDomain *domain);
 gchar *mono_debug_source_location_from_il_offset (MonoMethod *method, guint32 offset,
                                                  guint32 *line_number);
-gint32 mono_debug_il_offset_from_address (MonoMethod *method, gint32 address);
-gint32 mono_debug_address_from_il_offset (MonoMethod *method, gint32 il_offset);
+gint32 mono_debug_il_offset_from_address (MonoMethod *method, gint32 address, MonoDomain *domain);
+gint32 mono_debug_address_from_il_offset (MonoMethod *method, gint32 il_offset, MonoDomain *domain);
 
 #endif /* __MONO_DEBUG_H__ */
index b3389e4504792c54b8b24876c22d0b2d1888278c..a2942964e81b144fc7de41dbc2f055bc6dd685cb 100644 (file)
@@ -141,7 +141,7 @@ mono_debug_close_method (MonoCompile *cfg)
        for (i = 0; i < jit->num_params; i++)
                write_variable (cfg->varinfo [i + method->signature->hasthis], &jit->params [i]);
 
-       mono_debug_add_method (method, jit);
+       mono_debug_add_method (method, jit, cfg->domain);
 
        if (info->breakpoint_id)
                mono_debugger_breakpoint_callback (method, info->breakpoint_id);
index 5e00f88cb5d7661c271c898dfbe8f9a62e356326..050cade59751bd7fa9e2baacea27e1699fd24c5e 100644 (file)
@@ -600,8 +600,8 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf
                                *managed = TRUE;
 
                if (trace) {
-                       source_location = mono_debug_source_location_from_address (ji->method, address, NULL);
-                       iloffset = mono_debug_il_offset_from_address (ji->method, address);
+                       source_location = mono_debug_source_location_from_address (ji->method, address, NULL, domain);
+                       iloffset = mono_debug_il_offset_from_address (ji->method, address, domain);
 
                        if (iloffset < 0)
                                tmpaddr = g_strdup_printf ("<0x%05x>", address);
@@ -715,12 +715,12 @@ ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info
                sf->method = mono_method_get_object (domain, ji->method, NULL);
                sf->native_offset = (char *)ip - (char *)ji->code_start;
 
-               sf->il_offset = mono_debug_il_offset_from_address (ji->method, sf->native_offset);
+               sf->il_offset = mono_debug_il_offset_from_address (ji->method, sf->native_offset, domain);
 
                if (need_file_info) {
                        gchar *filename;
                        
-                       filename = mono_debug_source_location_from_address (ji->method, sf->native_offset, &sf->line);
+                       filename = mono_debug_source_location_from_address (ji->method, sf->native_offset, &sf->line, domain);
 
                        sf->filename = filename? mono_string_new (domain, filename): NULL;
                        sf->column = 0;
@@ -756,7 +756,7 @@ mono_jit_walk_stack (MonoStackWalk func, gpointer user_data) {
                if (ji == (gpointer)-1)
                        return;
 
-               il_offset = mono_debug_il_offset_from_address (ji->method, native_offset);
+               il_offset = mono_debug_il_offset_from_address (ji->method, native_offset, domain);
 
                if (func (ji->method, native_offset, il_offset, managed, user_data))
                        return;
@@ -798,12 +798,12 @@ ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
        } while (skip >= 0);
 
        *method = mono_method_get_object (domain, ji->method, NULL);
-       *iloffset = mono_debug_il_offset_from_address (ji->method, *native_offset);
+       *iloffset = mono_debug_il_offset_from_address (ji->method, *native_offset, domain);
 
        if (need_file_info) {
                gchar *filename;
 
-               filename = mono_debug_source_location_from_address (ji->method, *native_offset, line);
+               filename = mono_debug_source_location_from_address (ji->method, *native_offset, line, domain);
 
                *file = filename? mono_string_new (domain, filename): NULL;
                *column = 0;