aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/c.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-02-28 13:38:33 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-02-28 13:38:33 -0700
commitd5100dc81555f0e8197d5f189b1432070e8d72dd (patch)
tree96de992b22f7cfc4bcb672892c64fb2cdf621913 /src/codegen/c.zig
parent90bce11f62aa2f246b9bce5bc49069a3faf7ec9a (diff)
downloadzig-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.zig20
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;