2 * debug-mini.c: Mini-specific debugging stuff.
5 * Martin Baulig (martin@ximian.com)
7 * (C) 2003 Ximian, Inc.
12 #include <mono/metadata/mono-debug.h>
13 #include <mono/metadata/mono-debug-debugger.h>
16 * This method is only called when running in the Mono Debugger.
19 mono_debugger_create_notification_function (gpointer *notification_address)
23 ptr = buf = g_malloc0 (16);
25 if (notification_address)
26 *notification_address = buf;
33 record_line_number (MonoDebugMethodJitInfo *jit, guint32 address, guint32 offset)
35 MonoDebugLineNumberEntry *lne = g_new0 (MonoDebugLineNumberEntry, 1);
37 lne->address = address;
40 g_array_append_val (jit->line_numbers, *lne);
45 MonoDebugMethodJitInfo *jit;
46 guint32 has_line_numbers;
47 guint32 breakpoint_id;
48 } MiniDebugMethodInfo;
51 mono_debug_init_method (MonoCompile *cfg, MonoBasicBlock *start_block, guint32 breakpoint_id)
53 MonoMethod *method = cfg->method;
54 MiniDebugMethodInfo *info;
56 if (mono_debug_format == MONO_DEBUG_FORMAT_NONE)
59 if ((method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) ||
60 (method->iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME) ||
61 (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
62 (method->flags & METHOD_ATTRIBUTE_ABSTRACT) ||
63 (method->wrapper_type != MONO_WRAPPER_NONE))
66 info = g_new0 (MiniDebugMethodInfo, 1);
67 info->breakpoint_id = breakpoint_id;
69 cfg->debug_info = info;
73 mono_debug_open_method (MonoCompile *cfg)
75 MiniDebugMethodInfo *info;
76 MonoDebugMethodJitInfo *jit;
77 MonoMethodHeader *header;
79 info = (MiniDebugMethodInfo *) cfg->debug_info;
83 mono_class_init (cfg->method->klass);
85 g_assert (((MonoMethodNormal*)cfg->method)->header);
86 header = ((MonoMethodNormal*)cfg->method)->header;
88 info->jit = jit = g_new0 (MonoDebugMethodJitInfo, 1);
89 jit->line_numbers = g_array_new (FALSE, TRUE, sizeof (MonoDebugLineNumberEntry));
90 jit->num_locals = header->num_locals;
91 jit->locals = g_new0 (MonoDebugVarInfo, jit->num_locals);
95 write_variable (MonoInst *inst, MonoDebugVarInfo *var)
97 if (inst->opcode == OP_REGVAR)
98 var->index = inst->dreg | MONO_DEBUG_VAR_ADDRESS_MODE_REGISTER;
99 else if (inst->inst_basereg != X86_EBP) {
100 g_message (G_STRLOC ": %d - %d", inst->inst_basereg, inst->inst_offset);
101 var->index = inst->inst_basereg | MONO_DEBUG_VAR_ADDRESS_MODE_REGISTER;
102 var->offset = inst->inst_offset;
104 var->offset = inst->inst_offset;
108 mono_debug_close_method (MonoCompile *cfg)
110 MiniDebugMethodInfo *info;
111 MonoDebugMethodJitInfo *jit;
112 MonoMethodHeader *header;
116 info = (MiniDebugMethodInfo *) cfg->debug_info;
117 if (!info || !info->jit)
120 method = cfg->method;
121 header = ((MonoMethodNormal*)method)->header;
124 jit->code_start = cfg->native_code;
125 jit->epilogue_begin = cfg->epilog_begin;
126 jit->code_size = cfg->code_len;
128 record_line_number (jit, jit->epilogue_begin, header->code_size);
130 jit->num_params = method->signature->param_count;
131 jit->params = g_new0 (MonoDebugVarInfo, jit->num_params);
133 for (i = 0; i < jit->num_locals; i++)
134 write_variable (cfg->varinfo [cfg->locals_start + i], &jit->locals [i]);
136 if (method->signature->hasthis) {
137 jit->this_var = g_new0 (MonoDebugVarInfo, 1);
138 write_variable (cfg->varinfo [0], jit->this_var);
141 for (i = 0; i < jit->num_params; i++)
142 write_variable (cfg->varinfo [i + method->signature->hasthis], &jit->params [i]);
144 mono_debug_add_method (method, jit);
146 if (info->breakpoint_id)
147 mono_debugger_breakpoint_callback (method, info->breakpoint_id);
151 mono_debug_record_line_number (MonoCompile *cfg, MonoInst *ins, guint32 address)
153 MiniDebugMethodInfo *info;
154 MonoMethodHeader *header;
157 info = (MiniDebugMethodInfo *) cfg->debug_info;
158 if (!info || !info->jit || !ins->cil_code)
161 g_assert (((MonoMethodNormal*)cfg->method)->header);
162 header = ((MonoMethodNormal*)cfg->method)->header;
164 if ((ins->cil_code < header->code) ||
165 (ins->cil_code > header->code + header->code_size))
168 offset = ins->cil_code - header->code;
169 if (!info->has_line_numbers) {
170 info->jit->prologue_end = address;
171 info->has_line_numbers = TRUE;
174 record_line_number (info->jit, address, offset);