*** empty log message ***
[mono.git] / mono / jit / debug-dwarf2.c
index 8617489e8fb85554ddbe8de8f9db589e46f085cb..fdca0d3d564652202306d9ff8073e329d9ac46e5 100644 (file)
@@ -176,7 +176,7 @@ dwarf2_write_long (FILE *f, unsigned long value)
 static void
 dwarf2_write_address (FILE *f, const void *address)
 {
-       fprintf (f, "\t.long 0x%lx\n", address);
+       fprintf (f, "\t.long 0x%lx\n", (long) address);
 }
 
 static void
@@ -901,7 +901,7 @@ write_method_lines_dwarf2 (MonoDebugHandle *debug, MonoDebugMethodInfo *minfo)
        DebugMethodInfo *priv = minfo->user_data;
        int i;
 
-       if (!priv->line_numbers)
+       if (!minfo->jit || !minfo->jit->line_numbers)
                return;
 
        // Start of statement program
@@ -912,18 +912,19 @@ write_method_lines_dwarf2 (MonoDebugHandle *debug, MonoDebugMethodInfo *minfo)
        dwarf2_write_dw_lns_copy (debug->f);
 
        st_line = priv->start_line;
-       st_address = minfo->jit->code_start;
+       st_address = 0;
 
-       for (i = 1; i < priv->line_numbers->len; i++) {
-               DebugLineNumberInfo *lni = g_ptr_array_index (priv->line_numbers, i);
+       for (i = 1; i < minfo->jit->line_numbers->len; i++) {
+               MonoDebugLineNumberEntry lne = g_array_index (
+                       minfo->jit->line_numbers, MonoDebugLineNumberEntry, i);
                gint32 line_inc, addr_inc, opcode;
                int used_standard_opcode = 0;
 
-               line_inc = lni->line - st_line;
-               addr_inc = (char *)lni->address - (char *)st_address;
+               line_inc = lne.line - st_line;
+               addr_inc = (char *)lne.address - (char *)st_address;
 
                if (addr_inc < 0) {
-                       dwarf2_write_dw_lne_set_address (debug->f, lni->address);
+                       dwarf2_write_dw_lne_set_address (debug->f, lne.address + minfo->jit->code_start);
                        used_standard_opcode = 1;
                } else if (addr_inc && !line_inc) {
                        dwarf2_write_dw_lns_advance_pc (debug->f, addr_inc);
@@ -970,10 +971,16 @@ write_method_lines_func (gpointer key, gpointer value, gpointer user_data)
 }
 
 static void
-write_line_numbers (MonoDebugHandle *debug)
+write_method_lines_func_1 (gpointer key, gpointer value, gpointer user_data)
 {
-       GList *tmp;
+       AssemblyDebugInfo *info = (AssemblyDebugInfo *) value;
+
+       g_hash_table_foreach (info->methods, write_method_lines_func, user_data);
+}
 
+static void
+write_line_numbers (MonoDebugHandle *debug)
+{
        /* State machine registers. */
        int i;
        
@@ -1012,11 +1019,7 @@ write_line_numbers (MonoDebugHandle *debug)
        dwarf2_write_byte (debug->f, 0);
        dwarf2_write_label (debug->f, "DL3");
 
-       for (tmp = debug->info; tmp; tmp = tmp->next) {
-               AssemblyDebugInfo *info = (AssemblyDebugInfo*)tmp->data;
-
-               g_hash_table_foreach (info->methods, write_method_lines_func, debug);
-       }
+       g_hash_table_foreach (debug->images, write_method_lines_func_1, debug);
 
        dwarf2_write_label (debug->f, "debug_line_e");
 }
@@ -1141,11 +1144,17 @@ write_method_func (gpointer key, gpointer value, gpointer user_data)
        write_method_dwarf2 (user_data, value);
 }
 
+static void
+write_method_func_1 (gpointer key, gpointer value, gpointer user_data)
+{
+       AssemblyDebugInfo *info = (AssemblyDebugInfo *) value;
+
+       g_hash_table_foreach (info->methods, write_method_func, user_data);
+}
+
 void
 mono_debug_write_dwarf2 (MonoDebugHandle *debug)
 {
-       GList *tmp;
-
        if (!(debug->f = fopen (debug->filename, "w"))) {
                g_warning ("Can't create dwarf file `%s': %s", debug->filename, g_strerror (errno)); 
                return;
@@ -1367,11 +1376,7 @@ mono_debug_write_dwarf2 (MonoDebugHandle *debug)
        dwarf2_write_ref4 (debug->f, "debug_lines_b");
 
        // Methods
-       for (tmp = debug->info; tmp; tmp = tmp->next) {
-               AssemblyDebugInfo *info = (AssemblyDebugInfo*)tmp->data;
-
-               g_hash_table_foreach (info->methods, write_method_func, debug);
-       }
+       g_hash_table_foreach (debug->images, write_method_func_1, debug);
 
        // Derived types
        g_hash_table_foreach (debug->type_hash, write_class, debug);