From cec9f7abfe55a70fc7e56960eda1870aee596cbb Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 19 Nov 2017 15:06:56 +0000 Subject: Add `-debug` command (still in development) --- src/ir.cpp | 57 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 28 deletions(-) (limited to 'src/ir.cpp') diff --git a/src/ir.cpp b/src/ir.cpp index 175a95db2..aa4bd86b0 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -109,6 +109,16 @@ struct irBranchBlocks { }; +struct irDebugLocation { + TokenPos pos; + irDebugInfo *debug_scope; +}; + +struct irDebugScope { + irDebugScope * parent; + irDebugLocation loc; +}; + struct irProcedure { irProcedure * parent; Array children; @@ -125,6 +135,8 @@ struct irProcedure { bool is_export; bool is_entry_point; + irDebugInfo * debug_scope; + irValue * return_ptr; Array params; Array defer_stmts; @@ -146,6 +158,9 @@ struct irProcedure { i32 block_count; }; + + + #define IR_STARTUP_RUNTIME_PROC_NAME "__$startup_runtime" #define IR_TYPE_INFO_DATA_NAME "__$type_info_data" #define IR_TYPE_INFO_TYPES_NAME "__$type_info_types_data" @@ -231,11 +246,10 @@ struct irProcedure { irValue **args; \ isize arg_count; \ irValue * context_ptr; \ - irDebugInfo *debug_location; \ }) \ IR_INSTR_KIND(StartupRuntime, i32) \ IR_INSTR_KIND(DebugDeclare, struct { \ - irDebugInfo *debug_info; \ + irDebugInfo *scope; \ AstNode * expr; \ Entity * entity; \ bool is_addr; \ @@ -388,10 +402,12 @@ struct irValueParam { Array referrers; }; + struct irValue { - irValueKind kind; - i32 index; - bool index_set; + irValueKind kind; + i32 index; + bool index_set; + irDebugLocation loc; union { irValueConstant Constant; irValueConstantSlice ConstantSlice; @@ -490,8 +506,6 @@ enum irDebugInfoKind { irDebugInfo_Proc, irDebugInfo_AllProcs, - irDebugInfo_Location, - irDebugInfo_BasicType, // basic types irDebugInfo_ProcType, irDebugInfo_DerivedType, // pointer, typedef @@ -534,11 +548,6 @@ struct irDebugInfo { struct { Array procs; } AllProcs; - struct { - irDebugInfo *scope; - TokenPos pos; - } Location; - struct { String name; @@ -1070,18 +1079,6 @@ irValue *ir_instr_call(irProcedure *p, irValue *value, irValue *return_ptr, irVa v->Instr.Call.arg_count = arg_count; v->Instr.Call.type = result_type; v->Instr.Call.context_ptr = context_ptr; - - irDebugInfo **pp = map_get(&p->module->debug_info, hash_entity(p->entity)); - if (pp != nullptr) { - GB_ASSERT_MSG(pp != nullptr, "%.*s %p", LIT(p->name), p->entity); - irDebugInfo *dl = ir_alloc_debug_info(p->module->allocator, irDebugInfo_Location); - dl->Location.scope = *pp; - dl->Location.pos = p->entity->token.pos; - map_set(&p->module->debug_info, hash_pointer(v), dl); - - v->Instr.Call.debug_location = dl; - } - return v; } @@ -1100,9 +1097,9 @@ irValue *ir_instr_comment(irProcedure *p, String text) { return v; } -irValue *ir_instr_debug_declare(irProcedure *p, irDebugInfo *debug_info, AstNode *expr, Entity *entity, bool is_addr, irValue *value) { +irValue *ir_instr_debug_declare(irProcedure *p, irDebugInfo *scope, AstNode *expr, Entity *entity, bool is_addr, irValue *value) { irValue *v = ir_alloc_instr(p, irInstr_DebugDeclare); - v->Instr.DebugDeclare.debug_info = debug_info; + v->Instr.DebugDeclare.scope = scope; v->Instr.DebugDeclare.expr = expr; v->Instr.DebugDeclare.entity = entity; v->Instr.DebugDeclare.is_addr = is_addr; @@ -1130,7 +1127,6 @@ irValue *ir_value_constant_slice(gbAllocator a, Type *type, irValue *backing_arr } - irValue *ir_emit(irProcedure *proc, irValue *instr) { GB_ASSERT(instr->kind == irValue_Instr); irBlock *b = proc->curr_block; @@ -1519,6 +1515,8 @@ irDebugInfo *ir_add_debug_info_proc(irProcedure *proc, Entity *entity, String na di->Proc.file = file; di->Proc.pos = entity->token.pos; + proc->debug_scope = di; + map_set(&proc->module->debug_info, hash_entity(entity), di); return di; } @@ -7665,7 +7663,10 @@ void ir_init_module(irModule *m, Checker *c) { m->tmp_allocator = gb_arena_allocator(&m->tmp_arena); m->info = &c->info; - m->generate_debug_info = build_context.ODIN_OS == "windows" && build_context.word_size == 8; + m->generate_debug_info = false; + if (build_context.debug) { + m->generate_debug_info = build_context.ODIN_OS == "windows" && build_context.word_size == 8; + } map_init(&m->values, heap_allocator()); map_init(&m->members, heap_allocator()); -- cgit v1.2.3