2005-05-22 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / mini / debug-mini.c
index a294caa1a12785932f2b46aec8107171bd6cad5b..19f3a5b0db7acca0f77ef0f7983bd9a8cad1549e 100644 (file)
 #include <valgrind/valgrind.h>
 #endif
 
-static inline void
-record_line_number (MonoDebugMethodJitInfo *jit, guint32 address, guint32 offset)
-{
-       MonoDebugLineNumberEntry lne;
-
-       lne.address = address;
-       lne.offset = offset;
-
-       g_array_append_val (jit->line_numbers, lne);
-}
-
 typedef struct
 {
        MonoDebugMethodJitInfo *jit;
+       GArray *line_numbers;
        guint32 has_line_numbers;
        guint32 breakpoint_id;
 } MiniDebugMethodInfo;
 
+static inline void
+record_line_number (MiniDebugMethodInfo *info, guint32 address, guint32 offset)
+{
+       MonoDebugLineNumberEntry lne;
+
+       lne.native_offset = address;
+       lne.il_offset = offset;
+
+       g_array_append_val (info->line_numbers, lne);
+}
+
 void
 mono_debug_init_method (MonoCompile *cfg, MonoBasicBlock *start_block, guint32 breakpoint_id)
 {
@@ -80,7 +81,7 @@ mono_debug_open_method (MonoCompile *cfg)
        g_assert (header);
        
        info->jit = jit = g_new0 (MonoDebugMethodJitInfo, 1);
-       jit->line_numbers = g_array_new (FALSE, TRUE, sizeof (MonoDebugLineNumberEntry));
+       info->line_numbers = g_array_new (FALSE, TRUE, sizeof (MonoDebugLineNumberEntry));
        jit->num_locals = header->num_locals;
        jit->locals = g_new0 (MonoDebugVarInfo, jit->num_locals);
 }
@@ -139,8 +140,8 @@ mono_debug_add_vg_method (MonoMethod *method, MonoDebugMethodJitInfo *jit)
        }
 
        /* Create address->offset mapping */
-       for (i = 0; i < jit->line_numbers->len; ++i) {
-               MonoDebugLineNumberEntry *lne = &g_array_index (jit->line_numbers, MonoDebugLineNumberEntry, i);
+       for (i = 0; i < jit->num_line_numbers; ++i) {
+               MonoDebugLineNumberEntry *lne = jit->line_numbers [i];
 
                g_assert (lne->offset <= header->code_size);
 
@@ -194,36 +195,47 @@ mono_debug_close_method (MonoCompile *cfg)
        MiniDebugMethodInfo *info;
        MonoDebugMethodJitInfo *jit;
        MonoMethodHeader *header;
+       MonoMethodSignature *sig;
        MonoMethod *method;
        int i;
 
        info = (MiniDebugMethodInfo *) cfg->debug_info;
-       if (!info || !info->jit)
+       if (!info || !info->jit) {
+               if (info)
+                       g_free (info);
                return;
+       }
 
        method = cfg->method;
        header = mono_method_get_header (method);
+       sig = mono_method_signature (method);
 
        jit = info->jit;
        jit->code_start = cfg->native_code;
        jit->epilogue_begin = cfg->epilog_begin;
        jit->code_size = cfg->code_len;
 
-       record_line_number (jit, jit->epilogue_begin, header->code_size);
+       record_line_number (info, jit->epilogue_begin, header->code_size);
 
-       jit->num_params = method->signature->param_count;
+       jit->num_params = sig->param_count;
        jit->params = g_new0 (MonoDebugVarInfo, jit->num_params);
 
        for (i = 0; i < jit->num_locals; i++)
                write_variable (cfg->varinfo [cfg->locals_start + i], &jit->locals [i]);
 
-       if (method->signature->hasthis) {
+       if (sig->hasthis) {
                jit->this_var = g_new0 (MonoDebugVarInfo, 1);
                write_variable (cfg->varinfo [0], jit->this_var);
        }
 
        for (i = 0; i < jit->num_params; i++)
-               write_variable (cfg->varinfo [i + method->signature->hasthis], &jit->params [i]);
+               write_variable (cfg->varinfo [i + sig->hasthis], &jit->params [i]);
+
+       jit->num_line_numbers = info->line_numbers->len;
+       jit->line_numbers = g_new0 (MonoDebugLineNumberEntry, jit->num_line_numbers);
+
+       for (i = 0; i < jit->num_line_numbers; i++)
+               jit->line_numbers [i] = g_array_index (info->line_numbers, MonoDebugLineNumberEntry, i);
 
        mono_debug_add_method (method, jit, cfg->domain);
 
@@ -231,6 +243,10 @@ mono_debug_close_method (MonoCompile *cfg)
 
        if (info->breakpoint_id)
                mono_debugger_breakpoint_callback (method, info->breakpoint_id);
+
+       mono_debug_free_method_jit_info (jit);
+       g_array_free (info->line_numbers, TRUE);
+       g_free (info);
 }
 
 void
@@ -257,13 +273,13 @@ mono_debug_record_line_number (MonoCompile *cfg, MonoInst *ins, guint32 address)
                info->has_line_numbers = TRUE;
        }
 
-       record_line_number (info->jit, address, offset);
+       record_line_number (info, address, offset);
 }
 
 static inline void
