aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2024-02-08 21:36:43 +0000
committerGitHub <noreply@github.com>2024-02-08 21:36:43 +0000
commitd771b3286d87779ea5b1fc3531e0261a36e062c7 (patch)
tree5661a725af185f10245e634d6928126edc4400a5 /src
parent9127e584c56e94bf8a739a5a3349fa9097a1f5d1 (diff)
parent0e6dd56ac1f1e0b4fe38320125813a0194d9e577 (diff)
Merge pull request #3182 from laytan/fix-instrumentation-in-debug-mode
fix instrumentation in debug mode
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend.hpp2
-rw-r--r--src/llvm_backend_opt.cpp19
2 files changed, 17 insertions, 4 deletions
diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp
index fe2c2deba..026454c81 100644
--- a/src/llvm_backend.hpp
+++ b/src/llvm_backend.hpp
@@ -567,6 +567,8 @@ gb_internal LLVMTypeRef lb_type_internal_for_procedures_raw(lbModule *m, Type *t
gb_internal lbValue lb_emit_source_code_location_as_global_ptr(lbProcedure *p, String const &procedure, TokenPos const &pos);
+gb_internal LLVMMetadataRef lb_debug_location_from_token_pos(lbProcedure *p, TokenPos pos);
+
gb_internal LLVMTypeRef llvm_array_type(LLVMTypeRef ElementType, uint64_t ElementCount) {
#if LB_USE_NEW_PASS_SYSTEM
return LLVMArrayType2(ElementType, ElementCount);
diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp
index b57e74799..6a6d2f802 100644
--- a/src/llvm_backend_opt.cpp
+++ b/src/llvm_backend_opt.cpp
@@ -380,9 +380,19 @@ gb_internal void lb_run_remove_dead_instruction_pass(lbProcedure *p) {
}
}
-gb_internal LLVMValueRef lb_run_instrumentation_pass_insert_call(lbProcedure *p, Entity *entity, LLVMBuilderRef dummy_builder) {
+gb_internal LLVMValueRef lb_run_instrumentation_pass_insert_call(lbProcedure *p, Entity *entity, LLVMBuilderRef dummy_builder, bool is_enter) {
lbModule *m = p->module;
+ if (p->debug_info != nullptr) {
+ TokenPos pos = {};
+ if (is_enter) {
+ pos = ast_token(p->body).pos;
+ } else {
+ pos = ast_end_token(p->body).pos;
+ }
+ LLVMSetCurrentDebugLocation2(dummy_builder, lb_debug_location_from_token_pos(p, pos));
+ }
+
lbValue cc = lb_find_procedure_value_from_entity(m, entity);
LLVMValueRef args[3] = {};
@@ -430,7 +440,7 @@ gb_internal void lb_run_instrumentation_pass(lbProcedure *p) {
LLVMBasicBlockRef entry_bb = p->entry_block->block;
LLVMPositionBuilder(dummy_builder, entry_bb, LLVMGetFirstInstruction(entry_bb));
- lb_run_instrumentation_pass_insert_call(p, enter, dummy_builder);
+ lb_run_instrumentation_pass_insert_call(p, enter, dummy_builder, true);
LLVMRemoveStringAttributeAtIndex(p->value, LLVMAttributeIndex_FunctionIndex, LLVM_V_NAME("instrument-function-entry"));
unsigned bb_count = LLVMCountBasicBlocks(p->value);
@@ -451,7 +461,7 @@ gb_internal void lb_run_instrumentation_pass(lbProcedure *p) {
LLVMPositionBuilderBefore(dummy_builder, terminator);
- lb_run_instrumentation_pass_insert_call(p, exit, dummy_builder);
+ lb_run_instrumentation_pass_insert_call(p, exit, dummy_builder, false);
}
LLVMRemoveStringAttributeAtIndex(p->value, LLVMAttributeIndex_FunctionIndex, LLVM_V_NAME("instrument-function-exit"));
@@ -471,6 +481,8 @@ gb_internal void lb_run_function_pass_manager(LLVMPassManagerRef fpm, lbProcedur
// are not removed
lb_run_remove_dead_instruction_pass(p);
+ lb_run_instrumentation_pass(p);
+
switch (pass_manager_kind) {
case lbFunctionPassManager_none:
return;
@@ -481,7 +493,6 @@ gb_internal void lb_run_function_pass_manager(LLVMPassManagerRef fpm, lbProcedur
}
break;
}
- lb_run_instrumentation_pass(p);
LLVMRunFunctionPassManager(fpm, p->value);
}