authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-04-15 16:05:27+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-04-15 16:05:27+03:00
logef7282bab41fdc95c4aee973de2ba595ca8195d2
tree949bef80a15e5bc9179416006084917239c8a539
parent845a30624ffc8fab884e2b7000daddb7d49eb5ff

stage2 macho: workaround stage2 bugs


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

src/Sema.zig+2-1
...@@ -12417,7 +12417,8 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air...@@ -12417,7 +12417,8 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
12417 const tracy = trace(@src());12417 const tracy = trace(@src());
12418 defer tracy.end();12418 defer tracy.end();
1241912419
12420 const src: LazySrcLoc = .unneeded;12420 // TODO better source location
12421 const src: LazySrcLoc = sema.src;
12421 const elem_ty_src: LazySrcLoc = .unneeded;12422 const elem_ty_src: LazySrcLoc = .unneeded;
12422 const inst_data = sema.code.instructions.items(.data)[inst].ptr_type;12423 const inst_data = sema.code.instructions.items(.data)[inst].ptr_type;
12423 const extra = sema.code.extraData(Zir.Inst.PtrType, inst_data.payload_index);12424 const extra = sema.code.extraData(Zir.Inst.PtrType, inst_data.payload_index);
src/link/MachO.zig+7-4
...@@ -1317,6 +1317,9 @@ pub fn parseDylib(self: *MachO, path: []const u8, opts: DylibCreateOpts) ParseDy...@@ -1317,6 +1317,9 @@ pub fn parseDylib(self: *MachO, path: []const u8, opts: DylibCreateOpts) ParseDy
1317 error.EndOfStream, error.NotDylib => {1317 error.EndOfStream, error.NotDylib => {
1318 try file.seekTo(0);1318 try file.seekTo(0);
13191319
1320 // TODO https://github.com/ziglang/zig/issues/11367
1321 if (@import("builtin").zig_backend != .stage1) return error.Unexpected;
1322
1320 var lib_stub = LibStub.loadFromFile(self.base.allocator, file) catch {1323 var lib_stub = LibStub.loadFromFile(self.base.allocator, file) catch {
1321 dylib.deinit(self.base.allocator);1324 dylib.deinit(self.base.allocator);
1322 return false;1325 return false;
...@@ -5747,7 +5750,6 @@ fn populateLazyBindOffsetsInStubHelper(self: *MachO, buffer: []const u8) !void {...@@ -5747,7 +5750,6 @@ fn populateLazyBindOffsetsInStubHelper(self: *MachO, buffer: []const u8) !void {
5747 while (true) {5750 while (true) {
5748 const inst = reader.readByte() catch |err| switch (err) {5751 const inst = reader.readByte() catch |err| switch (err) {
5749 error.EndOfStream => break,5752 error.EndOfStream => break,
5750 else => return err,
5751 };5753 };
5752 const opcode: u8 = inst & macho.BIND_OPCODE_MASK;5754 const opcode: u8 = inst & macho.BIND_OPCODE_MASK;
57535755
...@@ -5875,7 +5877,7 @@ fn writeFunctionStarts(self: *MachO) !void {...@@ -5875,7 +5877,7 @@ fn writeFunctionStarts(self: *MachO) !void {
5875 mem.set(u8, buffer, 0);5877 mem.set(u8, buffer, 0);
58765878
5877 var stream = std.io.fixedBufferStream(buffer);5879 var stream = std.io.fixedBufferStream(buffer);
5878 var writer = stream.writer();5880 const writer = stream.writer();
58795881
5880 for (offsets.items) |offset| {5882 for (offsets.items) |offset| {
5881 try std.leb.writeULEB128(writer, offset);5883 try std.leb.writeULEB128(writer, offset);
...@@ -6236,7 +6238,8 @@ fn writeLoadCommands(self: *MachO) !void {...@@ -6236,7 +6238,8 @@ fn writeLoadCommands(self: *MachO) !void {
62366238
6237 var buffer = try self.base.allocator.alloc(u8, sizeofcmds);6239 var buffer = try self.base.allocator.alloc(u8, sizeofcmds);
6238 defer self.base.allocator.free(buffer);6240 defer self.base.allocator.free(buffer);
6239 var writer = std.io.fixedBufferStream(buffer).writer();6241 var fib = std.io.fixedBufferStream(buffer);
6242 const writer = fib.writer();
6240 for (self.load_commands.items) |lc| {6243 for (self.load_commands.items) |lc| {
6241 try lc.write(writer);6244 try lc.write(writer);
6242 }6245 }
...@@ -6416,7 +6419,7 @@ fn snapshotState(self: *MachO) !void {...@@ -6416,7 +6419,7 @@ fn snapshotState(self: *MachO) !void {
6416 error.Unseekable => try out_file.writer().writeByte('['),6419 error.Unseekable => try out_file.writer().writeByte('['),
6417 else => |e| return e,6420 else => |e| return e,
6418 }6421 }
6419 var writer = out_file.writer();6422 const writer = out_file.writer();
64206423
6421 var snapshot = Snapshot{6424 var snapshot = Snapshot{
6422 .timestamp = std.time.nanoTimestamp(),6425 .timestamp = std.time.nanoTimestamp(),
src/link/MachO/Archive.zig-1
...@@ -171,7 +171,6 @@ fn parseTableOfContents(self: *Archive, allocator: Allocator, reader: anytype) !...@@ -171,7 +171,6 @@ fn parseTableOfContents(self: *Archive, allocator: Allocator, reader: anytype) !
171 while (true) {171 while (true) {
172 const n_strx = symtab_reader.readIntLittle(u32) catch |err| switch (err) {172 const n_strx = symtab_reader.readIntLittle(u32) catch |err| switch (err) {
173 error.EndOfStream => break,173 error.EndOfStream => break,
174 else => |e| return e,
175 };174 };
176 const object_offset = try symtab_reader.readIntLittle(u32);175 const object_offset = try symtab_reader.readIntLittle(u32);
177176
src/link/MachO/DebugSymbols.zig+2-1
...@@ -472,7 +472,8 @@ fn writeLoadCommands(self: *DebugSymbols, allocator: Allocator) !void {...@@ -472,7 +472,8 @@ fn writeLoadCommands(self: *DebugSymbols, allocator: Allocator) !void {
472472
473 var buffer = try allocator.alloc(u8, sizeofcmds);473 var buffer = try allocator.alloc(u8, sizeofcmds);
474 defer allocator.free(buffer);474 defer allocator.free(buffer);
475 var writer = std.io.fixedBufferStream(buffer).writer();475 var fib = std.io.fixedBufferStream(buffer);
476 const writer = fib.writer();
476 for (self.load_commands.items) |lc| {477 for (self.load_commands.items) |lc| {
477 try lc.write(writer);478 try lc.write(writer);
478 }479 }
src/link/MachO/Dylib.zig+1-1
...@@ -64,7 +64,7 @@ pub const Id = struct {...@@ -64,7 +64,7 @@ pub const Id = struct {
64 };64 };
65 }65 }
6666
67 pub fn deinit(id: *Id, allocator: Allocator) void {67 pub fn deinit(id: Id, allocator: Allocator) void {
68 allocator.free(id.name);68 allocator.free(id.name);
69 }69 }
7070
src/link/MachO/Object.zig+2-1
...@@ -492,7 +492,8 @@ pub fn parseIntoAtoms(self: *Object, allocator: Allocator, macho_file: *MachO) !...@@ -492,7 +492,8 @@ pub fn parseIntoAtoms(self: *Object, allocator: Allocator, macho_file: *MachO) !
492 mem.copy(u8, atom.code.items, code);492 mem.copy(u8, atom.code.items, code);
493 }493 }
494494
495 try atom.parseRelocs(relocs, .{495 // TODO stage2 bug: @alignCast shouldn't be needed
496 try atom.parseRelocs(@alignCast(@alignOf(macho.relocation_info), relocs), .{
496 .base_addr = sect.addr,497 .base_addr = sect.addr,
497 .allocator = allocator,498 .allocator = allocator,
498 .object = self,499 .object = self,