authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-05 18:45:21-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-11-05 18:45:21-05:00
log1b0b46a8a9f5ed3ebaf35e3018fd5402957552ae
tree65d2ee6cb564d8c6696dd066963c62d8aced9e4d
parent702b809ea3e9b9dbdc1fd6efe9306442487e7103
parent0ea7189c236ce0a3151cfe52f845f4ba16fd8f38
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #17871 from jacobly0/x86_64

x86_64: get a compiler compiled with the x86_64 backend passing x86_64 backend tests

6 files changed, 20 insertions(+), 14 deletions(-)

build.zig+4
...@@ -224,6 +224,10 @@ pub fn build(b: *std.Build) !void {...@@ -224,6 +224,10 @@ pub fn build(b: *std.Build) !void {
224 check_case_exe.want_lto = false;224 check_case_exe.want_lto = false;
225 }225 }
226226
227 const use_llvm = b.option(bool, "use-llvm", "Use the llvm backend");
228 exe.use_llvm = use_llvm;
229 exe.use_lld = use_llvm;
230
227 const exe_options = b.addOptions();231 const exe_options = b.addOptions();
228 exe.addOptions("build_options", exe_options);232 exe.addOptions("build_options", exe_options);
229233
src/Module.zig+1-1
...@@ -4120,7 +4120,7 @@ pub fn embedFile(...@@ -4120,7 +4120,7 @@ pub fn embedFile(
4120 }4120 }
4121 return error.ImportOutsideModulePath;4121 return error.ImportOutsideModulePath;
4122 };4122 };
4123 errdefer gpa.free(sub_file_path);4123 defer gpa.free(sub_file_path);
41244124
4125 return newEmbedFile(mod, cur_file.mod, sub_file_path, resolved_path, gop, src_loc);4125 return newEmbedFile(mod, cur_file.mod, sub_file_path, resolved_path, gop, src_loc);
4126}4126}
src/Sema.zig+1
...@@ -23488,6 +23488,7 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C...@@ -23488,6 +23488,7 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C
23488 if (b_val.isUndef(mod)) return mod.undefRef(vec_ty);23488 if (b_val.isUndef(mod)) return mod.undefRef(vec_ty);
2348923489
23490 const elems = try sema.gpa.alloc(InternPool.Index, vec_len);23490 const elems = try sema.gpa.alloc(InternPool.Index, vec_len);
23491 defer sema.gpa.free(elems);
23491 for (elems, 0..) |*elem, i| {23492 for (elems, 0..) |*elem, i| {
23492 const pred_elem_val = try pred_val.elemValue(mod, i);23493 const pred_elem_val = try pred_val.elemValue(mod, i);
23493 const should_choose_a = pred_elem_val.toBool();23494 const should_choose_a = pred_elem_val.toBool();
src/arch/x86_64/CodeGen.zig+13-12
...@@ -585,7 +585,7 @@ const InstTracking = struct {...@@ -585,7 +585,7 @@ const InstTracking = struct {
585 tracking_log.debug("%{d} => {} (spilled)", .{ inst, self.* });585 tracking_log.debug("%{d} => {} (spilled)", .{ inst, self.* });
586 }586 }
587587
588 fn verifyMaterialize(self: *InstTracking, target: InstTracking) void {588 fn verifyMaterialize(self: InstTracking, target: InstTracking) void {
589 switch (self.long) {589 switch (self.long) {
590 .none,590 .none,
591 .unreach,591 .unreach,
...@@ -634,7 +634,7 @@ const InstTracking = struct {...@@ -634,7 +634,7 @@ const InstTracking = struct {
634 }634 }
635635
636 fn materializeUnsafe(636 fn materializeUnsafe(
637 self: *InstTracking,637 self: InstTracking,
638 function: *Self,638 function: *Self,
639 inst: Air.Inst.Index,639 inst: Air.Inst.Index,
640 target: InstTracking,640 target: InstTracking,
...@@ -688,7 +688,7 @@ const InstTracking = struct {...@@ -688,7 +688,7 @@ const InstTracking = struct {
688 }688 }
689689
690 fn liveOut(self: *InstTracking, function: *Self, inst: Air.Inst.Index) void {690 fn liveOut(self: *InstTracking, function: *Self, inst: Air.Inst.Index) void {
691 for (self.short.getRegs()) |reg| {691 for (self.getRegs()) |reg| {
692 if (function.register_manager.isRegFree(reg)) {692 if (function.register_manager.isRegFree(reg)) {
693 tracking_log.debug("%{d} => {} (live-out)", .{ inst, self.* });693 tracking_log.debug("%{d} => {} (live-out)", .{ inst, self.* });
694 continue;694 continue;
...@@ -701,7 +701,7 @@ const InstTracking = struct {...@@ -701,7 +701,7 @@ const InstTracking = struct {
701 // Disable death.701 // Disable death.
702 var found_reg = false;702 var found_reg = false;
703 var remaining_reg: Register = .none;703 var remaining_reg: Register = .none;
704 for (tracking.short.getRegs()) |tracked_reg| if (tracked_reg.id() == reg.id()) {704 for (tracking.getRegs()) |tracked_reg| if (tracked_reg.id() == reg.id()) {
705 assert(!found_reg);705 assert(!found_reg);
706 found_reg = true;706 found_reg = true;
707 } else {707 } else {
...@@ -10885,12 +10885,12 @@ fn airRet(self: *Self, inst: Air.Inst.Index) !void {...@@ -10885,12 +10885,12 @@ fn airRet(self: *Self, inst: Air.Inst.Index) !void {
10885 else => unreachable,10885 else => unreachable,
10886 }10886 }
10887 self.ret_mcv.liveOut(self, inst);10887 self.ret_mcv.liveOut(self, inst);
10888 try self.finishAir(inst, .unreach, .{ un_op, .none, .none });
1088810889
10889 // TODO optimization opportunity: figure out when we can emit this as a 2 byte instruction10890 // TODO optimization opportunity: figure out when we can emit this as a 2 byte instruction
10890 // which is available if the jump is 127 bytes or less forward.10891 // which is available if the jump is 127 bytes or less forward.
10891 const jmp_reloc = try self.asmJmpReloc(undefined);10892 const jmp_reloc = try self.asmJmpReloc(undefined);
10892 try self.exitlude_jump_relocs.append(self.gpa, jmp_reloc);10893 try self.exitlude_jump_relocs.append(self.gpa, jmp_reloc);
10893 return self.finishAir(inst, .unreach, .{ un_op, .none, .none });
10894}10894}
1089510895
10896fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {10896fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {
...@@ -10905,12 +10905,12 @@ fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {...@@ -10905,12 +10905,12 @@ fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {
10905 else => unreachable,10905 else => unreachable,
10906 }10906 }
10907 self.ret_mcv.liveOut(self, inst);10907 self.ret_mcv.liveOut(self, inst);
10908 try self.finishAir(inst, .unreach, .{ un_op, .none, .none });
1090810909
10909 // TODO optimization opportunity: figure out when we can emit this as a 2 byte instruction10910 // TODO optimization opportunity: figure out when we can emit this as a 2 byte instruction
10910 // which is available if the jump is 127 bytes or less forward.10911 // which is available if the jump is 127 bytes or less forward.
10911 const jmp_reloc = try self.asmJmpReloc(undefined);10912 const jmp_reloc = try self.asmJmpReloc(undefined);
10912 try self.exitlude_jump_relocs.append(self.gpa, jmp_reloc);10913 try self.exitlude_jump_relocs.append(self.gpa, jmp_reloc);
10913 return self.finishAir(inst, .unreach, .{ un_op, .none, .none });
10914}10914}
1091510915
10916fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {10916fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
...@@ -11991,7 +11991,6 @@ fn performReloc(self: *Self, reloc: Mir.Inst.Index) !void {...@@ -11991,7 +11991,6 @@ fn performReloc(self: *Self, reloc: Mir.Inst.Index) !void {
11991fn airBr(self: *Self, inst: Air.Inst.Index) !void {11991fn airBr(self: *Self, inst: Air.Inst.Index) !void {
11992 const mod = self.bin_file.options.module.?;11992 const mod = self.bin_file.options.module.?;
11993 const br = self.air.instructions.items(.data)[inst].br;11993 const br = self.air.instructions.items(.data)[inst].br;
11994 const src_mcv = try self.resolveInst(br.operand);
1199511994
11996 const block_ty = self.typeOfIndex(br.block_inst);11995 const block_ty = self.typeOfIndex(br.block_inst);
11997 const block_unused =11996 const block_unused =
...@@ -12002,15 +12001,17 @@ fn airBr(self: *Self, inst: Air.Inst.Index) !void {...@@ -12002,15 +12001,17 @@ fn airBr(self: *Self, inst: Air.Inst.Index) !void {
12002 const block_result = result: {12001 const block_result = result: {
12003 if (block_unused) break :result .none;12002 if (block_unused) break :result .none;
1200412003
12004 if (!first_br) try self.getValue(block_tracking.short, null);
12005 const src_mcv = try self.resolveInst(br.operand);
12006
12005 if (self.reuseOperandAdvanced(inst, br.operand, 0, src_mcv, br.block_inst)) {12007 if (self.reuseOperandAdvanced(inst, br.operand, 0, src_mcv, br.block_inst)) {
12006 if (first_br) break :result src_mcv;12008 if (first_br) break :result src_mcv;
1200712009
12008 for (block_tracking.getRegs()) |block_reg|12010 try self.getValue(block_tracking.short, br.block_inst);
12009 try self.register_manager.getReg(block_reg, br.block_inst);
12010 // .long = .none to avoid merging operand and block result stack frames.12011 // .long = .none to avoid merging operand and block result stack frames.
12011 var current_tracking = InstTracking{ .long = .none, .short = src_mcv };12012 const current_tracking: InstTracking = .{ .long = .none, .short = src_mcv };
12012 try current_tracking.materializeUnsafe(self, br.block_inst, block_tracking.*);12013 try current_tracking.materializeUnsafe(self, br.block_inst, block_tracking.*);
12013 for (src_mcv.getRegs()) |src_reg| self.register_manager.freeReg(src_reg);12014 for (current_tracking.getRegs()) |src_reg| self.register_manager.freeReg(src_reg);
12014 break :result block_tracking.short;12015 break :result block_tracking.short;
12015 }12016 }
1201612017
...@@ -12018,7 +12019,7 @@ fn airBr(self: *Self, inst: Air.Inst.Index) !void {...@@ -12018,7 +12019,7 @@ fn airBr(self: *Self, inst: Air.Inst.Index) !void {
12018 try self.getValue(block_tracking.short, br.block_inst);12019 try self.getValue(block_tracking.short, br.block_inst);
12019 break :dst block_tracking.short;12020 break :dst block_tracking.short;
12020 };12021 };
12021 try self.genCopy(block_ty, dst_mcv, src_mcv);12022 try self.genCopy(block_ty, dst_mcv, try self.resolveInst(br.operand));
12022 break :result dst_mcv;12023 break :result dst_mcv;
12023 };12024 };
1202412025
src/link/Elf.zig+1
...@@ -392,6 +392,7 @@ pub fn deinit(self: *Elf) void {...@@ -392,6 +392,7 @@ pub fn deinit(self: *Elf) void {
392 self.copy_rel.deinit(gpa);392 self.copy_rel.deinit(gpa);
393 self.rela_dyn.deinit(gpa);393 self.rela_dyn.deinit(gpa);
394 self.rela_plt.deinit(gpa);394 self.rela_plt.deinit(gpa);
395 self.zig_got.deinit(gpa);
395}396}
396397
397pub fn getDeclVAddr(self: *Elf, decl_index: Module.Decl.Index, reloc_info: link.File.RelocInfo) !u64 {398pub fn getDeclVAddr(self: *Elf, decl_index: Module.Decl.Index, reloc_info: link.File.RelocInfo) !u64 {
test/behavior/packed-struct.zig-1
...@@ -1016,7 +1016,6 @@ test "modify nested packed struct aligned field" {...@@ -1016,7 +1016,6 @@ test "modify nested packed struct aligned field" {
1016 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;1016 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1017 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;1017 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
1018 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;1018 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1019 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
10201019
1021 const Options = packed struct {1020 const Options = packed struct {
1022 foo: bool = false,1021 foo: bool = false,