authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-04-15 12:02:55-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-04-15 12:02:55-04:00
log4c83b11f71564e0de80f496f471ca6dfb83a95e3
tree74169b63dd4334421f353e947ad90dddff672ac7
parent02a43f325bfbccb73fb773f15b162d531c3c3ada
parentdbe0d3d5790d9e21cf42696d4cea8cc477207592
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #11438 from Vexu/stage2-fixes

Stage2 fixes

13 files changed, 83 insertions(+), 31 deletions(-)

lib/std/math/big/int.zig+2-1
......@@ -2063,7 +2063,8 @@ pub const Const = struct {
20632063 // This is the inverse of calcDivLimbsBufferLen
20642064 const available_len = (limbs.len / 3) - 2;
20652065
2066 const biggest: Const = .{
2066 // TODO https://github.com/ziglang/zig/issues/11439
2067 const biggest = comptime Const{
20672068 .limbs = &([1]Limb{math.maxInt(Limb)} ** available_len),
20682069 .positive = false,
20692070 };
lib/std/os/linux/x86_64.zig+6-1
......@@ -100,7 +100,12 @@ pub fn syscall6(
100100}
101101
102102/// This matches the libc clone function.
103pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: usize, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize;
103pub extern fn clone(func: CloneFn, stack: usize, flags: usize, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize;
104
105const CloneFn = switch (@import("builtin").zig_backend) {
106 .stage1 => fn (arg: usize) callconv(.C) u8,
107 else => *const fn (arg: usize) callconv(.C) u8,
108};
104109
105110pub const restore = restore_rt;
106111
src/AstGen.zig+5
......@@ -2851,6 +2851,9 @@ fn varDecl(
28512851 return &sub_scope.base;
28522852 },
28532853 .keyword_var => {
2854 const old_rl_ty_inst = gz.rl_ty_inst;
2855 defer gz.rl_ty_inst = old_rl_ty_inst;
2856
28542857 const is_comptime = var_decl.comptime_token != null or gz.force_comptime;
28552858 var resolve_inferred_alloc: Zir.Inst.Ref = .none;
28562859 const var_data: struct {
......@@ -2875,6 +2878,7 @@ fn varDecl(
28752878 });
28762879 }
28772880 };
2881 gz.rl_ty_inst = type_inst;
28782882 break :a .{ .alloc = alloc, .result_loc = .{ .ptr = alloc } };
28792883 } else a: {
28802884 const alloc = alloc: {
......@@ -2894,6 +2898,7 @@ fn varDecl(
28942898 });
28952899 }
28962900 };
2901 gz.rl_ty_inst = .none;
28972902 resolve_inferred_alloc = alloc;
28982903 break :a .{ .alloc = alloc, .result_loc = .{ .inferred_ptr = alloc } };
28992904 };
src/Sema.zig+33-16
......@@ -12432,7 +12432,8 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
1243212432 const tracy = trace(@src());
1243312433 defer tracy.end();
1243412434
12435 const src: LazySrcLoc = .unneeded;
12435 // TODO better source location
12436 const src: LazySrcLoc = sema.src;
1243612437 const elem_ty_src: LazySrcLoc = .unneeded;
1243712438 const inst_data = sema.code.instructions.items(.data)[inst].ptr_type;
1243812439 const extra = sema.code.extraData(Zir.Inst.PtrType, inst_data.payload_index);
......@@ -13086,22 +13087,38 @@ fn fieldType(
1308613087) CompileError!Air.Inst.Ref {
1308713088 const resolved_ty = try sema.resolveTypeFields(block, ty_src, aggregate_ty);
1308813089 const target = sema.mod.getTarget();
13089 switch (resolved_ty.zigTypeTag()) {
13090 .Struct => {
13091 const struct_obj = resolved_ty.castTag(.@"struct").?.data;
13092 const field = struct_obj.fields.get(field_name) orelse
13093 return sema.failWithBadStructFieldAccess(block, struct_obj, field_src, field_name);
13094 return sema.addType(field.ty);
13095 },
13096 .Union => {
13097 const union_obj = resolved_ty.cast(Type.Payload.Union).?.data;
13098 const field = union_obj.fields.get(field_name) orelse
13099 return sema.failWithBadUnionFieldAccess(block, union_obj, field_src, field_name);
13100 return sema.addType(field.ty);
13101 },
13102 else => return sema.fail(block, ty_src, "expected struct or union; found '{}'", .{
13090 var cur_ty = resolved_ty;
13091 while (true) {
13092 switch (cur_ty.zigTypeTag()) {
13093 .Struct => {
13094 const struct_obj = cur_ty.castTag(.@"struct").?.data;
13095 const field = struct_obj.fields.get(field_name) orelse
13096 return sema.failWithBadStructFieldAccess(block, struct_obj, field_src, field_name);
13097 return sema.addType(field.ty);
13098 },
13099 .Union => {
13100 const union_obj = cur_ty.cast(Type.Payload.Union).?.data;
13101 const field = union_obj.fields.get(field_name) orelse
13102 return sema.failWithBadUnionFieldAccess(block, union_obj, field_src, field_name);
13103 return sema.addType(field.ty);
13104 },
13105 .Optional => {
13106 if (cur_ty.castTag(.optional)) |some| {
13107 // Struct/array init through optional requires the child type to not be a pointer.
13108 // If the child of .optional is a pointer it'll error on the next loop.
13109 cur_ty = some.data;
13110 continue;
13111 }
13112 },
13113 .ErrorUnion => {
13114 cur_ty = cur_ty.errorUnionPayload();
13115 continue;
13116 },
13117 else => {},
13118 }
13119 return sema.fail(block, ty_src, "expected struct or union; found '{}'", .{
1310313120 resolved_ty.fmt(target),
13104 }),
13121 });
1310513122 }
1310613123}
1310713124
src/arch/sparcv9/CodeGen.zig+3-3
......@@ -624,9 +624,9 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
624624 const is_volatile = (extra.data.flags & 0x80000000) != 0;
625625 const clobbers_len = @truncate(u31, extra.data.flags);
626626 var extra_i: usize = extra.end;
627 const outputs = @bitCast([]const Air.Inst.Ref, self.air.extra[extra_i .. extra_i + extra.data.outputs_len]);
627 const outputs = @ptrCast([]const Air.Inst.Ref, self.air.extra[extra_i .. extra_i + extra.data.outputs_len]);
628628 extra_i += outputs.len;
629 const inputs = @bitCast([]const Air.Inst.Ref, self.air.extra[extra_i .. extra_i + extra.data.inputs_len]);
629 const inputs = @ptrCast([]const Air.Inst.Ref, self.air.extra[extra_i .. extra_i + extra.data.inputs_len]);
630630 extra_i += inputs.len;
631631
632632 const dead = !is_volatile and self.liveness.isUnused(inst);
......@@ -826,7 +826,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallOptions.
826826 const pl_op = self.air.instructions.items(.data)[inst].pl_op;
827827 const callee = pl_op.operand;
828828 const extra = self.air.extraData(Air.Call, pl_op.payload);
829 const args = @bitCast([]const Air.Inst.Ref, self.air.extra[extra.end .. extra.end + extra.data.args_len]);
829 const args = @ptrCast([]const Air.Inst.Ref, self.air.extra[extra.end .. extra.end + extra.data.args_len]);
830830 const ty = self.air.typeOf(callee);
831831 const fn_ty = switch (ty.zigTypeTag()) {
832832 .Fn => ty,
src/codegen/llvm.zig+1
......@@ -4637,6 +4637,7 @@ pub const FuncGen = struct {
46374637 switch (state) {
46384638 .start => switch (byte) {
46394639 '%' => state = .percent,
4640 '$' => try rendered_template.appendSlice("$$"),
46404641 else => try rendered_template.append(byte),
46414642 },
46424643 .percent => switch (byte) {
src/link/MachO.zig+7-4
......@@ -1317,6 +1317,9 @@ pub fn parseDylib(self: *MachO, path: []const u8, opts: DylibCreateOpts) ParseDy
13171317 error.EndOfStream, error.NotDylib => {
13181318 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
13201323 var lib_stub = LibStub.loadFromFile(self.base.allocator, file) catch {
13211324 dylib.deinit(self.base.allocator);
13221325 return false;
......@@ -5747,7 +5750,6 @@ fn populateLazyBindOffsetsInStubHelper(self: *MachO, buffer: []const u8) !void {
57475750 while (true) {
57485751 const inst = reader.readByte() catch |err| switch (err) {
57495752 error.EndOfStream => break,
5750 else => return err,
57515753 };
57525754 const opcode: u8 = inst & macho.BIND_OPCODE_MASK;
57535755
......@@ -5875,7 +5877,7 @@ fn writeFunctionStarts(self: *MachO) !void {
58755877 mem.set(u8, buffer, 0);
58765878
58775879 var stream = std.io.fixedBufferStream(buffer);
5878 var writer = stream.writer();
5880 const writer = stream.writer();
58795881
58805882 for (offsets.items) |offset| {
58815883 try std.leb.writeULEB128(writer, offset);
......@@ -6236,7 +6238,8 @@ fn writeLoadCommands(self: *MachO) !void {
62366238
62376239 var buffer = try self.base.allocator.alloc(u8, sizeofcmds);
62386240 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();
62406243 for (self.load_commands.items) |lc| {
62416244 try lc.write(writer);
62426245 }
......@@ -6416,7 +6419,7 @@ fn snapshotState(self: *MachO) !void {
64166419 error.Unseekable => try out_file.writer().writeByte('['),
64176420 else => |e| return e,
64186421 }
6419 var writer = out_file.writer();
6422 const writer = out_file.writer();
64206423
64216424 var snapshot = Snapshot{
64226425 .timestamp = std.time.nanoTimestamp(),
src/link/MachO/Archive.zig-1
......@@ -171,7 +171,6 @@ fn parseTableOfContents(self: *Archive, allocator: Allocator, reader: anytype) !
171171 while (true) {
172172 const n_strx = symtab_reader.readIntLittle(u32) catch |err| switch (err) {
173173 error.EndOfStream => break,
174 else => |e| return e,
175174 };
176175 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 {
472472
473473 var buffer = try allocator.alloc(u8, sizeofcmds);
474474 defer allocator.free(buffer);
475 var writer = std.io.fixedBufferStream(buffer).writer();
475 var fib = std.io.fixedBufferStream(buffer);
476 const writer = fib.writer();
476477 for (self.load_commands.items) |lc| {
477478 try lc.write(writer);
478479 }
src/link/MachO/Dylib.zig+1-1
......@@ -64,7 +64,7 @@ pub const Id = struct {
6464 };
6565 }
6666
67 pub fn deinit(id: *Id, allocator: Allocator) void {
67 pub fn deinit(id: Id, allocator: Allocator) void {
6868 allocator.free(id.name);
6969 }
7070
src/link/MachO/Object.zig+2-1
......@@ -492,7 +492,8 @@ pub fn parseIntoAtoms(self: *Object, allocator: Allocator, macho_file: *MachO) !
492492 mem.copy(u8, atom.code.items, code);
493493 }
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), .{
496497 .base_addr = sect.addr,
497498 .allocator = allocator,
498499 .object = self,
src/link/Wasm/Object.zig+2-1
......@@ -312,7 +312,8 @@ fn Parser(comptime ReaderType: type) type {
312312 var section_index: u32 = 0;
313313 while (self.reader.reader().readByte()) |byte| : (section_index += 1) {
314314 const len = try readLeb(u32, self.reader.reader());
315 const reader = std.io.limitedReader(self.reader.reader(), len).reader();
315 var limited_reader = std.io.limitedReader(self.reader.reader(), len);
316 const reader = limited_reader.reader();
316317 switch (@intToEnum(std.wasm.Section, byte)) {
317318 .custom => {
318319 const name_len = try readLeb(u32, reader);
test/behavior/basic.zig+19-1
......@@ -859,7 +859,6 @@ test "catch in block has correct result location" {
859859 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
860860 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
861861 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
862 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
863862
864863 const S = struct {
865864 fn open() error{A}!@This() {
......@@ -887,3 +886,22 @@ test "labeled block with runtime branch forwards its result location type to bre
887886 };
888887 try expect(e == .b);
889888}
889
890test "try in labeled block doesn't cast to wrong type" {
891 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
892 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
893
894 const S = struct {
895 a: u32,
896 fn foo() anyerror!u32 {
897 return 1;
898 }
899 };
900 const s: ?*S = blk: {
901 var a = try S.foo();
902
903 _ = a;
904 break :blk null;
905 };
906 _ = s;
907}