aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorlachsinc <lachlansinclair@gmail.com>2018-10-04 13:43:52 +1000
committerlachsinc <lachlansinclair@gmail.com>2018-10-04 13:43:52 +1000
commit79d49f1955c7ae8509f1221fe533a1df5ef4bfaa (patch)
tree9afdce2174886742abcbe77b27f66a6d8aa39c4c /src/ir.cpp
parent1ccc8700e4f8d12650f95fad11f617e70dd870c7 (diff)
Lexical block debug info.
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp59
1 files changed, 49 insertions, 10 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 096af7532..56a03a4f6 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -527,6 +527,7 @@ enum irDebugInfoKind {
irDebugInfo_Scope,
irDebugInfo_Proc,
irDebugInfo_Location,
+ irDebugInfo_LexicalBlock,
irDebugInfo_AllProcs,
irDebugInfo_BasicType, // basic types
@@ -578,6 +579,11 @@ struct irDebugInfo {
irDebugInfo *scope;
} Location;
struct {
+ TokenPos pos;
+ irDebugInfo *file;
+ irDebugInfo *scope;
+ } LexicalBlock;
+ struct {
Array<irDebugInfo *> procs;
} AllProcs; // TODO(lachsinc): Redundant w/ DebugInfoArray. Merge.
@@ -823,7 +829,7 @@ 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_pop_debug_location (irModule *m);
-irDebugInfo *ir_add_debug_info_local(irModule *module, Entity *e, i32 arg_id, irDebugInfo *scope, irDebugInfo *file);
+irDebugInfo *ir_add_debug_info_local(irProcedure *proc, Entity *e, i32 arg_id);
irDebugInfo *ir_add_debug_info_file(irModule *module, AstFile *file);
irDebugInfo *ir_add_debug_info_proc(irProcedure *proc);
@@ -1433,8 +1439,8 @@ irValue *ir_add_local(irProcedure *proc, Entity *e, Ast *expr, bool zero_initial
ir_emit(proc, ir_instr_debug_declare(proc, expr, e, true, instr));
// TODO(lachsinc): "Arg" is not used yet but should be eventually, if applicable, set to param index
- irDebugInfo *di = *map_get(&proc->module->debug_info, hash_entity(proc->entity)); // TODO(lachsinc): Cleanup; lookup di for proc inside ir_add_debug_info_local() ?
- ir_add_debug_info_local(proc->module, e, 0, di, di->Proc.file);
+ // irDebugInfo *di = *map_get(&proc->module->debug_info, hash_entity(proc->entity)); // TODO(lachsinc): Cleanup; lookup di for proc inside ir_add_debug_info_local() ?
+ ir_add_debug_info_local(proc, e, 0); // TODO(lachsinc): Cleanup, lookup file / di scope inside.
ir_pop_debug_location(proc->module);
}
@@ -1853,8 +1859,7 @@ irDebugInfo *ir_add_debug_info_type_bit_set(irModule *module, Type *type, Entity
Type *elem_type = nullptr;
if (base->BitSet.elem != nullptr) {
- // TODO(lachsinc): Do bitsets have integration with other types other than enums? (except ints ofcourse,
- // but we can't name those fields..)
+ // TODO(lachsinc): Do bitsets have integration with non-primitive types other than enums?
elem_type = base->BitSet.elem;
if (elem_type->kind == Type_Enum) {
GB_ASSERT(elem_type->Enum.fields.count == base->BitSet.upper + 1);
@@ -2285,15 +2290,46 @@ irDebugInfo *ir_add_debug_info_global(irModule *module, irValue *v) {
return di;
}
-irDebugInfo *ir_add_debug_info_local(irModule *module, Entity *e, i32 arg_id, irDebugInfo *scope, irDebugInfo *file) {
- // if (!proc->module->generate_debug_info) {
- // return nullptr;
- // }
+irDebugInfo *ir_add_debug_info_block(irProcedure *proc, Scope *scope) {
+ // GB_ASSERT(block->kind == Ast_BlockStmt);
+
+ irModule *module = proc->module;
+
+ irDebugInfo **existing = map_get(&module->debug_info, hash_pointer(scope));
+ if (existing != nullptr) {
+ GB_ASSERT((*existing)->kind == irDebugInfo_LexicalBlock);
+ return *existing;
+ }
+
+ Ast *block = scope->node;
+
+ irDebugInfo *di = ir_alloc_debug_info(irDebugInfo_LexicalBlock);
+ di->LexicalBlock.file = proc->debug_scope->Proc.file;
+ di->LexicalBlock.scope = proc->debug_scope;
+ di->LexicalBlock.pos = ast_token(block).pos;
+ map_set(&module->debug_info, hash_pointer(scope), di);
+ return di;
+}
+
+irDebugInfo *ir_add_debug_info_local(irProcedure *proc, Entity *e, i32 arg_id) {
+ irModule *module = proc->module;
+
+ irDebugInfo *scope = nullptr;
+ irDebugInfo *file = nullptr;
+ if (e->scope->node->kind == Ast_ProcType) {
+ scope = proc->debug_scope;
+ file = proc->debug_scope->Proc.file;
+ } else {
+ scope = ir_add_debug_info_block(proc, e->scope);
+ file = scope->LexicalBlock.file;
+ }
+ GB_ASSERT_NOT_NULL(scope);
+ GB_ASSERT_NOT_NULL(file);
irDebugInfo *di = ir_alloc_debug_info(irDebugInfo_LocalVariable);
di->LocalVariable.name = e->token.string;
di->LocalVariable.scope = scope;
- di->LocalVariable.file = scope->Proc.file;
+ di->LocalVariable.file = file;
di->LocalVariable.pos = e->token.pos;
di->LocalVariable.arg = arg_id;
di->LocalVariable.type = ir_add_debug_info_type(module, e->type, nullptr, nullptr, nullptr);
@@ -2375,6 +2411,7 @@ irDebugInfo *ir_add_debug_info_location(irModule *m, Ast *node, irDebugInfo *sco
// GB_ASSERT(proc->is_entry_point || (string_compare(proc->name, str_lit(IR_STARTUP_RUNTIME_PROC_NAME)) == 0));
return nullptr;
}
+ // GB_ASSERT(node->kind != Ast_BlockStmt);
// TODO(lachsinc): Should we traverse the node/children until we find one with
// valid token/pos and use that instead??
irDebugInfo **existing = map_get(&m->debug_info, hash_node(node));
@@ -5562,6 +5599,8 @@ irValue *ir_build_expr(irProcedure *proc, Ast *expr) {
irValue *ir_build_expr_internal(irProcedure *proc, Ast *expr) {
expr = unparen_expr(expr);
+ // ir_push_debug_location(proc->module, expr, proc->debug_scope);
+ // defer (ir_pop_debug_location(proc->module));
TypeAndValue tv = type_and_value_of_expr(expr);
GB_ASSERT(tv.mode != Addressing_Invalid);