authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-12-18 06:11:46+01:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-12-21 01:41:51+01:00
logddd2ef822f99979d3ea61583a91ab236942e6367
treea95dc4847af72a411d1a638e10b0fc056d67e511
parent2f7e98c129ca3c86fe20c043078bcc7f2fe477d6

stage2: @returnAddress()


10 files changed, 46 insertions(+), 1 deletions(-)

src/Air.zig+4
......@@ -195,6 +195,9 @@ pub const Inst = struct {
195195 /// Lowers to a hardware trap instruction, or the next best thing.
196196 /// Result type is always void.
197197 breakpoint,
198 /// Yields the return address of the current function.
199 /// Uses the `no_op` field.
200 ret_addr,
198201 /// Function call.
199202 /// Result type is the return type of the function being called.
200203 /// Uses the `pl_op` field with the `Call` payload. operand is the callee.
......@@ -785,6 +788,7 @@ pub fn typeOfIndex(air: Air, inst: Air.Inst.Index) Type {
785788
786789 .ptrtoint,
787790 .slice_len,
791 .ret_addr,
788792 => return Type.initTag(.usize),
789793
790794 .bool_to_int => return Type.initTag(.u1),
src/Liveness.zig+1
......@@ -281,6 +281,7 @@ fn analyzeInst(
281281 .dbg_stmt,
282282 .unreach,
283283 .fence,
284 .ret_addr,
284285 => return trackOperands(a, new_set, inst, main_tomb, .{ .none, .none, .none }),
285286
286287 .not,
src/Sema.zig+5-1
......@@ -8739,8 +8739,12 @@ fn zirRetAddr(
87398739 block: *Block,
87408740 extended: Zir.Inst.Extended.InstData,
87418741) CompileError!Air.Inst.Ref {
8742 const tracy = trace(@src());
8743 defer tracy.end();
8744
87428745 const src: LazySrcLoc = .{ .node_offset = @bitCast(i32, extended.operand) };
8743 return sema.fail(block, src, "TODO: implement Sema.zirRetAddr", .{});
8746 try sema.requireRuntimeBlock(block, src);
8747 return try block.addNoOp(.ret_addr);
87448748}
87458749
87468750fn zirBuiltinSrc(
src/arch/aarch64/CodeGen.zig+5
......@@ -547,6 +547,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
547547 .block => try self.airBlock(inst),
548548 .br => try self.airBr(inst),
549549 .breakpoint => try self.airBreakpoint(),
550 .ret_addr => try self.airRetAddr(),
550551 .fence => try self.airFence(),
551552 .call => try self.airCall(inst),
552553 .cond_br => try self.airCondBr(inst),
......@@ -1416,6 +1417,10 @@ fn airBreakpoint(self: *Self) !void {
14161417 return self.finishAirBookkeeping();
14171418}
14181419
1420fn airRetAddr(self: *Self) !void {
1421 return self.fail("TODO implement airRetAddr for {}", .{self.target.cpu.arch});
1422}
1423
14191424fn airFence(self: *Self) !void {
14201425 return self.fail("TODO implement fence() for {}", .{self.target.cpu.arch});
14211426 //return self.finishAirBookkeeping();
src/arch/arm/CodeGen.zig+5
......@@ -545,6 +545,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
545545 .block => try self.airBlock(inst),
546546 .br => try self.airBr(inst),
547547 .breakpoint => try self.airBreakpoint(),
548 .ret_addr => try self.airRetAddr(),
548549 .fence => try self.airFence(),
549550 .call => try self.airCall(inst),
550551 .cond_br => try self.airCondBr(inst),
......@@ -1850,6 +1851,10 @@ fn airBreakpoint(self: *Self) !void {
18501851 return self.finishAirBookkeeping();
18511852}
18521853
1854fn airRetAddr(self: *Self) !void {
1855 return self.fail("TODO implement airRetAddr for {}", .{self.target.cpu.arch});
1856}
1857
18531858fn airFence(self: *Self) !void {
18541859 return self.fail("TODO implement fence() for {}", .{self.target.cpu.arch});
18551860 //return self.finishAirBookkeeping();
src/arch/riscv64/CodeGen.zig+5
......@@ -526,6 +526,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
526526 .block => try self.airBlock(inst),
527527 .br => try self.airBr(inst),
528528 .breakpoint => try self.airBreakpoint(),
529 .ret_addr => try self.airRetAddr(),
529530 .fence => try self.airFence(),
530531 .call => try self.airCall(inst),
531532 .cond_br => try self.airCondBr(inst),
......@@ -1354,6 +1355,10 @@ fn airBreakpoint(self: *Self) !void {
13541355 return self.finishAirBookkeeping();
13551356}
13561357
1358fn airRetAddr(self: *Self) !void {
1359 return self.fail("TODO implement airRetAddr for {}", .{self.target.cpu.arch});
1360}
1361
13571362fn airFence(self: *Self) !void {
13581363 return self.fail("TODO implement fence() for {}", .{self.target.cpu.arch});
13591364 //return self.finishAirBookkeeping();
src/arch/x86_64/CodeGen.zig+5
......@@ -579,6 +579,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
579579 .block => try self.airBlock(inst),
580580 .br => try self.airBr(inst),
581581 .breakpoint => try self.airBreakpoint(),
582 .ret_addr => try self.airRetAddr(),
582583 .fence => try self.airFence(),
583584 .call => try self.airCall(inst),
584585 .cond_br => try self.airCondBr(inst),
......@@ -1839,6 +1840,10 @@ fn airBreakpoint(self: *Self) !void {
18391840 return self.finishAirBookkeeping();
18401841}
18411842
1843fn airRetAddr(self: *Self) !void {
1844 return self.fail("TODO implement airRetAddr for {}", .{self.target.cpu.arch});
1845}
1846
18421847fn airFence(self: *Self) !void {
18431848 return self.fail("TODO implement fence() for {}", .{self.target.cpu.arch});
18441849 //return self.finishAirBookkeeping();
src/codegen/c.zig+5
......@@ -1125,6 +1125,7 @@ fn genBody(f: *Function, body: []const Air.Inst.Index) error{ AnalysisFail, OutO
11251125 .arg => airArg(f),
11261126
11271127 .breakpoint => try airBreakpoint(f),
1128 .ret_addr => try airRetAddr(f),
11281129 .unreach => try airUnreach(f),
11291130 .fence => try airFence(f, inst),
11301131
......@@ -2191,6 +2192,10 @@ fn airBreakpoint(f: *Function) !CValue {
21912192 return CValue.none;
21922193}
21932194
2195fn airRetAddr(f: *Function) !CValue {
2196 return f.fail("TODO implement codegen for airRetAddr", .{});
2197}
2198
21942199fn airFence(f: *Function, inst: Air.Inst.Index) !CValue {
21952200 const atomic_order = f.air.instructions.items(.data)[inst].fence;
21962201 const writer = f.object.writer();
src/codegen/llvm.zig+10
......@@ -1747,6 +1747,7 @@ pub const FuncGen = struct {
17471747 .br => try self.airBr(inst),
17481748 .switch_br => try self.airSwitchBr(inst),
17491749 .breakpoint => try self.airBreakpoint(inst),
1750 .ret_addr => try self.airRetAddr(inst),
17501751 .call => try self.airCall(inst),
17511752 .cond_br => try self.airCondBr(inst),
17521753 .intcast => try self.airIntCast(inst),
......@@ -3550,6 +3551,15 @@ pub const FuncGen = struct {
35503551 return null;
35513552 }
35523553
3554 fn airRetAddr(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value {
3555 _ = inst;
3556 const i32_zero = self.context.intType(32).constNull();
3557 const usize_llvm_ty = try self.dg.llvmType(Type.usize);
3558 const llvm_fn = self.getIntrinsic("llvm.returnaddress", &.{});
3559 const ptr_val = self.builder.buildCall(llvm_fn, &[_]*const llvm.Value{i32_zero}, 1, .Fast, .Auto, "");
3560 return self.builder.buildPtrToInt(ptr_val, usize_llvm_ty, "");
3561 }
3562
35533563 fn airFence(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value {
35543564 const atomic_order = self.air.instructions.items(.data)[inst].fence;
35553565 const llvm_memory_order = toLlvmAtomicOrdering(atomic_order);
src/print_air.zig+1
......@@ -159,6 +159,7 @@ const Writer = struct {
159159
160160 .breakpoint,
161161 .unreach,
162 .ret_addr,
162163 => try w.writeNoOp(s, inst),
163164
164165 .const_ty,