aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-02-28 13:34:21 +0200
committerAndrew Kelley <andrew@ziglang.org>2022-02-28 13:09:14 -0700
commit90bce11f62aa2f246b9bce5bc49069a3faf7ec9a (patch)
tree1489691423543c9d3d5c65dcefa7c8cd6ae59354 /src/codegen/llvm.zig
parent2682b41da54e9b652dc570140d52f85418d6b89d (diff)
downloadzig-90bce11f62aa2f246b9bce5bc49069a3faf7ec9a.tar.gz
zig-90bce11f62aa2f246b9bce5bc49069a3faf7ec9a.zip
stage2: implement `@frameAddress`
Diffstat (limited to 'src/codegen/llvm.zig')
-rw-r--r--src/codegen/llvm.zig12
1 files changed, 12 insertions, 0 deletions
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;