authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-23 22:40:06+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-02-23 22:40:06+01:00
log9dd839b7ed15d1191f3303d069cffe0473e03e83
tree92d59fe28a7cb39e437a996086f479065a69bbb6
parent5d89955543d30b851777ff119160e480d04a6f0e
parentb7760ad742fa754c1f63b6d9465333c629a4b43e
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #10976 from ziglang/x64-macos-fixes

x64: print test runner results on macos

3 files changed, 70 insertions(+), 53 deletions(-)

lib/std/special/test_runner.zig+1-1
...@@ -143,7 +143,7 @@ pub fn main2() anyerror!void {...@@ -143,7 +143,7 @@ pub fn main2() anyerror!void {
143 }143 }
144 if (builtin.zig_backend == .stage2_llvm or144 if (builtin.zig_backend == .stage2_llvm or
145 builtin.zig_backend == .stage2_wasm or145 builtin.zig_backend == .stage2_wasm or
146 (builtin.zig_backend == .stage2_x86_64 and builtin.os.tag != .macos))146 builtin.zig_backend == .stage2_x86_64)
147 {147 {
148 const passed = builtin.test_functions.len - skipped - failed;148 const passed = builtin.test_functions.len - skipped - failed;
149 const stderr = std.io.getStdErr();149 const stderr = std.io.getStdErr();
src/arch/x86_64/CodeGen.zig+8-5
...@@ -49,7 +49,7 @@ arg_index: u32,...@@ -49,7 +49,7 @@ arg_index: u32,
49src_loc: Module.SrcLoc,49src_loc: Module.SrcLoc,
50stack_align: u32,50stack_align: u32,
5151
52ret_backpatch: ?Mir.Inst.Index = null,52ret_backpatches: std.ArrayListUnmanaged(Mir.Inst.Index) = .{},
53compare_flags_inst: ?Air.Inst.Index = null,53compare_flags_inst: ?Air.Inst.Index = null,
5454
55/// MIR Instructions55/// MIR Instructions
...@@ -310,6 +310,7 @@ pub fn generate(...@@ -310,6 +310,7 @@ pub fn generate(
310 std.AutoHashMap(Mir.Inst.Index, Air.Inst.Index).init(bin_file.allocator)310 std.AutoHashMap(Mir.Inst.Index, Air.Inst.Index).init(bin_file.allocator)
311 else {},311 else {},
312 };312 };
313 defer function.ret_backpatches.deinit(bin_file.allocator);
313 defer function.stack.deinit(bin_file.allocator);314 defer function.stack.deinit(bin_file.allocator);
314 defer function.blocks.deinit(bin_file.allocator);315 defer function.blocks.deinit(bin_file.allocator);
315 defer function.exitlude_jump_relocs.deinit(bin_file.allocator);316 defer function.exitlude_jump_relocs.deinit(bin_file.allocator);
...@@ -473,8 +474,8 @@ fn gen(self: *Self) InnerError!void {...@@ -473,8 +474,8 @@ fn gen(self: *Self) InnerError!void {
473 };474 };
474 inline for (callee_preserved_regs) |reg, i| {475 inline for (callee_preserved_regs) |reg, i| {
475 if (self.register_manager.isRegAllocated(reg)) {476 if (self.register_manager.isRegAllocated(reg)) {
476 if (self.ret_backpatch) |inst| {477 if (reg.to64() == .rdi) {
477 if (reg.to64() == .rdi) {478 for (self.ret_backpatches.items) |inst| {
478 const ops = Mir.Ops.decode(self.mir_instructions.items(.ops)[inst]);479 const ops = Mir.Ops.decode(self.mir_instructions.items(.ops)[inst]);
479 self.mir_instructions.set(inst, Mir.Inst{480 self.mir_instructions.set(inst, Mir.Inst{
480 .tag = .mov,481 .tag = .mov,
...@@ -3312,7 +3313,7 @@ fn airRet(self: *Self, inst: Air.Inst.Index) !void {...@@ -3312,7 +3313,7 @@ fn airRet(self: *Self, inst: Air.Inst.Index) !void {
3312 self.register_manager.freezeRegs(&.{ .rax, .rcx, .rdi });3313 self.register_manager.freezeRegs(&.{ .rax, .rcx, .rdi });
3313 defer self.register_manager.unfreezeRegs(&.{ .rax, .rcx, .rdi });3314 defer self.register_manager.unfreezeRegs(&.{ .rax, .rcx, .rdi });
3314 const reg = try self.register_manager.allocReg(null);3315 const reg = try self.register_manager.allocReg(null);
3315 self.ret_backpatch = try self.addInst(.{3316 const backpatch = try self.addInst(.{
3316 .tag = .mov,3317 .tag = .mov,
3317 .ops = (Mir.Ops{3318 .ops = (Mir.Ops{
3318 .reg1 = reg,3319 .reg1 = reg,
...@@ -3320,6 +3321,7 @@ fn airRet(self: *Self, inst: Air.Inst.Index) !void {...@@ -3320,6 +3321,7 @@ fn airRet(self: *Self, inst: Air.Inst.Index) !void {
3320 }).encode(),3321 }).encode(),
3321 .data = undefined,3322 .data = undefined,
3322 });3323 });
3324 try self.ret_backpatches.append(self.gpa, backpatch);
3323 try self.genSetStack(ret_ty, 0, operand, .{3325 try self.genSetStack(ret_ty, 0, operand, .{
3324 .source_stack_base = .rbp,3326 .source_stack_base = .rbp,
3325 .dest_stack_base = reg,3327 .dest_stack_base = reg,
...@@ -3354,7 +3356,7 @@ fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {...@@ -3354,7 +3356,7 @@ fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {
3354 self.register_manager.freezeRegs(&.{ .rax, .rcx, .rdi });3356 self.register_manager.freezeRegs(&.{ .rax, .rcx, .rdi });
3355 defer self.register_manager.unfreezeRegs(&.{ .rax, .rcx, .rdi });3357 defer self.register_manager.unfreezeRegs(&.{ .rax, .rcx, .rdi });
3356 const reg = try self.register_manager.allocReg(null);3358 const reg = try self.register_manager.allocReg(null);
3357 self.ret_backpatch = try self.addInst(.{3359 const backpatch = try self.addInst(.{
3358 .tag = .mov,3360 .tag = .mov,
3359 .ops = (Mir.Ops{3361 .ops = (Mir.Ops{
3360 .reg1 = reg,3362 .reg1 = reg,
...@@ -3362,6 +3364,7 @@ fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {...@@ -3362,6 +3364,7 @@ fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {
3362 }).encode(),3364 }).encode(),
3363 .data = undefined,3365 .data = undefined,
3364 });3366 });
3367 try self.ret_backpatches.append(self.gpa, backpatch);
3365 try self.genInlineMemcpy(0, elem_ty, ptr, .{3368 try self.genInlineMemcpy(0, elem_ty, ptr, .{
3366 .source_stack_base = .rbp,3369 .source_stack_base = .rbp,
3367 .dest_stack_base = reg,3370 .dest_stack_base = reg,
src/link/MachO.zig+61-47
...@@ -3047,6 +3047,9 @@ fn createMhExecuteHeaderAtom(self: *MachO) !void {...@@ -3047,6 +3047,9 @@ fn createMhExecuteHeaderAtom(self: *MachO) !void {
3047 .seg = self.text_segment_cmd_index.?,3047 .seg = self.text_segment_cmd_index.?,
3048 .sect = self.text_section_index.?,3048 .sect = self.text_section_index.?,
3049 };3049 };
3050 const seg = self.load_commands.items[match.seg].segment;
3051 const sect = seg.sections.items[match.sect];
3052
3050 const n_strx = try self.makeString("__mh_execute_header");3053 const n_strx = try self.makeString("__mh_execute_header");
3051 const local_sym_index = @intCast(u32, self.locals.items.len);3054 const local_sym_index = @intCast(u32, self.locals.items.len);
3052 var nlist = macho.nlist_64{3055 var nlist = macho.nlist_64{
...@@ -3054,29 +3057,42 @@ fn createMhExecuteHeaderAtom(self: *MachO) !void {...@@ -3054,29 +3057,42 @@ fn createMhExecuteHeaderAtom(self: *MachO) !void {
3054 .n_type = macho.N_SECT,3057 .n_type = macho.N_SECT,
3055 .n_sect = @intCast(u8, self.section_ordinals.getIndex(match).? + 1),3058 .n_sect = @intCast(u8, self.section_ordinals.getIndex(match).? + 1),
3056 .n_desc = 0,3059 .n_desc = 0,
3057 .n_value = 0,3060 .n_value = sect.addr,
3058 };3061 };
3059 try self.locals.append(self.base.allocator, nlist);3062 try self.locals.append(self.base.allocator, nlist);
3063 self.mh_execute_header_index = local_sym_index;
30603064
3061 nlist.n_type |= macho.N_EXT;3065 if (self.symbol_resolver.getPtr(n_strx)) |resolv| {
3062 const global_sym_index = @intCast(u32, self.globals.items.len);3066 const global = &self.globals.items[resolv.where_index];
3063 try self.globals.append(self.base.allocator, nlist);3067 if (!(global.weakDef() or !global.pext())) {
3064 try self.symbol_resolver.putNoClobber(self.base.allocator, n_strx, .{3068 log.err("symbol '__mh_execute_header' defined multiple times", .{});
3065 .where = .global,3069 return error.MultipleSymbolDefinitions;
3066 .where_index = global_sym_index,3070 }
3067 .local_sym_index = local_sym_index,3071 resolv.local_sym_index = local_sym_index;
3068 .file = null,3072 } else {
3069 });3073 const global_sym_index = @intCast(u32, self.globals.items.len);
3074 nlist.n_type |= macho.N_EXT;
3075 try self.globals.append(self.base.allocator, nlist);
3076 try self.symbol_resolver.putNoClobber(self.base.allocator, n_strx, .{
3077 .where = .global,
3078 .where_index = global_sym_index,
3079 .local_sym_index = local_sym_index,
3080 .file = null,
3081 });
3082 }
30703083
3084 // We always set the __mh_execute_header to point to the beginning of the __TEXT,__text section
3071 const atom = try self.createEmptyAtom(local_sym_index, 0, 0);3085 const atom = try self.createEmptyAtom(local_sym_index, 0, 0);
30723086 if (self.atoms.get(match)) |last| {
3073 if (self.needs_prealloc) {3087 var first = last;
3074 const sym = &self.locals.items[local_sym_index];3088 while (first.prev) |prev| {
3075 const vaddr = try self.allocateAtom(atom, 0, 1, match);3089 first = prev;
3076 sym.n_value = vaddr;3090 }
3077 } else try self.addAtomToSection(atom, match);3091 atom.next = first;
30783092 first.prev = atom;
3079 self.mh_execute_header_index = local_sym_index;3093 } else {
3094 try self.atoms.putNoClobber(self.base.allocator, match, atom);
3095 }
3080}3096}
30813097
3082fn resolveDyldStubBinder(self: *MachO) !void {3098fn resolveDyldStubBinder(self: *MachO) !void {
...@@ -3747,9 +3763,12 @@ pub fn lowerUnnamedConst(self: *MachO, typed_value: TypedValue, decl: *Module.De...@@ -3747,9 +3763,12 @@ pub fn lowerUnnamedConst(self: *MachO, typed_value: TypedValue, decl: *Module.De
3747 }3763 }
3748 const unnamed_consts = gop.value_ptr;3764 const unnamed_consts = gop.value_ptr;
37493765
3766 const decl_name = try decl.getFullyQualifiedName(self.base.allocator);
3767 defer self.base.allocator.free(decl_name);
3768
3750 const name_str_index = blk: {3769 const name_str_index = blk: {
3751 const index = unnamed_consts.items.len;3770 const index = unnamed_consts.items.len;
3752 const name = try std.fmt.allocPrint(self.base.allocator, "__unnamed_{s}_{d}", .{ decl.name, index });3771 const name = try std.fmt.allocPrint(self.base.allocator, "__unnamed_{s}_{d}", .{ decl_name, index });
3753 defer self.base.allocator.free(name);3772 defer self.base.allocator.free(name);
3754 break :blk try self.makeString(name);3773 break :blk try self.makeString(name);
3755 };3774 };
...@@ -4041,14 +4060,17 @@ fn placeDecl(self: *MachO, decl: *Module.Decl, code_len: usize) !*macho.nlist_64...@@ -4041,14 +4060,17 @@ fn placeDecl(self: *MachO, decl: *Module.Decl, code_len: usize) !*macho.nlist_64
4041 decl_ptr.* = try self.getMatchingSectionAtom(&decl.link.macho, decl.ty, decl.val);4060 decl_ptr.* = try self.getMatchingSectionAtom(&decl.link.macho, decl.ty, decl.val);
4042 }4061 }
4043 const match = decl_ptr.*.?;4062 const match = decl_ptr.*.?;
4063 const sym_name = try decl.getFullyQualifiedName(self.base.allocator);
4064 defer self.base.allocator.free(sym_name);
40444065
4045 if (decl.link.macho.size != 0) {4066 if (decl.link.macho.size != 0) {
4046 const capacity = decl.link.macho.capacity(self.*);4067 const capacity = decl.link.macho.capacity(self.*);
4047 const need_realloc = code_len > capacity or !mem.isAlignedGeneric(u64, symbol.n_value, required_alignment);4068 const need_realloc = code_len > capacity or !mem.isAlignedGeneric(u64, symbol.n_value, required_alignment);
4069
4048 if (need_realloc) {4070 if (need_realloc) {
4049 const vaddr = try self.growAtom(&decl.link.macho, code_len, required_alignment, match);4071 const vaddr = try self.growAtom(&decl.link.macho, code_len, required_alignment, match);
40504072
4051 log.debug("growing {s} and moving from 0x{x} to 0x{x}", .{ decl.name, symbol.n_value, vaddr });4073 log.debug("growing {s} and moving from 0x{x} to 0x{x}", .{ sym_name, symbol.n_value, vaddr });
40524074
4053 if (vaddr != symbol.n_value) {4075 if (vaddr != symbol.n_value) {
4054 log.debug(" (writing new GOT entry)", .{});4076 log.debug(" (writing new GOT entry)", .{});
...@@ -4074,25 +4096,15 @@ fn placeDecl(self: *MachO, decl: *Module.Decl, code_len: usize) !*macho.nlist_64...@@ -4074,25 +4096,15 @@ fn placeDecl(self: *MachO, decl: *Module.Decl, code_len: usize) !*macho.nlist_64
4074 decl.link.macho.size = code_len;4096 decl.link.macho.size = code_len;
4075 decl.link.macho.dirty = true;4097 decl.link.macho.dirty = true;
40764098
4077 const new_name = try std.fmt.allocPrint(self.base.allocator, "_{s}", .{4099 symbol.n_strx = try self.makeString(sym_name);
4078 mem.sliceTo(decl.name, 0),
4079 });
4080 defer self.base.allocator.free(new_name);
4081
4082 symbol.n_strx = try self.makeString(new_name);
4083 symbol.n_type = macho.N_SECT;4100 symbol.n_type = macho.N_SECT;
4084 symbol.n_sect = @intCast(u8, self.text_section_index.?) + 1;4101 symbol.n_sect = @intCast(u8, self.text_section_index.?) + 1;
4085 symbol.n_desc = 0;4102 symbol.n_desc = 0;
4086 } else {4103 } else {
4087 const decl_name = try std.fmt.allocPrint(self.base.allocator, "_{s}", .{4104 const name_str_index = try self.makeString(sym_name);
4088 mem.sliceTo(decl.name, 0),
4089 });
4090 defer self.base.allocator.free(decl_name);
4091
4092 const name_str_index = try self.makeString(decl_name);
4093 const addr = try self.allocateAtom(&decl.link.macho, code_len, required_alignment, match);4105 const addr = try self.allocateAtom(&decl.link.macho, code_len, required_alignment, match);
40944106
4095 log.debug("allocated atom for {s} at 0x{x}", .{ decl_name, addr });4107 log.debug("allocated atom for {s} at 0x{x}", .{ sym_name, addr });
40964108
4097 errdefer self.freeAtom(&decl.link.macho, match, false);4109 errdefer self.freeAtom(&decl.link.macho, match, false);
40984110
...@@ -6675,17 +6687,17 @@ fn snapshotState(self: *MachO) !void {...@@ -6675,17 +6687,17 @@ fn snapshotState(self: *MachO) !void {
6675fn logSymtab(self: MachO) void {6687fn logSymtab(self: MachO) void {
6676 log.debug("locals:", .{});6688 log.debug("locals:", .{});
6677 for (self.locals.items) |sym, id| {6689 for (self.locals.items) |sym, id| {
6678 log.debug(" {d}: {s}: {}", .{ id, self.getString(sym.n_strx), sym });6690 log.debug(" {d}: {s}: @{x} in {d}", .{ id, self.getString(sym.n_strx), sym.n_value, sym.n_sect });
6679 }6691 }
66806692
6681 log.debug("globals:", .{});6693 log.debug("globals:", .{});
6682 for (self.globals.items) |sym, id| {6694 for (self.globals.items) |sym, id| {
6683 log.debug(" {d}: {s}: {}", .{ id, self.getString(sym.n_strx), sym });6695 log.debug(" {d}: {s}: @{x} in {d}", .{ id, self.getString(sym.n_strx), sym.n_value, sym.n_sect });
6684 }6696 }
66856697
6686 log.debug("undefs:", .{});6698 log.debug("undefs:", .{});
6687 for (self.undefs.items) |sym, id| {6699 for (self.undefs.items) |sym, id| {
6688 log.debug(" {d}: {s}: {}", .{ id, self.getString(sym.n_strx), sym });6700 log.debug(" {d}: {s}: in {d}", .{ id, self.getString(sym.n_strx), sym.n_desc });
6689 }6701 }
66906702
6691 {6703 {
...@@ -6700,26 +6712,28 @@ fn logSymtab(self: MachO) void {...@@ -6700,26 +6712,28 @@ fn logSymtab(self: MachO) void {
6700 for (self.got_entries_table.values()) |value| {6712 for (self.got_entries_table.values()) |value| {
6701 const key = self.got_entries.items[value].target;6713 const key = self.got_entries.items[value].target;
6702 const atom = self.got_entries.items[value].atom;6714 const atom = self.got_entries.items[value].atom;
6715 const n_value = self.locals.items[atom.local_sym_index].n_value;
6703 switch (key) {6716 switch (key) {
6704 .local => {6717 .local => |ndx| log.debug(" {d}: @{x}", .{ ndx, n_value }),
6705 const sym = self.locals.items[atom.local_sym_index];6718 .global => |n_strx| log.debug(" {s}: @{x}", .{ self.getString(n_strx), n_value }),
6706 log.debug(" {} => {s}", .{ key, self.getString(sym.n_strx) });
6707 },
6708 .global => |n_strx| log.debug(" {} => {s}", .{ key, self.getString(n_strx) }),
6709 }6719 }
6710 }6720 }
67116721
6712 log.debug("__thread_ptrs entries:", .{});6722 log.debug("__thread_ptrs entries:", .{});
6713 for (self.tlv_ptr_entries_table.keys()) |key| {6723 for (self.tlv_ptr_entries_table.values()) |value| {
6714 switch (key) {6724 const key = self.tlv_ptr_entries.items[value].target;
6715 .local => unreachable,6725 const atom = self.tlv_ptr_entries.items[value].atom;
6716 .global => |n_strx| log.debug(" {} => {s}", .{ key, self.getString(n_strx) }),6726 const n_value = self.locals.items[atom.local_sym_index].n_value;
6717 }6727 assert(key == .global);
6728 log.debug(" {s}: @{x}", .{ self.getString(key.global), n_value });
6718 }6729 }
67196730
6720 log.debug("stubs:", .{});6731 log.debug("stubs:", .{});
6721 for (self.stubs_table.keys()) |key| {6732 for (self.stubs_table.keys()) |key| {
6722 log.debug(" {} => {s}", .{ key, self.getString(key) });6733 const value = self.stubs_table.get(key).?;
6734 const atom = self.stubs.items[value];
6735 const sym = self.locals.items[atom.local_sym_index];
6736 log.debug(" {s}: @{x}", .{ self.getString(key), sym.n_value });
6723 }6737 }
6724}6738}
67256739