diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2023-11-05 18:45:21 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-05 18:45:21 -0500 |
| commit | 1b0b46a8a9f5ed3ebaf35e3018fd5402957552ae (patch) | |
| tree | 65d2ee6cb564d8c6696dd066963c62d8aced9e4d /src | |
| parent | 702b809ea3e9b9dbdc1fd6efe9306442487e7103 (diff) | |
| parent | 0ea7189c236ce0a3151cfe52f845f4ba16fd8f38 (diff) | |
| download | zig-1b0b46a8a9f5ed3ebaf35e3018fd5402957552ae.tar.gz zig-1b0b46a8a9f5ed3ebaf35e3018fd5402957552ae.zip | |
Merge pull request #17871 from jacobly0/x86_64
x86_64: get a compiler compiled with the x86_64 backend passing x86_64 backend tests
Diffstat (limited to 'src')
| -rw-r--r-- | src/Module.zig | 2 | ||||
| -rw-r--r-- | src/Sema.zig | 1 | ||||
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 25 | ||||
| -rw-r--r-- | src/link/Elf.zig | 1 |
4 files changed, 16 insertions, 13 deletions
diff --git a/src/Module.zig b/src/Module.zig index 707ff41615..eda4624bd0 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -4120,7 +4120,7 @@ pub fn embedFile( } return error.ImportOutsideModulePath; }; - errdefer gpa.free(sub_file_path); + defer gpa.free(sub_file_path); return newEmbedFile(mod, cur_file.mod, sub_file_path, resolved_path, gop, src_loc); } diff --git a/src/Sema.zig b/src/Sema.zig index 4f557d33ac..2cd834862a 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -23488,6 +23488,7 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C if (b_val.isUndef(mod)) return mod.undefRef(vec_ty); const elems = try sema.gpa.alloc(InternPool.Index, vec_len); + defer sema.gpa.free(elems); for (elems, 0..) |*elem, i| { const pred_elem_val = try pred_val.elemValue(mod, i); const should_choose_a = pred_elem_val.toBool(); diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 1065d968b5..9d4ee182c4 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -585,7 +585,7 @@ const InstTracking = struct { tracking_log.debug("%{d} => {} (spilled)", .{ inst, self.* }); } - fn verifyMaterialize(self: *InstTracking, target: InstTracking) void { + fn verifyMaterialize(self: InstTracking, target: InstTracking) void { switch (self.long) { .none, .unreach, @@ -634,7 +634,7 @@ const InstTracking = struct { } fn materializeUnsafe( - self: *InstTracking, + self: InstTracking, function: *Self, inst: Air.Inst.Index, target: InstTracking, @@ -688,7 +688,7 @@ const InstTracking = struct { } fn liveOut(self: *InstTracking, function: *Self, inst: Air.Inst.Index) void { - for (self.short.getRegs()) |reg| { + for (self.getRegs()) |reg| { if (function.register_manager.isRegFree(reg)) { tracking_log.debug("%{d} => {} (live-out)", .{ inst, self.* }); continue; @@ -701,7 +701,7 @@ const InstTracking = struct { // Disable death. var found_reg = false; var remaining_reg: Register = .none; - for (tracking.short.getRegs()) |tracked_reg| if (tracked_reg.id() == reg.id()) { + for (tracking.getRegs()) |tracked_reg| if (tracked_reg.id() == reg.id()) { assert(!found_reg); found_reg = true; } else { @@ -10885,12 +10885,12 @@ fn airRet(self: *Self, inst: Air.Inst.Index) !void { else => unreachable, } self.ret_mcv.liveOut(self, inst); + try self.finishAir(inst, .unreach, .{ un_op, .none, .none }); // TODO optimization opportunity: figure out when we can emit this as a 2 byte instruction // which is available if the jump is 127 bytes or less forward. const jmp_reloc = try self.asmJmpReloc(undefined); try self.exitlude_jump_relocs.append(self.gpa, jmp_reloc); - return self.finishAir(inst, .unreach, .{ un_op, .none, .none }); } fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void { @@ -10905,12 +10905,12 @@ fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void { else => unreachable, } self.ret_mcv.liveOut(self, inst); + try self.finishAir(inst, .unreach, .{ un_op, .none, .none }); // TODO optimization opportunity: figure out when we can emit this as a 2 byte instruction // which is available if the jump is 127 bytes or less forward. const jmp_reloc = try self.asmJmpReloc(undefined); try self.exitlude_jump_relocs.append(self.gpa, jmp_reloc); - return self.finishAir(inst, .unreach, .{ un_op, .none, .none }); } fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void { @@ -11991,7 +11991,6 @@ fn performReloc(self: *Self, reloc: Mir.Inst.Index) !void { fn airBr(self: *Self, inst: Air.Inst.Index) !void { const mod = self.bin_file.options.module.?; const br = self.air.instructions.items(.data)[inst].br; - const src_mcv = try self.resolveInst(br.operand); const block_ty = self.typeOfIndex(br.block_inst); const block_unused = @@ -12002,15 +12001,17 @@ fn airBr(self: *Self, inst: Air.Inst.Index) !void { const block_result = result: { if (block_unused) break :result .none; + if (!first_br) try self.getValue(block_tracking.short, null); + const src_mcv = try self.resolveInst(br.operand); + if (self.reuseOperandAdvanced(inst, br.operand, 0, src_mcv, br.block_inst)) { if (first_br) break :result src_mcv; - for (block_tracking.getRegs()) |block_reg| - try self.register_manager.getReg(block_reg, br.block_inst); + try self.getValue(block_tracking.short, br.block_inst); // .long = .none to avoid merging operand and block result stack frames. - var current_tracking = InstTracking{ .long = .none, .short = src_mcv }; + const current_tracking: InstTracking = .{ .long = .none, .short = src_mcv }; try current_tracking.materializeUnsafe(self, br.block_inst, block_tracking.*); - for (src_mcv.getRegs()) |src_reg| self.register_manager.freeReg(src_reg); + for (current_tracking.getRegs()) |src_reg| self.register_manager.freeReg(src_reg); break :result block_tracking.short; } @@ -12018,7 +12019,7 @@ fn airBr(self: *Self, inst: Air.Inst.Index) !void { try self.getValue(block_tracking.short, br.block_inst); break :dst block_tracking.short; }; - try self.genCopy(block_ty, dst_mcv, src_mcv); + try self.genCopy(block_ty, dst_mcv, try self.resolveInst(br.operand)); break :result dst_mcv; }; diff --git a/src/link/Elf.zig b/src/link/Elf.zig index ab986aeaf9..7311bd38b4 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -392,6 +392,7 @@ pub fn deinit(self: *Elf) void { self.copy_rel.deinit(gpa); self.rela_dyn.deinit(gpa); self.rela_plt.deinit(gpa); + self.zig_got.deinit(gpa); } pub fn getDeclVAddr(self: *Elf, decl_index: Module.Decl.Index, reloc_info: link.File.RelocInfo) !u64 { |
