diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-02-28 13:38:33 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-02-28 13:38:33 -0700 |
| commit | d5100dc81555f0e8197d5f189b1432070e8d72dd (patch) | |
| tree | 96de992b22f7cfc4bcb672892c64fb2cdf621913 /src/codegen/c.zig | |
| parent | 90bce11f62aa2f246b9bce5bc49069a3faf7ec9a (diff) | |
| download | zig-d5100dc81555f0e8197d5f189b1432070e8d72dd.tar.gz zig-d5100dc81555f0e8197d5f189b1432070e8d72dd.zip | |
stage2: fix frame_address AIR instruction
Various places were assuming different union tags. Now it is
consistently a no-op instruction, just like the similar
instruction ret_addr.
Diffstat (limited to 'src/codegen/c.zig')
| -rw-r--r-- | src/codegen/c.zig | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 331673cc55..3e47637c76 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -1588,7 +1588,8 @@ fn genBody(f: *Function, body: []const Air.Inst.Index) error{ AnalysisFail, OutO .arg => airArg(f), .breakpoint => try airBreakpoint(f), - .ret_addr => try airRetAddr(f), + .ret_addr => try airRetAddr(f, inst), + .frame_addr => try airFrameAddress(f, inst), .unreach => try airUnreach(f), .fence => try airFence(f, inst), @@ -1757,8 +1758,6 @@ 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) { @@ -2719,12 +2718,20 @@ fn airBreakpoint(f: *Function) !CValue { return CValue.none; } -fn airRetAddr(f: *Function) !CValue { +fn airRetAddr(f: *Function, inst: Air.Inst.Index) !CValue { + if (f.liveness.isUnused(inst)) return CValue.none; const local = try f.allocLocal(Type.usize, .Const); try f.object.writer().writeAll(" = zig_return_address();\n"); return local; } +fn airFrameAddress(f: *Function, inst: Air.Inst.Index) !CValue { + if (f.liveness.isUnused(inst)) return CValue.none; + const local = try f.allocLocal(Type.usize, .Const); + try f.object.writer().writeAll(" = zig_frame_address();\n"); + return local; +} + fn airFence(f: *Function, inst: Air.Inst.Index) !CValue { const atomic_order = f.air.instructions.items(.data)[inst].fence; const writer = f.object.writer(); @@ -3200,11 +3207,6 @@ 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; |
