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
DebugMethodInfo *priv = minfo->user_data;
int i;
- if (!priv->line_numbers)
+ if (!minfo->jit || !minfo->jit->line_numbers)
return;
// Start of statement program
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);
}
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;
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");
}
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;
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);