From a0b2218cc3a8c8a8359cdbfe339fdee955ac4608 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Fri, 27 Jun 2025 20:47:02 -0600 Subject: [PATCH] Add breakpoint intrinsic --- src/compiler.bbb | 19 +++++++++++++++++++ tests/tests.bbb | 11 +++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/compiler.bbb b/src/compiler.bbb index 650b67a..772bbed 100644 --- a/src/compiler.bbb +++ b/src/compiler.bbb @@ -888,6 +888,7 @@ LLVMIntrinsicIndex = enum u32 { "llvm.ctlz", "llvm.cttz", + "llvm.debugtrap", "llvm.smax", "llvm.smin", "llvm.trap", @@ -2032,6 +2033,7 @@ ValueId = enum macro_instantiation, field_parent_pointer, build_mode, + breakpoint, } ValueConstantInteger = struct @@ -4126,6 +4128,7 @@ ValueKeyword = enum ValueIntrinsic = enum { align_of, + breakpoint, build_mode, byte_size, enum_from_int, @@ -5769,6 +5772,7 @@ parse_left = fn (module: &Module, scope: &Scope, builder: ValueBuilder) &Value .trap, .va_start, .has_debug_info, + .breakpoint, => { skip_space(module); @@ -5782,6 +5786,7 @@ parse_left = fn (module: &Module, scope: &Scope, builder: ValueBuilder) &Value .trap => { id = .trap; }, .va_start => { id = .va_start; }, .has_debug_info => { id = .has_debug_info; }, + .breakpoint => { id = .breakpoint; }, else => { unreachable; }, } @@ -12432,6 +12437,15 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi value_type = uint1(module); typecheck(module, expected_type, value_type); }, + .breakpoint => + { + if (expected_type) + { + report_error(); + } + + value_type = void_type(module); + }, else => { @trap(); @@ -15600,6 +15614,11 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con { llvm_value = LLVMConstInt(get_llvm_type(resolved_value_type, type_kind), @extend(module.has_debug_info), 0); }, + .breakpoint => + { + >call = emit_intrinsic_call(module, ."llvm.debugtrap", zero, zero); + llvm_value = call; + }, else => { @trap(); diff --git a/tests/tests.bbb b/tests/tests.bbb index 152b426..bca4359 100644 --- a/tests/tests.bbb +++ b/tests/tests.bbb @@ -2061,6 +2061,15 @@ pointer_sub = fn () void require(sub == 1); } +breakpoint = fn () void +{ + >ok: u1 = 1; + if (!ok) + { + @breakpoint(); + } +} + [export] main = fn [cc(c)] (argc: s32, argv: &&u8, envp: &&u8) s32 { >rc = return_constant(); @@ -2324,5 +2333,7 @@ pointer_sub = fn () void pointer_sub(); + breakpoint(); + return 0; }