| author | |
| committer | |
| log | 93378e2e7be964a7362a9875e3292e9d6a697177 |
| tree | 0b19c42423bdd2f346fe5c3cdb86292d9f976b50 |
| parent | a0d16829215f56fe42548f1014cba0f2df5a1609 |
14 files changed, 201 insertions(+), 546 deletions(-)
lib/compiler/objcopy.zig+9-9| ... | @@ -10,6 +10,9 @@ const assert = std.debug.assert; | ... | @@ -10,6 +10,9 @@ const assert = std.debug.assert; |
| 10 | const fatal = std.process.fatal; | 10 | const fatal = std.process.fatal; |
| 11 | const Server = std.zig.Server; | 11 | const Server = std.zig.Server; |
| 12 | 12 | ||
| 13 | var stdin_buffer: [1024]u8 = undefined; | ||
| 14 | var stdout_buffer: [1024]u8 = undefined; | ||
| 15 | |||
| 13 | pub fn main() !void { | 16 | pub fn main() !void { |
| 14 | var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator); | 17 | var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator); |
| 15 | defer arena_instance.deinit(); | 18 | defer arena_instance.deinit(); |
| ... | @@ -22,11 +25,8 @@ pub fn main() !void { | ... | @@ -22,11 +25,8 @@ pub fn main() !void { |
| 22 | return cmdObjCopy(gpa, arena, args[1..]); | 25 | return cmdObjCopy(gpa, arena, args[1..]); |
| 23 | } | 26 | } |
| 24 | 27 | ||
| 25 | fn cmdObjCopy( | 28 | fn cmdObjCopy(gpa: Allocator, arena: Allocator, args: []const []const u8) !void { |
| 26 | gpa: Allocator, | 29 | _ = gpa; |
| 27 | arena: Allocator, | ||
| 28 | args: []const []const u8, | ||
| 29 | ) !void { | ||
| 30 | var i: usize = 0; | 30 | var i: usize = 0; |
| 31 | var opt_out_fmt: ?std.Target.ObjectFormat = null; | 31 | var opt_out_fmt: ?std.Target.ObjectFormat = null; |
| 32 | var opt_input: ?[]const u8 = null; | 32 | var opt_input: ?[]const u8 = null; |
| ... | @@ -225,13 +225,13 @@ fn cmdObjCopy( | ... | @@ -225,13 +225,13 @@ fn cmdObjCopy( |
| 225 | } | 225 | } |
| 226 | 226 | ||
| 227 | if (listen) { | 227 | if (listen) { |
| 228 | var stdin_reader = fs.File.stdin().reader(&stdin_buffer); | ||
| 229 | var stdout_writer = fs.File.stdout().writer(&stdout_buffer); | ||
| 228 | var server = try Server.init(.{ | 230 | var server = try Server.init(.{ |
| 229 | .gpa = gpa, | 231 | .in = &stdin_reader.interface, |
| 230 | .in = .stdin(), | 232 | .out = &stdout_writer.interface, |
| 231 | .out = .stdout(), | ||
| 232 | .zig_version = builtin.zig_version_string, | 233 | .zig_version = builtin.zig_version_string, |
| 233 | }); | 234 | }); |
| 234 | defer server.deinit(); | ||
| 235 | 235 | ||
| 236 | var seen_update = false; | 236 | var seen_update = false; |
| 237 | while (true) { | 237 | while (true) { |
lib/compiler/resinator/main.zig+4-2| ... | @@ -13,6 +13,8 @@ const hasDisjointCodePage = @import("disjoint_code_page.zig").hasDisjointCodePag | ... | @@ -13,6 +13,8 @@ const hasDisjointCodePage = @import("disjoint_code_page.zig").hasDisjointCodePag |
| 13 | const fmtResourceType = @import("res.zig").NameOrOrdinal.fmtResourceType; | 13 | const fmtResourceType = @import("res.zig").NameOrOrdinal.fmtResourceType; |
| 14 | const aro = @import("aro"); | 14 | const aro = @import("aro"); |
| 15 | 15 | ||
| 16 | var stdout_buffer: [1024]u8 = undefined; | ||
| 17 | |||
| 16 | pub fn main() !void { | 18 | pub fn main() !void { |
| 17 | var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; | 19 | var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; |
| 18 | defer std.debug.assert(gpa.deinit() == .ok); | 20 | defer std.debug.assert(gpa.deinit() == .ok); |
| ... | @@ -41,12 +43,12 @@ pub fn main() !void { | ... | @@ -41,12 +43,12 @@ pub fn main() !void { |
| 41 | cli_args = args[3..]; | 43 | cli_args = args[3..]; |
| 42 | } | 44 | } |
| 43 | 45 | ||
| 46 | var stdout_writer2 = std.fs.File.stdout().writer(&stdout_buffer); | ||
| 44 | var error_handler: ErrorHandler = switch (zig_integration) { | 47 | var error_handler: ErrorHandler = switch (zig_integration) { |
| 45 | true => .{ | 48 | true => .{ |
| 46 | .server = .{ | 49 | .server = .{ |
| 47 | .out = std.fs.File.stdout(), | 50 | .out = &stdout_writer2.interface, |
| 48 | .in = undefined, // won't be receiving messages | 51 | .in = undefined, // won't be receiving messages |
| 49 | .receive_fifo = undefined, // won't be receiving messages | ||
| 50 | }, | 52 | }, |
| 51 | }, | 53 | }, |
| 52 | false => .{ | 54 | false => .{ |
lib/compiler/test_runner.zig+6-5| ... | @@ -2,7 +2,6 @@ | ... | @@ -2,7 +2,6 @@ |
| 2 | const builtin = @import("builtin"); | 2 | const builtin = @import("builtin"); |
| 3 | 3 | ||
| 4 | const std = @import("std"); | 4 | const std = @import("std"); |
| 5 | const io = std.io; | ||
| 6 | const testing = std.testing; | 5 | const testing = std.testing; |
| 7 | const assert = std.debug.assert; | 6 | const assert = std.debug.assert; |
| 8 | 7 | ||
| ... | @@ -13,6 +12,8 @@ pub const std_options: std.Options = .{ | ... | @@ -13,6 +12,8 @@ pub const std_options: std.Options = .{ |
| 13 | var log_err_count: usize = 0; | 12 | var log_err_count: usize = 0; |
| 14 | var fba_buffer: [8192]u8 = undefined; | 13 | var fba_buffer: [8192]u8 = undefined; |
| 15 | var fba = std.heap.FixedBufferAllocator.init(&fba_buffer); | 14 | var fba = std.heap.FixedBufferAllocator.init(&fba_buffer); |
| 15 | var stdin_buffer: [std.heap.page_size_min]u8 align(std.heap.page_size_min) = undefined; | ||
| 16 | var stdout_buffer: [std.heap.page_size_min]u8 align(std.heap.page_size_min) = undefined; | ||
| 16 | 17 | ||
| 17 | const crippled = switch (builtin.zig_backend) { | 18 | const crippled = switch (builtin.zig_backend) { |
| 18 | .stage2_powerpc, | 19 | .stage2_powerpc, |
| ... | @@ -67,13 +68,13 @@ pub fn main() void { | ... | @@ -67,13 +68,13 @@ pub fn main() void { |
| 67 | 68 | ||
| 68 | fn mainServer() !void { | 69 | fn mainServer() !void { |
| 69 | @disableInstrumentation(); | 70 | @disableInstrumentation(); |
| 71 | var stdin_reader = std.fs.File.stdin().reader(&stdin_buffer); | ||
| 72 | var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer); | ||
| 70 | var server = try std.zig.Server.init(.{ | 73 | var server = try std.zig.Server.init(.{ |
| 71 | .gpa = fba.allocator(), | 74 | .in = &stdin_reader.interface, |
| 72 | .in = .stdin(), | 75 | .out = &stdout_writer.interface, |
| 73 | .out = .stdout(), | ||
| 74 | .zig_version = builtin.zig_version_string, | 76 | .zig_version = builtin.zig_version_string, |
| 75 | }); | 77 | }); |
| 76 | defer server.deinit(); | ||
| 77 | 78 | ||
| 78 | if (builtin.fuzz) { | 79 | if (builtin.fuzz) { |
| 79 | const coverage_id = fuzzer_coverage_id(); | 80 | const coverage_id = fuzzer_coverage_id(); |
lib/std/zig.zig+1| ... | @@ -905,4 +905,5 @@ test { | ... | @@ -905,4 +905,5 @@ test { |
| 905 | _ = system; | 905 | _ = system; |
| 906 | _ = target; | 906 | _ = target; |
| 907 | _ = c_translation; | 907 | _ = c_translation; |
| 908 | _ = llvm; | ||
| 908 | } | 909 | } |
lib/std/zig/LibCInstallation.zig+3-4| ... | @@ -370,7 +370,7 @@ fn findNativeIncludeDirWindows( | ... | @@ -370,7 +370,7 @@ fn findNativeIncludeDirWindows( |
| 370 | 370 | ||
| 371 | for (installs) |install| { | 371 | for (installs) |install| { |
| 372 | result_buf.shrinkAndFree(0); | 372 | result_buf.shrinkAndFree(0); |
| 373 | try result_buf.writer().print("{s}\\Include\\{s}\\ucrt", .{ install.path, install.version }); | 373 | try result_buf.print("{s}\\Include\\{s}\\ucrt", .{ install.path, install.version }); |
| 374 | 374 | ||
| 375 | var dir = fs.cwd().openDir(result_buf.items, .{}) catch |err| switch (err) { | 375 | var dir = fs.cwd().openDir(result_buf.items, .{}) catch |err| switch (err) { |
| 376 | error.FileNotFound, | 376 | error.FileNotFound, |
| ... | @@ -417,7 +417,7 @@ fn findNativeCrtDirWindows( | ... | @@ -417,7 +417,7 @@ fn findNativeCrtDirWindows( |
| 417 | 417 | ||
| 418 | for (installs) |install| { | 418 | for (installs) |install| { |
| 419 | result_buf.shrinkAndFree(0); | 419 | result_buf.shrinkAndFree(0); |
| 420 | try result_buf.writer().print("{s}\\Lib\\{s}\\ucrt\\{s}", .{ install.path, install.version, arch_sub_dir }); | 420 | try result_buf.print("{s}\\Lib\\{s}\\ucrt\\{s}", .{ install.path, install.version, arch_sub_dir }); |
| 421 | 421 | ||
| 422 | var dir = fs.cwd().openDir(result_buf.items, .{}) catch |err| switch (err) { | 422 | var dir = fs.cwd().openDir(result_buf.items, .{}) catch |err| switch (err) { |
| 423 | error.FileNotFound, | 423 | error.FileNotFound, |
| ... | @@ -484,8 +484,7 @@ fn findNativeKernel32LibDir( | ... | @@ -484,8 +484,7 @@ fn findNativeKernel32LibDir( |
| 484 | 484 | ||
| 485 | for (installs) |install| { | 485 | for (installs) |install| { |
| 486 | result_buf.shrinkAndFree(0); | 486 | result_buf.shrinkAndFree(0); |
| 487 | const stream = result_buf.writer(); | 487 | try result_buf.print("{s}\\Lib\\{s}\\um\\{s}", .{ install.path, install.version, arch_sub_dir }); |
| 488 | try stream.print("{s}\\Lib\\{s}\\um\\{s}", .{ install.path, install.version, arch_sub_dir }); | ||
| 489 | 488 | ||
| 490 | var dir = fs.cwd().openDir(result_buf.items, .{}) catch |err| switch (err) { | 489 | var dir = fs.cwd().openDir(result_buf.items, .{}) catch |err| switch (err) { |
| 491 | error.FileNotFound, | 490 | error.FileNotFound, |
lib/std/zig/Server.zig+57-157| ... | @@ -1,6 +1,20 @@ | ... | @@ -1,6 +1,20 @@ |
| 1 | in: std.fs.File, | 1 | const Server = @This(); |
| 2 | out: std.fs.File, | 2 | |
| 3 | receive_fifo: std.fifo.LinearFifo(u8, .Dynamic), | 3 | const builtin = @import("builtin"); |
| 4 | |||
| 5 | const std = @import("std"); | ||
| 6 | const Allocator = std.mem.Allocator; | ||
| 7 | const assert = std.debug.assert; | ||
| 8 | const native_endian = builtin.target.cpu.arch.endian(); | ||
| 9 | const need_bswap = native_endian != .little; | ||
| 10 | const Cache = std.Build.Cache; | ||
| 11 | const OutMessage = std.zig.Server.Message; | ||
| 12 | const InMessage = std.zig.Client.Message; | ||
| 13 | const Reader = std.Io.Reader; | ||
| 14 | const Writer = std.Io.Writer; | ||
| 15 | |||
| 16 | in: *Reader, | ||
| 17 | out: *Writer, | ||
| 4 | 18 | ||
| 5 | pub const Message = struct { | 19 | pub const Message = struct { |
| 6 | pub const Header = extern struct { | 20 | pub const Header = extern struct { |
| ... | @@ -94,9 +108,8 @@ pub const Message = struct { | ... | @@ -94,9 +108,8 @@ pub const Message = struct { |
| 94 | }; | 108 | }; |
| 95 | 109 | ||
| 96 | pub const Options = struct { | 110 | pub const Options = struct { |
| 97 | gpa: Allocator, | 111 | in: *Reader, |
| 98 | in: std.fs.File, | 112 | out: *Writer, |
| 99 | out: std.fs.File, | ||
| 100 | zig_version: []const u8, | 113 | zig_version: []const u8, |
| 101 | }; | 114 | }; |
| 102 | 115 | ||
| ... | @@ -104,96 +117,40 @@ pub fn init(options: Options) !Server { | ... | @@ -104,96 +117,40 @@ pub fn init(options: Options) !Server { |
| 104 | var s: Server = .{ | 117 | var s: Server = .{ |
| 105 | .in = options.in, | 118 | .in = options.in, |
| 106 | .out = options.out, | 119 | .out = options.out, |
| 107 | .receive_fifo = std.fifo.LinearFifo(u8, .Dynamic).init(options.gpa), | ||
| 108 | }; | 120 | }; |
| 109 | try s.serveStringMessage(.zig_version, options.zig_version); | 121 | try s.serveStringMessage(.zig_version, options.zig_version); |
| 110 | return s; | 122 | return s; |
| 111 | } | 123 | } |
| 112 | 124 | ||
| 113 | pub fn deinit(s: *Server) void { | ||
| 114 | s.receive_fifo.deinit(); | ||
| 115 | s.* = undefined; | ||
| 116 | } | ||
| 117 | |||
| 118 | pub fn receiveMessage(s: *Server) !InMessage.Header { | 125 | pub fn receiveMessage(s: *Server) !InMessage.Header { |
| 119 | const Header = InMessage.Header; | 126 | return s.in.takeStruct(InMessage.Header, .little); |
| 120 | const fifo = &s.receive_fifo; | ||
| 121 | var last_amt_zero = false; | ||
| 122 | |||
| 123 | while (true) { | ||
| 124 | const buf = fifo.readableSlice(0); | ||
| 125 | assert(fifo.readableLength() == buf.len); | ||
| 126 | if (buf.len >= @sizeOf(Header)) { | ||
| 127 | const header: *align(1) const Header = @ptrCast(buf[0..@sizeOf(Header)]); | ||
| 128 | const bytes_len = bswap(header.bytes_len); | ||
| 129 | const tag = bswap(header.tag); | ||
| 130 | |||
| 131 | if (buf.len - @sizeOf(Header) >= bytes_len) { | ||
| 132 | fifo.discard(@sizeOf(Header)); | ||
| 133 | return .{ | ||
| 134 | .tag = tag, | ||
| 135 | .bytes_len = bytes_len, | ||
| 136 | }; | ||
| 137 | } else { | ||
| 138 | const needed = bytes_len - (buf.len - @sizeOf(Header)); | ||
| 139 | const write_buffer = try fifo.writableWithSize(needed); | ||
| 140 | const amt = try s.in.read(write_buffer); | ||
| 141 | fifo.update(amt); | ||
| 142 | continue; | ||
| 143 | } | ||
| 144 | } | ||
| 145 | |||
| 146 | const write_buffer = try fifo.writableWithSize(256); | ||
| 147 | const amt = try s.in.read(write_buffer); | ||
| 148 | fifo.update(amt); | ||
| 149 | if (amt == 0) { | ||
| 150 | if (last_amt_zero) return error.BrokenPipe; | ||
| 151 | last_amt_zero = true; | ||
| 152 | } | ||
| 153 | } | ||
| 154 | } | 127 | } |
| 155 | 128 | ||
| 156 | pub fn receiveBody_u32(s: *Server) !u32 { | 129 | pub fn receiveBody_u32(s: *Server) !u32 { |
| 157 | const fifo = &s.receive_fifo; | 130 | return s.in.takeInt(u32, .little); |
| 158 | const buf = fifo.readableSlice(0); | ||
| 159 | const result = @as(*align(1) const u32, @ptrCast(buf[0..4])).*; | ||
| 160 | fifo.discard(4); | ||
| 161 | return bswap(result); | ||
| 162 | } | 131 | } |
| 163 | 132 | ||
| 164 | pub fn serveStringMessage(s: *Server, tag: OutMessage.Tag, msg: []const u8) !void { | 133 | pub fn serveStringMessage(s: *Server, tag: OutMessage.Tag, msg: []const u8) !void { |
| 165 | return s.serveMessage(.{ | 134 | try s.serveMessageHeader(.{ |
| 166 | .tag = tag, | 135 | .tag = tag, |
| 167 | .bytes_len = @as(u32, @intCast(msg.len)), | 136 | .bytes_len = @intCast(msg.len), |
| 168 | }, &.{msg}); | 137 | }); |
| 138 | try s.out.writeAll(msg); | ||
| 139 | try s.out.flush(); | ||
| 169 | } | 140 | } |
| 170 | 141 | ||
| 171 | pub fn serveMessage( | 142 | /// Don't forget to flush! |
| 172 | s: *const Server, | 143 | pub fn serveMessageHeader(s: *const Server, header: OutMessage.Header) !void { |
| 173 | header: OutMessage.Header, | 144 | try s.out.writeStruct(header, .little); |
| 174 | bufs: []const []const u8, | ||
| 175 | ) !void { | ||
| 176 | var iovecs: [10]std.posix.iovec_const = undefined; | ||
| 177 | const header_le = bswap(header); | ||
| 178 | iovecs[0] = .{ | ||
| 179 | .base = @as([*]const u8, @ptrCast(&header_le)), | ||
| 180 | .len = @sizeOf(OutMessage.Header), | ||
| 181 | }; | ||
| 182 | for (bufs, iovecs[1 .. bufs.len + 1]) |buf, *iovec| { | ||
| 183 | iovec.* = .{ | ||
| 184 | .base = buf.ptr, | ||
| 185 | .len = buf.len, | ||
| 186 | }; | ||
| 187 | } | ||
| 188 | try s.out.writevAll(iovecs[0 .. bufs.len + 1]); | ||
| 189 | } | 145 | } |
| 190 | 146 | ||
| 191 | pub fn serveU64Message(s: *Server, tag: OutMessage.Tag, int: u64) !void { | 147 | pub fn serveU64Message(s: *const Server, tag: OutMessage.Tag, int: u64) !void { |
| 192 | const msg_le = bswap(int); | 148 | try serveMessageHeader(s, .{ |
| 193 | return s.serveMessage(.{ | ||
| 194 | .tag = tag, | 149 | .tag = tag, |
| 195 | .bytes_len = @sizeOf(u64), | 150 | .bytes_len = @sizeOf(u64), |
| 196 | }, &.{std.mem.asBytes(&msg_le)}); | 151 | }); |
| 152 | try s.out.writeInt(u64, int, .little); | ||
| 153 | try s.out.flush(); | ||
| 197 | } | 154 | } |
| 198 | 155 | ||
| 199 | pub fn serveEmitDigest( | 156 | pub fn serveEmitDigest( |
| ... | @@ -201,26 +158,22 @@ pub fn serveEmitDigest( | ... | @@ -201,26 +158,22 @@ pub fn serveEmitDigest( |
| 201 | digest: *const [Cache.bin_digest_len]u8, | 158 | digest: *const [Cache.bin_digest_len]u8, |
| 202 | header: OutMessage.EmitDigest, | 159 | header: OutMessage.EmitDigest, |
| 203 | ) !void { | 160 | ) !void { |
| 204 | try s.serveMessage(.{ | 161 | try s.serveMessageHeader(.{ |
| 205 | .tag = .emit_digest, | 162 | .tag = .emit_digest, |
| 206 | .bytes_len = @intCast(digest.len + @sizeOf(OutMessage.EmitDigest)), | 163 | .bytes_len = @intCast(digest.len + @sizeOf(OutMessage.EmitDigest)), |
| 207 | }, &.{ | ||
| 208 | std.mem.asBytes(&header), | ||
| 209 | digest, | ||
| 210 | }); | 164 | }); |
| 165 | try s.out.writeStruct(header, .little); | ||
| 166 | try s.out.writeAll(digest); | ||
| 167 | try s.out.flush(); | ||
| 211 | } | 168 | } |
| 212 | 169 | ||
| 213 | pub fn serveTestResults( | 170 | pub fn serveTestResults(s: *Server, msg: OutMessage.TestResults) !void { |
| 214 | s: *Server, | 171 | try s.serveMessageHeader(.{ |
| 215 | msg: OutMessage.TestResults, | ||
| 216 | ) !void { | ||
| 217 | const msg_le = bswap(msg); | ||
| 218 | try s.serveMessage(.{ | ||
| 219 | .tag = .test_results, | 172 | .tag = .test_results, |
| 220 | .bytes_len = @intCast(@sizeOf(OutMessage.TestResults)), | 173 | .bytes_len = @intCast(@sizeOf(OutMessage.TestResults)), |
| 221 | }, &.{ | ||
| 222 | std.mem.asBytes(&msg_le), | ||
| 223 | }); | 174 | }); |
| 175 | try s.out.writeStruct(msg, .little); | ||
| 176 | try s.out.flush(); | ||
| 224 | } | 177 | } |
| 225 | 178 | ||
| 226 | pub fn serveErrorBundle(s: *Server, error_bundle: std.zig.ErrorBundle) !void { | 179 | pub fn serveErrorBundle(s: *Server, error_bundle: std.zig.ErrorBundle) !void { |
| ... | @@ -230,91 +183,38 @@ pub fn serveErrorBundle(s: *Server, error_bundle: std.zig.ErrorBundle) !void { | ... | @@ -230,91 +183,38 @@ pub fn serveErrorBundle(s: *Server, error_bundle: std.zig.ErrorBundle) !void { |
| 230 | }; | 183 | }; |
| 231 | const bytes_len = @sizeOf(OutMessage.ErrorBundle) + | 184 | const bytes_len = @sizeOf(OutMessage.ErrorBundle) + |
| 232 | 4 * error_bundle.extra.len + error_bundle.string_bytes.len; | 185 | 4 * error_bundle.extra.len + error_bundle.string_bytes.len; |
| 233 | try s.serveMessage(.{ | 186 | try s.serveMessageHeader(.{ |
| 234 | .tag = .error_bundle, | 187 | .tag = .error_bundle, |
| 235 | .bytes_len = @intCast(bytes_len), | 188 | .bytes_len = @intCast(bytes_len), |
| 236 | }, &.{ | ||
| 237 | std.mem.asBytes(&eb_hdr), | ||
| 238 | // TODO: implement @ptrCast between slices changing the length | ||
| 239 | std.mem.sliceAsBytes(error_bundle.extra), | ||
| 240 | error_bundle.string_bytes, | ||
| 241 | }); | 189 | }); |
| 190 | try s.out.writeStruct(eb_hdr, .little); | ||
| 191 | try s.out.writeSliceEndian(u32, error_bundle.extra, .little); | ||
| 192 | try s.out.writeAll(error_bundle.string_bytes); | ||
| 193 | try s.out.flush(); | ||
| 242 | } | 194 | } |
| 243 | 195 | ||
| 244 | pub const TestMetadata = struct { | 196 | pub const TestMetadata = struct { |
| 245 | names: []u32, | 197 | names: []const u32, |
| 246 | expected_panic_msgs: []u32, | 198 | expected_panic_msgs: []const u32, |
| 247 | string_bytes: []const u8, | 199 | string_bytes: []const u8, |
| 248 | }; | 200 | }; |
| 249 | 201 | ||
| 250 | pub fn serveTestMetadata(s: *Server, test_metadata: TestMetadata) !void { | 202 | pub fn serveTestMetadata(s: *Server, test_metadata: TestMetadata) !void { |
| 251 | const header: OutMessage.TestMetadata = .{ | 203 | const header: OutMessage.TestMetadata = .{ |
| 252 | .tests_len = bswap(@as(u32, @intCast(test_metadata.names.len))), | 204 | .tests_len = @as(u32, @intCast(test_metadata.names.len)), |
| 253 | .string_bytes_len = bswap(@as(u32, @intCast(test_metadata.string_bytes.len))), | 205 | .string_bytes_len = @as(u32, @intCast(test_metadata.string_bytes.len)), |
| 254 | }; | 206 | }; |
| 255 | const trailing = 2; | 207 | const trailing = 2; |
| 256 | const bytes_len = @sizeOf(OutMessage.TestMetadata) + | 208 | const bytes_len = @sizeOf(OutMessage.TestMetadata) + |
| 257 | trailing * @sizeOf(u32) * test_metadata.names.len + test_metadata.string_bytes.len; | 209 | trailing * @sizeOf(u32) * test_metadata.names.len + test_metadata.string_bytes.len; |
| 258 | 210 | ||
| 259 | if (need_bswap) { | 211 | try s.serveMessageHeader(.{ |
| 260 | bswap_u32_array(test_metadata.names); | ||
| 261 | bswap_u32_array(test_metadata.expected_panic_msgs); | ||
| 262 | } | ||
| 263 | defer if (need_bswap) { | ||
| 264 | bswap_u32_array(test_metadata.names); | ||
| 265 | bswap_u32_array(test_metadata.expected_panic_msgs); | ||
| 266 | }; | ||
| 267 | |||
| 268 | return s.serveMessage(.{ | ||
| 269 | .tag = .test_metadata, | 212 | .tag = .test_metadata, |
| 270 | .bytes_len = @intCast(bytes_len), | 213 | .bytes_len = @intCast(bytes_len), |
| 271 | }, &.{ | ||
| 272 | std.mem.asBytes(&header), | ||
| 273 | // TODO: implement @ptrCast between slices changing the length | ||
| 274 | std.mem.sliceAsBytes(test_metadata.names), | ||
| 275 | std.mem.sliceAsBytes(test_metadata.expected_panic_msgs), | ||
| 276 | test_metadata.string_bytes, | ||
| 277 | }); | 214 | }); |
| 215 | try s.out.writeStruct(header, .little); | ||
| 216 | try s.out.writeSliceEndian(u32, test_metadata.names, .little); | ||
| 217 | try s.out.writeSliceEndian(u32, test_metadata.expected_panic_msgs, .little); | ||
| 218 | try s.out.writeAll(test_metadata.string_bytes); | ||
| 219 | try s.out.flush(); | ||
| 278 | } | 220 | } |
| 279 | |||
| 280 | fn bswap(x: anytype) @TypeOf(x) { | ||
| 281 | if (!need_bswap) return x; | ||
| 282 | |||
| 283 | const T = @TypeOf(x); | ||
| 284 | switch (@typeInfo(T)) { | ||
| 285 | .@"enum" => return @as(T, @enumFromInt(@byteSwap(@intFromEnum(x)))), | ||
| 286 | .int => return @byteSwap(x), | ||
| 287 | .@"struct" => |info| switch (info.layout) { | ||
| 288 | .@"extern" => { | ||
| 289 | var result: T = undefined; | ||
| 290 | inline for (info.fields) |field| { | ||
| 291 | @field(result, field.name) = bswap(@field(x, field.name)); | ||
| 292 | } | ||
| 293 | return result; | ||
| 294 | }, | ||
| 295 | .@"packed" => { | ||
| 296 | const I = info.backing_integer.?; | ||
| 297 | return @as(T, @bitCast(@byteSwap(@as(I, @bitCast(x))))); | ||
| 298 | }, | ||
| 299 | .auto => @compileError("auto layout struct"), | ||
| 300 | }, | ||
| 301 | else => @compileError("bswap on type " ++ @typeName(T)), | ||
| 302 | } | ||
| 303 | } | ||
| 304 | |||
| 305 | fn bswap_u32_array(slice: []u32) void { | ||
| 306 | comptime assert(need_bswap); | ||
| 307 | for (slice) |*elem| elem.* = @byteSwap(elem.*); | ||
| 308 | } | ||
| 309 | |||
| 310 | const OutMessage = std.zig.Server.Message; | ||
| 311 | const InMessage = std.zig.Client.Message; | ||
| 312 | |||
| 313 | const Server = @This(); | ||
| 314 | const builtin = @import("builtin"); | ||
| 315 | const std = @import("std"); | ||
| 316 | const Allocator = std.mem.Allocator; | ||
| 317 | const assert = std.debug.assert; | ||
| 318 | const native_endian = builtin.target.cpu.arch.endian(); | ||
| 319 | const need_bswap = native_endian != .little; | ||
| 320 | const Cache = std.Build.Cache; |
lib/std/zig/WindowsSdk.zig+7-7| ... | @@ -1,11 +1,12 @@ | ... | @@ -1,11 +1,12 @@ |
| 1 | const WindowsSdk = @This(); | ||
| 2 | const builtin = @import("builtin"); | ||
| 3 | const std = @import("std"); | ||
| 4 | const Writer = std.Io.Writer; | ||
| 5 | |||
| 1 | windows10sdk: ?Installation, | 6 | windows10sdk: ?Installation, |
| 2 | windows81sdk: ?Installation, | 7 | windows81sdk: ?Installation, |
| 3 | msvc_lib_dir: ?[]const u8, | 8 | msvc_lib_dir: ?[]const u8, |
| 4 | 9 | ||
| 5 | const WindowsSdk = @This(); | ||
| 6 | const std = @import("std"); | ||
| 7 | const builtin = @import("builtin"); | ||
| 8 | |||
| 9 | const windows = std.os.windows; | 10 | const windows = std.os.windows; |
| 10 | const RRF = windows.advapi32.RRF; | 11 | const RRF = windows.advapi32.RRF; |
| 11 | 12 | ||
| ... | @@ -759,14 +760,13 @@ const MsvcLibDir = struct { | ... | @@ -759,14 +760,13 @@ const MsvcLibDir = struct { |
| 759 | while (instances_dir_it.next() catch return error.PathNotFound) |entry| { | 760 | while (instances_dir_it.next() catch return error.PathNotFound) |entry| { |
| 760 | if (entry.kind != .directory) continue; | 761 | if (entry.kind != .directory) continue; |
| 761 | 762 | ||
| 762 | var fbs = std.io.fixedBufferStream(&state_subpath_buf); | 763 | var writer: Writer = .fixed(&state_subpath_buf); |
| 763 | const writer = fbs.writer(); | ||
| 764 | 764 | ||
| 765 | writer.writeAll(entry.name) catch unreachable; | 765 | writer.writeAll(entry.name) catch unreachable; |
| 766 | writer.writeByte(std.fs.path.sep) catch unreachable; | 766 | writer.writeByte(std.fs.path.sep) catch unreachable; |
| 767 | writer.writeAll("state.json") catch unreachable; | 767 | writer.writeAll("state.json") catch unreachable; |
| 768 | 768 | ||
| 769 | const json_contents = instances_dir.readFileAlloc(allocator, fbs.getWritten(), std.math.maxInt(usize)) catch continue; | 769 | const json_contents = instances_dir.readFileAlloc(allocator, writer.buffered(), std.math.maxInt(usize)) catch continue; |
| 770 | defer allocator.free(json_contents); | 770 | defer allocator.free(json_contents); |
| 771 | 771 | ||
| 772 | var parsed = std.json.parseFromSlice(std.json.Value, allocator, json_contents, .{}) catch continue; | 772 | var parsed = std.json.parseFromSlice(std.json.Value, allocator, json_contents, .{}) catch continue; |
lib/std/zig/llvm.zig+6| ... | @@ -1,3 +1,9 @@ | ... | @@ -1,3 +1,9 @@ |
| 1 | pub const BitcodeReader = @import("llvm/BitcodeReader.zig"); | 1 | pub const BitcodeReader = @import("llvm/BitcodeReader.zig"); |
| 2 | pub const bitcode_writer = @import("llvm/bitcode_writer.zig"); | 2 | pub const bitcode_writer = @import("llvm/bitcode_writer.zig"); |
| 3 | pub const Builder = @import("llvm/Builder.zig"); | 3 | pub const Builder = @import("llvm/Builder.zig"); |
| 4 | |||
| 5 | test { | ||
| 6 | _ = BitcodeReader; | ||
| 7 | _ = bitcode_writer; | ||
| 8 | _ = Builder; | ||
| 9 | } |
lib/std/zig/llvm/BitcodeReader.zig+16-12| ... | @@ -1,6 +1,11 @@ | ... | @@ -1,6 +1,11 @@ |
| 1 | const BitcodeReader = @This(); | ||
| 2 | |||
| 3 | const std = @import("../../std.zig"); | ||
| 4 | const assert = std.debug.assert; | ||
| 5 | |||
| 1 | allocator: std.mem.Allocator, | 6 | allocator: std.mem.Allocator, |
| 2 | record_arena: std.heap.ArenaAllocator.State, | 7 | record_arena: std.heap.ArenaAllocator.State, |
| 3 | reader: std.io.AnyReader, | 8 | reader: *std.Io.Reader, |
| 4 | keep_names: bool, | 9 | keep_names: bool, |
| 5 | bit_buffer: u32, | 10 | bit_buffer: u32, |
| 6 | bit_offset: u5, | 11 | bit_offset: u5, |
| ... | @@ -93,7 +98,7 @@ pub const Record = struct { | ... | @@ -93,7 +98,7 @@ pub const Record = struct { |
| 93 | }; | 98 | }; |
| 94 | 99 | ||
| 95 | pub const InitOptions = struct { | 100 | pub const InitOptions = struct { |
| 96 | reader: std.io.AnyReader, | 101 | reader: *std.Io.Reader, |
| 97 | keep_names: bool = false, | 102 | keep_names: bool = false, |
| 98 | }; | 103 | }; |
| 99 | pub fn init(allocator: std.mem.Allocator, options: InitOptions) BitcodeReader { | 104 | pub fn init(allocator: std.mem.Allocator, options: InitOptions) BitcodeReader { |
| ... | @@ -172,7 +177,7 @@ pub fn next(bc: *BitcodeReader) !?Item { | ... | @@ -172,7 +177,7 @@ pub fn next(bc: *BitcodeReader) !?Item { |
| 172 | 177 | ||
| 173 | pub fn skipBlock(bc: *BitcodeReader, block: Block) !void { | 178 | pub fn skipBlock(bc: *BitcodeReader, block: Block) !void { |
| 174 | assert(bc.bit_offset == 0); | 179 | assert(bc.bit_offset == 0); |
| 175 | try bc.reader.skipBytes(@as(u34, block.len) * 4, .{}); | 180 | try bc.reader.discardAll(4 * @as(u34, block.len)); |
| 176 | try bc.endBlock(); | 181 | try bc.endBlock(); |
| 177 | } | 182 | } |
| 178 | 183 | ||
| ... | @@ -371,19 +376,19 @@ fn align32Bits(bc: *BitcodeReader) void { | ... | @@ -371,19 +376,19 @@ fn align32Bits(bc: *BitcodeReader) void { |
| 371 | 376 | ||
| 372 | fn read32Bits(bc: *BitcodeReader) !u32 { | 377 | fn read32Bits(bc: *BitcodeReader) !u32 { |
| 373 | assert(bc.bit_offset == 0); | 378 | assert(bc.bit_offset == 0); |
| 374 | return bc.reader.readInt(u32, .little); | 379 | return bc.reader.takeInt(u32, .little); |
| 375 | } | 380 | } |
| 376 | 381 | ||
| 377 | fn readBytes(bc: *BitcodeReader, bytes: []u8) !void { | 382 | fn readBytes(bc: *BitcodeReader, bytes: []u8) !void { |
| 378 | assert(bc.bit_offset == 0); | 383 | assert(bc.bit_offset == 0); |
| 379 | try bc.reader.readNoEof(bytes); | 384 | try bc.reader.readSliceAll(bytes); |
| 380 | 385 | ||
| 381 | const trailing_bytes = bytes.len % 4; | 386 | const trailing_bytes = bytes.len % 4; |
| 382 | if (trailing_bytes > 0) { | 387 | if (trailing_bytes > 0) { |
| 383 | var bit_buffer = [1]u8{0} ** 4; | 388 | var bit_buffer: [4]u8 = @splat(0); |
| 384 | try bc.reader.readNoEof(bit_buffer[trailing_bytes..]); | 389 | try bc.reader.readSliceAll(bit_buffer[trailing_bytes..]); |
| 385 | bc.bit_buffer = std.mem.readInt(u32, &bit_buffer, .little); | 390 | bc.bit_buffer = std.mem.readInt(u32, &bit_buffer, .little); |
| 386 | bc.bit_offset = @intCast(trailing_bytes * 8); | 391 | bc.bit_offset = @intCast(8 * trailing_bytes); |
| 387 | } | 392 | } |
| 388 | } | 393 | } |
| 389 | 394 | ||
| ... | @@ -509,7 +514,6 @@ const Abbrev = struct { | ... | @@ -509,7 +514,6 @@ const Abbrev = struct { |
| 509 | }; | 514 | }; |
| 510 | }; | 515 | }; |
| 511 | 516 | ||
| 512 | const assert = std.debug.assert; | 517 | test { |
| 513 | const std = @import("../../std.zig"); | 518 | _ = &skipBlock; |
| 514 | 519 | } | |
| 515 | const BitcodeReader = @This(); |
lib/std/zig/perf_test.zig+6-8| ... | @@ -1,7 +1,6 @@ | ... | @@ -1,7 +1,6 @@ |
| 1 | const std = @import("std"); | 1 | const std = @import("std"); |
| 2 | const mem = std.mem; | 2 | const mem = std.mem; |
| 3 | const Tokenizer = std.zig.Tokenizer; | 3 | const Tokenizer = std.zig.Tokenizer; |
| 4 | const io = std.io; | ||
| 5 | const fmtIntSizeBin = std.fmt.fmtIntSizeBin; | 4 | const fmtIntSizeBin = std.fmt.fmtIntSizeBin; |
| 6 | 5 | ||
| 7 | const source = @embedFile("../os.zig"); | 6 | const source = @embedFile("../os.zig"); |
| ... | @@ -22,16 +21,15 @@ pub fn main() !void { | ... | @@ -22,16 +21,15 @@ pub fn main() !void { |
| 22 | const bytes_per_sec_float = @as(f64, @floatFromInt(source.len * iterations)) / elapsed_s; | 21 | const bytes_per_sec_float = @as(f64, @floatFromInt(source.len * iterations)) / elapsed_s; |
| 23 | const bytes_per_sec = @as(u64, @intFromFloat(@floor(bytes_per_sec_float))); | 22 | const bytes_per_sec = @as(u64, @intFromFloat(@floor(bytes_per_sec_float))); |
| 24 | 23 | ||
| 25 | var stdout_file: std.fs.File = .stdout(); | 24 | var stdout_buffer: [1024]u8 = undefined; |
| 26 | const stdout = stdout_file.deprecatedWriter(); | 25 | var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer); |
| 27 | try stdout.print("parsing speed: {:.2}/s, {:.2} used \n", .{ | 26 | const stdout = &stdout_writer.interface; |
| 28 | fmtIntSizeBin(bytes_per_sec), | 27 | try stdout.print("parsing speed: {Bi:.2}/s, {Bi:.2} used \n", .{ bytes_per_sec, memory_used }); |
| 29 | fmtIntSizeBin(memory_used), | 28 | try stdout.flush(); |
| 30 | }); | ||
| 31 | } | 29 | } |
| 32 | 30 | ||
| 33 | fn testOnce() usize { | 31 | fn testOnce() usize { |
| 34 | var fixed_buf_alloc = std.heap.FixedBufferAllocator.init(fixed_buffer_mem[0..]); | 32 | var fixed_buf_alloc = std.heap.FixedBufferAllocator.init(&fixed_buffer_mem); |
| 35 | const allocator = fixed_buf_alloc.allocator(); | 33 | const allocator = fixed_buf_alloc.allocator(); |
| 36 | _ = std.zig.Ast.parse(allocator, source, .zig) catch @panic("parse failure"); | 34 | _ = std.zig.Ast.parse(allocator, source, .zig) catch @panic("parse failure"); |
| 37 | return fixed_buf_alloc.end_index; | 35 | return fixed_buf_alloc.end_index; |
lib/std/zig/system/linux.zig+17-18| ... | @@ -1,7 +1,6 @@ | ... | @@ -1,7 +1,6 @@ |
| 1 | const std = @import("std"); | 1 | const std = @import("std"); |
| 2 | const builtin = @import("builtin"); | 2 | const builtin = @import("builtin"); |
| 3 | const mem = std.mem; | 3 | const mem = std.mem; |
| 4 | const io = std.io; | ||
| 5 | const fs = std.fs; | 4 | const fs = std.fs; |
| 6 | const fmt = std.fmt; | 5 | const fmt = std.fmt; |
| 7 | const testing = std.testing; | 6 | const testing = std.testing; |
| ... | @@ -344,8 +343,8 @@ fn testParser( | ... | @@ -344,8 +343,8 @@ fn testParser( |
| 344 | expected_model: *const Target.Cpu.Model, | 343 | expected_model: *const Target.Cpu.Model, |
| 345 | input: []const u8, | 344 | input: []const u8, |
| 346 | ) !void { | 345 | ) !void { |
| 347 | var fbs = io.fixedBufferStream(input); | 346 | var r: std.Io.Reader = .fixed(input); |
| 348 | const result = try parser.parse(arch, fbs.reader()); | 347 | const result = try parser.parse(arch, &r); |
| 349 | try testing.expectEqual(expected_model, result.?.model); | 348 | try testing.expectEqual(expected_model, result.?.model); |
| 350 | try testing.expect(expected_model.features.eql(result.?.features)); | 349 | try testing.expect(expected_model.features.eql(result.?.features)); |
| 351 | } | 350 | } |
| ... | @@ -357,20 +356,17 @@ fn testParser( | ... | @@ -357,20 +356,17 @@ fn testParser( |
| 357 | // When all the lines have been analyzed the finalize method is called. | 356 | // When all the lines have been analyzed the finalize method is called. |
| 358 | fn CpuinfoParser(comptime impl: anytype) type { | 357 | fn CpuinfoParser(comptime impl: anytype) type { |
| 359 | return struct { | 358 | return struct { |
| 360 | fn parse(arch: Target.Cpu.Arch, reader: anytype) anyerror!?Target.Cpu { | 359 | fn parse(arch: Target.Cpu.Arch, reader: *std.Io.Reader) !?Target.Cpu { |
| 361 | var line_buf: [1024]u8 = undefined; | ||
| 362 | var obj: impl = .{}; | 360 | var obj: impl = .{}; |
| 363 | 361 | while (reader.takeDelimiterExclusive('\n')) |line| { | |
| 364 | while (true) { | ||
| 365 | const line = (try reader.readUntilDelimiterOrEof(&line_buf, '\n')) orelse break; | ||
| 366 | const colon_pos = mem.indexOfScalar(u8, line, ':') orelse continue; | 362 | const colon_pos = mem.indexOfScalar(u8, line, ':') orelse continue; |
| 367 | const key = mem.trimEnd(u8, line[0..colon_pos], " \t"); | 363 | const key = mem.trimEnd(u8, line[0..colon_pos], " \t"); |
| 368 | const value = mem.trimStart(u8, line[colon_pos + 1 ..], " \t"); | 364 | const value = mem.trimStart(u8, line[colon_pos + 1 ..], " \t"); |
| 369 | 365 | if (!try obj.line_hook(key, value)) break; | |
| 370 | if (!try obj.line_hook(key, value)) | 366 | } else |err| switch (err) { |
| 371 | break; | 367 | error.EndOfStream => {}, |
| 368 | else => |e| return e, | ||
| 372 | } | 369 | } |
| 373 | |||
| 374 | return obj.finalize(arch); | 370 | return obj.finalize(arch); |
| 375 | } | 371 | } |
| 376 | }; | 372 | }; |
| ... | @@ -383,15 +379,18 @@ inline fn getAArch64CpuFeature(comptime feat_reg: []const u8) u64 { | ... | @@ -383,15 +379,18 @@ inline fn getAArch64CpuFeature(comptime feat_reg: []const u8) u64 { |
| 383 | } | 379 | } |
| 384 | 380 | ||
| 385 | pub fn detectNativeCpuAndFeatures() ?Target.Cpu { | 381 | pub fn detectNativeCpuAndFeatures() ?Target.Cpu { |
| 386 | var f = fs.openFileAbsolute("/proc/cpuinfo", .{}) catch |err| switch (err) { | 382 | var file = fs.openFileAbsolute("/proc/cpuinfo", .{}) catch |err| switch (err) { |
| 387 | else => return null, | 383 | else => return null, |
| 388 | }; | 384 | }; |
| 389 | defer f.close(); | 385 | defer file.close(); |
| 386 | |||
| 387 | var buffer: [4096]u8 = undefined; // "flags" lines can get pretty long. | ||
| 388 | var file_reader = file.reader(&buffer); | ||
| 390 | 389 | ||
| 391 | const current_arch = builtin.cpu.arch; | 390 | const current_arch = builtin.cpu.arch; |
| 392 | switch (current_arch) { | 391 | switch (current_arch) { |
| 393 | .arm, .armeb, .thumb, .thumbeb => { | 392 | .arm, .armeb, .thumb, .thumbeb => { |
| 394 | return ArmCpuinfoParser.parse(current_arch, f.deprecatedReader()) catch null; | 393 | return ArmCpuinfoParser.parse(current_arch, &file_reader.interface) catch null; |
| 395 | }, | 394 | }, |
| 396 | .aarch64, .aarch64_be => { | 395 | .aarch64, .aarch64_be => { |
| 397 | const registers = [12]u64{ | 396 | const registers = [12]u64{ |
| ... | @@ -413,13 +412,13 @@ pub fn detectNativeCpuAndFeatures() ?Target.Cpu { | ... | @@ -413,13 +412,13 @@ pub fn detectNativeCpuAndFeatures() ?Target.Cpu { |
| 413 | return core; | 412 | return core; |
| 414 | }, | 413 | }, |
| 415 | .sparc64 => { | 414 | .sparc64 => { |
| 416 | return SparcCpuinfoParser.parse(current_arch, f.deprecatedReader()) catch null; | 415 | return SparcCpuinfoParser.parse(current_arch, &file_reader.interface) catch null; |
| 417 | }, | 416 | }, |
| 418 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => { | 417 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => { |
| 419 | return PowerpcCpuinfoParser.parse(current_arch, f.deprecatedReader()) catch null; | 418 | return PowerpcCpuinfoParser.parse(current_arch, &file_reader.interface) catch null; |
| 420 | }, | 419 | }, |
| 421 | .riscv64, .riscv32 => { | 420 | .riscv64, .riscv32 => { |
| 422 | return RiscvCpuinfoParser.parse(current_arch, f.deprecatedReader()) catch null; | 421 | return RiscvCpuinfoParser.parse(current_arch, &file_reader.interface) catch null; |
| 423 | }, | 422 | }, |
| 424 | else => {}, | 423 | else => {}, |
| 425 | } | 424 | } |
src/Compilation.zig+44-41| ... | @@ -12,6 +12,7 @@ const ThreadPool = std.Thread.Pool; | ... | @@ -12,6 +12,7 @@ const ThreadPool = std.Thread.Pool; |
| 12 | const WaitGroup = std.Thread.WaitGroup; | 12 | const WaitGroup = std.Thread.WaitGroup; |
| 13 | const ErrorBundle = std.zig.ErrorBundle; | 13 | const ErrorBundle = std.zig.ErrorBundle; |
| 14 | const fatal = std.process.fatal; | 14 | const fatal = std.process.fatal; |
| 15 | const Writer = std.io.Writer; | ||
| 15 | 16 | ||
| 16 | const Value = @import("Value.zig"); | 17 | const Value = @import("Value.zig"); |
| 17 | const Type = @import("Type.zig"); | 18 | const Type = @import("Type.zig"); |
| ... | @@ -44,6 +45,8 @@ const Builtin = @import("Builtin.zig"); | ... | @@ -44,6 +45,8 @@ const Builtin = @import("Builtin.zig"); |
| 44 | const LlvmObject = @import("codegen/llvm.zig").Object; | 45 | const LlvmObject = @import("codegen/llvm.zig").Object; |
| 45 | const dev = @import("dev.zig"); | 46 | const dev = @import("dev.zig"); |
| 46 | 47 | ||
| 48 | const DeprecatedLinearFifo = @import("deprecated.zig").LinearFifo; | ||
| 49 | |||
| 47 | pub const Config = @import("Compilation/Config.zig"); | 50 | pub const Config = @import("Compilation/Config.zig"); |
| 48 | 51 | ||
| 49 | /// General-purpose allocator. Used for both temporary and long-term storage. | 52 | /// General-purpose allocator. Used for both temporary and long-term storage. |
| ... | @@ -121,15 +124,15 @@ work_queues: [ | ... | @@ -121,15 +124,15 @@ work_queues: [ |
| 121 | } | 124 | } |
| 122 | break :len len; | 125 | break :len len; |
| 123 | } | 126 | } |
| 124 | ]std.fifo.LinearFifo(Job, .Dynamic), | 127 | ]DeprecatedLinearFifo(Job), |
| 125 | 128 | ||
| 126 | /// These jobs are to invoke the Clang compiler to create an object file, which | 129 | /// These jobs are to invoke the Clang compiler to create an object file, which |
| 127 | /// gets linked with the Compilation. | 130 | /// gets linked with the Compilation. |
| 128 | c_object_work_queue: std.fifo.LinearFifo(*CObject, .Dynamic), | 131 | c_object_work_queue: DeprecatedLinearFifo(*CObject), |
| 129 | 132 | ||
| 130 | /// These jobs are to invoke the RC compiler to create a compiled resource file (.res), which | 133 | /// These jobs are to invoke the RC compiler to create a compiled resource file (.res), which |
| 131 | /// gets linked with the Compilation. | 134 | /// gets linked with the Compilation. |
| 132 | win32_resource_work_queue: if (dev.env.supports(.win32_resource)) std.fifo.LinearFifo(*Win32Resource, .Dynamic) else struct { | 135 | win32_resource_work_queue: if (dev.env.supports(.win32_resource)) DeprecatedLinearFifo(*Win32Resource) else struct { |
| 133 | pub fn ensureUnusedCapacity(_: @This(), _: u0) error{}!void {} | 136 | pub fn ensureUnusedCapacity(_: @This(), _: u0) error{}!void {} |
| 134 | pub fn readItem(_: @This()) ?noreturn { | 137 | pub fn readItem(_: @This()) ?noreturn { |
| 135 | return null; | 138 | return null; |
| ... | @@ -995,13 +998,13 @@ pub const CObject = struct { | ... | @@ -995,13 +998,13 @@ pub const CObject = struct { |
| 995 | 998 | ||
| 996 | const file = fs.cwd().openFile(file_name, .{}) catch break :source_line 0; | 999 | const file = fs.cwd().openFile(file_name, .{}) catch break :source_line 0; |
| 997 | defer file.close(); | 1000 | defer file.close(); |
| 998 | file.seekTo(diag.src_loc.offset + 1 - diag.src_loc.column) catch break :source_line 0; | 1001 | var buffer: [1024]u8 = undefined; |
| 999 | 1002 | var file_reader = file.reader(&buffer); | |
| 1000 | var line = std.ArrayList(u8).init(eb.gpa); | 1003 | file_reader.seekTo(diag.src_loc.offset + 1 - diag.src_loc.column) catch break :source_line 0; |
| 1001 | defer line.deinit(); | 1004 | var aw: Writer.Allocating = .init(eb.gpa); |
| 1002 | file.deprecatedReader().readUntilDelimiterArrayList(&line, '\n', 1 << 10) catch break :source_line 0; | 1005 | defer aw.deinit(); |
| 1003 | 1006 | _ = file_reader.interface.streamDelimiterEnding(&aw.writer, '\n') catch break :source_line 0; | |
| 1004 | break :source_line try eb.addString(line.items); | 1007 | break :source_line try eb.addString(aw.getWritten()); |
| 1005 | }; | 1008 | }; |
| 1006 | 1009 | ||
| 1007 | return .{ | 1010 | return .{ |
| ... | @@ -1067,11 +1070,11 @@ pub const CObject = struct { | ... | @@ -1067,11 +1070,11 @@ pub const CObject = struct { |
| 1067 | } | 1070 | } |
| 1068 | }; | 1071 | }; |
| 1069 | 1072 | ||
| 1073 | var buffer: [1024]u8 = undefined; | ||
| 1070 | const file = try fs.cwd().openFile(path, .{}); | 1074 | const file = try fs.cwd().openFile(path, .{}); |
| 1071 | defer file.close(); | 1075 | defer file.close(); |
| 1072 | var br = std.io.bufferedReader(file.deprecatedReader()); | 1076 | var file_reader = file.reader(&buffer); |
| 1073 | const reader = br.reader(); | 1077 | var bc = std.zig.llvm.BitcodeReader.init(gpa, .{ .reader = &file_reader.interface }); |
| 1074 | var bc = std.zig.llvm.BitcodeReader.init(gpa, .{ .reader = reader.any() }); | ||
| 1075 | defer bc.deinit(); | 1078 | defer bc.deinit(); |
| 1076 | 1079 | ||
| 1077 | var file_names: std.AutoArrayHashMapUnmanaged(u32, []const u8) = .empty; | 1080 | var file_names: std.AutoArrayHashMapUnmanaged(u32, []const u8) = .empty; |
| ... | @@ -1873,15 +1876,12 @@ pub fn create(gpa: Allocator, arena: Allocator, options: CreateOptions) !*Compil | ... | @@ -1873,15 +1876,12 @@ pub fn create(gpa: Allocator, arena: Allocator, options: CreateOptions) !*Compil |
| 1873 | 1876 | ||
| 1874 | if (options.verbose_llvm_cpu_features) { | 1877 | if (options.verbose_llvm_cpu_features) { |
| 1875 | if (options.root_mod.resolved_target.llvm_cpu_features) |cf| print: { | 1878 | if (options.root_mod.resolved_target.llvm_cpu_features) |cf| print: { |
| 1876 | std.debug.lockStdErr(); | 1879 | const stderr_w = std.debug.lockStderrWriter(&.{}); |
| 1877 | defer std.debug.unlockStdErr(); | 1880 | defer std.debug.unlockStderrWriter(); |
| 1878 | const stderr = fs.File.stderr().deprecatedWriter(); | 1881 | stderr_w.print("compilation: {s}\n", .{options.root_name}) catch break :print; |
| 1879 | nosuspend { | 1882 | stderr_w.print(" target: {s}\n", .{try target.zigTriple(arena)}) catch break :print; |
| 1880 | stderr.print("compilation: {s}\n", .{options.root_name}) catch break :print; | 1883 | stderr_w.print(" cpu: {s}\n", .{target.cpu.model.name}) catch break :print; |
| 1881 | stderr.print(" target: {s}\n", .{try target.zigTriple(arena)}) catch break :print; | 1884 | stderr_w.print(" features: {s}\n", .{cf}) catch {}; |
| 1882 | stderr.print(" cpu: {s}\n", .{target.cpu.model.name}) catch break :print; | ||
| 1883 | stderr.print(" features: {s}\n", .{cf}) catch {}; | ||
| 1884 | } | ||
| 1885 | } | 1885 | } |
| 1886 | } | 1886 | } |
| 1887 | 1887 | ||
| ... | @@ -2483,7 +2483,7 @@ pub fn destroy(comp: *Compilation) void { | ... | @@ -2483,7 +2483,7 @@ pub fn destroy(comp: *Compilation) void { |
| 2483 | if (comp.zcu) |zcu| zcu.deinit(); | 2483 | if (comp.zcu) |zcu| zcu.deinit(); |
| 2484 | comp.cache_use.deinit(); | 2484 | comp.cache_use.deinit(); |
| 2485 | 2485 | ||
| 2486 | for (comp.work_queues) |work_queue| work_queue.deinit(); | 2486 | for (&comp.work_queues) |*work_queue| work_queue.deinit(); |
| 2487 | comp.c_object_work_queue.deinit(); | 2487 | comp.c_object_work_queue.deinit(); |
| 2488 | comp.win32_resource_work_queue.deinit(); | 2488 | comp.win32_resource_work_queue.deinit(); |
| 2489 | 2489 | ||
| ... | @@ -3931,11 +3931,12 @@ pub fn getAllErrorsAlloc(comp: *Compilation) !ErrorBundle { | ... | @@ -3931,11 +3931,12 @@ pub fn getAllErrorsAlloc(comp: *Compilation) !ErrorBundle { |
| 3931 | // This AU is referenced and has a transitive compile error, meaning it referenced something with a compile error. | 3931 | // This AU is referenced and has a transitive compile error, meaning it referenced something with a compile error. |
| 3932 | // However, we haven't reported any such error. | 3932 | // However, we haven't reported any such error. |
| 3933 | // This is a compiler bug. | 3933 | // This is a compiler bug. |
| 3934 | const stderr = fs.File.stderr().deprecatedWriter(); | 3934 | var stderr_w = std.debug.lockStderrWriter(&.{}); |
| 3935 | try stderr.writeAll("referenced transitive analysis errors, but none actually emitted\n"); | 3935 | defer std.debug.unlockStderrWriter(); |
| 3936 | try stderr.print("{f} [transitive failure]\n", .{zcu.fmtAnalUnit(failed_unit)}); | 3936 | try stderr_w.writeAll("referenced transitive analysis errors, but none actually emitted\n"); |
| 3937 | try stderr_w.print("{f} [transitive failure]\n", .{zcu.fmtAnalUnit(failed_unit)}); | ||
| 3937 | while (ref) |r| { | 3938 | while (ref) |r| { |
| 3938 | try stderr.print("referenced by: {f}{s}\n", .{ | 3939 | try stderr_w.print("referenced by: {f}{s}\n", .{ |
| 3939 | zcu.fmtAnalUnit(r.referencer), | 3940 | zcu.fmtAnalUnit(r.referencer), |
| 3940 | if (zcu.transitive_failed_analysis.contains(r.referencer)) " [transitive failure]" else "", | 3941 | if (zcu.transitive_failed_analysis.contains(r.referencer)) " [transitive failure]" else "", |
| 3941 | }); | 3942 | }); |
| ... | @@ -5849,7 +5850,9 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: std.Pr | ... | @@ -5849,7 +5850,9 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: std.Pr |
| 5849 | 5850 | ||
| 5850 | try child.spawn(); | 5851 | try child.spawn(); |
| 5851 | 5852 | ||
| 5852 | const stderr = try child.stderr.?.deprecatedReader().readAllAlloc(arena, std.math.maxInt(usize)); | 5853 | var small_buffer: [1]u8 = undefined; |
| 5854 | var stderr_reader = child.stderr.?.reader(&small_buffer); | ||
| 5855 | const stderr = try stderr_reader.interface.allocRemaining(arena, .unlimited); | ||
| 5853 | 5856 | ||
| 5854 | const term = child.wait() catch |err| { | 5857 | const term = child.wait() catch |err| { |
| 5855 | return comp.failCObj(c_object, "failed to spawn zig clang {s}: {s}", .{ argv.items[0], @errorName(err) }); | 5858 | return comp.failCObj(c_object, "failed to spawn zig clang {s}: {s}", .{ argv.items[0], @errorName(err) }); |
| ... | @@ -6213,13 +6216,10 @@ fn spawnZigRc( | ... | @@ -6213,13 +6216,10 @@ fn spawnZigRc( |
| 6213 | const stdout = poller.fifo(.stdout); | 6216 | const stdout = poller.fifo(.stdout); |
| 6214 | 6217 | ||
| 6215 | poll: while (true) { | 6218 | poll: while (true) { |
| 6216 | while (stdout.readableLength() < @sizeOf(std.zig.Server.Message.Header)) { | 6219 | while (stdout.readableLength() < @sizeOf(std.zig.Server.Message.Header)) if (!try poller.poll()) break :poll; |
| 6217 | if (!(try poller.poll())) break :poll; | 6220 | var header: std.zig.Server.Message.Header = undefined; |
| 6218 | } | 6221 | assert(stdout.read(std.mem.asBytes(&header)) == @sizeOf(std.zig.Server.Message.Header)); |
| 6219 | const header = stdout.reader().readStruct(std.zig.Server.Message.Header) catch unreachable; | 6222 | while (stdout.readableLength() < header.bytes_len) if (!try poller.poll()) break :poll; |
| 6220 | while (stdout.readableLength() < header.bytes_len) { | ||
| 6221 | if (!(try poller.poll())) break :poll; | ||
| 6222 | } | ||
| 6223 | const body = stdout.readableSliceOfLen(header.bytes_len); | 6223 | const body = stdout.readableSliceOfLen(header.bytes_len); |
| 6224 | 6224 | ||
| 6225 | switch (header.tag) { | 6225 | switch (header.tag) { |
| ... | @@ -7209,13 +7209,16 @@ pub fn lockAndSetMiscFailure( | ... | @@ -7209,13 +7209,16 @@ pub fn lockAndSetMiscFailure( |
| 7209 | } | 7209 | } |
| 7210 | 7210 | ||
| 7211 | pub fn dump_argv(argv: []const []const u8) void { | 7211 | pub fn dump_argv(argv: []const []const u8) void { |
| 7212 | std.debug.lockStdErr(); | 7212 | var buffer: [64]u8 = undefined; |
| 7213 | defer std.debug.unlockStdErr(); | 7213 | const stderr = std.debug.lockStderrWriter(&buffer); |
| 7214 | const stderr = fs.File.stderr().deprecatedWriter(); | 7214 | defer std.debug.unlockStderrWriter(); |
| 7215 | for (argv[0 .. argv.len - 1]) |arg| { | 7215 | nosuspend { |
| 7216 | nosuspend stderr.print("{s} ", .{arg}) catch return; | 7216 | for (argv) |arg| { |
| 7217 | stderr.writeAll(arg) catch return; | ||
| 7218 | (stderr.writableArray(1) catch return)[0] = ' '; | ||
| 7219 | } | ||
| 7220 | stderr.buffer[stderr.end - 1] = '\n'; | ||
| 7217 | } | 7221 | } |
| 7218 | nosuspend stderr.print("{s}\n", .{argv[argv.len - 1]}) catch {}; | ||
| 7219 | } | 7222 | } |
| 7220 | 7223 | ||
| 7221 | pub fn getZigBackend(comp: Compilation) std.builtin.CompilerBackend { | 7224 | pub fn getZigBackend(comp: Compilation) std.builtin.CompilerBackend { |
src/deprecated.zig-262| ... | @@ -52,15 +52,6 @@ pub fn LinearFifo(comptime T: type) type { | ... | @@ -52,15 +52,6 @@ pub fn LinearFifo(comptime T: type) type { |
| 52 | } | 52 | } |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | /// Reduce allocated capacity to `size`. | ||
| 56 | pub fn shrink(self: *Self, size: usize) void { | ||
| 57 | assert(size >= self.count); | ||
| 58 | self.realign(); | ||
| 59 | self.buf = self.allocator.realloc(self.buf, size) catch |e| switch (e) { | ||
| 60 | error.OutOfMemory => return, // no problem, capacity is still correct then. | ||
| 61 | }; | ||
| 62 | } | ||
| 63 | |||
| 64 | /// Ensure that the buffer can fit at least `size` items | 55 | /// Ensure that the buffer can fit at least `size` items |
| 65 | pub fn ensureTotalCapacity(self: *Self, size: usize) !void { | 56 | pub fn ensureTotalCapacity(self: *Self, size: usize) !void { |
| 66 | if (self.buf.len >= size) return; | 57 | if (self.buf.len >= size) return; |
| ... | @@ -76,11 +67,6 @@ pub fn LinearFifo(comptime T: type) type { | ... | @@ -76,11 +67,6 @@ pub fn LinearFifo(comptime T: type) type { |
| 76 | return try self.ensureTotalCapacity(math.add(usize, self.count, size) catch return error.OutOfMemory); | 67 | return try self.ensureTotalCapacity(math.add(usize, self.count, size) catch return error.OutOfMemory); |
| 77 | } | 68 | } |
| 78 | 69 | ||
| 79 | /// Returns number of items currently in fifo | ||
| 80 | pub fn readableLength(self: Self) usize { | ||
| 81 | return self.count; | ||
| 82 | } | ||
| 83 | |||
| 84 | /// Returns a writable slice from the 'read' end of the fifo | 70 | /// Returns a writable slice from the 'read' end of the fifo |
| 85 | fn readableSliceMut(self: Self, offset: usize) []T { | 71 | fn readableSliceMut(self: Self, offset: usize) []T { |
| 86 | if (offset > self.count) return &[_]T{}; | 72 | if (offset > self.count) return &[_]T{}; |
| ... | @@ -95,22 +81,6 @@ pub fn LinearFifo(comptime T: type) type { | ... | @@ -95,22 +81,6 @@ pub fn LinearFifo(comptime T: type) type { |
| 95 | } | 81 | } |
| 96 | } | 82 | } |
| 97 | 83 | ||
| 98 | /// Returns a readable slice from `offset` | ||
| 99 | pub fn readableSlice(self: Self, offset: usize) []const T { | ||
| 100 | return self.readableSliceMut(offset); | ||
| 101 | } | ||
| 102 | |||
| 103 | pub fn readableSliceOfLen(self: *Self, len: usize) []const T { | ||
| 104 | assert(len <= self.count); | ||
| 105 | const buf = self.readableSlice(0); | ||
| 106 | if (buf.len >= len) { | ||
| 107 | return buf[0..len]; | ||
| 108 | } else { | ||
| 109 | self.realign(); | ||
| 110 | return self.readableSlice(0)[0..len]; | ||
| 111 | } | ||
| 112 | } | ||
| 113 | |||
| 114 | /// Discard first `count` items in the fifo | 84 | /// Discard first `count` items in the fifo |
| 115 | pub fn discard(self: *Self, count: usize) void { | 85 | pub fn discard(self: *Self, count: usize) void { |
| 116 | assert(count <= self.count); | 86 | assert(count <= self.count); |
| ... | @@ -143,28 +113,6 @@ pub fn LinearFifo(comptime T: type) type { | ... | @@ -143,28 +113,6 @@ pub fn LinearFifo(comptime T: type) type { |
| 143 | return c; | 113 | return c; |
| 144 | } | 114 | } |
| 145 | 115 | ||
| 146 | /// Read data from the fifo into `dst`, returns number of items copied. | ||
| 147 | pub fn read(self: *Self, dst: []T) usize { | ||
| 148 | var dst_left = dst; | ||
| 149 | |||
| 150 | while (dst_left.len > 0) { | ||
| 151 | const slice = self.readableSlice(0); | ||
| 152 | if (slice.len == 0) break; | ||
| 153 | const n = @min(slice.len, dst_left.len); | ||
| 154 | @memcpy(dst_left[0..n], slice[0..n]); | ||
| 155 | self.discard(n); | ||
| 156 | dst_left = dst_left[n..]; | ||
| 157 | } | ||
| 158 | |||
| 159 | return dst.len - dst_left.len; | ||
| 160 | } | ||
| 161 | |||
| 162 | /// Same as `read` except it returns an error union | ||
| 163 | /// The purpose of this function existing is to match `std.io.Reader` API. | ||
| 164 | fn readFn(self: *Self, dest: []u8) error{}!usize { | ||
| 165 | return self.read(dest); | ||
| 166 | } | ||
| 167 | |||
| 168 | /// Returns number of items available in fifo | 116 | /// Returns number of items available in fifo |
| 169 | pub fn writableLength(self: Self) usize { | 117 | pub fn writableLength(self: Self) usize { |
| 170 | return self.buf.len - self.count; | 118 | return self.buf.len - self.count; |
| ... | @@ -183,20 +131,6 @@ pub fn LinearFifo(comptime T: type) type { | ... | @@ -183,20 +131,6 @@ pub fn LinearFifo(comptime T: type) type { |
| 183 | } | 131 | } |
| 184 | } | 132 | } |
| 185 | 133 | ||
| 186 | /// Returns a writable buffer of at least `size` items, allocating memory as needed. | ||
| 187 | /// Use `fifo.update` once you've written data to it. | ||
| 188 | pub fn writableWithSize(self: *Self, size: usize) ![]T { | ||
| 189 | try self.ensureUnusedCapacity(size); | ||
| 190 | |||
| 191 | // try to avoid realigning buffer | ||
| 192 | var slice = self.writableSlice(0); | ||
| 193 | if (slice.len < size) { | ||
| 194 | self.realign(); | ||
| 195 | slice = self.writableSlice(0); | ||
| 196 | } | ||
| 197 | return slice; | ||
| 198 | } | ||
| 199 | |||
| 200 | /// Update the tail location of the buffer (usually follows use of writable/writableWithSize) | 134 | /// Update the tail location of the buffer (usually follows use of writable/writableWithSize) |
| 201 | pub fn update(self: *Self, count: usize) void { | 135 | pub fn update(self: *Self, count: usize) void { |
| 202 | assert(self.count + count <= self.buf.len); | 136 | assert(self.count + count <= self.buf.len); |
| ... | @@ -231,201 +165,5 @@ pub fn LinearFifo(comptime T: type) type { | ... | @@ -231,201 +165,5 @@ pub fn LinearFifo(comptime T: type) type { |
| 231 | self.buf[tail] = item; | 165 | self.buf[tail] = item; |
| 232 | self.update(1); | 166 | self.update(1); |
| 233 | } | 167 | } |
| 234 | |||
| 235 | /// Appends the data in `src` to the fifo. | ||
| 236 | /// Allocates more memory as necessary | ||
| 237 | pub fn write(self: *Self, src: []const T) !void { | ||
| 238 | try self.ensureUnusedCapacity(src.len); | ||
| 239 | |||
| 240 | return self.writeAssumeCapacity(src); | ||
| 241 | } | ||
| 242 | |||
| 243 | /// Same as `write` except it returns the number of bytes written, which is always the same | ||
| 244 | /// as `bytes.len`. The purpose of this function existing is to match `std.io.Writer` API. | ||
| 245 | fn appendWrite(self: *Self, bytes: []const u8) error{OutOfMemory}!usize { | ||
| 246 | try self.write(bytes); | ||
| 247 | return bytes.len; | ||
| 248 | } | ||
| 249 | |||
| 250 | /// Make `count` items available before the current read location | ||
| 251 | fn rewind(self: *Self, count: usize) void { | ||
| 252 | assert(self.writableLength() >= count); | ||
| 253 | |||
| 254 | var head = self.head + (self.buf.len - count); | ||
| 255 | head &= self.buf.len - 1; | ||
| 256 | self.head = head; | ||
| 257 | self.count += count; | ||
| 258 | } | ||
| 259 | |||
| 260 | /// Place data back into the read stream | ||
| 261 | pub fn unget(self: *Self, src: []const T) !void { | ||
| 262 | try self.ensureUnusedCapacity(src.len); | ||
| 263 | |||
| 264 | self.rewind(src.len); | ||
| 265 | |||
| 266 | const slice = self.readableSliceMut(0); | ||
| 267 | if (src.len < slice.len) { | ||
| 268 | @memcpy(slice[0..src.len], src); | ||
| 269 | } else { | ||
| 270 | @memcpy(slice, src[0..slice.len]); | ||
| 271 | const slice2 = self.readableSliceMut(slice.len); | ||
| 272 | @memcpy(slice2[0 .. src.len - slice.len], src[slice.len..]); | ||
| 273 | } | ||
| 274 | } | ||
| 275 | |||
| 276 | /// Returns the item at `offset`. | ||
| 277 | /// Asserts offset is within bounds. | ||
| 278 | pub fn peekItem(self: Self, offset: usize) T { | ||
| 279 | assert(offset < self.count); | ||
| 280 | |||
| 281 | var index = self.head + offset; | ||
| 282 | index &= self.buf.len - 1; | ||
| 283 | return self.buf[index]; | ||
| 284 | } | ||
| 285 | |||
| 286 | pub fn toOwnedSlice(self: *Self) Allocator.Error![]T { | ||
| 287 | if (self.head != 0) self.realign(); | ||
| 288 | assert(self.head == 0); | ||
| 289 | assert(self.count <= self.buf.len); | ||
| 290 | const allocator = self.allocator; | ||
| 291 | if (allocator.resize(self.buf, self.count)) { | ||
| 292 | const result = self.buf[0..self.count]; | ||
| 293 | self.* = Self.init(allocator); | ||
| 294 | return result; | ||
| 295 | } | ||
| 296 | const new_memory = try allocator.dupe(T, self.buf[0..self.count]); | ||
| 297 | allocator.free(self.buf); | ||
| 298 | self.* = Self.init(allocator); | ||
| 299 | return new_memory; | ||
| 300 | } | ||
| 301 | }; | 168 | }; |
| 302 | } | 169 | } |
| 303 | |||
| 304 | test "LinearFifo(u8, .Dynamic) discard(0) from empty buffer should not error on overflow" { | ||
| 305 | var fifo = LinearFifo(u8, .Dynamic).init(testing.allocator); | ||
| 306 | defer fifo.deinit(); | ||
| 307 | |||
| 308 | // If overflow is not explicitly allowed this will crash in debug / safe mode | ||
| 309 | fifo.discard(0); | ||
| 310 | } | ||
| 311 | |||
| 312 | test "LinearFifo(u8, .Dynamic)" { | ||
| 313 | var fifo = LinearFifo(u8, .Dynamic).init(testing.allocator); | ||
| 314 | defer fifo.deinit(); | ||
| 315 | |||
| 316 | try fifo.write("HELLO"); | ||
| 317 | try testing.expectEqual(@as(usize, 5), fifo.readableLength()); | ||
| 318 | try testing.expectEqualSlices(u8, "HELLO", fifo.readableSlice(0)); | ||
| 319 | |||
| 320 | { | ||
| 321 | var i: usize = 0; | ||
| 322 | while (i < 5) : (i += 1) { | ||
| 323 | try fifo.write(&[_]u8{fifo.peekItem(i)}); | ||
| 324 | } | ||
| 325 | try testing.expectEqual(@as(usize, 10), fifo.readableLength()); | ||
| 326 | try testing.expectEqualSlices(u8, "HELLOHELLO", fifo.readableSlice(0)); | ||
| 327 | } | ||
| 328 | |||
| 329 | { | ||
| 330 | try testing.expectEqual(@as(u8, 'H'), fifo.readItem().?); | ||
| 331 | try testing.expectEqual(@as(u8, 'E'), fifo.readItem().?); | ||
| 332 | try testing.expectEqual(@as(u8, 'L'), fifo.readItem().?); | ||
| 333 | try testing.expectEqual(@as(u8, 'L'), fifo.readItem().?); | ||
| 334 | try testing.expectEqual(@as(u8, 'O'), fifo.readItem().?); | ||
| 335 | } | ||
| 336 | try testing.expectEqual(@as(usize, 5), fifo.readableLength()); | ||
| 337 | |||
| 338 | { // Writes that wrap around | ||
| 339 | try testing.expectEqual(@as(usize, 11), fifo.writableLength()); | ||
| 340 | try testing.expectEqual(@as(usize, 6), fifo.writableSlice(0).len); | ||
| 341 | fifo.writeAssumeCapacity("6<chars<11"); | ||
| 342 | try testing.expectEqualSlices(u8, "HELLO6<char", fifo.readableSlice(0)); | ||
| 343 | try testing.expectEqualSlices(u8, "s<11", fifo.readableSlice(11)); | ||
| 344 | try testing.expectEqualSlices(u8, "11", fifo.readableSlice(13)); | ||
| 345 | try testing.expectEqualSlices(u8, "", fifo.readableSlice(15)); | ||
| 346 | fifo.discard(11); | ||
| 347 | try testing.expectEqualSlices(u8, "s<11", fifo.readableSlice(0)); | ||
| 348 | fifo.discard(4); | ||
| 349 | try testing.expectEqual(@as(usize, 0), fifo.readableLength()); | ||
| 350 | } | ||
| 351 | |||
| 352 | { | ||
| 353 | const buf = try fifo.writableWithSize(12); | ||
| 354 | try testing.expectEqual(@as(usize, 12), buf.len); | ||
| 355 | var i: u8 = 0; | ||
| 356 | while (i < 10) : (i += 1) { | ||
| 357 | buf[i] = i + 'a'; | ||
| 358 | } | ||
| 359 | fifo.update(10); | ||
| 360 | try testing.expectEqualSlices(u8, "abcdefghij", fifo.readableSlice(0)); | ||
| 361 | } | ||
| 362 | |||
| 363 | { | ||
| 364 | try fifo.unget("prependedstring"); | ||
| 365 | var result: [30]u8 = undefined; | ||
| 366 | try testing.expectEqualSlices(u8, "prependedstringabcdefghij", result[0..fifo.read(&result)]); | ||
| 367 | try fifo.unget("b"); | ||
| 368 | try fifo.unget("a"); | ||
| 369 | try testing.expectEqualSlices(u8, "ab", result[0..fifo.read(&result)]); | ||
| 370 | } | ||
| 371 | |||
| 372 | fifo.shrink(0); | ||
| 373 | |||
| 374 | { | ||
| 375 | try fifo.writer().print("{s}, {s}!", .{ "Hello", "World" }); | ||
| 376 | var result: [30]u8 = undefined; | ||
| 377 | try testing.expectEqualSlices(u8, "Hello, World!", result[0..fifo.read(&result)]); | ||
| 378 | try testing.expectEqual(@as(usize, 0), fifo.readableLength()); | ||
| 379 | } | ||
| 380 | |||
| 381 | { | ||
| 382 | try fifo.writer().writeAll("This is a test"); | ||
| 383 | var result: [30]u8 = undefined; | ||
| 384 | try testing.expectEqualSlices(u8, "This", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?); | ||
| 385 | try testing.expectEqualSlices(u8, "is", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?); | ||
| 386 | try testing.expectEqualSlices(u8, "a", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?); | ||
| 387 | try testing.expectEqualSlices(u8, "test", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?); | ||
| 388 | } | ||
| 389 | |||
| 390 | { | ||
| 391 | try fifo.ensureTotalCapacity(1); | ||
| 392 | var in_fbs = std.io.fixedBufferStream("pump test"); | ||
| 393 | var out_buf: [50]u8 = undefined; | ||
| 394 | var out_fbs = std.io.fixedBufferStream(&out_buf); | ||
| 395 | try fifo.pump(in_fbs.reader(), out_fbs.writer()); | ||
| 396 | try testing.expectEqualSlices(u8, in_fbs.buffer, out_fbs.getWritten()); | ||
| 397 | } | ||
| 398 | } | ||
| 399 | |||
| 400 | test LinearFifo { | ||
| 401 | inline for ([_]type{ u1, u8, u16, u64 }) |T| { | ||
| 402 | const FifoType = LinearFifo(T); | ||
| 403 | var fifo: FifoType = .init(testing.allocator); | ||
| 404 | defer fifo.deinit(); | ||
| 405 | |||
| 406 | try fifo.write(&[_]T{ 0, 1, 1, 0, 1 }); | ||
| 407 | try testing.expectEqual(@as(usize, 5), fifo.readableLength()); | ||
| 408 | |||
| 409 | { | ||
| 410 | try testing.expectEqual(@as(T, 0), fifo.readItem().?); | ||
| 411 | try testing.expectEqual(@as(T, 1), fifo.readItem().?); | ||
| 412 | try testing.expectEqual(@as(T, 1), fifo.readItem().?); | ||
| 413 | try testing.expectEqual(@as(T, 0), fifo.readItem().?); | ||
| 414 | try testing.expectEqual(@as(T, 1), fifo.readItem().?); | ||
| 415 | try testing.expectEqual(@as(usize, 0), fifo.readableLength()); | ||
| 416 | } | ||
| 417 | |||
| 418 | { | ||
| 419 | try fifo.writeItem(1); | ||
| 420 | try fifo.writeItem(1); | ||
| 421 | try fifo.writeItem(1); | ||
| 422 | try testing.expectEqual(@as(usize, 3), fifo.readableLength()); | ||
| 423 | } | ||
| 424 | |||
| 425 | { | ||
| 426 | var readBuf: [3]T = undefined; | ||
| 427 | const n = fifo.read(&readBuf); | ||
| 428 | try testing.expectEqual(@as(usize, 3), n); // NOTE: It should be the number of items. | ||
| 429 | } | ||
| 430 | } | ||
| 431 | } |
src/main.zig+25-21| ... | @@ -65,8 +65,10 @@ pub fn wasi_cwd() std.os.wasi.fd_t { | ... | @@ -65,8 +65,10 @@ pub fn wasi_cwd() std.os.wasi.fd_t { |
| 65 | 65 | ||
| 66 | const fatal = std.process.fatal; | 66 | const fatal = std.process.fatal; |
| 67 | 67 | ||
| 68 | /// This can be global since stdin is a singleton. | ||
| 69 | var stdin_buffer: [4096]u8 = undefined; | ||
| 68 | /// This can be global since stdout is a singleton. | 70 | /// This can be global since stdout is a singleton. |
| 69 | var stdio_buffer: [4096]u8 = undefined; | 71 | var stdout_buffer: [4096]u8 = undefined; |
| 70 | 72 | ||
| 71 | /// Shaming all the locations that inappropriately use an O(N) search algorithm. | 73 | /// Shaming all the locations that inappropriately use an O(N) search algorithm. |
| 72 | /// Please delete this and fix the compilation errors! | 74 | /// Please delete this and fix the compilation errors! |
| ... | @@ -3561,10 +3563,12 @@ fn buildOutputType( | ... | @@ -3561,10 +3563,12 @@ fn buildOutputType( |
| 3561 | switch (listen) { | 3563 | switch (listen) { |
| 3562 | .none => {}, | 3564 | .none => {}, |
| 3563 | .stdio => { | 3565 | .stdio => { |
| 3566 | var stdin_reader = fs.File.stdin().reader(&stdin_buffer); | ||
| 3567 | var stdout_writer = fs.File.stdout().writer(&stdout_buffer); | ||
| 3564 | try serve( | 3568 | try serve( |
| 3565 | comp, | 3569 | comp, |
| 3566 | .stdin(), | 3570 | &stdin_reader.interface, |
| 3567 | .stdout(), | 3571 | &stdout_writer.interface, |
| 3568 | test_exec_args.items, | 3572 | test_exec_args.items, |
| 3569 | self_exe_path, | 3573 | self_exe_path, |
| 3570 | arg_mode, | 3574 | arg_mode, |
| ... | @@ -3584,10 +3588,13 @@ fn buildOutputType( | ... | @@ -3584,10 +3588,13 @@ fn buildOutputType( |
| 3584 | const conn = try server.accept(); | 3588 | const conn = try server.accept(); |
| 3585 | defer conn.stream.close(); | 3589 | defer conn.stream.close(); |
| 3586 | 3590 | ||
| 3591 | var input = conn.stream.reader(&stdin_buffer); | ||
| 3592 | var output = conn.stream.writer(&stdout_buffer); | ||
| 3593 | |||
| 3587 | try serve( | 3594 | try serve( |
| 3588 | comp, | 3595 | comp, |
| 3589 | .{ .handle = conn.stream.handle }, | 3596 | input.interface(), |
| 3590 | .{ .handle = conn.stream.handle }, | 3597 | &output.interface, |
| 3591 | test_exec_args.items, | 3598 | test_exec_args.items, |
| 3592 | self_exe_path, | 3599 | self_exe_path, |
| 3593 | arg_mode, | 3600 | arg_mode, |
| ... | @@ -4053,8 +4060,8 @@ fn saveState(comp: *Compilation, incremental: bool) void { | ... | @@ -4053,8 +4060,8 @@ fn saveState(comp: *Compilation, incremental: bool) void { |
| 4053 | 4060 | ||
| 4054 | fn serve( | 4061 | fn serve( |
| 4055 | comp: *Compilation, | 4062 | comp: *Compilation, |
| 4056 | in: fs.File, | 4063 | in: *std.Io.Reader, |
| 4057 | out: fs.File, | 4064 | out: *std.Io.Writer, |
| 4058 | test_exec_args: []const ?[]const u8, | 4065 | test_exec_args: []const ?[]const u8, |
| 4059 | self_exe_path: ?[]const u8, | 4066 | self_exe_path: ?[]const u8, |
| 4060 | arg_mode: ArgMode, | 4067 | arg_mode: ArgMode, |
| ... | @@ -4064,12 +4071,10 @@ fn serve( | ... | @@ -4064,12 +4071,10 @@ fn serve( |
| 4064 | const gpa = comp.gpa; | 4071 | const gpa = comp.gpa; |
| 4065 | 4072 | ||
| 4066 | var server = try Server.init(.{ | 4073 | var server = try Server.init(.{ |
| 4067 | .gpa = gpa, | ||
| 4068 | .in = in, | 4074 | .in = in, |
| 4069 | .out = out, | 4075 | .out = out, |
| 4070 | .zig_version = build_options.version, | 4076 | .zig_version = build_options.version, |
| 4071 | }); | 4077 | }); |
| 4072 | defer server.deinit(); | ||
| 4073 | 4078 | ||
| 4074 | var child_pid: ?std.process.Child.Id = null; | 4079 | var child_pid: ?std.process.Child.Id = null; |
| 4075 | 4080 | ||
| ... | @@ -5491,10 +5496,10 @@ fn jitCmd( | ... | @@ -5491,10 +5496,10 @@ fn jitCmd( |
| 5491 | defer comp.destroy(); | 5496 | defer comp.destroy(); |
| 5492 | 5497 | ||
| 5493 | if (options.server) { | 5498 | if (options.server) { |
| 5499 | var stdout_writer = fs.File.stdout().writer(&stdout_buffer); | ||
| 5494 | var server: std.zig.Server = .{ | 5500 | var server: std.zig.Server = .{ |
| 5495 | .out = fs.File.stdout(), | 5501 | .out = &stdout_writer.interface, |
| 5496 | .in = undefined, // won't be receiving messages | 5502 | .in = undefined, // won't be receiving messages |
| 5497 | .receive_fifo = undefined, // won't be receiving messages | ||
| 5498 | }; | 5503 | }; |
| 5499 | 5504 | ||
| 5500 | try comp.update(root_prog_node); | 5505 | try comp.update(root_prog_node); |
| ... | @@ -6058,7 +6063,7 @@ fn cmdAstCheck( | ... | @@ -6058,7 +6063,7 @@ fn cmdAstCheck( |
| 6058 | }; | 6063 | }; |
| 6059 | } else fs.File.stdin(); | 6064 | } else fs.File.stdin(); |
| 6060 | defer if (zig_source_path != null) f.close(); | 6065 | defer if (zig_source_path != null) f.close(); |
| 6061 | var file_reader: fs.File.Reader = f.reader(&stdio_buffer); | 6066 | var file_reader: fs.File.Reader = f.reader(&stdin_buffer); |
| 6062 | break :s std.zig.readSourceFileToEndAlloc(arena, &file_reader) catch |err| { | 6067 | break :s std.zig.readSourceFileToEndAlloc(arena, &file_reader) catch |err| { |
| 6063 | fatal("unable to load file '{s}' for ast-check: {s}", .{ display_path, @errorName(err) }); | 6068 | fatal("unable to load file '{s}' for ast-check: {s}", .{ display_path, @errorName(err) }); |
| 6064 | }; | 6069 | }; |
| ... | @@ -6076,7 +6081,7 @@ fn cmdAstCheck( | ... | @@ -6076,7 +6081,7 @@ fn cmdAstCheck( |
| 6076 | 6081 | ||
| 6077 | const tree = try Ast.parse(arena, source, mode); | 6082 | const tree = try Ast.parse(arena, source, mode); |
| 6078 | 6083 | ||
| 6079 | var stdout_writer = fs.File.stdout().writerStreaming(&stdio_buffer); | 6084 | var stdout_writer = fs.File.stdout().writerStreaming(&stdout_buffer); |
| 6080 | const stdout_bw = &stdout_writer.interface; | 6085 | const stdout_bw = &stdout_writer.interface; |
| 6081 | switch (mode) { | 6086 | switch (mode) { |
| 6082 | .zig => { | 6087 | .zig => { |
| ... | @@ -6291,7 +6296,7 @@ fn detectNativeCpuWithLLVM( | ... | @@ -6291,7 +6296,7 @@ fn detectNativeCpuWithLLVM( |
| 6291 | } | 6296 | } |
| 6292 | 6297 | ||
| 6293 | fn printCpu(cpu: std.Target.Cpu) !void { | 6298 | fn printCpu(cpu: std.Target.Cpu) !void { |
| 6294 | var stdout_writer = fs.File.stdout().writerStreaming(&stdio_buffer); | 6299 | var stdout_writer = fs.File.stdout().writerStreaming(&stdout_buffer); |
| 6295 | const stdout_bw = &stdout_writer.interface; | 6300 | const stdout_bw = &stdout_writer.interface; |
| 6296 | 6301 | ||
| 6297 | if (cpu.model.llvm_name) |llvm_name| { | 6302 | if (cpu.model.llvm_name) |llvm_name| { |
| ... | @@ -6340,7 +6345,7 @@ fn cmdDumpLlvmInts( | ... | @@ -6340,7 +6345,7 @@ fn cmdDumpLlvmInts( |
| 6340 | const dl = tm.createTargetDataLayout(); | 6345 | const dl = tm.createTargetDataLayout(); |
| 6341 | const context = llvm.Context.create(); | 6346 | const context = llvm.Context.create(); |
| 6342 | 6347 | ||
| 6343 | var stdout_writer = fs.File.stdout().writerStreaming(&stdio_buffer); | 6348 | var stdout_writer = fs.File.stdout().writerStreaming(&stdout_buffer); |
| 6344 | const stdout_bw = &stdout_writer.interface; | 6349 | const stdout_bw = &stdout_writer.interface; |
| 6345 | for ([_]u16{ 1, 8, 16, 32, 64, 128, 256 }) |bits| { | 6350 | for ([_]u16{ 1, 8, 16, 32, 64, 128, 256 }) |bits| { |
| 6346 | const int_type = context.intType(bits); | 6351 | const int_type = context.intType(bits); |
| ... | @@ -6369,9 +6374,8 @@ fn cmdDumpZir( | ... | @@ -6369,9 +6374,8 @@ fn cmdDumpZir( |
| 6369 | defer f.close(); | 6374 | defer f.close(); |
| 6370 | 6375 | ||
| 6371 | const zir = try Zcu.loadZirCache(arena, f); | 6376 | const zir = try Zcu.loadZirCache(arena, f); |
| 6372 | var stdout_writer = fs.File.stdout().writerStreaming(&stdio_buffer); | 6377 | var stdout_writer = fs.File.stdout().writerStreaming(&stdout_buffer); |
| 6373 | const stdout_bw = &stdout_writer.interface; | 6378 | const stdout_bw = &stdout_writer.interface; |
| 6374 | |||
| 6375 | { | 6379 | { |
| 6376 | const instruction_bytes = zir.instructions.len * | 6380 | const instruction_bytes = zir.instructions.len * |
| 6377 | // Here we don't use @sizeOf(Zir.Inst.Data) because it would include | 6381 | // Here we don't use @sizeOf(Zir.Inst.Data) because it would include |
| ... | @@ -6417,7 +6421,7 @@ fn cmdChangelist( | ... | @@ -6417,7 +6421,7 @@ fn cmdChangelist( |
| 6417 | var f = fs.cwd().openFile(old_source_path, .{}) catch |err| | 6421 | var f = fs.cwd().openFile(old_source_path, .{}) catch |err| |
| 6418 | fatal("unable to open old source file '{s}': {s}", .{ old_source_path, @errorName(err) }); | 6422 | fatal("unable to open old source file '{s}': {s}", .{ old_source_path, @errorName(err) }); |
| 6419 | defer f.close(); | 6423 | defer f.close(); |
| 6420 | var file_reader: fs.File.Reader = f.reader(&stdio_buffer); | 6424 | var file_reader: fs.File.Reader = f.reader(&stdin_buffer); |
| 6421 | break :source std.zig.readSourceFileToEndAlloc(arena, &file_reader) catch |err| | 6425 | break :source std.zig.readSourceFileToEndAlloc(arena, &file_reader) catch |err| |
| 6422 | fatal("unable to read old source file '{s}': {s}", .{ old_source_path, @errorName(err) }); | 6426 | fatal("unable to read old source file '{s}': {s}", .{ old_source_path, @errorName(err) }); |
| 6423 | }; | 6427 | }; |
| ... | @@ -6425,7 +6429,7 @@ fn cmdChangelist( | ... | @@ -6425,7 +6429,7 @@ fn cmdChangelist( |
| 6425 | var f = fs.cwd().openFile(new_source_path, .{}) catch |err| | 6429 | var f = fs.cwd().openFile(new_source_path, .{}) catch |err| |
| 6426 | fatal("unable to open new source file '{s}': {s}", .{ new_source_path, @errorName(err) }); | 6430 | fatal("unable to open new source file '{s}': {s}", .{ new_source_path, @errorName(err) }); |
| 6427 | defer f.close(); | 6431 | defer f.close(); |
| 6428 | var file_reader: fs.File.Reader = f.reader(&stdio_buffer); | 6432 | var file_reader: fs.File.Reader = f.reader(&stdin_buffer); |
| 6429 | break :source std.zig.readSourceFileToEndAlloc(arena, &file_reader) catch |err| | 6433 | break :source std.zig.readSourceFileToEndAlloc(arena, &file_reader) catch |err| |
| 6430 | fatal("unable to read new source file '{s}': {s}", .{ new_source_path, @errorName(err) }); | 6434 | fatal("unable to read new source file '{s}': {s}", .{ new_source_path, @errorName(err) }); |
| 6431 | }; | 6435 | }; |
| ... | @@ -6457,7 +6461,7 @@ fn cmdChangelist( | ... | @@ -6457,7 +6461,7 @@ fn cmdChangelist( |
| 6457 | var inst_map: std.AutoHashMapUnmanaged(Zir.Inst.Index, Zir.Inst.Index) = .empty; | 6461 | var inst_map: std.AutoHashMapUnmanaged(Zir.Inst.Index, Zir.Inst.Index) = .empty; |
| 6458 | try Zcu.mapOldZirToNew(arena, old_zir, new_zir, &inst_map); | 6462 | try Zcu.mapOldZirToNew(arena, old_zir, new_zir, &inst_map); |
| 6459 | 6463 | ||
| 6460 | var stdout_writer = fs.File.stdout().writerStreaming(&stdio_buffer); | 6464 | var stdout_writer = fs.File.stdout().writerStreaming(&stdout_buffer); |
| 6461 | const stdout_bw = &stdout_writer.interface; | 6465 | const stdout_bw = &stdout_writer.interface; |
| 6462 | { | 6466 | { |
| 6463 | try stdout_bw.print("Instruction mappings:\n", .{}); | 6467 | try stdout_bw.print("Instruction mappings:\n", .{}); |
| ... | @@ -6917,7 +6921,7 @@ fn cmdFetch( | ... | @@ -6917,7 +6921,7 @@ fn cmdFetch( |
| 6917 | 6921 | ||
| 6918 | const name = switch (save) { | 6922 | const name = switch (save) { |
| 6919 | .no => { | 6923 | .no => { |
| 6920 | var stdout = fs.File.stdout().writerStreaming(&stdio_buffer); | 6924 | var stdout = fs.File.stdout().writerStreaming(&stdout_buffer); |
| 6921 | try stdout.interface.print("{s}\n", .{package_hash_slice}); | 6925 | try stdout.interface.print("{s}\n", .{package_hash_slice}); |
| 6922 | try stdout.interface.flush(); | 6926 | try stdout.interface.flush(); |
| 6923 | return cleanExit(); | 6927 | return cleanExit(); |