Browse Source

Fix loop var (init) becoming hidden while stepping on the for-line

- set debug location of jumps between block (similar to clang to the location of 'for')
- extend scope range to include all parts of the for-stmt
Fabian Sperber 3 years ago
parent
commit
fb167d1d0a
2 changed files with 12 additions and 2 deletions
  1. 4 0
      src/llvm_backend_debug.cpp
  2. 8 2
      src/llvm_backend_stmt.cpp

+ 4 - 0
src/llvm_backend_debug.cpp

@@ -43,6 +43,10 @@ LLVMMetadataRef lb_debug_location_from_ast(lbProcedure *p, Ast *node) {
 	GB_ASSERT(node != nullptr);
 	GB_ASSERT(node != nullptr);
 	return lb_debug_location_from_token_pos(p, ast_token(node).pos);
 	return lb_debug_location_from_token_pos(p, ast_token(node).pos);
 }
 }
+LLVMMetadataRef lb_debug_end_location_from_ast(lbProcedure *p, Ast *node) {
+	GB_ASSERT(node != nullptr);
+	return lb_debug_location_from_token_pos(p, ast_end_token(node).pos);
+}
 
 
 LLVMMetadataRef lb_debug_type_internal_proc(lbModule *m, Type *type) {
 LLVMMetadataRef lb_debug_type_internal_proc(lbModule *m, Type *type) {
 	i64 size = type_size_of(type); // Check size
 	i64 size = type_size_of(type); // Check size

+ 8 - 2
src/llvm_backend_stmt.cpp

@@ -1744,11 +1744,14 @@ void lb_build_for_stmt(lbProcedure *p, Ast *node) {
 		post = lb_create_block(p, "for.post");
 		post = lb_create_block(p, "for.post");
 	}
 	}
 
 
-
 	lb_emit_jump(p, loop);
 	lb_emit_jump(p, loop);
 	lb_start_block(p, loop);
 	lb_start_block(p, loop);
 
 
 	if (loop != body) {
 	if (loop != body) {
+		// right now the condition (all expressions) will not set it's debug location, so we will do it here
+		if (p->debug_info != nullptr) {
+			LLVMSetCurrentDebugLocation2(p->builder, lb_debug_location_from_ast(p, fs->cond));
+		}
 		lb_build_cond(p, fs->cond, body, done);
 		lb_build_cond(p, fs->cond, body, done);
 		lb_start_block(p, body);
 		lb_start_block(p, body);
 	}
 	}
@@ -1756,10 +1759,12 @@ void lb_build_for_stmt(lbProcedure *p, Ast *node) {
 	lb_push_target_list(p, fs->label, done, post, nullptr);
 	lb_push_target_list(p, fs->label, done, post, nullptr);
 
 
 	lb_build_stmt(p, fs->body);
 	lb_build_stmt(p, fs->body);
-	lb_close_scope(p, lbDeferExit_Default, nullptr);
 
 
 	lb_pop_target_list(p);
 	lb_pop_target_list(p);
 
 
+	if (p->debug_info != nullptr) {
+		LLVMSetCurrentDebugLocation2(p->builder, lb_debug_end_location_from_ast(p, fs->body));
+	}
 	lb_emit_jump(p, post);
 	lb_emit_jump(p, post);
 
 
 	if (fs->post != nullptr) {
 	if (fs->post != nullptr) {
@@ -1769,6 +1774,7 @@ void lb_build_for_stmt(lbProcedure *p, Ast *node) {
 	}
 	}
 
 
 	lb_start_block(p, done);
 	lb_start_block(p, done);
+	lb_close_scope(p, lbDeferExit_Default, nullptr);
 }
 }
 
 
 void lb_build_assign_stmt_array(lbProcedure *p, TokenKind op, lbAddr const &lhs, lbValue const &value) {
 void lb_build_assign_stmt_array(lbProcedure *p, TokenKind op, lbAddr const &lhs, lbValue const &value) {