aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-01-18 19:29:23 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-01-18 19:29:53 -0700
commit7e56028bc7c00b884c92e2948728cbc47e5a8a09 (patch)
tree660b8f5e027066e728fbd88db5e58385940aa2d7 /src/codegen.zig
parent6c7e66613d57aec2f2949c065ea6431ff6c31f88 (diff)
parentecc246efa2c133aaab73032a18fed5b2c15e08ce (diff)
downloadzig-7e56028bc7c00b884c92e2948728cbc47e5a8a09.tar.gz
zig-7e56028bc7c00b884c92e2948728cbc47e5a8a09.zip
Merge branch 'stage2: rework ZIR/TZIR for optionals and error unions'
closes #7730 closes #7662
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig37
1 files changed, 31 insertions, 6 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index 14572c2012..1ca2bb2abe 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -860,9 +860,12 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
.dbg_stmt => return self.genDbgStmt(inst.castTag(.dbg_stmt).?),
.floatcast => return self.genFloatCast(inst.castTag(.floatcast).?),
.intcast => return self.genIntCast(inst.castTag(.intcast).?),
- .isnonnull => return self.genIsNonNull(inst.castTag(.isnonnull).?),
- .isnull => return self.genIsNull(inst.castTag(.isnull).?),
- .iserr => return self.genIsErr(inst.castTag(.iserr).?),
+ .is_non_null => return self.genIsNonNull(inst.castTag(.is_non_null).?),
+ .is_non_null_ptr => return self.genIsNonNullPtr(inst.castTag(.is_non_null_ptr).?),
+ .is_null => return self.genIsNull(inst.castTag(.is_null).?),
+ .is_null_ptr => return self.genIsNullPtr(inst.castTag(.is_null_ptr).?),
+ .is_err => return self.genIsErr(inst.castTag(.is_err).?),
+ .is_err_ptr => return self.genIsErrPtr(inst.castTag(.is_err_ptr).?),
.load => return self.genLoad(inst.castTag(.load).?),
.loop => return self.genLoop(inst.castTag(.loop).?),
.not => return self.genNot(inst.castTag(.not).?),
@@ -874,7 +877,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
.sub => return self.genSub(inst.castTag(.sub).?),
.switchbr => return self.genSwitch(inst.castTag(.switchbr).?),
.unreach => return MCValue{ .unreach = {} },
- .unwrap_optional => return self.genUnwrapOptional(inst.castTag(.unwrap_optional).?),
+ .optional_payload => return self.genOptionalPayload(inst.castTag(.optional_payload).?),
+ .optional_payload_ptr => return self.genOptionalPayloadPtr(inst.castTag(.optional_payload_ptr).?),
.wrap_optional => return self.genWrapOptional(inst.castTag(.wrap_optional).?),
.varptr => return self.genVarPtr(inst.castTag(.varptr).?),
.xor => return self.genXor(inst.castTag(.xor).?),
@@ -1118,12 +1122,21 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
}
}
- fn genUnwrapOptional(self: *Self, inst: *ir.Inst.UnOp) !MCValue {
+ fn genOptionalPayload(self: *Self, inst: *ir.Inst.UnOp) !MCValue {
// No side effects, so if it's unreferenced, do nothing.
if (inst.base.isUnused())
return MCValue.dead;
switch (arch) {
- else => return self.fail(inst.base.src, "TODO implement unwrap optional for {}", .{self.target.cpu.arch}),
+ else => return self.fail(inst.base.src, "TODO implement .optional_payload for {}", .{self.target.cpu.arch}),
+ }
+ }
+
+ fn genOptionalPayloadPtr(self: *Self, inst: *ir.Inst.UnOp) !MCValue {
+ // No side effects, so if it's unreferenced, do nothing.
+ if (inst.base.isUnused())
+ return MCValue.dead;
+ switch (arch) {
+ else => return self.fail(inst.base.src, "TODO implement .optional_payload_ptr for {}", .{self.target.cpu.arch}),
}
}
@@ -2306,6 +2319,10 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
}
}
+ fn genIsNullPtr(self: *Self, inst: *ir.Inst.UnOp) !MCValue {
+ return self.fail(inst.base.src, "TODO load the operand and call genIsNull", .{});
+ }
+
fn genIsNonNull(self: *Self, inst: *ir.Inst.UnOp) !MCValue {
// Here you can specialize this instruction if it makes sense to, otherwise the default
// will call genIsNull and invert the result.
@@ -2314,12 +2331,20 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
}
}
+ fn genIsNonNullPtr(self: *Self, inst: *ir.Inst.UnOp) !MCValue {
+ return self.fail(inst.base.src, "TODO load the operand and call genIsNonNull", .{});
+ }
+
fn genIsErr(self: *Self, inst: *ir.Inst.UnOp) !MCValue {
switch (arch) {
else => return self.fail(inst.base.src, "TODO implement iserr for {}", .{self.target.cpu.arch}),
}
}
+ fn genIsErrPtr(self: *Self, inst: *ir.Inst.UnOp) !MCValue {
+ return self.fail(inst.base.src, "TODO load the operand and call genIsErr", .{});
+ }
+
fn genLoop(self: *Self, inst: *ir.Inst.Loop) !MCValue {
// A loop is a setup to be able to jump back to the beginning.
const start_index = self.code.items.len;