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/codegen/llvm.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/codegen/llvm.zig')
| -rw-r--r-- | src/codegen/llvm.zig | 8 |
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", &.{}); |
