diff options
| author | r00ster91 <r00ster91@proton.me> | 2023-03-03 18:35:03 +0100 |
|---|---|---|
| committer | r00ster91 <r00ster91@proton.me> | 2023-03-04 12:08:19 +0100 |
| commit | 65368683ad92b858d0a391cb29d37c0476784b40 (patch) | |
| tree | 741bea50bb76c77683a4c48d02f8ee63bd35c1e0 /src/Sema.zig | |
| parent | d6bd00e85500fa1a7909695ae5943be438f7521d (diff) | |
| download | zig-65368683ad92b858d0a391cb29d37c0476784b40.tar.gz zig-65368683ad92b858d0a391cb29d37c0476784b40.zip | |
add @trap builtin
This introduces a new builtin function that compiles down to something that results in an illegal instruction exception/interrupt.
It can be used to exit a program abnormally.
This implements the builtin for all backends.
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 4702d10688..8940527bc0 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -1101,6 +1101,7 @@ fn analyzeBodyInner( .@"unreachable" => break sema.zirUnreachable(block, inst), .panic => break sema.zirPanic(block, inst, false), .panic_comptime => break sema.zirPanic(block, inst, true), + .trap => break sema.zirTrap(block, inst), // zig fmt: on .extended => ext: { @@ -5144,6 +5145,14 @@ fn zirPanic(sema: *Sema, block: *Block, inst: Zir.Inst.Index, force_comptime: bo return always_noreturn; } +fn zirTrap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Zir.Inst.Index { + const src_node = sema.code.instructions.items(.data)[inst].node; + const src = LazySrcLoc.nodeOffset(src_node); + sema.src = src; + _ = try block.addNoOp(.trap); + return always_noreturn; +} + fn zirLoop(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const tracy = trace(@src()); defer tracy.end(); |
