| author | |
| committer | |
| log | 914540ddb5867efe5c1823c281641897bc4cd22a |
| tree | 3fae3be246291d26fb10c2ff3a4b415e3d51ec12 |
| parent | 9010bd8aec612d5a14e4be800c80b72025fac2c5 |
Now it builds and what remains in this branch is:
* fix the stage2 compiler regressions from this branch
* finish the rest of zig fmt test cases, get them passing
* Merge in Vexu's translate-c AST branch & fix translate-c regressions6 files changed, 37 insertions(+), 32 deletions(-)
src/astgen.zig+23-18| ... | ... | @@ -381,7 +381,7 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) In |
| 381 | 381 | return addZIRNoOp(mod, scope, src, .unreachable_safe); |
| 382 | 382 | }, |
| 383 | 383 | .@"return" => return ret(mod, scope, node), |
| 384 | .field_access => return field(mod, scope, rl, node), | |
| 384 | .field_access => return fieldAccess(mod, scope, rl, node), | |
| 385 | 385 | .float_literal => return floatLiteral(mod, scope, rl, node), |
| 386 | 386 | |
| 387 | 387 | .if_simple => return ifExpr(mod, scope, rl, tree.ifSimple(node)), |
| ... | ... | @@ -1423,17 +1423,17 @@ fn arrayTypeSentinel(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node. |
| 1423 | 1423 | fn containerField( |
| 1424 | 1424 | mod: *Module, |
| 1425 | 1425 | scope: *Scope, |
| 1426 | node: *ast.Node.ContainerField, | |
| 1426 | field: ast.full.ContainerField, | |
| 1427 | 1427 | ) InnerError!*zir.Inst { |
| 1428 | 1428 | const tree = scope.tree(); |
| 1429 | 1429 | const token_starts = tree.tokens.items(.start); |
| 1430 | 1430 | |
| 1431 | const src = token_starts[tree.firstToken(node)]; | |
| 1432 | const name = try mod.identifierTokenString(scope, node.name_token); | |
| 1431 | const src = token_starts[field.ast.name_token]; | |
| 1432 | const name = try mod.identifierTokenString(scope, field.ast.name_token); | |
| 1433 | 1433 | |
| 1434 | if (node.comptime_token == null and node.value_expr == null and node.align_expr == null) { | |
| 1435 | if (node.type_expr) |some| { | |
| 1436 | const ty = try typeExpr(mod, scope, some); | |
| 1434 | if (field.comptime_token == null and field.ast.value_expr == 0 and field.ast.align_expr == 0) { | |
| 1435 | if (field.ast.type_expr != 0) { | |
| 1436 | const ty = try typeExpr(mod, scope, field.ast.type_expr); | |
| 1437 | 1437 | return addZIRInst(mod, scope, src, zir.Inst.ContainerFieldTyped, .{ |
| 1438 | 1438 | .bytes = name, |
| 1439 | 1439 | .ty = ty, |
| ... | ... | @@ -1445,9 +1445,11 @@ fn containerField( |
| 1445 | 1445 | } |
| 1446 | 1446 | } |
| 1447 | 1447 | |
| 1448 | const ty = if (node.type_expr) |some| try typeExpr(mod, scope, some) else null; | |
| 1449 | const alignment = if (node.align_expr) |some| try expr(mod, scope, .none, some) else null; | |
| 1450 | const init = if (node.value_expr) |some| try expr(mod, scope, .none, some) else null; | |
| 1448 | const ty = if (field.ast.type_expr != 0) try typeExpr(mod, scope, field.ast.type_expr) else null; | |
| 1449 | // TODO result location should be alignment type | |
| 1450 | const alignment = if (field.ast.align_expr != 0) try expr(mod, scope, .none, field.ast.align_expr) else null; | |
| 1451 | // TODO result location should be the field type | |
| 1452 | const init = if (field.ast.value_expr != 0) try expr(mod, scope, .none, field.ast.value_expr) else null; | |
| 1451 | 1453 | |
| 1452 | 1454 | return addZIRInst(mod, scope, src, zir.Inst.ContainerField, .{ |
| 1453 | 1455 | .bytes = name, |
| ... | ... | @@ -1455,7 +1457,7 @@ fn containerField( |
| 1455 | 1457 | .ty = ty, |
| 1456 | 1458 | .init = init, |
| 1457 | 1459 | .alignment = alignment, |
| 1458 | .is_comptime = node.comptime_token != null, | |
| 1460 | .is_comptime = field.comptime_token != null, | |
| 1459 | 1461 | }); |
| 1460 | 1462 | } |
| 1461 | 1463 | |
| ... | ... | @@ -1485,12 +1487,15 @@ fn containerDecl( |
| 1485 | 1487 | defer fields.deinit(); |
| 1486 | 1488 | |
| 1487 | 1489 | for (container_decl.ast.members) |member| { |
| 1488 | switch (node_tags[member]) { | |
| 1489 | .container_field_init, .container_field_align, .container_field => { | |
| 1490 | try fields.append(try containerField(mod, &gen_scope.base, member)); | |
| 1491 | }, | |
| 1490 | // TODO just handle these cases differently since they end up with different ZIR | |
| 1491 | // instructions anyway. It will be simpler & have fewer branches. | |
| 1492 | const field = switch (node_tags[member]) { | |
| 1493 | .container_field_init => try containerField(mod, &gen_scope.base, tree.containerFieldInit(member)), | |
| 1494 | .container_field_align => try containerField(mod, &gen_scope.base, tree.containerFieldAlign(member)), | |
| 1495 | .container_field => try containerField(mod, &gen_scope.base, tree.containerField(member)), | |
| 1492 | 1496 | else => continue, |
| 1493 | } | |
| 1497 | }; | |
| 1498 | try fields.append(field); | |
| 1494 | 1499 | } |
| 1495 | 1500 | |
| 1496 | 1501 | var decl_arena = std.heap.ArenaAllocator.init(mod.gpa); |
| ... | ... | @@ -1847,7 +1852,7 @@ fn tokenIdentEql(mod: *Module, scope: *Scope, token1: ast.TokenIndex, token2: as |
| 1847 | 1852 | return mem.eql(u8, ident_name_1, ident_name_2); |
| 1848 | 1853 | } |
| 1849 | 1854 | |
| 1850 | pub fn field(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) InnerError!*zir.Inst { | |
| 1855 | pub fn fieldAccess(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) InnerError!*zir.Inst { | |
| 1851 | 1856 | const tree = scope.tree(); |
| 1852 | 1857 | const token_starts = tree.tokens.items(.start); |
| 1853 | 1858 | const main_tokens = tree.nodes.items(.main_token); |
| ... | ... | @@ -3269,7 +3274,7 @@ fn asRlPtr( |
| 3269 | 3274 | rl: ResultLoc, |
| 3270 | 3275 | src: usize, |
| 3271 | 3276 | result_ptr: *zir.Inst, |
| 3272 | operand_node: *ast.Node, | |
| 3277 | operand_node: ast.Node.Index, | |
| 3273 | 3278 | dest_type: *zir.Inst, |
| 3274 | 3279 | ) InnerError!*zir.Inst { |
| 3275 | 3280 | // Detect whether this expr() call goes into rvalue() to store the result into the |
src/link.zig+2-2| ... | ... | @@ -550,11 +550,11 @@ pub const File = struct { |
| 550 | 550 | id_symlink_basename, |
| 551 | 551 | &prev_digest_buf, |
| 552 | 552 | ) catch |err| b: { |
| 553 | log.debug("archive new_digest={} readFile error: {s}", .{ digest, @errorName(err) }); | |
| 553 | log.debug("archive new_digest={x} readFile error: {s}", .{ digest, @errorName(err) }); | |
| 554 | 554 | break :b prev_digest_buf[0..0]; |
| 555 | 555 | }; |
| 556 | 556 | if (mem.eql(u8, prev_digest, &digest)) { |
| 557 | log.debug("archive digest={} match - skipping invocation", .{digest}); | |
| 557 | log.debug("archive digest={x} match - skipping invocation", .{digest}); | |
| 558 | 558 | base.lock = man.toOwnedLock(); |
| 559 | 559 | return; |
| 560 | 560 | } |
src/link/Coff.zig+3-3| ... | ... | @@ -892,17 +892,17 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void { |
| 892 | 892 | id_symlink_basename, |
| 893 | 893 | &prev_digest_buf, |
| 894 | 894 | ) catch |err| blk: { |
| 895 | log.debug("COFF LLD new_digest={} error: {s}", .{ digest, @errorName(err) }); | |
| 895 | log.debug("COFF LLD new_digest={x} error: {s}", .{ digest, @errorName(err) }); | |
| 896 | 896 | // Handle this as a cache miss. |
| 897 | 897 | break :blk prev_digest_buf[0..0]; |
| 898 | 898 | }; |
| 899 | 899 | if (mem.eql(u8, prev_digest, &digest)) { |
| 900 | log.debug("COFF LLD digest={} match - skipping invocation", .{digest}); | |
| 900 | log.debug("COFF LLD digest={x} match - skipping invocation", .{digest}); | |
| 901 | 901 | // Hot diggity dog! The output binary is already there. |
| 902 | 902 | self.base.lock = man.toOwnedLock(); |
| 903 | 903 | return; |
| 904 | 904 | } |
| 905 | log.debug("COFF LLD prev_digest={} new_digest={}", .{ prev_digest, digest }); | |
| 905 | log.debug("COFF LLD prev_digest={x} new_digest={x}", .{ prev_digest, digest }); | |
| 906 | 906 | |
| 907 | 907 | // We are about to change the output file to be different, so we invalidate the build hash now. |
| 908 | 908 | directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) { |
src/link/Elf.zig+3-3| ... | ... | @@ -1365,17 +1365,17 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void { |
| 1365 | 1365 | id_symlink_basename, |
| 1366 | 1366 | &prev_digest_buf, |
| 1367 | 1367 | ) catch |err| blk: { |
| 1368 | log.debug("ELF LLD new_digest={} error: {s}", .{ digest, @errorName(err) }); | |
| 1368 | log.debug("ELF LLD new_digest={x} error: {s}", .{ digest, @errorName(err) }); | |
| 1369 | 1369 | // Handle this as a cache miss. |
| 1370 | 1370 | break :blk prev_digest_buf[0..0]; |
| 1371 | 1371 | }; |
| 1372 | 1372 | if (mem.eql(u8, prev_digest, &digest)) { |
| 1373 | log.debug("ELF LLD digest={} match - skipping invocation", .{digest}); | |
| 1373 | log.debug("ELF LLD digest={x} match - skipping invocation", .{digest}); | |
| 1374 | 1374 | // Hot diggity dog! The output binary is already there. |
| 1375 | 1375 | self.base.lock = man.toOwnedLock(); |
| 1376 | 1376 | return; |
| 1377 | 1377 | } |
| 1378 | log.debug("ELF LLD prev_digest={} new_digest={}", .{ prev_digest, digest }); | |
| 1378 | log.debug("ELF LLD prev_digest={x} new_digest={x}", .{ prev_digest, digest }); | |
| 1379 | 1379 | |
| 1380 | 1380 | // We are about to change the output file to be different, so we invalidate the build hash now. |
| 1381 | 1381 | directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) { |
src/link/MachO.zig+3-3| ... | ... | @@ -556,17 +556,17 @@ fn linkWithLLD(self: *MachO, comp: *Compilation) !void { |
| 556 | 556 | id_symlink_basename, |
| 557 | 557 | &prev_digest_buf, |
| 558 | 558 | ) catch |err| blk: { |
| 559 | log.debug("MachO LLD new_digest={} error: {s}", .{ digest, @errorName(err) }); | |
| 559 | log.debug("MachO LLD new_digest={x} error: {s}", .{ digest, @errorName(err) }); | |
| 560 | 560 | // Handle this as a cache miss. |
| 561 | 561 | break :blk prev_digest_buf[0..0]; |
| 562 | 562 | }; |
| 563 | 563 | if (mem.eql(u8, prev_digest, &digest)) { |
| 564 | log.debug("MachO LLD digest={} match - skipping invocation", .{digest}); | |
| 564 | log.debug("MachO LLD digest={x} match - skipping invocation", .{digest}); | |
| 565 | 565 | // Hot diggity dog! The output binary is already there. |
| 566 | 566 | self.base.lock = man.toOwnedLock(); |
| 567 | 567 | return; |
| 568 | 568 | } |
| 569 | log.debug("MachO LLD prev_digest={} new_digest={}", .{ prev_digest, digest }); | |
| 569 | log.debug("MachO LLD prev_digest={x} new_digest={x}", .{ prev_digest, digest }); | |
| 570 | 570 | |
| 571 | 571 | // We are about to change the output file to be different, so we invalidate the build hash now. |
| 572 | 572 | directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) { |
src/link/Wasm.zig+3-3| ... | ... | @@ -333,17 +333,17 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void { |
| 333 | 333 | id_symlink_basename, |
| 334 | 334 | &prev_digest_buf, |
| 335 | 335 | ) catch |err| blk: { |
| 336 | log.debug("WASM LLD new_digest={} error: {s}", .{ digest, @errorName(err) }); | |
| 336 | log.debug("WASM LLD new_digest={x} error: {s}", .{ digest, @errorName(err) }); | |
| 337 | 337 | // Handle this as a cache miss. |
| 338 | 338 | break :blk prev_digest_buf[0..0]; |
| 339 | 339 | }; |
| 340 | 340 | if (mem.eql(u8, prev_digest, &digest)) { |
| 341 | log.debug("WASM LLD digest={} match - skipping invocation", .{digest}); | |
| 341 | log.debug("WASM LLD digest={x} match - skipping invocation", .{digest}); | |
| 342 | 342 | // Hot diggity dog! The output binary is already there. |
| 343 | 343 | self.base.lock = man.toOwnedLock(); |
| 344 | 344 | return; |
| 345 | 345 | } |
| 346 | log.debug("WASM LLD prev_digest={} new_digest={}", .{ prev_digest, digest }); | |
| 346 | log.debug("WASM LLD prev_digest={x} new_digest={x}", .{ prev_digest, digest }); | |
| 347 | 347 | |
| 348 | 348 | // We are about to change the output file to be different, so we invalidate the build hash now. |
| 349 | 349 | directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) { |