-encode_value (gint32 value, char *buf, char **endbuf)
+encode_value (gint32 value, guint8 *buf, guint8 **endbuf)
 {
-       char *p = buf;
+       guint8 *p = buf;
 
        //printf ("ENCODE: %d 0x%x.\n", value, value);
 
@@ -273,7 +289,7 @@ encode_value (gint32 value, char *buf, char **endbuf)
         */
        if ((value >= 0) && (value <= 127))
                *p++ = value;
-       else if ((value >= 0) && (value <= 16384)) {
+       else if ((value >= 0) && (value <= 16383)) {
                p [0] = 0x80 | (value >> 8);
                p [1] = value & 0xff;
                p += 2;
@@ -297,10 +313,9 @@ encode_value (gint32 value, char *buf, char **endbuf)
 }
 
 static inline gint32
-decode_value (char *_ptr, char **rptr)
+decode_value (guint8 *ptr, guint8 **rptr)
 {
-       unsigned char *ptr = (unsigned char *) _ptr;
-       unsigned char b = *ptr;
+       guint8 b = *ptr;
        gint32 len;
        
        if ((b & 0x80) == 0){
@@ -328,7 +343,7 @@ decode_value (char *_ptr, char **rptr)
 }
 
 static void
-serialize_variable (MonoDebugVarInfo *var, char *p, char **endbuf)
+serialize_variable (MonoDebugVarInfo *var, guint8 *p, guint8 **endbuf)
 {
        guint32 flags = var->index & MONO_DEBUG_VAR_ADDRESS_MODE_FLAGS;
 
@@ -347,14 +362,12 @@ serialize_variable (MonoDebugVarInfo *var, char *p, char **endbuf)
 }
 
 void
-mono_debug_serialize_debug_info (MonoCompile *cfg, 
-                                                                guint8 **out_buf, guint32 *buf_len)
+mono_debug_serialize_debug_info (MonoCompile *cfg, guint8 **out_buf, guint32 *buf_len)
 {
        MiniDebugMethodInfo *info;
        MonoDebugMethodJitInfo *jit;
        guint32 size, prev_offset, prev_native_offset;
-       char *buf;
-       char *p;
+       guint8 *buf, *p;
        int i;
 
        info = (MiniDebugMethodInfo *) cfg->debug_info;
@@ -364,34 +377,32 @@ mono_debug_serialize_debug_info (MonoCompile *cfg,
        }
        jit = info->jit;
 
-       size = ((jit->num_params + jit->num_locals + 1) * 10) + (jit->line_numbers->len * 10) + 64;
+       size = ((jit->num_params + jit->num_locals + 1) * 10) + (jit->num_line_numbers * 10) + 64;
        p = buf = g_malloc (size);
        encode_value (jit->epilogue_begin, p, &p);
-    encode_value (jit->prologue_end, p, &p);
+       encode_value (jit->prologue_end, p, &p);
        encode_value (jit->code_size, p, &p);
 
        for (i = 0; i < jit->num_params; ++i)
                serialize_variable (&jit->params [i], p, &p);
 
-       if (cfg->method->signature->hasthis)
+       if (mono_method_signature (cfg->method)->hasthis)
                serialize_variable (jit->this_var, p, &p);
 
        for (i = 0; i < jit->num_locals; i++)
                serialize_variable (&jit->locals [i], p, &p);
 
-       encode_value (jit->line_numbers->len, p, &p);
+       encode_value (jit->num_line_numbers, p, &p);
 
        prev_offset = 0;
        prev_native_offset = 0;
-       for (i = 0; i < jit->line_numbers->len; ++i) {
+       for (i = 0; i < jit->num_line_numbers; ++i) {
                /* Sometimes, the offset values are not in increasing order */
-               MonoDebugLineNumberEntry *lne = &g_array_index (jit->line_numbers, 
-                                                                                                               MonoDebugLineNumberEntry,
-                                                                                                               i);
-               encode_value (lne->offset - prev_offset, p, &p);
-               encode_value (lne->address - prev_native_offset, p, &p);
-               prev_offset = lne->offset;
-               prev_native_offset = lne->address;
+               MonoDebugLineNumberEntry *lne = &jit->line_numbers [i];
+               encode_value (lne->il_offset - prev_offset, p, &p);
+               encode_value (lne->native_offset - prev_native_offset, p, &p);
+               prev_offset = lne->il_offset;
+               prev_native_offset = lne->native_offset;
        }
 
        g_assert (p - buf < size);
@@ -401,7 +412,7 @@ mono_debug_serialize_debug_info (MonoCompile *cfg,
 }
 
 static void
-deserialize_variable (MonoDebugVarInfo *var, char *p, char **endbuf)
+deserialize_variable (MonoDebugVarInfo *var, guint8 *p, guint8 **endbuf)
 {
        guint32 flags;
 
@@ -422,14 +433,12 @@ deserialize_variable (MonoDebugVarInfo *var, char *p, char **endbuf)
 }
 
 static MonoDebugMethodJitInfo *
-deserialize_debug_info (MonoMethod *method,
-                                               guint8 *code_start, 
-                                               guint8 *buf, guint32 buf_len)
+deserialize_debug_info (MonoMethod *method, guint8 *code_start, guint8 *buf, guint32 buf_len)
 {
        MonoMethodHeader *header;
+       gint32 offset, native_offset, prev_offset, prev_native_offset;
        MonoDebugMethodJitInfo *jit;
-       gint32 offset, native_offset, prev_offset, prev_native_offset, len;
-       char *p;
+       guint8 *p;
        int i;
 
        header = mono_method_get_header (method);
@@ -437,10 +446,9 @@ deserialize_debug_info (MonoMethod *method,
 
        jit = g_new0 (MonoDebugMethodJitInfo, 1);
        jit->code_start = code_start;
-       jit->line_numbers = g_array_new (FALSE, TRUE, sizeof (MonoDebugLineNumberEntry));
        jit->num_locals = header->num_locals;
        jit->locals = g_new0 (MonoDebugVarInfo, jit->num_locals);
-       jit->num_params = method->signature->param_count;
+       jit->num_params = mono_method_signature (method)->param_count;
        jit->params = g_new0 (MonoDebugVarInfo, jit->num_params);
 
        p = buf;
@@ -451,7 +459,7 @@ deserialize_debug_info (MonoMethod *method,
        for (i = 0; i < jit->num_params; ++i)
                deserialize_variable (&jit->params [i], p, &p);
 
-       if (method->signature->hasthis) {
+       if (mono_method_signature (method)->hasthis) {
                jit->this_var = g_new0 (MonoDebugVarInfo, 1);
                deserialize_variable (jit->this_var, p, &p);
        }
@@ -459,14 +467,20 @@ deserialize_debug_info (MonoMethod *method,
        for (i = 0; i < jit->num_locals; i++)
                deserialize_variable (&jit->locals [i], p, &p);
 
-       len = decode_value (p, &p);
+       jit->num_line_numbers = decode_value (p, &p);
+       jit->line_numbers = g_new0 (MonoDebugLineNumberEntry, jit->num_line_numbers);
 
        prev_offset = 0;
        prev_native_offset = 0;
-       for (i = 0; i < len; ++i) {
+       for (i = 0; i < jit->num_line_numbers; ++i) {
+               MonoDebugLineNumberEntry *lne = &jit->line_numbers [i];
+
                offset = prev_offset + decode_value (p, &p);
                native_offset = prev_native_offset + decode_value (p, &p);
-               record_line_number (jit, native_offset, offset);
+
+               lne->native_offset = native_offset;
+               lne->il_offset = offset;
+
                prev_offset = offset;
                prev_native_offset = native_offset;
        }
@@ -475,9 +489,8 @@ deserialize_debug_info (MonoMethod *method,
 }
 
 void
-mono_debug_add_aot_method (MonoDomain *domain,
-                                                  MonoMethod *method, guint8 *code_start, 
-                                                  guint8 *debug_info, guint32 debug_info_len)
+mono_debug_add_aot_method (MonoDomain *domain, MonoMethod *method, guint8 *code_start, 
+                          guint8 *debug_info, guint32 debug_info_len)
 {
        MonoDebugMethodJitInfo *jit;
 
@@ -494,20 +507,26 @@ mono_debug_add_aot_method (MonoDomain *domain,
        if (debug_info_len == 0)
                return;
 
-       jit = deserialize_debug_info (method, code_start,
-                                                                 debug_info,
-                                                                 debug_info_len);
+       jit = deserialize_debug_info (method, code_start, debug_info, debug_info_len);
+
+#if 0
+       jit = mono_debug_read_method ((MonoDebugMethodAddress *) debug_info);
+       jit->code_start = code_start;
+       jit->wrapper_addr = NULL;
+#endif
 
        mono_debug_add_method (method, jit, domain);
 
        mono_debug_add_vg_method (method, jit);
+
+       mono_debug_free_method_jit_info (jit);
 }
 
 MonoDomain *
 mono_init_debugger (const char *file, const char *opt_flags)
 {
        MonoDomain *domain;
-       const guchar *error;
+       const char *error;
        int opt;
 
        g_set_prgname (file);
@@ -537,5 +556,5 @@ mono_debug_add_icall_wrapper (MonoMethod *method, MonoJitICallInfo* callinfo)
        if (mono_debug_format == MONO_DEBUG_FORMAT_NONE)
                return;
 
-       mono_debug_add_wrapper (method, callinfo->func, mono_get_root_domain ());
+       // mono_debug_add_wrapper (method, callinfo->func, mono_get_root_domain ());
 }