aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorRobin Voetter <robin@voetter.nl>2021-12-18 06:11:46 +0100
committerRobin Voetter <robin@voetter.nl>2021-12-21 01:41:51 +0100
commitddd2ef822f99979d3ea61583a91ab236942e6367 (patch)
treea95dc4847af72a411d1a638e10b0fc056d67e511 /src/codegen
parent2f7e98c129ca3c86fe20c043078bcc7f2fe477d6 (diff)
downloadzig-ddd2ef822f99979d3ea61583a91ab236942e6367.tar.gz
zig-ddd2ef822f99979d3ea61583a91ab236942e6367.zip
stage2: @returnAddress()
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/c.zig5
-rw-r--r--src/codegen/llvm.zig10
2 files changed, 15 insertions, 0 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index b086d15b48..070aa0a238 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -1125,6 +1125,7 @@ fn genBody(f: *Function, body: []const Air.Inst.Index) error{ AnalysisFail, OutO
.arg => airArg(f),
.breakpoint => try airBreakpoint(f),
+ .ret_addr => try airRetAddr(f),
.unreach => try airUnreach(f),
.fence => try airFence(f, inst),
@@ -2191,6 +2192,10 @@ fn airBreakpoint(f: *Function) !CValue {
return CValue.none;
}
+fn airRetAddr(f: *Function) !CValue {
+ return f.fail("TODO implement codegen for airRetAddr", .{});
+}
+
fn airFence(f: *Function, inst: Air.Inst.Index) !CValue {
const atomic_order = f.air.instructions.items(.data)[inst].fence;
const writer = f.object.writer();
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index d12dad2403..0a2b12dd1e 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -1747,6 +1747,7 @@ pub const FuncGen = struct {
.br => try self.airBr(inst),
.switch_br => try self.airSwitchBr(inst),
.breakpoint => try self.airBreakpoint(inst),
+ .ret_addr => try self.airRetAddr(inst),
.call => try self.airCall(inst),
.cond_br => try self.airCondBr(inst),
.intcast => try self.airIntCast(inst),
@@ -3550,6 +3551,15 @@ pub const FuncGen = struct {
return null;
}
+ fn airRetAddr(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value {
+ _ = inst;
+ const i32_zero = self.context.intType(32).constNull();
+ const usize_llvm_ty = try self.dg.llvmType(Type.usize);
+ const llvm_fn = self.getIntrinsic("llvm.returnaddress", &.{});
+ const ptr_val = self.builder.buildCall(llvm_fn, &[_]*const llvm.Value{i32_zero}, 1, .Fast, .Auto, "");
+ return self.builder.buildPtrToInt(ptr_val, usize_llvm_ty, "");
+ }
+
fn airFence(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value {
const atomic_order = self.air.instructions.items(.data)[inst].fence;
const llvm_memory_order = toLlvmAtomicOrdering(atomic_order);