aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/c.zig
diff options
context:
space:
mode:
authorCody Tapscott <topolarity@tapscott.me>2022-09-14 13:49:54 -0700
committerCody Tapscott <topolarity@tapscott.me>2022-10-21 10:44:20 -0700
commit724d75363855176aa5e6b3d9bcd1656e2cc1f6a6 (patch)
treef3b5c2e68dcc355ade60e3c75065002715040790 /src/codegen/c.zig
parent3007fdde45868142654d0bfa59bc0e17e5f24a1c (diff)
downloadzig-724d75363855176aa5e6b3d9bcd1656e2cc1f6a6.tar.gz
zig-724d75363855176aa5e6b3d9bcd1656e2cc1f6a6.zip
stage2: Add `.save_err_return_trace_index` AIR op
This is encoded as a primitive AIR instruction to resolve one corner case: A function may include a `catch { ... }` or `else |err| { ... }` block but not call any errorable fn. In that case, there is no error return trace to save the index of and codegen needs to avoid interacting with the non-existing error trace. By using a primitive AIR op, we can depend on Liveness to mark this unused in this corner case.
Diffstat (limited to 'src/codegen/c.zig')
-rw-r--r--src/codegen/c.zig6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index 072091d9b2..d6584d75ae 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -1935,6 +1935,7 @@ fn genBody(f: *Function, body: []const Air.Inst.Index) error{ AnalysisFail, OutO
.errunion_payload_ptr_set => try airErrUnionPayloadPtrSet(f, inst),
.err_return_trace => try airErrReturnTrace(f, inst),
.set_err_return_trace => try airSetErrReturnTrace(f, inst),
+ .save_err_return_trace_index => try airSaveErrReturnTraceIndex(f, inst),
.wasm_memory_size => try airWasmMemorySize(f, inst),
.wasm_memory_grow => try airWasmMemoryGrow(f, inst),
@@ -3625,6 +3626,11 @@ fn airSetErrReturnTrace(f: *Function, inst: Air.Inst.Index) !CValue {
return f.fail("TODO: C backend: implement airSetErrReturnTrace", .{});
}
+fn airSaveErrReturnTraceIndex(f: *Function, inst: Air.Inst.Index) !CValue {
+ _ = inst;
+ return f.fail("TODO: C backend: implement airSaveErrReturnTraceIndex", .{});
+}
+
fn airWrapErrUnionPay(f: *Function, inst: Air.Inst.Index) !CValue {
if (f.liveness.isUnused(inst))
return CValue.none;