aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.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/codegen/llvm.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/codegen/llvm.zig')
-rw-r--r--src/codegen/llvm.zig8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 6f240b88f5..1f8473ac32 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -4590,6 +4590,7 @@ pub const FuncGen = struct {
.block => try self.airBlock(inst),
.br => try self.airBr(inst),
.switch_br => try self.airSwitchBr(inst),
+ .trap => try self.airTrap(inst),
.breakpoint => try self.airBreakpoint(inst),
.ret_addr => try self.airRetAddr(inst),
.frame_addr => try self.airFrameAddress(inst),
@@ -8256,6 +8257,13 @@ pub const FuncGen = struct {
return fg.load(ptr, ptr_ty);
}
+ fn airTrap(self: *FuncGen, inst: Air.Inst.Index) !?*llvm.Value {
+ _ = inst;
+ const llvm_fn = self.getIntrinsic("llvm.trap", &.{});
+ _ = self.builder.buildCall(llvm_fn.globalGetValueType(), llvm_fn, undefined, 0, .Cold, .Auto, "");
+ return null;
+ }
+
fn airBreakpoint(self: *FuncGen, inst: Air.Inst.Index) !?*llvm.Value {
_ = inst;
const llvm_fn = self.getIntrinsic("llvm.debugtrap", &.{});