diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index 4a07dd496..85c03dfdb 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -6246,13 +6246,12 @@ static inline void llvm_emit_macro_block(GenContext *c, BEValue *be_value, Expr Expr *init_expr = val->var.init_expr; BEValue value; llvm_emit_expr(c, &value, init_expr); - if (llvm_value_is_addr(&value) || val->var.is_written || val->var.is_addr) + if (llvm_value_is_addr(&value) || val->var.is_written || val->var.is_addr || llvn_use_accurate_debug_info(c)) { llvm_emit_and_set_decl_alloca(c, val); llvm_store_decl(c, val, &value); continue; } - val->is_value = true; val->backend_value = value.value; FOREACH_END(); diff --git a/src/compiler/llvm_codegen_function.c b/src/compiler/llvm_codegen_function.c index 75b59e944..eb3591afa 100644 --- a/src/compiler/llvm_codegen_function.c +++ b/src/compiler/llvm_codegen_function.c @@ -196,7 +196,7 @@ static inline void llvm_process_parameter_value(GenContext *c, Decl *decl, ABIAr decl->span, NULL, NULL, NULL); } - if (!decl->var.is_written && !decl->var.is_addr) + if (!decl->var.is_written && !decl->var.is_addr && !llvn_use_accurate_debug_info(c)) { decl->backend_value = param_value; decl->is_value = true; diff --git a/src/compiler/llvm_codegen_internal_impl.h b/src/compiler/llvm_codegen_internal_impl.h index 7ae5c416c..ad1254031 100644 --- a/src/compiler/llvm_codegen_internal_impl.h +++ b/src/compiler/llvm_codegen_internal_impl.h @@ -166,6 +166,11 @@ INLINE LLVMValueRef llvm_emit_extract_value(GenContext *c, LLVMValueRef agg, uns return LLVMBuildExtractValue(c->builder, agg, index, ""); } +INLINE bool llvn_use_accurate_debug_info(GenContext *context) +{ + return context->debug.builder && active_target.optlevel <= OPTIMIZATION_NONE; +} + INLINE bool llvm_use_debug(GenContext *context) { return context->debug.builder != NULL; } INLINE bool llvm_basic_block_is_unused(LLVMBasicBlockRef block) diff --git a/test/test_suite/concurrency/atomic_load_store_debug.c3t b/test/test_suite/concurrency/atomic_load_store_debug.c3t index 0cae6bb9e..ca6f34e93 100644 --- a/test/test_suite/concurrency/atomic_load_store_debug.c3t +++ b/test/test_suite/concurrency/atomic_load_store_debug.c3t @@ -31,35 +31,63 @@ define void @test.main() #0 !dbg !6 { entry: %a = alloca i32, align 4 %x = alloca i32, align 4 + %x1 = alloca ptr, align 8 %y = alloca i32, align 4 + %x2 = alloca ptr, align 8 + %x3 = alloca ptr, align 8 + %value = alloca i32, align 4 + %x4 = alloca ptr, align 8 + %value6 = alloca i32, align 4 %varargslots = alloca [1 x %"any*"], align 16 %retparam = alloca i64, align 8 call void @llvm.dbg.declare(metadata ptr %a, metadata !10, metadata !DIExpression()), !dbg !12 store i32 111, ptr %a, align 4, !dbg !13 call void @llvm.dbg.declare(metadata ptr %x, metadata !14, metadata !DIExpression()), !dbg !15 - %0 = load atomic i32, ptr %a seq_cst, align 4, !dbg !16 - store i32 %0, ptr %x, align 4, !dbg !16 + store ptr %a, ptr %x1, align 8 + %0 = load ptr, ptr %x1, align 8, !dbg !16 + %1 = load atomic i32, ptr %0 seq_cst, align 4, !dbg !16 + store i32 %1, ptr %x, align 4, !dbg !16 call void @llvm.dbg.declare(metadata ptr %y, metadata !19, metadata !DIExpression()), !dbg !20 - %1 = load atomic volatile i32, ptr %a monotonic, align 4, !dbg !21 - store i32 %1, ptr %y, align 4, !dbg !21 - %2 = load i32, ptr %x, align 4, !dbg !23 - %add = add i32 123, %2, !dbg !24 - store atomic i32 %add, ptr %a seq_cst, align 4, !dbg !25 - %3 = load i32, ptr %y, align 4, !dbg !27 - %add1 = add i32 33, %3, !dbg !28 - store atomic volatile i32 %add1, ptr %a monotonic, align 4, !dbg !29 - %4 = insertvalue %"any*" undef, ptr %a, 0, !dbg !31 - %5 = insertvalue %"any*" %4, i64 ptrtoint (ptr @"$ct.int" to i64), 1, !dbg !31 - store %"any*" %5, ptr %varargslots, align 16, !dbg !31 - %6 = call i64 @std.io.printfn(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1), !dbg !32 + store ptr %a, ptr %x2, align 8 + %2 = load ptr, ptr %x2, align 8, !dbg !21 + %3 = load atomic volatile i32, ptr %2 monotonic, align 4, !dbg !21 + store i32 %3, ptr %y, align 4, !dbg !21 + store ptr %a, ptr %x3, align 8 + %4 = load i32, ptr %x, align 4, !dbg !23 + %add = add i32 123, %4, !dbg !24 + store i32 %add, ptr %value, align 4 + %5 = load ptr, ptr %x3, align 8, !dbg !25 + %6 = load i32, ptr %value, align 4, !dbg !25 + store atomic i32 %6, ptr %5 seq_cst, align 4, !dbg !25 + store ptr %a, ptr %x4, align 8 + %7 = load i32, ptr %y, align 4, !dbg !27 + %add5 = add i32 33, %7, !dbg !28 + store i32 %add5, ptr %value6, align 4 + %8 = load ptr, ptr %x4, align 8, !dbg !29 + %9 = load i32, ptr %value6, align 4, !dbg !29 + store atomic volatile i32 %9, ptr %8 monotonic, align 4, !dbg !29 + %10 = insertvalue %"any*" undef, ptr %a, 0, !dbg !31 + %11 = insertvalue %"any*" %10, i64 ptrtoint (ptr @"$ct.int" to i64), 1, !dbg !31 + store %"any*" %11, ptr %varargslots, align 16, !dbg !31 + %12 = call i64 @std.io.printfn(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1), !dbg !32 ret void, !dbg !32 } ; Function Attrs: define i32 @main(i32 %0, ptr %1) #0 !dbg !33 { entry: - call void @llvm.dbg.value(metadata i32 %0, metadata !39, metadata !DIExpression()), !dbg !40 - call void @llvm.dbg.value(metadata ptr %1, metadata !41, metadata !DIExpression()), !dbg !40 + %.anon = alloca i32, align 4 + %.anon1 = alloca ptr, align 8 + %.anon2 = alloca i32, align 4 + %.anon3 = alloca ptr, align 8 + store i32 %0, ptr %.anon, align 4 + call void @llvm.dbg.declare(metadata ptr %.anon, metadata !39, metadata !DIExpression()), !dbg !40 + store ptr %1, ptr %.anon1, align 8 + call void @llvm.dbg.declare(metadata ptr %.anon1, metadata !41, metadata !DIExpression()), !dbg !40 + %2 = load i32, ptr %.anon, align 4 + store i32 %2, ptr %.anon2, align 4 + %3 = load ptr, ptr %.anon1, align 8 + store ptr %3, ptr %.anon3, align 8 call void @test.main(), !dbg !42 ret i32 0, !dbg !45 }