diff options
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/c.zig | 7 | ||||
| -rw-r--r-- | src/codegen/llvm.zig | 12 |
2 files changed, 19 insertions, 0 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig index f09acaa47c..331673cc55 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -1757,6 +1757,8 @@ fn genBody(f: *Function, body: []const Air.Inst.Index) error{ AnalysisFail, OutO .wrap_errunion_payload => try airWrapErrUnionPay(f, inst), .wrap_errunion_err => try airWrapErrUnionErr(f, inst), .errunion_payload_ptr_set => try airErrUnionPayloadPtrSet(f, inst), + + .frame_address => try airFrameAddress(f, inst), // zig fmt: on }; switch (result_value) { @@ -3198,6 +3200,11 @@ fn airErrUnionPayloadPtrSet(f: *Function, inst: Air.Inst.Index) !CValue { return f.fail("TODO: C backend: implement airErrUnionPayloadPtrSet", .{}); } +fn airFrameAddress(f: *Function, inst: Air.Inst.Index) !CValue { + _ = inst; + return f.fail("TODO: C backend: implement airFrameAddress", .{}); +} + fn airWrapErrUnionPay(f: *Function, inst: Air.Inst.Index) !CValue { if (f.liveness.isUnused(inst)) return CValue.none; diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index e349f0186e..6f2cc9bbd0 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -2214,6 +2214,8 @@ pub const FuncGen = struct { .wrap_errunion_payload => try self.airWrapErrUnionPayload(inst), .wrap_errunion_err => try self.airWrapErrUnionErr(inst), + .frame_address => try self.airFrameAddress(inst), + .constant => unreachable, .const_ty => unreachable, .unreach => self.airUnreach(inst), @@ -3339,6 +3341,16 @@ pub const FuncGen = struct { return partial; } + fn airFrameAddress(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) return null; + + const llvm_i32 = try self.dg.llvmType(Type.initTag(.i32)); + const llvm_fn = self.getIntrinsic("llvm.frameaddress", &.{llvm_i32}); + const ptr_val = self.builder.buildCall(llvm_fn, &[_]*const llvm.Value{llvm_i32.constNull()}, 1, .Fast, .Auto, ""); + const llvm_usize = try self.dg.llvmType(Type.usize); + return self.builder.buildPtrToInt(ptr_val, llvm_usize, ""); + } + fn airMin(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { if (self.liveness.isUnused(inst)) return null; |
