aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorr00ster91 <r00ster91@proton.me>2023-03-03 18:35:03 +0100
committerr00ster91 <r00ster91@proton.me>2023-03-04 12:08:19 +0100
commit65368683ad92b858d0a391cb29d37c0476784b40 (patch)
tree741bea50bb76c77683a4c48d02f8ee63bd35c1e0 /src/Sema.zig
parentd6bd00e85500fa1a7909695ae5943be438f7521d (diff)
downloadzig-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.zig9
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();