Add breakpoint intrinsic
All checks were successful
CI / ci (Release, ubuntu-latest) (pull_request) Successful in 22s
CI / ci (Release-assertions, ubuntu-latest) (pull_request) Successful in 27s
CI / ci (Release, ubuntu-latest) (push) Successful in 1m22s
CI / ci (Release-assertions, ubuntu-latest) (push) Successful in 1m30s
CI / ci (Debug, ubuntu-latest) (push) Successful in 7m20s
CI / release (ubuntu-latest) (push) Successful in 9s

This commit is contained in:
David Gonzalez Martin 2025-06-27 20:47:02 -06:00
parent 0ada589422
commit a0b2218cc3
2 changed files with 30 additions and 0 deletions

View File

@ -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();

View File

@ -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;
}