void mono_debug_open_block (MonoCompile *cfg, MonoBasicBlock *bb, guint32 address) { MiniDebugMethodInfo *info; MonoMethodHeader *header; guint32 offset; info = (MiniDebugMethodInfo *) cfg->debug_info; if (!info || !info->jit || !bb->cil_code) return; header = cfg->header; g_assert (header); if ((bb->cil_code < header->code) || (bb->cil_code > header->code + header->code_size)) return; offset = bb->cil_code - header->code; if (!info->has_line_numbers) { info->jit->prologue_end = address; info->has_line_numbers = TRUE; } record_line_number (info, address, offset); }
void mono_debug_close_method (MonoCompile *cfg) { MiniDebugMethodInfo *info; MonoDebugMethodJitInfo *jit; MonoMethodHeader *header; MonoMethodSignature *sig; MonoDebugMethodAddress *debug_info; MonoMethod *method; int i; info = (MiniDebugMethodInfo *) cfg->debug_info; 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; if (jit->epilogue_begin) record_line_number (info, jit->epilogue_begin, header->code_size); 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->locals [i], &jit->locals [i]); if (sig->hasthis) { jit->this_var = g_new0 (MonoDebugVarInfo, 1); write_variable (cfg->args [0], jit->this_var); } for (i = 0; i < jit->num_params; i++) write_variable (cfg->args [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); debug_info = mono_debug_add_method (cfg->method_to_register, jit, cfg->domain); mono_debug_add_vg_method (method, jit); mono_debugger_check_breakpoints (method, debug_info); mono_debug_free_method_jit_info (jit); g_array_free (info->line_numbers, TRUE); g_free (info); }
void mono_debug_record_line_number (MonoCompile *cfg, MonoInst *ins, guint32 address) { MiniDebugMethodInfo *info; MonoMethodHeader *header; guint32 offset; info = (MiniDebugMethodInfo *) cfg->debug_info; if (!info || !info->jit || !ins->cil_code) return; header = mono_method_get_header (cfg->method); g_assert (header); if ((ins->cil_code < header->code) || (ins->cil_code > header->code + header->code_size)) return; offset = ins->cil_code - header->code; if (!info->has_line_numbers) { info->jit->prologue_end = address; info->has_line_numbers = TRUE; } record_line_number (info, address, offset); }
void 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) g_free (info); return; } method = cfg->method; header = cfg->header; 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; jit->has_var_info = mini_debug_options.mdb_optimizations || MONO_CFG_PROFILE_CALL_CONTEXT (cfg); if (jit->epilogue_begin) record_line_number (info, jit->epilogue_begin, header->code_size); if (jit->has_var_info) { 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->locals [i], &jit->locals [i]); if (sig->hasthis) { jit->this_var = g_new0 (MonoDebugVarInfo, 1); write_variable (cfg->args [0], jit->this_var); } for (i = 0; i < jit->num_params; i++) write_variable (cfg->args [i + sig->hasthis], &jit->params [i]); if (cfg->gsharedvt_info_var) { jit->gsharedvt_info_var = g_new0 (MonoDebugVarInfo, 1); jit->gsharedvt_locals_var = g_new0 (MonoDebugVarInfo, 1); write_variable (cfg->gsharedvt_info_var, jit->gsharedvt_info_var); write_variable (cfg->gsharedvt_locals_var, jit->gsharedvt_locals_var); } } 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 (cfg->method_to_register, jit, cfg->domain); mono_debug_add_vg_method (method, jit); mono_debug_free_method_jit_info (jit); mono_debug_free_method (cfg); }