aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-02-08 18:05:54 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-02-08 21:00:07 +0100
commit9981b3fd2f7ab85146efa9feebe08a795411d131 (patch)
tree426608bca102609dd4e4926179b01b68af7b4081 /src
parentf50203c83667ed3ad0c57fdc953322a5f9c221ac (diff)
downloadzig-9981b3fd2f7ab85146efa9feebe08a795411d131.tar.gz
zig-9981b3fd2f7ab85146efa9feebe08a795411d131.zip
stage2: tiny improvements all over the place
* pass more x64 behavior tests * return with a TODO error when lowering a decl with no runtime bits * insert some debug logs for tracing recursive descent down the type-value tree when lowering types * print `Decl`'s name when print debugging `decl_ref` value
Diffstat (limited to 'src')
-rw-r--r--src/arch/wasm/CodeGen.zig2
-rw-r--r--src/arch/x86_64/CodeGen.zig11
-rw-r--r--src/codegen.zig14
-rw-r--r--src/value.zig5
4 files changed, 27 insertions, 5 deletions
diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig
index 9f0736f055..0361d4ffdd 100644
--- a/src/arch/wasm/CodeGen.zig
+++ b/src/arch/wasm/CodeGen.zig
@@ -970,6 +970,8 @@ pub const DeclGen = struct {
/// Generates the wasm bytecode for the declaration belonging to `Context`
fn genTypedValue(self: *DeclGen, ty: Type, val: Value) InnerError!Result {
+ log.debug("genTypedValue: ty = {}, val = {}", .{ ty, val });
+
const writer = self.code.writer();
if (val.isUndef()) {
try writer.writeByteNTimes(0xaa, @intCast(usize, ty.abiSize(self.target())));
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index a745a6df33..9abeadad5d 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -1973,6 +1973,7 @@ fn structFieldPtr(self: *Self, inst: Air.Inst.Index, operand: Air.Inst.Ref, inde
if (self.liveness.isUnused(inst)) {
return MCValue.dead;
}
+
const mcv = try self.resolveInst(operand);
const ptr_ty = self.air.typeOf(operand);
const struct_ty = ptr_ty.childType();
@@ -2190,6 +2191,7 @@ fn genBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_rhs:
}
fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !void {
+ const abi_size = dst_ty.abiSize(self.target.*);
switch (dst_mcv) {
.none => unreachable,
.undef => unreachable,
@@ -2216,7 +2218,6 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
});
},
.immediate => |imm| {
- const abi_size = dst_ty.abiSize(self.target.*);
_ = try self.addInst(.{
.tag = mir_tag,
.ops = (Mir.Ops{
@@ -2226,7 +2227,11 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
});
},
.embedded_in_code, .memory => {
- return self.fail("TODO implement x86 ADD/SUB/CMP source memory", .{});
+ assert(abi_size <= 8);
+ self.register_manager.freezeRegs(&.{dst_reg});
+ defer self.register_manager.unfreezeRegs(&.{dst_reg});
+ const reg = try self.copyToTmpRegister(dst_ty, src_mcv);
+ return self.genBinMathOpMir(mir_tag, dst_ty, dst_mcv, .{ .register = reg });
},
.got_load, .direct_load => {
return self.fail("TODO implement x86 ADD/SUB/CMP source symbol at index in linker", .{});
@@ -2235,7 +2240,6 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
if (off > math.maxInt(i32)) {
return self.fail("stack offset too large", .{});
}
- const abi_size = dst_ty.abiSize(self.target.*);
const adj_off = off + @intCast(i32, abi_size);
_ = try self.addInst(.{
.tag = mir_tag,
@@ -2259,7 +2263,6 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
if (off > math.maxInt(i32)) {
return self.fail("stack offset too large", .{});
}
- const abi_size = dst_ty.abiSize(self.target.*);
if (abi_size > 8) {
return self.fail("TODO implement ADD/SUB/CMP for stack dst with large ABI", .{});
}
diff --git a/src/codegen.zig b/src/codegen.zig
index 059d2adc14..5873fd439c 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -150,6 +150,8 @@ pub fn generateSymbol(
const tracy = trace(@src());
defer tracy.end();
+ log.debug("generateSymbol: ty = {}, val = {}", .{ typed_value.ty, typed_value.val });
+
if (typed_value.val.isUndefDeep()) {
const target = bin_file.options.target;
const abi_size = try math.cast(usize, typed_value.ty.abiSize(target));
@@ -485,6 +487,18 @@ fn lowerDeclRef(
return Result{ .appended = {} };
}
+ const is_fn_body = decl.ty.zigTypeTag() == .Fn;
+ if (!is_fn_body and !decl.ty.hasRuntimeBits()) {
+ return Result{
+ .fail = try ErrorMsg.create(
+ bin_file.allocator,
+ src_loc,
+ "TODO handle void types when lowering decl ref",
+ .{},
+ ),
+ };
+ }
+
if (decl.analysis != .complete) return error.AnalysisFail;
decl.markAlive();
const vaddr = vaddr: {
diff --git a/src/value.zig b/src/value.zig
index 23a04f2e5a..acc3fa3d74 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -711,7 +711,10 @@ pub const Value = extern union {
const decl = val.castTag(.decl_ref_mut).?.data.decl;
return out_stream.print("(decl_ref_mut '{s}')", .{decl.name});
},
- .decl_ref => return out_stream.writeAll("(decl ref)"),
+ .decl_ref => {
+ const decl = val.castTag(.decl_ref).?.data;
+ return out_stream.print("(decl ref '{s}')", .{decl.name});
+ },
.elem_ptr => {
const elem_ptr = val.castTag(.elem_ptr).?.data;
try out_stream.print("&[{}] ", .{elem_ptr.index});