Browse Source

Fix Source_Code_Location error for *_insert_dynamic_map_key_and_value procedures

gingerBill 5 years ago
parent
commit
9da1347c21
3 changed files with 24 additions and 9 deletions
  1. 13 4
      src/ir.cpp
  2. 8 4
      src/llvm_backend.cpp
  3. 3 1
      src/llvm_backend.hpp

+ 13 - 4
src/ir.cpp

@@ -153,6 +153,8 @@ struct irProcedure {
 	irTargetList *        target_list;
 	Array<irValue *>      referrers;
 
+	Ast *curr_stmt;
+
 	Array<irContextData>  context_stack;
 
 	i32      parameter_count;
@@ -3614,7 +3616,7 @@ void ir_emit_bounds_check(irProcedure *proc, Token token, irValue *index, irValu
 
 
 irValue *ir_insert_dynamic_map_key_and_value(irProcedure *proc, irValue *addr, Type *map_type,
-                                             irValue *map_key, irValue *map_value) {
+                                             irValue *map_key, irValue *map_value, Ast *node) {
 	map_type = base_type(map_type);
 
 	irValue *h = ir_gen_map_header(proc, addr, map_type);
@@ -3628,7 +3630,7 @@ irValue *ir_insert_dynamic_map_key_and_value(irProcedure *proc, irValue *addr, T
 	args[0] = h;
 	args[1] = key;
 	args[2] = ir_emit_conv(proc, ptr, t_rawptr);
-	args[3] = ir_emit_source_code_location(proc, nullptr);
+	args[3] = ir_emit_source_code_location(proc, node);
 	return ir_emit_runtime_call(proc, "__dynamic_map_set", args);
 }
 
@@ -3768,7 +3770,7 @@ void ir_addr_store(irProcedure *proc, irAddr addr, irValue *value) {
 		return;
 
 	} else if (addr.kind == irAddr_Map) {
-		ir_insert_dynamic_map_key_and_value(proc, addr.addr, addr.map_type, addr.map_key, value);
+		ir_insert_dynamic_map_key_and_value(proc, addr.addr, addr.map_type, addr.map_key, value, proc->curr_stmt);
 		return;
 	} else if (addr.kind == irAddr_BitField) {
 		gbAllocator a = ir_allocator();
@@ -6784,6 +6786,10 @@ u64 ir_generate_source_code_location_hash(TokenPos pos) {
 }
 
 irValue *ir_emit_source_code_location(irProcedure *proc, String procedure, TokenPos pos) {
+	if (pos.file == "") {
+		gb_printf_err("here\n");
+	}
+
 	gbAllocator a = ir_allocator();
 	irValue *v = ir_alloc_value(irValue_SourceCodeLocation);
 	v->SourceCodeLocation.file      = ir_find_or_add_entity_string(proc->module, pos.file);
@@ -8880,7 +8886,7 @@ irAddr ir_build_addr(irProcedure *proc, Ast *expr) {
 
 				irValue *key   = ir_build_expr(proc, fv->field);
 				irValue *value = ir_build_expr(proc, fv->value);
-				ir_insert_dynamic_map_key_and_value(proc, v, type, key, value);
+				ir_insert_dynamic_map_key_and_value(proc, v, type, key, value, elem);
 			}
 			break;
 		}
@@ -9578,6 +9584,8 @@ void ir_build_stmt_list(irProcedure *proc, Array<Ast *> stmts) {
 
 void ir_build_stmt_internal(irProcedure *proc, Ast *node);
 void ir_build_stmt(irProcedure *proc, Ast *node) {
+	Ast *prev_stmt = proc->curr_stmt;
+	proc->curr_stmt = node;
 	u64 prev_state_flags = proc->module->state_flags;
 	defer (proc->module->state_flags = prev_state_flags);
 
@@ -9600,6 +9608,7 @@ void ir_build_stmt(irProcedure *proc, Ast *node) {
 	ir_build_stmt_internal(proc, node);
 	ir_pop_debug_location(proc->module);
 
+	proc->curr_stmt = prev_stmt;
 }
 
 void ir_build_when_stmt(irProcedure *proc, AstWhenStmt *ws) {

+ 8 - 4
src/llvm_backend.cpp

@@ -384,7 +384,7 @@ void lb_addr_store(lbProcedure *p, lbAddr addr, lbValue value) {
 
 		return;
 	} else if (addr.kind == lbAddr_Map) {
-		lb_insert_dynamic_map_key_and_value(p, addr, addr.map.type, addr.map.key, value);
+		lb_insert_dynamic_map_key_and_value(p, addr, addr.map.type, addr.map.key, value, p->curr_stmt);
 		return;
 	} else if (addr.kind == lbAddr_BitField) {
 		Type *bft = base_type(type_deref(addr.addr.type));
@@ -3909,6 +3909,10 @@ lbValue lb_emit_logical_binary_expr(lbProcedure *p, TokenKind op, Ast *left, Ast
 }
 
 void lb_build_stmt(lbProcedure *p, Ast *node) {
+	Ast *prev_stmt = p->curr_stmt;
+	defer (p->curr_stmt = prev_stmt);
+	p->curr_stmt = node;
+
 	if (p->curr_block != nullptr) {
 		LLVMValueRef last_instr = LLVMGetLastInstruction(p->curr_block->block);
 		if (lb_is_instr_terminating(last_instr)) {
@@ -9616,7 +9620,7 @@ lbValue lb_gen_map_key(lbProcedure *p, lbValue key, Type *key_type) {
 }
 
 void lb_insert_dynamic_map_key_and_value(lbProcedure *p, lbAddr addr, Type *map_type,
-                                         lbValue map_key, lbValue map_value) {
+                                         lbValue map_key, lbValue map_value, Ast *node) {
 	map_type = base_type(map_type);
 	GB_ASSERT(map_type->kind == Type_Map);
 
@@ -9631,7 +9635,7 @@ void lb_insert_dynamic_map_key_and_value(lbProcedure *p, lbAddr addr, Type *map_
 	args[0] = h;
 	args[1] = key;
 	args[2] = lb_emit_conv(p, value_addr.addr, t_rawptr);
-	args[3] = lb_emit_source_code_location(p, nullptr);
+	args[3] = lb_emit_source_code_location(p, node);
 	lb_emit_runtime_call(p, "__dynamic_map_set", args);
 }
 
@@ -10336,7 +10340,7 @@ lbAddr lb_build_addr(lbProcedure *p, Ast *expr) {
 
 				lbValue key   = lb_build_expr(p, fv->field);
 				lbValue value = lb_build_expr(p, fv->value);
-				lb_insert_dynamic_map_key_and_value(p, v, type, key, value);
+				lb_insert_dynamic_map_key_and_value(p, v, type, key, value, elem);
 			}
 			break;
 		}

+ 3 - 1
src/llvm_backend.hpp

@@ -218,6 +218,8 @@ struct lbProcedure {
 	lbBlock *        curr_block;
 	lbTargetList *   target_list;
 
+	Ast *curr_stmt;
+
 	Array<lbContextData> context_stack;
 
 	lbValue  return_ptr_hint_value;
@@ -345,7 +347,7 @@ lbValue lb_generate_local_array(lbProcedure *p, Type *elem_type, i64 count, bool
 lbValue lb_generate_global_array(lbModule *m, Type *elem_type, i64 count, String prefix, i64 id);
 lbValue lb_gen_map_header(lbProcedure *p, lbValue map_val_ptr, Type *map_type);
 lbValue lb_gen_map_key(lbProcedure *p, lbValue key, Type *key_type);
-void    lb_insert_dynamic_map_key_and_value(lbProcedure *p, lbAddr addr, Type *map_type, lbValue map_key, lbValue map_value);
+void    lb_insert_dynamic_map_key_and_value(lbProcedure *p, lbAddr addr, Type *map_type, lbValue map_key, lbValue map_value, Ast *node);
 
 
 void lb_store_type_case_implicit(lbProcedure *p, Ast *clause, lbValue value);