diff --git a/src/ir.cpp b/src/ir.cpp index 618996bcc..b012e67b7 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -846,7 +846,7 @@ void ir_build_proc (irValue *value, irProcedure *parent); void ir_gen_global_type_name(irModule *m, Entity *e, String name); irValue *ir_get_type_info_ptr (irProcedure *proc, Type *type); void ir_value_set_debug_location(irProcedure *proc, irValue *v); -void ir_push_debug_location (irModule *m, Ast *node, irDebugInfo *scope); +void ir_push_debug_location (irModule *m, Ast *node, irDebugInfo *scope, Entity *e=nullptr); void ir_pop_debug_location (irModule *m); irDebugInfo *ir_add_debug_info_local(irProcedure *proc, Entity *e, i32 arg_id); irDebugInfo *ir_add_debug_info_file(irModule *module, AstFile *file); @@ -1513,7 +1513,8 @@ irValue *ir_add_local(irProcedure *proc, Entity *e, Ast *expr, bool zero_initial } // if (proc->module->generate_debug_info && expr != nullptr && proc->entity != nullptr) { - if (proc->module->generate_debug_info && proc->entity != nullptr) { + // if (proc->module->generate_debug_info && proc->entity != nullptr) { + if (proc->module->generate_debug_info) { // GB_ASSERT_NOT_NULL(proc->debug_scope); if (expr != nullptr) { ir_emit(proc, ir_instr_debug_declare(proc, expr, e, true, instr)); @@ -1589,7 +1590,7 @@ irValue *ir_add_param(irProcedure *proc, Entity *e, Ast *expr, Type *abi_type, i irValue *v = ir_value_param(proc, e, abi_type); irValueParam *p = &v->Param; - ir_push_debug_location(proc->module, e ? e->identifier : nullptr, proc->debug_scope); + ir_push_debug_location(proc->module, e ? e->identifier : nullptr, proc->debug_scope, e); defer (ir_pop_debug_location(proc->module)); switch (p->kind) { @@ -2590,9 +2591,23 @@ irDebugInfo *ir_add_debug_info_proc(irProcedure *proc) { return di; } -irDebugInfo *ir_add_debug_info_location(irModule *m, Ast *node, irDebugInfo *scope) { +irDebugInfo *ir_add_debug_info_location(irModule *m, Ast *node, irDebugInfo *scope, Entity *e) { if (node == nullptr || scope == nullptr) { - return nullptr; + if (e == nullptr) { + return nullptr; + } else if (scope != nullptr) { + irDebugInfo **existing = map_get(&m->debug_info, hash_entity(e)); + if (existing != nullptr) { + return *existing; + } + + // TODO HACK(bill): This is a little dirty but it is should do for the weird edge cases + irDebugInfo *di = ir_alloc_debug_info(irDebugInfo_Location); + di->Location.pos = e->token.pos; + di->Location.scope = scope; + map_set(&m->debug_info, hash_entity(e), di); + return di; + } } // TODO(lachsinc): Should we traverse the node/children until we find one with // valid token/pos and use that instead?? @@ -2607,8 +2622,8 @@ irDebugInfo *ir_add_debug_info_location(irModule *m, Ast *node, irDebugInfo *sco return di; } -void ir_push_debug_location(irModule *m, Ast *node, irDebugInfo *scope) { - irDebugInfo *debug_location = ir_add_debug_info_location(m, node, scope); +void ir_push_debug_location(irModule *m, Ast *node, irDebugInfo *scope, Entity *e) { + irDebugInfo *debug_location = ir_add_debug_info_location(m, node, scope, e); array_add(&m->debug_location_stack, debug_location); } @@ -2666,9 +2681,18 @@ void ir_value_set_debug_location(irProcedure *proc, irValue *v) { v->loc = *array_end_ptr(&m->debug_location_stack); if (v->loc == nullptr && proc->entity != nullptr) { - // NOTE(lachsinc): Entry point (main()) and runtime_startup are the only ones where null location is considered valid. - GB_ASSERT_MSG(proc->is_entry_point || (string_compare(proc->name, str_lit(IR_STARTUP_RUNTIME_PROC_NAME)) == 0), - "%.*s %p", LIT(proc->name), proc->entity); + if (proc->is_entry_point || (string_compare(proc->name, str_lit(IR_STARTUP_RUNTIME_PROC_NAME)) == 0)) { + // NOTE(lachsinc): Entry point (main()) and runtime_startup are the only ones where null location is considered valid. + } else { + if (v->kind == irValue_Instr) { + auto *instr = &v->Instr; + gb_printf_err("Instruction kind: %.*s\n", LIT(ir_instr_strings[instr->kind])); + if (instr->kind == irInstr_DebugDeclare) { + gb_printf_err("\t%.*s\n", LIT(instr->DebugDeclare.entity->token.string)); + } + } + GB_PANIC("Value wihout debug location: %.*s %p; %p", LIT(proc->name), proc->entity, v); + } } } @@ -8543,7 +8567,6 @@ void ir_begin_procedure_body(irProcedure *proc) { ir_push_debug_location(proc->module, proc->entity->identifier, proc->debug_scope); GB_ASSERT_NOT_NULL(proc->debug_scope); } else { - // GB_ASSERT(proc->is_entry_point || (string_compare(proc->name, str_lit(IR_STARTUP_RUNTIME_PROC_NAME)) == 0)); ir_push_debug_location(proc->module, nullptr, nullptr); }