diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e54f8cf6c..7349fa01c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -224,7 +224,7 @@ set(EMBEDDED_SOFTFLOAT_SOURCES add_library(embedded_softfloat STATIC ${EMBEDDED_SOFTFLOAT_SOURCES}) if(MSVC) set_target_properties(embedded_softfloat PROPERTIES - COMPILE_FLAGS "-std=c99 /w" + COMPILE_FLAGS "/w /O2" ) else() set_target_properties(embedded_softfloat PROPERTIES @@ -315,12 +315,17 @@ include_directories( ) # These have to go before the -Wno- flags -set(EXE_CFLAGS "-std=c++14") +if(MSVC) + set(EXE_CFLAGS "/std:c++14") +else(MSVC) + set(EXE_CFLAGS "-std=c++14") +endif(MSVC) + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") if(MSVC) set(EXE_CFLAGS "${EXE_CFLAGS} /w") else() - set(EXE_CFLAGS "${EXE_CFLAGS} -Werror -Wall") + set(EXE_CFLAGS "${EXE_CFLAGS} -Werror -Wall -Werror=implicit-fallthrough") endif() endif() @@ -333,7 +338,11 @@ else() endif() endif() -set(OPTIMIZED_C_FLAGS "-std=c99 -O3") +if(MSVC) + set(OPTIMIZED_C_FLAGS "/O2") +else(MSVC) + set(OPTIMIZED_C_FLAGS "-std=c99 -O3") +endif(MSVC) set(EXE_LDFLAGS " ") if(MSVC) diff --git a/README.md b/README.md index ac9e8208ae..fd8e51da17 100644 --- a/README.md +++ b/README.md @@ -54,8 +54,8 @@ make install ##### MacOS ``` -brew install cmake llvm@10 -brew outdated llvm@10 || brew upgrade llvm@10 +brew install cmake llvm +brew outdated llvm || brew upgrade llvm mkdir build cd build cmake .. -DCMAKE_PREFIX_PATH=$(brew --prefix llvm) diff --git a/ci/azure/linux_script b/ci/azure/linux_script index c34d8d324f..d3a0d40b53 100755 --- a/ci/azure/linux_script +++ b/ci/azure/linux_script @@ -12,7 +12,11 @@ sudo apt-get update -q sudo apt-get remove -y llvm-* sudo rm -rf /usr/local/* -sudo apt-get install -y libxml2-dev libclang-10-dev llvm-10 llvm-10-dev liblld-10-dev cmake s3cmd gcc-7 g++-7 qemu +sudo apt-get install -y libxml2-dev libclang-10-dev llvm-10 llvm-10-dev liblld-10-dev cmake s3cmd gcc-7 g++-7 + +wget https://ziglang.org/deps/qemu-5.0.0-rc1-x86_64-alpinelinux.tar.xz +tar xf qemu-5.0.0-rc1-x86_64-alpinelinux.tar.xz +PATH=$PWD/qemu-5.0.0-rc1/bin:$PATH # Make the `zig version` number consistent. # This will affect the cmake command below. diff --git a/ci/srht/update_download_page b/ci/srht/update_download_page index 1a721bec80..77436a3772 100755 --- a/ci/srht/update_download_page +++ b/ci/srht/update_download_page @@ -71,6 +71,7 @@ export X86_64_FREEBSD_SHASUM="$(echo "$X86_64_FREEBSD_JSON" | jq .shasum -r)" git clone https://github.com/ziglang/www.ziglang.org --depth 1 cd www.ziglang.org export MASTER_DATE="$(date +%Y-%m-%d)" +export MASTER_VERSION="$VERSION" "../$ZIG" run update-download-page.zig $S3CMD put -P --no-mime-magic --add-header="cache-control: public, max-age=31536000, immutable" "../$SRC_TARBALL" s3://ziglang.org/builds/ diff --git a/cmake/Findlld.cmake b/cmake/Findlld.cmake index 4c69d51b24..e27605a54d 100644 --- a/cmake/Findlld.cmake +++ b/cmake/Findlld.cmake @@ -24,6 +24,7 @@ else() string(TOUPPER ${_libname_} _prettylibname_) find_library(LLD_${_prettylibname_}_LIB NAMES ${_libname_} PATHS + ${LLD_LIBDIRS} /usr/lib/llvm-10/lib /usr/local/llvm100/lib /mingw64/lib diff --git a/doc/docgen.zig b/doc/docgen.zig index 32ad0cdc5d..9e4c8173c0 100644 --- a/doc/docgen.zig +++ b/doc/docgen.zig @@ -321,7 +321,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc { var last_action = Action.Open; var last_columns: ?u8 = null; - var toc_buf = try std.Buffer.initSize(allocator, 0); + var toc_buf = std.ArrayList(u8).init(allocator); defer toc_buf.deinit(); var toc = toc_buf.outStream(); @@ -607,7 +607,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc { } fn urlize(allocator: *mem.Allocator, input: []const u8) ![]u8 { - var buf = try std.Buffer.initSize(allocator, 0); + var buf = std.ArrayList(u8).init(allocator); defer buf.deinit(); const out = buf.outStream(); @@ -626,7 +626,7 @@ fn urlize(allocator: *mem.Allocator, input: []const u8) ![]u8 { } fn escapeHtml(allocator: *mem.Allocator, input: []const u8) ![]u8 { - var buf = try std.Buffer.initSize(allocator, 0); + var buf = std.ArrayList(u8).init(allocator); defer buf.deinit(); const out = buf.outStream(); @@ -672,7 +672,7 @@ test "term color" { } fn termColor(allocator: *mem.Allocator, input: []const u8) ![]u8 { - var buf = try std.Buffer.initSize(allocator, 0); + var buf = std.ArrayList(u8).init(allocator); defer buf.deinit(); var out = buf.outStream(); @@ -1048,7 +1048,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var allocator, &[_][]const u8{ tmp_dir_name, name_plus_ext }, ); - try io.writeFile(tmp_source_file_name, trimmed_raw_source); + try fs.cwd().writeFile(tmp_source_file_name, trimmed_raw_source); switch (code.id) { Code.Id.Exe => |expected_outcome| code_block: { @@ -1106,18 +1106,17 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var } } if (expected_outcome == .BuildFail) { - const result = try ChildProcess.exec( - allocator, - build_args.toSliceConst(), - null, - &env_map, - max_doc_file_size, - ); + const result = try ChildProcess.exec(.{ + .allocator = allocator, + .argv = build_args.span(), + .env_map = &env_map, + .max_output_bytes = max_doc_file_size, + }); switch (result.term) { .Exited => |exit_code| { if (exit_code == 0) { warn("{}\nThe following command incorrectly succeeded:\n", .{result.stderr}); - for (build_args.toSliceConst()) |arg| + for (build_args.span()) |arg| warn("{} ", .{arg}) else warn("\n", .{}); @@ -1126,7 +1125,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var }, else => { warn("{}\nThe following command crashed:\n", .{result.stderr}); - for (build_args.toSliceConst()) |arg| + for (build_args.span()) |arg| warn("{} ", .{arg}) else warn("\n", .{}); @@ -1138,7 +1137,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var try out.print("\n{}\n", .{colored_stderr}); break :code_block; } - const exec_result = exec(allocator, &env_map, build_args.toSliceConst()) catch + const exec_result = exec(allocator, &env_map, build_args.span()) catch return parseError(tokenizer, code.source_token, "example failed to compile", .{}); if (code.target_str) |triple| { @@ -1167,7 +1166,12 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var var exited_with_signal = false; const result = if (expected_outcome == ExpectedOutcome.Fail) blk: { - const result = try ChildProcess.exec(allocator, run_args, null, &env_map, max_doc_file_size); + const result = try ChildProcess.exec(.{ + .allocator = allocator, + .argv = run_args, + .env_map = &env_map, + .max_output_bytes = max_doc_file_size, + }); switch (result.term) { .Exited => |exit_code| { if (exit_code == 0) { @@ -1234,7 +1238,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var try test_args.appendSlice(&[_][]const u8{ "-target", triple }); try out.print(" -target {}", .{triple}); } - const result = exec(allocator, &env_map, test_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "test failed", .{}); + const result = exec(allocator, &env_map, test_args.span()) catch return parseError(tokenizer, code.source_token, "test failed", .{}); const escaped_stderr = try escapeHtml(allocator, result.stderr); const escaped_stdout = try escapeHtml(allocator, result.stdout); try out.print("\n{}{}\n", .{ escaped_stderr, escaped_stdout }); @@ -1268,12 +1272,17 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var try out.print(" --release-small", .{}); }, } - const result = try ChildProcess.exec(allocator, test_args.toSliceConst(), null, &env_map, max_doc_file_size); + const result = try ChildProcess.exec(.{ + .allocator = allocator, + .argv = test_args.span(), + .env_map = &env_map, + .max_output_bytes = max_doc_file_size, + }); switch (result.term) { .Exited => |exit_code| { if (exit_code == 0) { warn("{}\nThe following command incorrectly succeeded:\n", .{result.stderr}); - for (test_args.toSliceConst()) |arg| + for (test_args.span()) |arg| warn("{} ", .{arg}) else warn("\n", .{}); @@ -1282,7 +1291,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var }, else => { warn("{}\nThe following command crashed:\n", .{result.stderr}); - for (test_args.toSliceConst()) |arg| + for (test_args.span()) |arg| warn("{} ", .{arg}) else warn("\n", .{}); @@ -1326,12 +1335,17 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var }, } - const result = try ChildProcess.exec(allocator, test_args.toSliceConst(), null, &env_map, max_doc_file_size); + const result = try ChildProcess.exec(.{ + .allocator = allocator, + .argv = test_args.span(), + .env_map = &env_map, + .max_output_bytes = max_doc_file_size, + }); switch (result.term) { .Exited => |exit_code| { if (exit_code == 0) { warn("{}\nThe following command incorrectly succeeded:\n", .{result.stderr}); - for (test_args.toSliceConst()) |arg| + for (test_args.span()) |arg| warn("{} ", .{arg}) else warn("\n", .{}); @@ -1340,7 +1354,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var }, else => { warn("{}\nThe following command crashed:\n", .{result.stderr}); - for (test_args.toSliceConst()) |arg| + for (test_args.span()) |arg| warn("{} ", .{arg}) else warn("\n", .{}); @@ -1418,12 +1432,17 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var } if (maybe_error_match) |error_match| { - const result = try ChildProcess.exec(allocator, build_args.toSliceConst(), null, &env_map, max_doc_file_size); + const result = try ChildProcess.exec(.{ + .allocator = allocator, + .argv = build_args.span(), + .env_map = &env_map, + .max_output_bytes = max_doc_file_size, + }); switch (result.term) { .Exited => |exit_code| { if (exit_code == 0) { warn("{}\nThe following command incorrectly succeeded:\n", .{result.stderr}); - for (build_args.toSliceConst()) |arg| + for (build_args.span()) |arg| warn("{} ", .{arg}) else warn("\n", .{}); @@ -1432,7 +1451,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var }, else => { warn("{}\nThe following command crashed:\n", .{result.stderr}); - for (build_args.toSliceConst()) |arg| + for (build_args.span()) |arg| warn("{} ", .{arg}) else warn("\n", .{}); @@ -1447,7 +1466,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var const colored_stderr = try termColor(allocator, escaped_stderr); try out.print("\n{}", .{colored_stderr}); } else { - _ = exec(allocator, &env_map, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile", .{}); + _ = exec(allocator, &env_map, build_args.span()) catch return parseError(tokenizer, code.source_token, "example failed to compile", .{}); } if (!code.is_inline) { try out.print("\n", .{}); @@ -1484,7 +1503,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var try test_args.appendSlice(&[_][]const u8{ "-target", triple }); try out.print(" -target {}", .{triple}); } - const result = exec(allocator, &env_map, test_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "test failed", .{}); + const result = exec(allocator, &env_map, test_args.span()) catch return parseError(tokenizer, code.source_token, "test failed", .{}); const escaped_stderr = try escapeHtml(allocator, result.stderr); const escaped_stdout = try escapeHtml(allocator, result.stdout); try out.print("\n{}{}\n", .{ escaped_stderr, escaped_stdout }); @@ -1497,7 +1516,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var } fn exec(allocator: *mem.Allocator, env_map: *std.BufMap, args: []const []const u8) !ChildProcess.ExecResult { - const result = try ChildProcess.exec2(.{ + const result = try ChildProcess.exec(.{ .allocator = allocator, .argv = args, .env_map = env_map, diff --git a/doc/langref.html.in b/doc/langref.html.in index f98b9d674f..3d38d67e00 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -4953,7 +4953,7 @@ const mem = std.mem; test "cast *[1][*]const u8 to [*]const ?[*]const u8" { const window_name = [1][*]const u8{"window name"}; const x: [*]const ?[*]const u8 = &window_name; - assert(mem.eql(u8, std.mem.toSliceConst(u8, @ptrCast([*:0]const u8, x[0].?)), "window name")); + assert(mem.eql(u8, std.mem.spanZ(@ptrCast([*:0]const u8, x[0].?)), "window name")); } {#code_end#} {#header_close#} @@ -9310,7 +9310,7 @@ test "string literal to constant slice" {

Sometimes the lifetime of a pointer may be more complicated. For example, when using - {#syntax#}std.ArrayList(T).toSlice(){#endsyntax#}, the returned slice has a lifetime that remains + {#syntax#}std.ArrayList(T).span(){#endsyntax#}, the returned slice has a lifetime that remains valid until the next time the list is resized, such as by appending new elements.

diff --git a/lib/std/array_list.zig b/lib/std/array_list.zig index cbbec0b4f3..523d1c810f 100644 --- a/lib/std/array_list.zig +++ b/lib/std/array_list.zig @@ -189,16 +189,30 @@ pub fn AlignedArrayList(comptime T: type, comptime alignment: ?u29) type { self.len += items.len; } - /// Append a value to the list `n` times. Allocates more memory - /// as necessary. + /// Same as `append` except it returns the number of bytes written, which is always the same + /// as `m.len`. The purpose of this function existing is to match `std.io.OutStream` API. + /// This function may be called only when `T` is `u8`. + fn appendWrite(self: *Self, m: []const u8) !usize { + try self.appendSlice(m); + return m.len; + } + + /// Initializes an OutStream which will append to the list. + /// This function may be called only when `T` is `u8`. + pub fn outStream(self: *Self) std.io.OutStream(*Self, error{OutOfMemory}, appendWrite) { + return .{ .context = self }; + } + + /// Append a value to the list `n` times. + /// Allocates more memory as necessary. pub fn appendNTimes(self: *Self, value: T, n: usize) !void { const old_len = self.len; try self.resize(self.len + n); mem.set(T, self.items[old_len..self.len], value); } - /// Adjust the list's length to `new_len`. Doesn't initialize - /// added items if any. + /// Adjust the list's length to `new_len`. + /// Does not initialize added items if any. pub fn resize(self: *Self, new_len: usize) !void { try self.ensureCapacity(new_len); self.len = new_len; @@ -479,3 +493,14 @@ test "std.ArrayList: ArrayList(T) of struct T" { try root.sub_items.append(Item{ .integer = 42, .sub_items = ArrayList(Item).init(testing.allocator) }); testing.expect(root.sub_items.items[0].integer == 42); } + +test "std.ArrayList(u8) implements outStream" { + var buffer = ArrayList(u8).init(std.testing.allocator); + defer buffer.deinit(); + + const x: i32 = 42; + const y: i32 = 1234; + try buffer.outStream().print("x: {}\ny: {}\n", .{ x, y }); + + testing.expectEqualSlices(u8, "x: 42\ny: 1234\n", buffer.span()); +} diff --git a/lib/std/array_list_sentineled.zig b/lib/std/array_list_sentineled.zig new file mode 100644 index 0000000000..ee262b0322 --- /dev/null +++ b/lib/std/array_list_sentineled.zig @@ -0,0 +1,224 @@ +const std = @import("std.zig"); +const debug = std.debug; +const mem = std.mem; +const Allocator = mem.Allocator; +const assert = debug.assert; +const testing = std.testing; +const ArrayList = std.ArrayList; + +/// A contiguous, growable list of items in memory, with a sentinel after them. +/// The sentinel is maintained when appending, resizing, etc. +/// If you do not need a sentinel, consider using `ArrayList` instead. +pub fn ArrayListSentineled(comptime T: type, comptime sentinel: T) type { + return struct { + list: ArrayList(T), + + const Self = @This(); + + /// Must deinitialize with deinit. + pub fn init(allocator: *Allocator, m: []const T) !Self { + var self = try initSize(allocator, m.len); + mem.copy(T, self.list.items, m); + return self; + } + + /// Initialize memory to size bytes of undefined values. + /// Must deinitialize with deinit. + pub fn initSize(allocator: *Allocator, size: usize) !Self { + var self = initNull(allocator); + try self.resize(size); + return self; + } + + /// Initialize with capacity to hold at least num bytes. + /// Must deinitialize with deinit. + pub fn initCapacity(allocator: *Allocator, num: usize) !Self { + var self = Self{ .list = try ArrayList(T).initCapacity(allocator, num + 1) }; + self.list.appendAssumeCapacity(sentinel); + return self; + } + + /// Must deinitialize with deinit. + /// None of the other operations are valid until you do one of these: + /// * `replaceContents` + /// * `resize` + pub fn initNull(allocator: *Allocator) Self { + return Self{ .list = ArrayList(T).init(allocator) }; + } + + /// Must deinitialize with deinit. + pub fn initFromBuffer(buffer: Self) !Self { + return Self.init(buffer.list.allocator, buffer.span()); + } + + /// Takes ownership of the passed in slice. The slice must have been + /// allocated with `allocator`. + /// Must deinitialize with deinit. + pub fn fromOwnedSlice(allocator: *Allocator, slice: []T) !Self { + var self = Self{ .list = ArrayList(T).fromOwnedSlice(allocator, slice) }; + try self.list.append(sentinel); + return self; + } + + /// The caller owns the returned memory. The list becomes null and is safe to `deinit`. + pub fn toOwnedSlice(self: *Self) [:sentinel]T { + const allocator = self.list.allocator; + const result = self.list.toOwnedSlice(); + self.* = initNull(allocator); + return result[0 .. result.len - 1 :sentinel]; + } + + /// Only works when `T` is `u8`. + pub fn allocPrint(allocator: *Allocator, comptime format: []const u8, args: var) !Self { + const size = std.math.cast(usize, std.fmt.count(format, args)) catch |err| switch (err) { + error.Overflow => return error.OutOfMemory, + }; + var self = try Self.initSize(allocator, size); + assert((std.fmt.bufPrint(self.list.items, format, args) catch unreachable).len == size); + return self; + } + + pub fn deinit(self: *Self) void { + self.list.deinit(); + } + + pub fn span(self: var) @TypeOf(self.list.items[0 .. self.list.len - 1 :sentinel]) { + return self.list.span()[0..self.len() :sentinel]; + } + + pub fn shrink(self: *Self, new_len: usize) void { + assert(new_len <= self.len()); + self.list.shrink(new_len + 1); + self.list.items[self.len()] = sentinel; + } + + pub fn resize(self: *Self, new_len: usize) !void { + try self.list.resize(new_len + 1); + self.list.items[self.len()] = sentinel; + } + + pub fn isNull(self: Self) bool { + return self.list.len == 0; + } + + pub fn len(self: Self) usize { + return self.list.len - 1; + } + + pub fn capacity(self: Self) usize { + return if (self.list.items.len > 0) + self.list.items.len - 1 + else + 0; + } + + pub fn appendSlice(self: *Self, m: []const T) !void { + const old_len = self.len(); + try self.resize(old_len + m.len); + mem.copy(T, self.list.span()[old_len..], m); + } + + pub fn append(self: *Self, byte: T) !void { + const old_len = self.len(); + try self.resize(old_len + 1); + self.list.span()[old_len] = byte; + } + + pub fn eql(self: Self, m: []const T) bool { + return mem.eql(T, self.span(), m); + } + + pub fn startsWith(self: Self, m: []const T) bool { + if (self.len() < m.len) return false; + return mem.eql(T, self.list.items[0..m.len], m); + } + + pub fn endsWith(self: Self, m: []const T) bool { + const l = self.len(); + if (l < m.len) return false; + const start = l - m.len; + return mem.eql(T, self.list.items[start..l], m); + } + + pub fn replaceContents(self: *Self, m: []const T) !void { + try self.resize(m.len); + mem.copy(T, self.list.span(), m); + } + + /// Initializes an OutStream which will append to the list. + /// This function may be called only when `T` is `u8`. + pub fn outStream(self: *Self) std.io.OutStream(*Self, error{OutOfMemory}, appendWrite) { + return .{ .context = self }; + } + + /// Same as `append` except it returns the number of bytes written, which is always the same + /// as `m.len`. The purpose of this function existing is to match `std.io.OutStream` API. + /// This function may be called only when `T` is `u8`. + pub fn appendWrite(self: *Self, m: []const u8) !usize { + try self.appendSlice(m); + return m.len; + } + }; +} + +test "simple" { + var buf = try ArrayListSentineled(u8, 0).init(testing.allocator, ""); + defer buf.deinit(); + + testing.expect(buf.len() == 0); + try buf.appendSlice("hello"); + try buf.appendSlice(" "); + try buf.appendSlice("world"); + testing.expect(buf.eql("hello world")); + testing.expect(mem.eql(u8, mem.spanZ(buf.span().ptr), buf.span())); + + var buf2 = try ArrayListSentineled(u8, 0).initFromBuffer(buf); + defer buf2.deinit(); + testing.expect(buf.eql(buf2.span())); + + testing.expect(buf.startsWith("hell")); + testing.expect(buf.endsWith("orld")); + + try buf2.resize(4); + testing.expect(buf.startsWith(buf2.span())); +} + +test "initSize" { + var buf = try ArrayListSentineled(u8, 0).initSize(testing.allocator, 3); + defer buf.deinit(); + testing.expect(buf.len() == 3); + try buf.appendSlice("hello"); + testing.expect(mem.eql(u8, buf.span()[3..], "hello")); +} + +test "initCapacity" { + var buf = try ArrayListSentineled(u8, 0).initCapacity(testing.allocator, 10); + defer buf.deinit(); + testing.expect(buf.len() == 0); + testing.expect(buf.capacity() >= 10); + const old_cap = buf.capacity(); + try buf.appendSlice("hello"); + testing.expect(buf.len() == 5); + testing.expect(buf.capacity() == old_cap); + testing.expect(mem.eql(u8, buf.span(), "hello")); +} + +test "print" { + var buf = try ArrayListSentineled(u8, 0).init(testing.allocator, ""); + defer buf.deinit(); + + try buf.outStream().print("Hello {} the {}", .{ 2, "world" }); + testing.expect(buf.eql("Hello 2 the world")); +} + +test "outStream" { + var buffer = try ArrayListSentineled(u8, 0).initSize(testing.allocator, 0); + defer buffer.deinit(); + const buf_stream = buffer.outStream(); + + const x: i32 = 42; + const y: i32 = 1234; + try buf_stream.print("x: {}\ny: {}\n", .{ x, y }); + + testing.expect(mem.eql(u8, buffer.span(), "x: 42\ny: 1234\n")); +} diff --git a/lib/std/atomic/queue.zig b/lib/std/atomic/queue.zig index 52e200e7a2..be0894d5cf 100644 --- a/lib/std/atomic/queue.zig +++ b/lib/std/atomic/queue.zig @@ -227,7 +227,7 @@ fn startPuts(ctx: *Context) u8 { var r = std.rand.DefaultPrng.init(0xdeadbeef); while (put_count != 0) : (put_count -= 1) { std.time.sleep(1); // let the os scheduler be our fuzz - const x = @bitCast(i32, r.random.scalar(u32)); + const x = @bitCast(i32, r.random.int(u32)); const node = ctx.allocator.create(Queue(i32).Node) catch unreachable; node.* = .{ .prev = undefined, diff --git a/lib/std/atomic/stack.zig b/lib/std/atomic/stack.zig index 092dce15b0..db749ecaac 100644 --- a/lib/std/atomic/stack.zig +++ b/lib/std/atomic/stack.zig @@ -150,7 +150,7 @@ fn startPuts(ctx: *Context) u8 { var r = std.rand.DefaultPrng.init(0xdeadbeef); while (put_count != 0) : (put_count -= 1) { std.time.sleep(1); // let the os scheduler be our fuzz - const x = @bitCast(i32, r.random.scalar(u32)); + const x = @bitCast(i32, r.random.int(u32)); const node = ctx.allocator.create(Stack(i32).Node) catch unreachable; node.* = Stack(i32).Node{ .next = undefined, diff --git a/lib/std/buffer.zig b/lib/std/buffer.zig deleted file mode 100644 index a1e29ef51a..0000000000 --- a/lib/std/buffer.zig +++ /dev/null @@ -1,225 +0,0 @@ -const std = @import("std.zig"); -const debug = std.debug; -const mem = std.mem; -const Allocator = mem.Allocator; -const assert = debug.assert; -const testing = std.testing; -const ArrayList = std.ArrayList; - -/// A buffer that allocates memory and maintains a null byte at the end. -pub const Buffer = struct { - list: ArrayList(u8), - - /// Must deinitialize with deinit. - pub fn init(allocator: *Allocator, m: []const u8) !Buffer { - var self = try initSize(allocator, m.len); - mem.copy(u8, self.list.items, m); - return self; - } - - /// Initialize memory to size bytes of undefined values. - /// Must deinitialize with deinit. - pub fn initSize(allocator: *Allocator, size: usize) !Buffer { - var self = initNull(allocator); - try self.resize(size); - return self; - } - - /// Initialize with capacity to hold at least num bytes. - /// Must deinitialize with deinit. - pub fn initCapacity(allocator: *Allocator, num: usize) !Buffer { - var self = Buffer{ .list = try ArrayList(u8).initCapacity(allocator, num + 1) }; - self.list.appendAssumeCapacity(0); - return self; - } - - /// Must deinitialize with deinit. - /// None of the other operations are valid until you do one of these: - /// * ::replaceContents - /// * ::resize - pub fn initNull(allocator: *Allocator) Buffer { - return Buffer{ .list = ArrayList(u8).init(allocator) }; - } - - /// Must deinitialize with deinit. - pub fn initFromBuffer(buffer: Buffer) !Buffer { - return Buffer.init(buffer.list.allocator, buffer.toSliceConst()); - } - - /// Buffer takes ownership of the passed in slice. The slice must have been - /// allocated with `allocator`. - /// Must deinitialize with deinit. - pub fn fromOwnedSlice(allocator: *Allocator, slice: []u8) !Buffer { - var self = Buffer{ .list = ArrayList(u8).fromOwnedSlice(allocator, slice) }; - try self.list.append(0); - return self; - } - - /// The caller owns the returned memory. The Buffer becomes null and - /// is safe to `deinit`. - pub fn toOwnedSlice(self: *Buffer) [:0]u8 { - const allocator = self.list.allocator; - const result = self.list.toOwnedSlice(); - self.* = initNull(allocator); - return result[0 .. result.len - 1 :0]; - } - - pub fn allocPrint(allocator: *Allocator, comptime format: []const u8, args: var) !Buffer { - const size = std.math.cast(usize, std.fmt.count(format, args)) catch |err| switch (err) { - error.Overflow => return error.OutOfMemory, - }; - var self = try Buffer.initSize(allocator, size); - assert((std.fmt.bufPrint(self.list.items, format, args) catch unreachable).len == size); - return self; - } - - pub fn deinit(self: *Buffer) void { - self.list.deinit(); - } - - pub fn span(self: var) @TypeOf(self.list.items[0 .. self.list.len - 1 :0]) { - return self.list.span()[0..self.len() :0]; - } - - /// Deprecated: use `span` - pub fn toSlice(self: Buffer) [:0]u8 { - return self.span(); - } - - /// Deprecated: use `span` - pub fn toSliceConst(self: Buffer) [:0]const u8 { - return self.span(); - } - - pub fn shrink(self: *Buffer, new_len: usize) void { - assert(new_len <= self.len()); - self.list.shrink(new_len + 1); - self.list.items[self.len()] = 0; - } - - pub fn resize(self: *Buffer, new_len: usize) !void { - try self.list.resize(new_len + 1); - self.list.items[self.len()] = 0; - } - - pub fn isNull(self: Buffer) bool { - return self.list.len == 0; - } - - pub fn len(self: Buffer) usize { - return self.list.len - 1; - } - - pub fn capacity(self: Buffer) usize { - return if (self.list.items.len > 0) - self.list.items.len - 1 - else - 0; - } - - pub fn append(self: *Buffer, m: []const u8) !void { - const old_len = self.len(); - try self.resize(old_len + m.len); - mem.copy(u8, self.list.toSlice()[old_len..], m); - } - - pub fn appendByte(self: *Buffer, byte: u8) !void { - const old_len = self.len(); - try self.resize(old_len + 1); - self.list.toSlice()[old_len] = byte; - } - - pub fn eql(self: Buffer, m: []const u8) bool { - return mem.eql(u8, self.toSliceConst(), m); - } - - pub fn startsWith(self: Buffer, m: []const u8) bool { - if (self.len() < m.len) return false; - return mem.eql(u8, self.list.items[0..m.len], m); - } - - pub fn endsWith(self: Buffer, m: []const u8) bool { - const l = self.len(); - if (l < m.len) return false; - const start = l - m.len; - return mem.eql(u8, self.list.items[start..l], m); - } - - pub fn replaceContents(self: *Buffer, m: []const u8) !void { - try self.resize(m.len); - mem.copy(u8, self.list.toSlice(), m); - } - - pub fn outStream(self: *Buffer) std.io.OutStream(*Buffer, error{OutOfMemory}, appendWrite) { - return .{ .context = self }; - } - - /// Same as `append` except it returns the number of bytes written, which is always the same - /// as `m.len`. The purpose of this function existing is to match `std.io.OutStream` API. - pub fn appendWrite(self: *Buffer, m: []const u8) !usize { - try self.append(m); - return m.len; - } -}; - -test "simple Buffer" { - var buf = try Buffer.init(testing.allocator, ""); - defer buf.deinit(); - - testing.expect(buf.len() == 0); - try buf.append("hello"); - try buf.append(" "); - try buf.append("world"); - testing.expect(buf.eql("hello world")); - testing.expect(mem.eql(u8, mem.toSliceConst(u8, buf.toSliceConst().ptr), buf.toSliceConst())); - - var buf2 = try Buffer.initFromBuffer(buf); - defer buf2.deinit(); - testing.expect(buf.eql(buf2.toSliceConst())); - - testing.expect(buf.startsWith("hell")); - testing.expect(buf.endsWith("orld")); - - try buf2.resize(4); - testing.expect(buf.startsWith(buf2.toSlice())); -} - -test "Buffer.initSize" { - var buf = try Buffer.initSize(testing.allocator, 3); - defer buf.deinit(); - testing.expect(buf.len() == 3); - try buf.append("hello"); - testing.expect(mem.eql(u8, buf.toSliceConst()[3..], "hello")); -} - -test "Buffer.initCapacity" { - var buf = try Buffer.initCapacity(testing.allocator, 10); - defer buf.deinit(); - testing.expect(buf.len() == 0); - testing.expect(buf.capacity() >= 10); - const old_cap = buf.capacity(); - try buf.append("hello"); - testing.expect(buf.len() == 5); - testing.expect(buf.capacity() == old_cap); - testing.expect(mem.eql(u8, buf.toSliceConst(), "hello")); -} - -test "Buffer.print" { - var buf = try Buffer.init(testing.allocator, ""); - defer buf.deinit(); - - try buf.outStream().print("Hello {} the {}", .{ 2, "world" }); - testing.expect(buf.eql("Hello 2 the world")); -} - -test "Buffer.outStream" { - var buffer = try Buffer.initSize(testing.allocator, 0); - defer buffer.deinit(); - const buf_stream = buffer.outStream(); - - const x: i32 = 42; - const y: i32 = 1234; - try buf_stream.print("x: {}\ny: {}\n", .{ x, y }); - - testing.expect(mem.eql(u8, buffer.toSlice(), "x: 42\ny: 1234\n")); -} diff --git a/lib/std/build.zig b/lib/std/build.zig index c603fd861b..ccd0ebaf8a 100644 --- a/lib/std/build.zig +++ b/lib/std/build.zig @@ -355,7 +355,7 @@ pub const Builder = struct { } } - for (wanted_steps.toSliceConst()) |s| { + for (wanted_steps.span()) |s| { try self.makeOneStep(s); } } @@ -372,7 +372,7 @@ pub const Builder = struct { const uninstall_tls = @fieldParentPtr(TopLevelStep, "step", uninstall_step); const self = @fieldParentPtr(Builder, "uninstall_tls", uninstall_tls); - for (self.installed_files.toSliceConst()) |installed_file| { + for (self.installed_files.span()) |installed_file| { const full_path = self.getInstallPath(installed_file.dir, installed_file.path); if (self.verbose) { warn("rm {}\n", .{full_path}); @@ -390,7 +390,7 @@ pub const Builder = struct { } s.loop_flag = true; - for (s.dependencies.toSlice()) |dep| { + for (s.dependencies.span()) |dep| { self.makeOneStep(dep) catch |err| { if (err == error.DependencyLoopDetected) { warn(" {}\n", .{s.name}); @@ -405,7 +405,7 @@ pub const Builder = struct { } fn getTopLevelStepByName(self: *Builder, name: []const u8) !*Step { - for (self.top_level_steps.toSliceConst()) |top_level_step| { + for (self.top_level_steps.span()) |top_level_step| { if (mem.eql(u8, top_level_step.step.name, name)) { return &top_level_step.step; } @@ -470,7 +470,7 @@ pub const Builder = struct { return null; }, UserValue.Scalar => |s| return &[_][]const u8{s}, - UserValue.List => |lst| return lst.toSliceConst(), + UserValue.List => |lst| return lst.span(), }, } } @@ -866,7 +866,7 @@ pub const Builder = struct { pub fn findProgram(self: *Builder, names: []const []const u8, paths: []const []const u8) ![]const u8 { // TODO report error for ambiguous situations const exe_extension = @as(CrossTarget, .{}).exeFileExt(); - for (self.search_prefixes.toSliceConst()) |search_prefix| { + for (self.search_prefixes.span()) |search_prefix| { for (names) |name| { if (fs.path.isAbsolute(name)) { return name; @@ -1010,7 +1010,7 @@ pub const Builder = struct { .desc = tok_it.rest(), }); } - return list.toSliceConst(); + return list.span(); } fn getPkgConfigList(self: *Builder) ![]const PkgConfigPkg { @@ -1139,7 +1139,7 @@ pub const LibExeObjStep = struct { out_lib_filename: []const u8, out_pdb_filename: []const u8, packages: ArrayList(Pkg), - build_options_contents: std.Buffer, + build_options_contents: std.ArrayList(u8), system_linker_hack: bool = false, object_src: []const u8, @@ -1274,7 +1274,7 @@ pub const LibExeObjStep = struct { .lib_paths = ArrayList([]const u8).init(builder.allocator), .framework_dirs = ArrayList([]const u8).init(builder.allocator), .object_src = undefined, - .build_options_contents = std.Buffer.initSize(builder.allocator, 0) catch unreachable, + .build_options_contents = std.ArrayList(u8).init(builder.allocator), .c_std = Builder.CStd.C99, .override_lib_dir = null, .main_pkg_path = null, @@ -1395,7 +1395,7 @@ pub const LibExeObjStep = struct { if (isLibCLibrary(name)) { return self.is_linking_libc; } - for (self.link_objects.toSliceConst()) |link_object| { + for (self.link_objects.span()) |link_object| { switch (link_object) { LinkObject.SystemLib => |n| if (mem.eql(u8, n, name)) return true, else => continue, @@ -1599,10 +1599,7 @@ pub const LibExeObjStep = struct { self.main_pkg_path = dir_path; } - /// Deprecated; just set the field directly. - pub fn setDisableGenH(self: *LibExeObjStep, is_disabled: bool) void { - self.emit_h = !is_disabled; - } + pub const setDisableGenH = @compileError("deprecated; set the emit_h field directly"); pub fn setLibCFile(self: *LibExeObjStep, libc_file: ?[]const u8) void { self.libc_file = libc_file; @@ -1762,7 +1759,7 @@ pub const LibExeObjStep = struct { self.include_dirs.append(IncludeDir{ .OtherStep = other }) catch unreachable; // Inherit dependency on system libraries - for (other.link_objects.toSliceConst()) |link_object| { + for (other.link_objects.span()) |link_object| { switch (link_object) { .SystemLib => |name| self.linkSystemLibrary(name), else => continue, @@ -1802,7 +1799,7 @@ pub const LibExeObjStep = struct { if (self.root_src) |root_src| try zig_args.append(root_src.getPath(builder)); - for (self.link_objects.toSlice()) |link_object| { + for (self.link_objects.span()) |link_object| { switch (link_object) { .StaticPath => |static_path| { try zig_args.append("--object"); @@ -1850,12 +1847,12 @@ pub const LibExeObjStep = struct { } } - if (self.build_options_contents.len() > 0) { + if (self.build_options_contents.len > 0) { const build_options_file = try fs.path.join( builder.allocator, &[_][]const u8{ builder.cache_root, builder.fmt("{}_build_options.zig", .{self.name}) }, ); - try std.io.writeFile(build_options_file, self.build_options_contents.toSliceConst()); + try fs.cwd().writeFile(build_options_file, self.build_options_contents.span()); try zig_args.append("--pkg-begin"); try zig_args.append("build_options"); try zig_args.append(builder.pathFromRoot(build_options_file)); @@ -1963,22 +1960,22 @@ pub const LibExeObjStep = struct { try zig_args.append(cross.cpu.model.name); } } else { - var mcpu_buffer = try std.Buffer.init(builder.allocator, "-mcpu="); - try mcpu_buffer.append(cross.cpu.model.name); + var mcpu_buffer = std.ArrayList(u8).init(builder.allocator); + + try mcpu_buffer.outStream().print("-mcpu={}", .{cross.cpu.model.name}); for (all_features) |feature, i_usize| { const i = @intCast(std.Target.Cpu.Feature.Set.Index, i_usize); const in_cpu_set = populated_cpu_features.isEnabled(i); const in_actual_set = cross.cpu.features.isEnabled(i); if (in_cpu_set and !in_actual_set) { - try mcpu_buffer.appendByte('-'); - try mcpu_buffer.append(feature.name); + try mcpu_buffer.outStream().print("-{}", .{feature.name}); } else if (!in_cpu_set and in_actual_set) { - try mcpu_buffer.appendByte('+'); - try mcpu_buffer.append(feature.name); + try mcpu_buffer.outStream().print("+{}", .{feature.name}); } } - try zig_args.append(mcpu_buffer.toSliceConst()); + + try zig_args.append(mcpu_buffer.toOwnedSlice()); } if (self.target.dynamic_linker.get()) |dynamic_linker| { @@ -2040,7 +2037,7 @@ pub const LibExeObjStep = struct { try zig_args.append("--test-cmd-bin"); }, } - for (self.packages.toSliceConst()) |pkg| { + for (self.packages.span()) |pkg| { try zig_args.append("--pkg-begin"); try zig_args.append(pkg.name); try zig_args.append(builder.pathFromRoot(pkg.path)); @@ -2057,7 +2054,7 @@ pub const LibExeObjStep = struct { try zig_args.append("--pkg-end"); } - for (self.include_dirs.toSliceConst()) |include_dir| { + for (self.include_dirs.span()) |include_dir| { switch (include_dir) { .RawPath => |include_path| { try zig_args.append("-I"); @@ -2075,18 +2072,18 @@ pub const LibExeObjStep = struct { } } - for (self.lib_paths.toSliceConst()) |lib_path| { + for (self.lib_paths.span()) |lib_path| { try zig_args.append("-L"); try zig_args.append(lib_path); } - for (self.c_macros.toSliceConst()) |c_macro| { + for (self.c_macros.span()) |c_macro| { try zig_args.append("-D"); try zig_args.append(c_macro); } if (self.target.isDarwin()) { - for (self.framework_dirs.toSliceConst()) |dir| { + for (self.framework_dirs.span()) |dir| { try zig_args.append("-F"); try zig_args.append(dir); } @@ -2146,12 +2143,12 @@ pub const LibExeObjStep = struct { } if (self.kind == Kind.Test) { - try builder.spawnChild(zig_args.toSliceConst()); + try builder.spawnChild(zig_args.span()); } else { try zig_args.append("--cache"); try zig_args.append("on"); - const output_dir_nl = try builder.execFromStep(zig_args.toSliceConst(), &self.step); + const output_dir_nl = try builder.execFromStep(zig_args.span(), &self.step); const build_output_dir = mem.trimRight(u8, output_dir_nl, "\r\n"); if (self.output_dir) |output_dir| { diff --git a/lib/std/build/emit_raw.zig b/lib/std/build/emit_raw.zig index 8b4747e8a7..367da2f747 100644 --- a/lib/std/build/emit_raw.zig +++ b/lib/std/build/emit_raw.zig @@ -72,7 +72,7 @@ const BinaryElfOutput = struct { newSegment.binaryOffset = 0; newSegment.firstSection = null; - for (self.sections.toSlice()) |section| { + for (self.sections.span()) |section| { if (sectionWithinSegment(section, phdr)) { if (section.segment) |sectionSegment| { if (sectionSegment.elfOffset > newSegment.elfOffset) { @@ -92,7 +92,7 @@ const BinaryElfOutput = struct { } } - sort.sort(*BinaryElfSegment, self.segments.toSlice(), segmentSortCompare); + sort.sort(*BinaryElfSegment, self.segments.span(), segmentSortCompare); if (self.segments.len > 0) { const firstSegment = self.segments.at(0); @@ -105,19 +105,19 @@ const BinaryElfOutput = struct { const basePhysicalAddress = firstSegment.physicalAddress; - for (self.segments.toSlice()) |segment| { + for (self.segments.span()) |segment| { segment.binaryOffset = segment.physicalAddress - basePhysicalAddress; } } } - for (self.sections.toSlice()) |section| { + for (self.sections.span()) |section| { if (section.segment) |segment| { section.binaryOffset = segment.binaryOffset + (section.elfOffset - segment.elfOffset); } } - sort.sort(*BinaryElfSection, self.sections.toSlice(), sectionSortCompare); + sort.sort(*BinaryElfSection, self.sections.span(), sectionSortCompare); return self; } @@ -165,7 +165,7 @@ fn emitRaw(allocator: *Allocator, elf_path: []const u8, raw_path: []const u8) !v var binary_elf_output = try BinaryElfOutput.parse(allocator, elf_file); defer binary_elf_output.deinit(); - for (binary_elf_output.sections.toSlice()) |section| { + for (binary_elf_output.sections.span()) |section| { try writeBinaryElfSection(elf_file, out_file, section); } } diff --git a/lib/std/build/run.zig b/lib/std/build/run.zig index 3276de9d19..3a2dc2a2a3 100644 --- a/lib/std/build/run.zig +++ b/lib/std/build/run.zig @@ -139,7 +139,7 @@ pub const RunStep = struct { const cwd = if (self.cwd) |cwd| self.builder.pathFromRoot(cwd) else self.builder.build_root; var argv_list = ArrayList([]const u8).init(self.builder.allocator); - for (self.argv.toSlice()) |arg| { + for (self.argv.span()) |arg| { switch (arg) { Arg.Bytes => |bytes| try argv_list.append(bytes), Arg.Artifact => |artifact| { @@ -153,7 +153,7 @@ pub const RunStep = struct { } } - const argv = argv_list.toSliceConst(); + const argv = argv_list.span(); const child = std.ChildProcess.init(argv, self.builder.allocator) catch unreachable; defer child.deinit(); @@ -289,7 +289,7 @@ pub const RunStep = struct { } fn addPathForDynLibs(self: *RunStep, artifact: *LibExeObjStep) void { - for (artifact.link_objects.toSliceConst()) |link_object| { + for (artifact.link_objects.span()) |link_object| { switch (link_object) { .OtherStep => |other| { if (other.target.isWindows() and other.isDynamicLibrary()) { diff --git a/lib/std/build/translate_c.zig b/lib/std/build/translate_c.zig index e9e61b190f..73e395d951 100644 --- a/lib/std/build/translate_c.zig +++ b/lib/std/build/translate_c.zig @@ -71,7 +71,7 @@ pub const TranslateCStep = struct { try argv_list.append(self.source.getPath(self.builder)); - const output_path_nl = try self.builder.execFromStep(argv_list.toSliceConst(), &self.step); + const output_path_nl = try self.builder.execFromStep(argv_list.span(), &self.step); const output_path = mem.trimRight(u8, output_path_nl, "\r\n"); self.out_basename = fs.path.basename(output_path); diff --git a/lib/std/build/write_file.zig b/lib/std/build/write_file.zig index 0c3f628457..7389923dc3 100644 --- a/lib/std/build/write_file.zig +++ b/lib/std/build/write_file.zig @@ -59,7 +59,7 @@ pub const WriteFileStep = struct { // new random bytes when WriteFileStep implementation is modified // in a non-backwards-compatible way. hash.update("eagVR1dYXoE7ARDP"); - for (self.files.toSliceConst()) |file| { + for (self.files.span()) |file| { hash.update(file.basename); hash.update(file.bytes); hash.update("|"); @@ -80,7 +80,7 @@ pub const WriteFileStep = struct { }; var dir = try fs.cwd().openDir(self.output_dir, .{}); defer dir.close(); - for (self.files.toSliceConst()) |file| { + for (self.files.span()) |file| { dir.writeFile(file.basename, file.bytes) catch |err| { warn("unable to write {} into {}: {}\n", .{ file.basename, diff --git a/lib/std/c.zig b/lib/std/c.zig index a229fedaa2..1261974d65 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -73,7 +73,6 @@ pub extern "c" fn abort() noreturn; pub extern "c" fn exit(code: c_int) noreturn; pub extern "c" fn isatty(fd: fd_t) c_int; pub extern "c" fn close(fd: fd_t) c_int; -pub extern "c" fn fstat(fd: fd_t, buf: *Stat) c_int; pub extern "c" fn fstatat(dirfd: fd_t, path: [*:0]const u8, stat_buf: *Stat, flags: u32) c_int; pub extern "c" fn lseek(fd: fd_t, offset: off_t, whence: c_int) off_t; pub extern "c" fn open(path: [*:0]const u8, oflag: c_uint, ...) c_int; @@ -86,7 +85,6 @@ pub extern "c" fn pread(fd: fd_t, buf: [*]u8, nbyte: usize, offset: u64) isize; pub extern "c" fn preadv(fd: c_int, iov: [*]const iovec, iovcnt: c_uint, offset: u64) isize; pub extern "c" fn writev(fd: c_int, iov: [*]const iovec_const, iovcnt: c_uint) isize; pub extern "c" fn pwritev(fd: c_int, iov: [*]const iovec_const, iovcnt: c_uint, offset: u64) isize; -pub extern "c" fn stat(noalias path: [*:0]const u8, noalias buf: *Stat) c_int; pub extern "c" fn write(fd: fd_t, buf: [*]const u8, nbyte: usize) isize; pub extern "c" fn pwrite(fd: fd_t, buf: [*]const u8, nbyte: usize, offset: u64) isize; pub extern "c" fn mmap(addr: ?*align(page_size) c_void, len: usize, prot: c_uint, flags: c_uint, fd: fd_t, offset: u64) *c_void; @@ -114,15 +112,10 @@ pub extern "c" fn dup2(old_fd: fd_t, new_fd: fd_t) c_int; pub extern "c" fn readlink(noalias path: [*:0]const u8, noalias buf: [*]u8, bufsize: usize) isize; pub extern "c" fn readlinkat(dirfd: fd_t, noalias path: [*:0]const u8, noalias buf: [*]u8, bufsize: usize) isize; pub extern "c" fn realpath(noalias file_name: [*:0]const u8, noalias resolved_name: [*]u8) ?[*:0]u8; -pub extern "c" fn sigprocmask(how: c_int, noalias set: ?*const sigset_t, noalias oset: ?*sigset_t) c_int; -pub extern "c" fn gettimeofday(noalias tv: ?*timeval, noalias tz: ?*timezone) c_int; -pub extern "c" fn sigaction(sig: c_int, noalias act: *const Sigaction, noalias oact: ?*Sigaction) c_int; -pub extern "c" fn nanosleep(rqtp: *const timespec, rmtp: ?*timespec) c_int; pub extern "c" fn setreuid(ruid: c_uint, euid: c_uint) c_int; pub extern "c" fn setregid(rgid: c_uint, egid: c_uint) c_int; pub extern "c" fn rmdir(path: [*:0]const u8) c_int; pub extern "c" fn getenv(name: [*:0]const u8) ?[*:0]u8; -pub extern "c" fn getrusage(who: c_int, usage: *rusage) c_int; pub extern "c" fn sysctl(name: [*]const c_int, namelen: c_uint, oldp: ?*c_void, oldlenp: ?*usize, newp: ?*c_void, newlen: usize) c_int; pub extern "c" fn sysctlbyname(name: [*:0]const u8, oldp: ?*c_void, oldlenp: ?*usize, newp: ?*c_void, newlen: usize) c_int; pub extern "c" fn sysctlnametomib(name: [*:0]const u8, mibp: ?*c_int, sizep: ?*usize) c_int; @@ -133,7 +126,6 @@ pub extern "c" fn uname(buf: *utsname) c_int; pub extern "c" fn gethostname(name: [*]u8, len: usize) c_int; pub extern "c" fn bind(socket: fd_t, address: ?*const sockaddr, address_len: socklen_t) c_int; -pub extern "c" fn socket(domain: c_uint, sock_type: c_uint, protocol: c_uint) c_int; pub extern "c" fn socketpair(domain: c_uint, sock_type: c_uint, protocol: c_uint, sv: *[2]fd_t) c_int; pub extern "c" fn listen(sockfd: fd_t, backlog: c_uint) c_int; pub extern "c" fn getsockname(sockfd: fd_t, noalias addr: *sockaddr, noalias addrlen: *socklen_t) c_int; @@ -161,12 +153,55 @@ pub extern fn recvfrom( noalias addrlen: ?*socklen_t, ) isize; +pub usingnamespace switch (builtin.os.tag) { + .netbsd => struct { + pub const clock_getres = __clock_getres50; + pub const clock_gettime = __clock_gettime50; + pub const fstat = __fstat50; + pub const getdents = __getdents30; + pub const getrusage = __getrusage50; + pub const gettimeofday = __gettimeofday50; + pub const nanosleep = __nanosleep50; + pub const sched_yield = __libc_thr_yield; + pub const sigaction = __sigaction14; + pub const sigaltstack = __sigaltstack14; + pub const sigprocmask = __sigprocmask14; + pub const stat = __stat50; + }, + .macosx, .ios, .watchos, .tvos => struct { + // XXX: close -> close$NOCANCEL + // XXX: getdirentries -> _getdirentries64 + pub extern "c" fn clock_getres(clk_id: c_int, tp: *timespec) c_int; + pub extern "c" fn clock_gettime(clk_id: c_int, tp: *timespec) c_int; + pub const fstat = @"fstat$INODE64"; + pub extern "c" fn getrusage(who: c_int, usage: *rusage) c_int; + pub extern "c" fn gettimeofday(noalias tv: ?*timeval, noalias tz: ?*timezone) c_int; + pub extern "c" fn nanosleep(rqtp: *const timespec, rmtp: ?*timespec) c_int; + pub extern "c" fn sched_yield() c_int; + pub extern "c" fn sigaction(sig: c_int, noalias act: *const Sigaction, noalias oact: ?*Sigaction) c_int; + pub extern "c" fn sigprocmask(how: c_int, noalias set: ?*const sigset_t, noalias oset: ?*sigset_t) c_int; + pub extern "c" fn socket(domain: c_uint, sock_type: c_uint, protocol: c_uint) c_int; + pub extern "c" fn stat(noalias path: [*:0]const u8, noalias buf: *Stat) c_int; + }, + else => struct { + pub extern "c" fn clock_getres(clk_id: c_int, tp: *timespec) c_int; + pub extern "c" fn clock_gettime(clk_id: c_int, tp: *timespec) c_int; + pub extern "c" fn fstat(fd: fd_t, buf: *Stat) c_int; + pub extern "c" fn getrusage(who: c_int, usage: *rusage) c_int; + pub extern "c" fn gettimeofday(noalias tv: ?*timeval, noalias tz: ?*timezone) c_int; + pub extern "c" fn nanosleep(rqtp: *const timespec, rmtp: ?*timespec) c_int; + pub extern "c" fn sched_yield() c_int; + pub extern "c" fn sigaction(sig: c_int, noalias act: *const Sigaction, noalias oact: ?*Sigaction) c_int; + pub extern "c" fn sigprocmask(how: c_int, noalias set: ?*const sigset_t, noalias oset: ?*sigset_t) c_int; + pub extern "c" fn socket(domain: c_uint, sock_type: c_uint, protocol: c_uint) c_int; + pub extern "c" fn stat(noalias path: [*:0]const u8, noalias buf: *Stat) c_int; + }, +}; + pub extern "c" fn kill(pid: pid_t, sig: c_int) c_int; pub extern "c" fn getdirentries(fd: fd_t, buf_ptr: [*]u8, nbytes: usize, basep: *i64) isize; pub extern "c" fn setgid(ruid: c_uint, euid: c_uint) c_int; pub extern "c" fn setuid(uid: c_uint) c_int; -pub extern "c" fn clock_gettime(clk_id: c_int, tp: *timespec) c_int; -pub extern "c" fn clock_getres(clk_id: c_int, tp: *timespec) c_int; pub extern "c" fn aligned_alloc(alignment: usize, size: usize) ?*c_void; pub extern "c" fn malloc(usize) ?*c_void; @@ -174,7 +209,6 @@ pub extern "c" fn realloc(?*c_void, usize) ?*c_void; pub extern "c" fn free(*c_void) void; pub extern "c" fn posix_memalign(memptr: **c_void, alignment: usize, size: usize) c_int; -// Deprecated pub extern "c" fn futimes(fd: fd_t, times: *[2]timeval) c_int; pub extern "c" fn utimes(path: [*:0]const u8, times: *[2]timeval) c_int; @@ -230,8 +264,6 @@ pub extern "c" fn dn_expand( length: c_int, ) c_int; -pub extern "c" fn sched_yield() c_int; - pub const PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t{}; pub extern "c" fn pthread_mutex_lock(mutex: *pthread_mutex_t) c_int; pub extern "c" fn pthread_mutex_unlock(mutex: *pthread_mutex_t) c_int; diff --git a/lib/std/c/netbsd.zig b/lib/std/c/netbsd.zig index fd70220603..f3c34b5cad 100644 --- a/lib/std/c/netbsd.zig +++ b/lib/std/c/netbsd.zig @@ -10,36 +10,58 @@ pub const dl_iterate_phdr_callback = extern fn (info: *dl_phdr_info, size: usize pub extern "c" fn dl_iterate_phdr(callback: dl_iterate_phdr_callback, data: ?*c_void) c_int; pub extern "c" fn __fstat50(fd: fd_t, buf: *Stat) c_int; +pub extern "c" fn __stat50(path: [*:0]const u8, buf: *Stat) c_int; pub extern "c" fn __clock_gettime50(clk_id: c_int, tp: *timespec) c_int; pub extern "c" fn __clock_getres50(clk_id: c_int, tp: *timespec) c_int; pub extern "c" fn __getdents30(fd: c_int, buf_ptr: [*]u8, nbytes: usize) c_int; pub extern "c" fn __sigaltstack14(ss: ?*stack_t, old_ss: ?*stack_t) c_int; +pub extern "c" fn __nanosleep50(rqtp: *const timespec, rmtp: ?*timespec) c_int; +pub extern "c" fn __sigaction14(sig: c_int, noalias act: *const Sigaction, noalias oact: ?*Sigaction) c_int; +pub extern "c" fn __sigprocmask14(how: c_int, noalias set: ?*const sigset_t, noalias oset: ?*sigset_t) c_int; +pub extern "c" fn __socket30(domain: c_uint, sock_type: c_uint, protocol: c_uint) c_int; +pub extern "c" fn __gettimeofday50(noalias tv: ?*timeval, noalias tz: ?*timezone) c_int; +pub extern "c" fn __getrusage50(who: c_int, usage: *rusage) c_int; +// libc aliases this as sched_yield +pub extern "c" fn __libc_thr_yield() c_int; pub const pthread_mutex_t = extern struct { - ptm_magic: c_uint = 0x33330003, - ptm_errorcheck: padded_spin_t = 0, - ptm_unused: padded_spin_t = 0, + ptm_magic: u32 = 0x33330003, + ptm_errorcheck: padded_pthread_spin_t = 0, + ptm_ceiling: padded_pthread_spin_t = 0, ptm_owner: usize = 0, ptm_waiters: ?*u8 = null, - ptm_recursed: c_uint = 0, + ptm_recursed: u32 = 0, ptm_spare2: ?*c_void = null, }; + pub const pthread_cond_t = extern struct { - ptc_magic: c_uint = 0x55550005, + ptc_magic: u32 = 0x55550005, ptc_lock: pthread_spin_t = 0, ptc_waiters_first: ?*u8 = null, ptc_waiters_last: ?*u8 = null, ptc_mutex: ?*pthread_mutex_t = null, ptc_private: ?*c_void = null, }; -const pthread_spin_t = if (builtin.arch == .arm or .arch == .powerpc) c_int else u8; -const padded_spin_t = switch (builtin.arch) { - .sparc, .sparcel, .sparcv9, .i386, .x86_64, .le64 => u32, - else => spin_t, + +const pthread_spin_t = switch (builtin.arch) { + .aarch64, .aarch64_be, .aarch64_32 => u8, + .mips, .mipsel, .mips64, .mips64el => u32, + .powerpc, .powerpc64, .powerpc64le => i32, + .i386, .x86_64 => u8, + .arm, .armeb, .thumb, .thumbeb => i32, + .sparc, .sparcel, .sparcv9 => u8, + .riscv32, .riscv64 => u32, + else => @compileError("undefined pthread_spin_t for this arch"), +}; + +const padded_pthread_spin_t = switch (builtin.arch) { + .i386, .x86_64 => u32, + .sparc, .sparcel, .sparcv9 => u32, + else => pthread_spin_t, }; pub const pthread_attr_t = extern struct { pta_magic: u32, - pta_flags: c_int, - pta_private: *c_void, + pta_flags: i32, + pta_private: ?*c_void, }; diff --git a/lib/std/child_process.zig b/lib/std/child_process.zig index 008fc34ff6..e1c489bf05 100644 --- a/lib/std/child_process.zig +++ b/lib/std/child_process.zig @@ -10,7 +10,7 @@ const windows = os.windows; const mem = std.mem; const debug = std.debug; const BufMap = std.BufMap; -const Buffer = std.Buffer; +const ArrayListSentineled = std.ArrayListSentineled; const builtin = @import("builtin"); const Os = builtin.Os; const TailQueue = std.TailQueue; @@ -175,29 +175,11 @@ pub const ChildProcess = struct { stderr: []u8, }; - /// Spawns a child process, waits for it, collecting stdout and stderr, and then returns. - /// If it succeeds, the caller owns result.stdout and result.stderr memory. - /// TODO deprecate in favor of exec2 - pub fn exec( - allocator: *mem.Allocator, - argv: []const []const u8, - cwd: ?[]const u8, - env_map: ?*const BufMap, - max_output_bytes: usize, - ) !ExecResult { - return exec2(.{ - .allocator = allocator, - .argv = argv, - .cwd = cwd, - .env_map = env_map, - .max_output_bytes = max_output_bytes, - }); - } + pub const exec2 = @compileError("deprecated: exec2 is renamed to exec"); /// Spawns a child process, waits for it, collecting stdout and stderr, and then returns. /// If it succeeds, the caller owns result.stdout and result.stderr memory. - /// TODO rename to exec - pub fn exec2(args: struct { + pub fn exec(args: struct { allocator: *mem.Allocator, argv: []const []const u8, cwd: ?[]const u8 = null, @@ -370,7 +352,7 @@ pub const ChildProcess = struct { const any_ignore = (self.stdin_behavior == StdIo.Ignore or self.stdout_behavior == StdIo.Ignore or self.stderr_behavior == StdIo.Ignore); const dev_null_fd = if (any_ignore) - os.openC("/dev/null", os.O_RDWR, 0) catch |err| switch (err) { + os.openZ("/dev/null", os.O_RDWR, 0) catch |err| switch (err) { error.PathAlreadyExists => unreachable, error.NoSpaceLeft => unreachable, error.FileTooBig => unreachable, @@ -775,38 +757,36 @@ fn windowsCreateProcess(app_name: [*:0]u16, cmd_line: [*:0]u16, envp_ptr: ?[*]u1 } /// Caller must dealloc. -/// Guarantees a null byte at result[result.len]. -fn windowsCreateCommandLine(allocator: *mem.Allocator, argv: []const []const u8) ![]u8 { - var buf = try Buffer.initSize(allocator, 0); +fn windowsCreateCommandLine(allocator: *mem.Allocator, argv: []const []const u8) ![:0]u8 { + var buf = try ArrayListSentineled(u8, 0).initSize(allocator, 0); defer buf.deinit(); - - var buf_stream = buf.outStream(); + const buf_stream = buf.outStream(); for (argv) |arg, arg_i| { - if (arg_i != 0) try buf.appendByte(' '); + if (arg_i != 0) try buf_stream.writeByte(' '); if (mem.indexOfAny(u8, arg, " \t\n\"") == null) { - try buf.append(arg); + try buf_stream.writeAll(arg); continue; } - try buf.appendByte('"'); + try buf_stream.writeByte('"'); var backslash_count: usize = 0; for (arg) |byte| { switch (byte) { '\\' => backslash_count += 1, '"' => { try buf_stream.writeByteNTimes('\\', backslash_count * 2 + 1); - try buf.appendByte('"'); + try buf_stream.writeByte('"'); backslash_count = 0; }, else => { try buf_stream.writeByteNTimes('\\', backslash_count); - try buf.appendByte(byte); + try buf_stream.writeByte(byte); backslash_count = 0; }, } } try buf_stream.writeByteNTimes('\\', backslash_count * 2); - try buf.appendByte('"'); + try buf_stream.writeByte('"'); } return buf.toOwnedSlice(); diff --git a/lib/std/coff.zig b/lib/std/coff.zig index 2e17f46454..d89019eec6 100644 --- a/lib/std/coff.zig +++ b/lib/std/coff.zig @@ -145,7 +145,7 @@ pub const Coff = struct { blk: while (i < debug_dir_entry_count) : (i += 1) { const debug_dir_entry = try in.readStruct(DebugDirectoryEntry); if (debug_dir_entry.type == IMAGE_DEBUG_TYPE_CODEVIEW) { - for (self.sections.toSlice()) |*section| { + for (self.sections.span()) |*section| { const section_start = section.header.virtual_address; const section_size = section.header.misc.virtual_size; const rva = debug_dir_entry.address_of_raw_data; @@ -211,7 +211,7 @@ pub const Coff = struct { } pub fn getSection(self: *Coff, comptime name: []const u8) ?*Section { - for (self.sections.toSlice()) |*sec| { + for (self.sections.span()) |*sec| { if (mem.eql(u8, sec.header.name[0..name.len], name)) { return sec; } diff --git a/lib/std/crypto/gimli.zig b/lib/std/crypto/gimli.zig index 30304f59cf..be789d8953 100644 --- a/lib/std/crypto/gimli.zig +++ b/lib/std/crypto/gimli.zig @@ -23,10 +23,12 @@ pub const State = struct { const Self = @This(); + /// TODO follow the span() convention instead of having this and `toSliceConst` pub fn toSlice(self: *Self) []u8 { return mem.sliceAsBytes(self.data[0..]); } + /// TODO follow the span() convention instead of having this and `toSlice` pub fn toSliceConst(self: *Self) []const u8 { return mem.sliceAsBytes(self.data[0..]); } diff --git a/lib/std/debug.zig b/lib/std/debug.zig index 94475515e7..9e14d132a8 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -735,7 +735,7 @@ fn openCoffDebugInfo(allocator: *mem.Allocator, coff_file_path: [:0]const u16) ! for (present) |_| { const name_offset = try pdb_stream.inStream().readIntLittle(u32); const name_index = try pdb_stream.inStream().readIntLittle(u32); - const name = mem.toSlice(u8, @ptrCast([*:0]u8, name_bytes.ptr + name_offset)); + const name = mem.spanZ(@ptrCast([*:0]u8, name_bytes.ptr + name_offset)); if (mem.eql(u8, name, "/names")) { break :str_tab_index name_index; } @@ -1131,7 +1131,7 @@ pub const DebugInfo = struct { const obj_di = try self.allocator.create(ModuleDebugInfo); errdefer self.allocator.destroy(obj_di); - const macho_path = mem.toSliceConst(u8, std.c._dyld_get_image_name(i)); + const macho_path = mem.spanZ(std.c._dyld_get_image_name(i)); obj_di.* = openMachODebugInfo(self.allocator, macho_path) catch |err| switch (err) { error.FileNotFound => return error.MissingDebugInfo, else => return err, @@ -1254,10 +1254,7 @@ pub const DebugInfo = struct { if (context.address >= seg_start and context.address < seg_end) { // Android libc uses NULL instead of an empty string to mark the // main program - context.name = if (info.dlpi_name) |dlpi_name| - mem.toSliceConst(u8, dlpi_name) - else - ""; + context.name = mem.spanZ(info.dlpi_name) orelse ""; context.base_address = info.dlpi_addr; // Stop the iteration return error.Found; @@ -1426,7 +1423,7 @@ pub const ModuleDebugInfo = switch (builtin.os.tag) { return SymbolInfo{}; assert(symbol.ofile.?.n_strx < self.strings.len); - const o_file_path = mem.toSliceConst(u8, self.strings.ptr + symbol.ofile.?.n_strx); + const o_file_path = mem.spanZ(self.strings.ptr + symbol.ofile.?.n_strx); // Check if its debug infos are already in the cache var o_file_di = self.ofiles.getValue(o_file_path) orelse @@ -1483,7 +1480,7 @@ pub const ModuleDebugInfo = switch (builtin.os.tag) { const mod_index = for (self.sect_contribs) |sect_contrib| { if (sect_contrib.Section > self.coff.sections.len) continue; // Remember that SectionContribEntry.Section is 1-based. - coff_section = &self.coff.sections.toSlice()[sect_contrib.Section - 1]; + coff_section = &self.coff.sections.span()[sect_contrib.Section - 1]; const vaddr_start = coff_section.header.virtual_address + sect_contrib.Offset; const vaddr_end = vaddr_start + sect_contrib.Size; @@ -1510,7 +1507,7 @@ pub const ModuleDebugInfo = switch (builtin.os.tag) { const vaddr_start = coff_section.header.virtual_address + proc_sym.CodeOffset; const vaddr_end = vaddr_start + proc_sym.CodeSize; if (relocated_address >= vaddr_start and relocated_address < vaddr_end) { - break mem.toSliceConst(u8, @ptrCast([*:0]u8, proc_sym) + @sizeOf(pdb.ProcSym)); + break mem.spanZ(@ptrCast([*:0]u8, proc_sym) + @sizeOf(pdb.ProcSym)); } }, else => {}, @@ -1669,7 +1666,11 @@ fn getDebugInfoAllocator() *mem.Allocator { } /// Whether or not the current target can print useful debug information when a segfault occurs. -pub const have_segfault_handling_support = builtin.os.tag == .linux or builtin.os.tag == .windows; +pub const have_segfault_handling_support = switch (builtin.os.tag) { + .linux, .netbsd => true, + .windows => true, + else => false, +}; pub const enable_segfault_handler: bool = if (@hasDecl(root, "enable_segfault_handler")) root.enable_segfault_handler else @@ -1721,13 +1722,17 @@ fn resetSegfaultHandler() void { os.sigaction(os.SIGBUS, &act, null); } -fn handleSegfaultLinux(sig: i32, info: *const os.siginfo_t, ctx_ptr: *const c_void) callconv(.C) noreturn { +fn handleSegfaultLinux(sig: i32, info: *const os.siginfo_t, ctx_ptr: ?*const c_void) callconv(.C) noreturn { // Reset to the default handler so that if a segfault happens in this handler it will crash // the process. Also when this handler returns, the original instruction will be repeated // and the resulting segfault will crash the process rather than continually dump stack traces. resetSegfaultHandler(); - const addr = @ptrToInt(info.fields.sigfault.addr); + const addr = switch (builtin.os.tag) { + .linux => @ptrToInt(info.fields.sigfault.addr), + .netbsd => @ptrToInt(info.info.reason.fault.addr), + else => unreachable, + }; switch (sig) { os.SIGSEGV => std.debug.warn("Segmentation fault at address 0x{x}\n", .{addr}), os.SIGILL => std.debug.warn("Illegal instruction at address 0x{x}\n", .{addr}), diff --git a/lib/std/dwarf.zig b/lib/std/dwarf.zig index d198886b11..95403bc109 100644 --- a/lib/std/dwarf.zig +++ b/lib/std/dwarf.zig @@ -82,7 +82,7 @@ const Die = struct { }; fn getAttr(self: *const Die, id: u64) ?*const FormValue { - for (self.attrs.toSliceConst()) |*attr| { + for (self.attrs.span()) |*attr| { if (attr.id == id) return &attr.value; } return null; @@ -375,7 +375,7 @@ fn parseFormValue(allocator: *mem.Allocator, in_stream: var, form_id: u64, is_64 } fn getAbbrevTableEntry(abbrev_table: *const AbbrevTable, abbrev_code: u64) ?*const AbbrevTableEntry { - for (abbrev_table.toSliceConst()) |*table_entry| { + for (abbrev_table.span()) |*table_entry| { if (table_entry.abbrev_code == abbrev_code) return table_entry; } return null; @@ -399,7 +399,7 @@ pub const DwarfInfo = struct { } fn getSymbolName(di: *DwarfInfo, address: u64) ?[]const u8 { - for (di.func_list.toSliceConst()) |*func| { + for (di.func_list.span()) |*func| { if (func.pc_range) |range| { if (address >= range.start and address < range.end) { return func.name; @@ -588,7 +588,7 @@ pub const DwarfInfo = struct { } fn findCompileUnit(di: *DwarfInfo, target_address: u64) !*const CompileUnit { - for (di.compile_unit_list.toSlice()) |*compile_unit| { + for (di.compile_unit_list.span()) |*compile_unit| { if (compile_unit.pc_range) |range| { if (target_address >= range.start and target_address < range.end) return compile_unit; } @@ -636,7 +636,7 @@ pub const DwarfInfo = struct { /// Gets an already existing AbbrevTable given the abbrev_offset, or if not found, /// seeks in the stream and parses it. fn getAbbrevTable(di: *DwarfInfo, abbrev_offset: u64) !*const AbbrevTable { - for (di.abbrev_table_list.toSlice()) |*header| { + for (di.abbrev_table_list.span()) |*header| { if (header.offset == abbrev_offset) { return &header.table; } @@ -690,7 +690,7 @@ pub const DwarfInfo = struct { .attrs = ArrayList(Die.Attr).init(di.allocator()), }; try result.attrs.resize(table_entry.attrs.len); - for (table_entry.attrs.toSliceConst()) |attr, i| { + for (table_entry.attrs.span()) |attr, i| { result.attrs.items[i] = Die.Attr{ .id = attr.attr_id, .value = try parseFormValue(di.allocator(), in_stream, attr.form_id, is_64), @@ -757,7 +757,7 @@ pub const DwarfInfo = struct { } var file_entries = ArrayList(FileEntry).init(di.allocator()); - var prog = LineNumberProgram.init(default_is_stmt, include_directories.toSliceConst(), &file_entries, target_address); + var prog = LineNumberProgram.init(default_is_stmt, include_directories.span(), &file_entries, target_address); while (true) { const file_name = try in.readUntilDelimiterAlloc(di.allocator(), 0, math.maxInt(usize)); diff --git a/lib/std/dynamic_library.zig b/lib/std/dynamic_library.zig index 0d14f8d032..110d476b10 100644 --- a/lib/std/dynamic_library.zig +++ b/lib/std/dynamic_library.zig @@ -254,9 +254,11 @@ pub const ElfDynLib = struct { }; } + pub const openC = @compileError("deprecated: renamed to openZ"); + /// Trusts the file. Malicious file will be able to execute arbitrary code. - pub fn openC(path_c: [*:0]const u8) !ElfDynLib { - return open(mem.toSlice(u8, path_c)); + pub fn openZ(path_c: [*:0]const u8) !ElfDynLib { + return open(mem.spanZ(path_c)); } /// Trusts the file @@ -285,7 +287,7 @@ pub const ElfDynLib = struct { if (0 == (@as(u32, 1) << @intCast(u5, self.syms[i].st_info & 0xf) & OK_TYPES)) continue; if (0 == (@as(u32, 1) << @intCast(u5, self.syms[i].st_info >> 4) & OK_BINDS)) continue; if (0 == self.syms[i].st_shndx) continue; - if (!mem.eql(u8, name, mem.toSliceConst(u8, self.strings + self.syms[i].st_name))) continue; + if (!mem.eql(u8, name, mem.spanZ(self.strings + self.syms[i].st_name))) continue; if (maybe_versym) |versym| { if (!checkver(self.verdef.?, versym[i], vername, self.strings)) continue; @@ -316,7 +318,7 @@ fn checkver(def_arg: *elf.Verdef, vsym_arg: i32, vername: []const u8, strings: [ def = @intToPtr(*elf.Verdef, @ptrToInt(def) + def.vd_next); } const aux = @intToPtr(*elf.Verdaux, @ptrToInt(def) + def.vd_aux); - return mem.eql(u8, vername, mem.toSliceConst(u8, strings + aux.vda_name)); + return mem.eql(u8, vername, mem.spanZ(strings + aux.vda_name)); } pub const WindowsDynLib = struct { @@ -329,7 +331,9 @@ pub const WindowsDynLib = struct { return openW(&path_w); } - pub fn openC(path_c: [*:0]const u8) !WindowsDynLib { + pub const openC = @compileError("deprecated: renamed to openZ"); + + pub fn openZ(path_c: [*:0]const u8) !WindowsDynLib { const path_w = try windows.cStrToPrefixedFileW(path_c); return openW(&path_w); } @@ -362,10 +366,12 @@ pub const DlDynlib = struct { pub fn open(path: []const u8) !DlDynlib { const path_c = try os.toPosixPath(path); - return openC(&path_c); + return openZ(&path_c); } - pub fn openC(path_c: [*:0]const u8) !DlDynlib { + pub const openC = @compileError("deprecated: renamed to openZ"); + + pub fn openZ(path_c: [*:0]const u8) !DlDynlib { return DlDynlib{ .handle = system.dlopen(path_c, system.RTLD_LAZY) orelse { return error.FileNotFound; diff --git a/lib/std/event/loop.zig b/lib/std/event/loop.zig index 7db6fe98de..0a5cf2a6e7 100644 --- a/lib/std/event/loop.zig +++ b/lib/std/event/loop.zig @@ -1096,10 +1096,10 @@ pub const Loop = struct { msg.result = noasync os.preadv(msg.fd, msg.iov, msg.offset); }, .open => |*msg| { - msg.result = noasync os.openC(msg.path, msg.flags, msg.mode); + msg.result = noasync os.openZ(msg.path, msg.flags, msg.mode); }, .openat => |*msg| { - msg.result = noasync os.openatC(msg.fd, msg.path, msg.flags, msg.mode); + msg.result = noasync os.openatZ(msg.fd, msg.path, msg.flags, msg.mode); }, .faccessat => |*msg| { msg.result = noasync os.faccessatZ(msg.dirfd, msg.path, msg.mode, msg.flags); diff --git a/lib/std/fifo.zig b/lib/std/fifo.zig index 94570e93ef..6bbec57072 100644 --- a/lib/std/fifo.zig +++ b/lib/std/fifo.zig @@ -160,7 +160,7 @@ pub fn LinearFifo( return self.readableSliceMut(offset); } - /// Discard first `count` bytes of readable data + /// Discard first `count` items in the fifo pub fn discard(self: *Self, count: usize) void { assert(count <= self.count); { // set old range to undefined. Note: may be wrapped around @@ -199,7 +199,7 @@ pub fn LinearFifo( return c; } - /// Read data from the fifo into `dst`, returns number of bytes copied. + /// Read data from the fifo into `dst`, returns number of items copied. pub fn read(self: *Self, dst: []T) usize { var dst_left = dst; @@ -215,7 +215,17 @@ pub fn LinearFifo( return dst.len - dst_left.len; } - /// Returns number of bytes available in fifo + /// Same as `read` except it returns an error union + /// The purpose of this function existing is to match `std.io.InStream` API. + fn readFn(self: *Self, dest: []u8) error{}!usize { + return self.read(dest); + } + + pub fn inStream(self: *Self) std.io.InStream(*Self, error{}, readFn) { + return .{ .context = self }; + } + + /// Returns number of items available in fifo pub fn writableLength(self: Self) usize { return self.buf.len - self.count; } @@ -233,9 +243,9 @@ pub fn LinearFifo( } } - /// Returns a writable buffer of at least `size` bytes, allocating memory as needed. + /// Returns a writable buffer of at least `size` items, allocating memory as needed. /// Use `fifo.update` once you've written data to it. - pub fn writeableWithSize(self: *Self, size: usize) ![]T { + pub fn writableWithSize(self: *Self, size: usize) ![]T { try self.ensureUnusedCapacity(size); // try to avoid realigning buffer @@ -247,7 +257,7 @@ pub fn LinearFifo( return slice; } - /// Update the tail location of the buffer (usually follows use of writable/writeableWithSize) + /// Update the tail location of the buffer (usually follows use of writable/writableWithSize) pub fn update(self: *Self, count: usize) void { assert(self.count + count <= self.buf.len); self.count += count; @@ -279,7 +289,7 @@ pub fn LinearFifo( } else { tail %= self.buf.len; } - self.buf[tail] = byte; + self.buf[tail] = item; self.update(1); } @@ -291,24 +301,16 @@ pub fn LinearFifo( return self.writeAssumeCapacity(src); } - pub usingnamespace if (T == u8) - struct { - const OutStream = std.io.OutStream(*Self, Error, appendWrite); - const Error = error{OutOfMemory}; + /// Same as `write` except it returns the number of bytes written, which is always the same + /// as `bytes.len`. The purpose of this function existing is to match `std.io.OutStream` API. + fn appendWrite(self: *Self, bytes: []const u8) error{OutOfMemory}!usize { + try self.write(bytes); + return bytes.len; + } - /// Same as `write` except it returns the number of bytes written, which is always the same - /// as `bytes.len`. The purpose of this function existing is to match `std.io.OutStream` API. - pub fn appendWrite(fifo: *Self, bytes: []const u8) Error!usize { - try fifo.write(bytes); - return bytes.len; - } - - pub fn outStream(self: *Self) OutStream { - return .{ .context = self }; - } - } - else - struct {}; + pub fn outStream(self: *Self) std.io.OutStream(*Self, error{OutOfMemory}, appendWrite) { + return .{ .context = self }; + } /// Make `count` items available before the current read location fn rewind(self: *Self, count: usize) void { @@ -395,7 +397,7 @@ test "LinearFifo(u8, .Dynamic)" { } { - const buf = try fifo.writeableWithSize(12); + const buf = try fifo.writableWithSize(12); testing.expectEqual(@as(usize, 12), buf.len); var i: u8 = 0; while (i < 10) : (i += 1) { @@ -422,6 +424,15 @@ test "LinearFifo(u8, .Dynamic)" { testing.expectEqualSlices(u8, "Hello, World!", result[0..fifo.read(&result)]); testing.expectEqual(@as(usize, 0), fifo.readableLength()); } + + { + try fifo.outStream().writeAll("This is a test"); + var result: [30]u8 = undefined; + testing.expectEqualSlices(u8, "This", (try fifo.inStream().readUntilDelimiterOrEof(&result, ' ')).?); + testing.expectEqualSlices(u8, "is", (try fifo.inStream().readUntilDelimiterOrEof(&result, ' ')).?); + testing.expectEqualSlices(u8, "a", (try fifo.inStream().readUntilDelimiterOrEof(&result, ' ')).?); + testing.expectEqualSlices(u8, "test", (try fifo.inStream().readUntilDelimiterOrEof(&result, ' ')).?); + } } test "LinearFifo" { @@ -445,6 +456,20 @@ test "LinearFifo" { testing.expectEqual(@as(T, 1), try fifo.readItem()); testing.expectEqual(@as(T, 0), try fifo.readItem()); testing.expectEqual(@as(T, 1), try fifo.readItem()); + testing.expectEqual(@as(usize, 0), fifo.readableLength()); + } + + { + try fifo.writeItem(1); + try fifo.writeItem(1); + try fifo.writeItem(1); + testing.expectEqual(@as(usize, 3), fifo.readableLength()); + } + + { + var readBuf: [3]T = undefined; + const n = fifo.read(&readBuf); + testing.expectEqual(@as(usize, 3), n); // NOTE: It should be the number of items. } } } diff --git a/lib/std/fmt/parse_float.zig b/lib/std/fmt/parse_float.zig index 0268ca96cc..2495a140d3 100644 --- a/lib/std/fmt/parse_float.zig +++ b/lib/std/fmt/parse_float.zig @@ -30,6 +30,7 @@ // - Does not handle denormals const std = @import("../std.zig"); +const ascii = std.ascii; const max_digits = 25; @@ -190,14 +191,6 @@ const ParseResult = enum { MinusInf, }; -inline fn isDigit(c: u8) bool { - return c >= '0' and c <= '9'; -} - -inline fn isSpace(c: u8) bool { - return (c >= 0x09 and c <= 0x13) or c == 0x20; -} - fn parseRepr(s: []const u8, n: *FloatRepr) !ParseResult { var digit_index: usize = 0; var negative = false; @@ -207,52 +200,49 @@ fn parseRepr(s: []const u8, n: *FloatRepr) !ParseResult { var state = State.MaybeSign; var i: usize = 0; - loop: while (i < s.len) { + while (i < s.len) { const c = s[i]; switch (state) { - State.MaybeSign => { - state = State.LeadingMantissaZeros; + .MaybeSign => { + state = .LeadingMantissaZeros; if (c == '+') { i += 1; } else if (c == '-') { n.negative = true; i += 1; - } else if (isDigit(c) or c == '.') { + } else if (ascii.isDigit(c) or c == '.') { // continue } else { return error.InvalidCharacter; } }, - - State.LeadingMantissaZeros => { + .LeadingMantissaZeros => { if (c == '0') { i += 1; } else if (c == '.') { i += 1; - state = State.LeadingFractionalZeros; + state = .LeadingFractionalZeros; } else { - state = State.MantissaIntegral; + state = .MantissaIntegral; } }, - - State.LeadingFractionalZeros => { + .LeadingFractionalZeros => { if (c == '0') { i += 1; if (n.exponent > std.math.minInt(i32)) { n.exponent -= 1; } } else { - state = State.MantissaFractional; + state = .MantissaFractional; } }, - - State.MantissaIntegral => { - if (isDigit(c)) { + .MantissaIntegral => { + if (ascii.isDigit(c)) { if (digit_index < max_digits) { n.mantissa *%= 10; - n.mantissa += s[i] - '0'; + n.mantissa += c - '0'; digit_index += 1; } else if (n.exponent < std.math.maxInt(i32)) { n.exponent += 1; @@ -261,14 +251,13 @@ fn parseRepr(s: []const u8, n: *FloatRepr) !ParseResult { i += 1; } else if (c == '.') { i += 1; - state = State.MantissaFractional; + state = .MantissaFractional; } else { - state = State.MantissaFractional; + state = .MantissaFractional; } }, - - State.MantissaFractional => { - if (isDigit(c)) { + .MantissaFractional => { + if (ascii.isDigit(c)) { if (digit_index < max_digits) { n.mantissa *%= 10; n.mantissa += c - '0'; @@ -279,13 +268,12 @@ fn parseRepr(s: []const u8, n: *FloatRepr) !ParseResult { i += 1; } else if (c == 'e' or c == 'E') { i += 1; - state = State.ExponentSign; + state = .ExponentSign; } else { - state = State.ExponentSign; + state = .ExponentSign; } }, - - State.ExponentSign => { + .ExponentSign => { if (c == '+') { i += 1; } else if (c == '-') { @@ -293,20 +281,18 @@ fn parseRepr(s: []const u8, n: *FloatRepr) !ParseResult { i += 1; } - state = State.LeadingExponentZeros; + state = .LeadingExponentZeros; }, - - State.LeadingExponentZeros => { + .LeadingExponentZeros => { if (c == '0') { i += 1; } else { - state = State.Exponent; + state = .Exponent; } }, - - State.Exponent => { - if (isDigit(c)) { - if (exponent < std.math.maxInt(i32)) { + .Exponent => { + if (ascii.isDigit(c)) { + if (exponent < std.math.maxInt(i32) / 10) { exponent *= 10; exponent += @intCast(i32, c - '0'); } @@ -323,29 +309,21 @@ fn parseRepr(s: []const u8, n: *FloatRepr) !ParseResult { n.exponent += exponent; if (n.mantissa == 0) { - return if (n.negative) ParseResult.MinusZero else ParseResult.PlusZero; + return if (n.negative) .MinusZero else .PlusZero; } else if (n.exponent > 309) { - return if (n.negative) ParseResult.MinusInf else ParseResult.PlusInf; + return if (n.negative) .MinusInf else .PlusInf; } else if (n.exponent < -328) { - return if (n.negative) ParseResult.MinusZero else ParseResult.PlusZero; + return if (n.negative) .MinusZero else .PlusZero; } - return ParseResult.Ok; -} - -inline fn isLower(c: u8) bool { - return c -% 'a' < 26; -} - -inline fn toUpper(c: u8) u8 { - return if (isLower(c)) (c & 0x5f) else c; + return .Ok; } fn caseInEql(a: []const u8, b: []const u8) bool { if (a.len != b.len) return false; for (a) |_, i| { - if (toUpper(a[i]) != toUpper(b[i])) { + if (ascii.toUpper(a[i]) != ascii.toUpper(b[i])) { return false; } } @@ -373,11 +351,11 @@ pub fn parseFloat(comptime T: type, s: []const u8) !T { }; return switch (try parseRepr(s, &r)) { - ParseResult.Ok => convertRepr(T, r), - ParseResult.PlusZero => 0.0, - ParseResult.MinusZero => -@as(T, 0.0), - ParseResult.PlusInf => std.math.inf(T), - ParseResult.MinusInf => -std.math.inf(T), + .Ok => convertRepr(T, r), + .PlusZero => 0.0, + .MinusZero => -@as(T, 0.0), + .PlusInf => std.math.inf(T), + .MinusInf => -std.math.inf(T), }; } @@ -396,26 +374,28 @@ test "fmt.parseFloat" { testing.expectError(error.InvalidCharacter, parseFloat(T, "1abc")); expectEqual(try parseFloat(T, "0"), 0.0); - expectEqual((try parseFloat(T, "0")), 0.0); - expectEqual((try parseFloat(T, "+0")), 0.0); - expectEqual((try parseFloat(T, "-0")), 0.0); + expectEqual(try parseFloat(T, "0"), 0.0); + expectEqual(try parseFloat(T, "+0"), 0.0); + expectEqual(try parseFloat(T, "-0"), 0.0); - expectEqual((try parseFloat(T, "0e0")), 0); - expectEqual((try parseFloat(T, "2e3")), 2000.0); - expectEqual((try parseFloat(T, "1e0")), 1.0); - expectEqual((try parseFloat(T, "-2e3")), -2000.0); - expectEqual((try parseFloat(T, "-1e0")), -1.0); - expectEqual((try parseFloat(T, "1.234e3")), 1234); + expectEqual(try parseFloat(T, "0e0"), 0); + expectEqual(try parseFloat(T, "2e3"), 2000.0); + expectEqual(try parseFloat(T, "1e0"), 1.0); + expectEqual(try parseFloat(T, "-2e3"), -2000.0); + expectEqual(try parseFloat(T, "-1e0"), -1.0); + expectEqual(try parseFloat(T, "1.234e3"), 1234); expect(approxEq(T, try parseFloat(T, "3.141"), 3.141, epsilon)); expect(approxEq(T, try parseFloat(T, "-3.141"), -3.141, epsilon)); - expectEqual((try parseFloat(T, "1e-700")), 0); - expectEqual((try parseFloat(T, "1e+700")), std.math.inf(T)); + expectEqual(try parseFloat(T, "1e-700"), 0); + expectEqual(try parseFloat(T, "1e+700"), std.math.inf(T)); expectEqual(@bitCast(Z, try parseFloat(T, "nAn")), @bitCast(Z, std.math.nan(T))); - expectEqual((try parseFloat(T, "inF")), std.math.inf(T)); - expectEqual((try parseFloat(T, "-INF")), -std.math.inf(T)); + expectEqual(try parseFloat(T, "inF"), std.math.inf(T)); + expectEqual(try parseFloat(T, "-INF"), -std.math.inf(T)); + + expectEqual(try parseFloat(T, "0.4e0066999999999999999999999999999999999999999999999999999"), std.math.inf(T)); if (T != f16) { expect(approxEq(T, try parseFloat(T, "1e-2"), 0.01, epsilon)); diff --git a/lib/std/fs.zig b/lib/std/fs.zig index fce6601915..325e2b2834 100644 --- a/lib/std/fs.zig +++ b/lib/std/fs.zig @@ -11,13 +11,18 @@ const math = std.math; pub const path = @import("fs/path.zig"); pub const File = @import("fs/file.zig").File; +// TODO audit these APIs with respect to Dir and absolute paths + pub const symLink = os.symlink; -pub const symLinkC = os.symlinkC; +pub const symLinkZ = os.symlinkZ; +pub const symLinkC = @compileError("deprecated: renamed to symlinkZ"); pub const rename = os.rename; -pub const renameC = os.renameC; +pub const renameZ = os.renameZ; +pub const renameC = @compileError("deprecated: renamed to renameZ"); pub const renameW = os.renameW; pub const realpath = os.realpath; -pub const realpathC = os.realpathC; +pub const realpathZ = os.realpathZ; +pub const realpathC = @compileError("deprecated: renamed to realpathZ"); pub const realpathW = os.realpathW; pub const getAppDataDir = @import("fs/get_app_data_dir.zig").getAppDataDir; @@ -120,7 +125,7 @@ pub const AtomicFile = struct { file: File, // TODO either replace this with rand_buf or use []u16 on Windows tmp_path_buf: [TMP_PATH_LEN:0]u8, - dest_path: []const u8, + dest_basename: []const u8, file_open: bool, file_exists: bool, close_dir_on_deinit: bool, @@ -131,17 +136,23 @@ pub const AtomicFile = struct { const RANDOM_BYTES = 12; const TMP_PATH_LEN = base64.Base64Encoder.calcSize(RANDOM_BYTES); - /// TODO rename this. Callers should go through Dir API - pub fn init2(dest_path: []const u8, mode: File.Mode, dir: Dir, close_dir_on_deinit: bool) InitError!AtomicFile { + /// Note that the `Dir.atomicFile` API may be more handy than this lower-level function. + pub fn init( + dest_basename: []const u8, + mode: File.Mode, + dir: Dir, + close_dir_on_deinit: bool, + ) InitError!AtomicFile { var rand_buf: [RANDOM_BYTES]u8 = undefined; var tmp_path_buf: [TMP_PATH_LEN:0]u8 = undefined; + // TODO: should be able to use TMP_PATH_LEN here. tmp_path_buf[base64.Base64Encoder.calcSize(RANDOM_BYTES)] = 0; while (true) { try crypto.randomBytes(rand_buf[0..]); base64_encoder.encode(&tmp_path_buf, &rand_buf); - const file = dir.createFileC( + const file = dir.createFileZ( &tmp_path_buf, .{ .mode = mode, .exclusive = true }, ) catch |err| switch (err) { @@ -152,7 +163,7 @@ pub const AtomicFile = struct { return AtomicFile{ .file = file, .tmp_path_buf = tmp_path_buf, - .dest_path = dest_path, + .dest_basename = dest_basename, .file_open = true, .file_exists = true, .close_dir_on_deinit = close_dir_on_deinit, @@ -161,11 +172,6 @@ pub const AtomicFile = struct { } } - /// Deprecated. Use `Dir.atomicFile`. - pub fn init(dest_path: []const u8, mode: File.Mode) InitError!AtomicFile { - return cwd().atomicFile(dest_path, .{ .mode = mode }); - } - /// always call deinit, even after successful finish() pub fn deinit(self: *AtomicFile) void { if (self.file_open) { @@ -173,7 +179,7 @@ pub const AtomicFile = struct { self.file_open = false; } if (self.file_exists) { - self.dir.deleteFileC(&self.tmp_path_buf) catch {}; + self.dir.deleteFileZ(&self.tmp_path_buf) catch {}; self.file_exists = false; } if (self.close_dir_on_deinit) { @@ -189,12 +195,12 @@ pub const AtomicFile = struct { self.file_open = false; } if (std.Target.current.os.tag == .windows) { - const dest_path_w = try os.windows.sliceToPrefixedFileW(self.dest_path); + const dest_path_w = try os.windows.sliceToPrefixedFileW(self.dest_basename); const tmp_path_w = try os.windows.cStrToPrefixedFileW(&self.tmp_path_buf); try os.renameatW(self.dir.fd, &tmp_path_w, self.dir.fd, &dest_path_w, os.windows.TRUE); self.file_exists = false; } else { - const dest_path_c = try os.toPosixPath(self.dest_path); + const dest_path_c = try os.toPosixPath(self.dest_basename); try os.renameatZ(self.dir.fd, &self.tmp_path_buf, self.dir.fd, &dest_path_c); self.file_exists = false; } @@ -213,7 +219,7 @@ pub fn makeDirAbsolute(absolute_path: []const u8) !void { /// Same as `makeDirAbsolute` except the parameter is a null-terminated UTF8-encoded string. pub fn makeDirAbsoluteZ(absolute_path_z: [*:0]const u8) !void { - assert(path.isAbsoluteC(absolute_path_z)); + assert(path.isAbsoluteZ(absolute_path_z)); return os.mkdirZ(absolute_path_z, default_new_dir_mode); } @@ -224,18 +230,25 @@ pub fn makeDirAbsoluteW(absolute_path_w: [*:0]const u16) !void { os.windows.CloseHandle(handle); } -/// Deprecated; use `Dir.deleteDir`. -pub fn deleteDir(dir_path: []const u8) !void { +pub const deleteDir = @compileError("deprecated; use dir.deleteDir or deleteDirAbsolute"); +pub const deleteDirC = @compileError("deprecated; use dir.deleteDirZ or deleteDirAbsoluteZ"); +pub const deleteDirW = @compileError("deprecated; use dir.deleteDirW or deleteDirAbsoluteW"); + +/// Same as `Dir.deleteDir` except the path is absolute. +pub fn deleteDirAbsolute(dir_path: []const u8) !void { + assert(path.isAbsolute(dir_path)); return os.rmdir(dir_path); } -/// Deprecated; use `Dir.deleteDirC`. -pub fn deleteDirC(dir_path: [*:0]const u8) !void { - return os.rmdirC(dir_path); +/// Same as `deleteDirAbsolute` except the path parameter is null-terminated. +pub fn deleteDirAbsoluteZ(dir_path: [*:0]const u8) !void { + assert(path.isAbsoluteZ(dir_path)); + return os.rmdirZ(dir_path); } -/// Deprecated; use `Dir.deleteDirW`. -pub fn deleteDirW(dir_path: [*:0]const u16) !void { +/// Same as `deleteDirAbsolute` except the path parameter is WTF-16 and target OS is assumed Windows. +pub fn deleteDirAbsoluteW(dir_path: [*:0]const u16) !void { + assert(path.isAbsoluteWindowsW(dir_path)); return os.rmdirW(dir_path); } @@ -412,7 +425,7 @@ pub const Dir = struct { const next_index = self.index + linux_entry.reclen(); self.index = next_index; - const name = mem.toSlice(u8, @ptrCast([*:0]u8, &linux_entry.d_name)); + const name = mem.spanZ(@ptrCast([*:0]u8, &linux_entry.d_name)); // skip . and .. entries if (mem.eql(u8, name, ".") or mem.eql(u8, name, "..")) { @@ -573,8 +586,7 @@ pub const Dir = struct { return self.openFileZ(&path_c, flags); } - /// Deprecated; use `openFileZ`. - pub const openFileC = openFileZ; + pub const openFileC = @compileError("deprecated: renamed to openFileZ"); /// Same as `openFile` but the path parameter is null-terminated. pub fn openFileZ(self: Dir, sub_path: [*:0]const u8, flags: File.OpenFlags) File.OpenError!File { @@ -603,7 +615,7 @@ pub const Dir = struct { const fd = if (need_async_thread and !flags.always_blocking) try std.event.Loop.instance.?.openatZ(self.fd, sub_path, os_flags, 0) else - try os.openatC(self.fd, sub_path, os_flags, 0); + try os.openatZ(self.fd, sub_path, os_flags, 0); // use fcntl file locking if no lock flag was given if (flags.lock and lock_flag == 0) { @@ -652,11 +664,13 @@ pub const Dir = struct { return self.createFileW(&path_w, flags); } const path_c = try os.toPosixPath(sub_path); - return self.createFileC(&path_c, flags); + return self.createFileZ(&path_c, flags); } + pub const createFileC = @compileError("deprecated: renamed to createFileZ"); + /// Same as `createFile` but the path parameter is null-terminated. - pub fn createFileC(self: Dir, sub_path_c: [*:0]const u8, flags: File.CreateFlags) File.OpenError!File { + pub fn createFileZ(self: Dir, sub_path_c: [*:0]const u8, flags: File.CreateFlags) File.OpenError!File { if (builtin.os.tag == .windows) { const path_w = try os.windows.cStrToPrefixedFileW(sub_path_c); return self.createFileW(&path_w, flags); @@ -676,7 +690,7 @@ pub const Dir = struct { const fd = if (need_async_thread) try std.event.Loop.instance.?.openatZ(self.fd, sub_path_c, os_flags, flags.mode) else - try os.openatC(self.fd, sub_path_c, os_flags, flags.mode); + try os.openatZ(self.fd, sub_path_c, os_flags, flags.mode); if (flags.lock and lock_flag == 0) { // TODO: integrate async I/O @@ -713,27 +727,16 @@ pub const Dir = struct { }); } - /// Deprecated; call `openFile` directly. - pub fn openRead(self: Dir, sub_path: []const u8) File.OpenError!File { - return self.openFile(sub_path, .{}); - } - - /// Deprecated; call `openFileZ` directly. - pub fn openReadC(self: Dir, sub_path: [*:0]const u8) File.OpenError!File { - return self.openFileZ(sub_path, .{}); - } - - /// Deprecated; call `openFileW` directly. - pub fn openReadW(self: Dir, sub_path: [*:0]const u16) File.OpenError!File { - return self.openFileW(sub_path, .{}); - } + pub const openRead = @compileError("deprecated in favor of openFile"); + pub const openReadC = @compileError("deprecated in favor of openFileZ"); + pub const openReadW = @compileError("deprecated in favor of openFileW"); pub fn makeDir(self: Dir, sub_path: []const u8) !void { try os.mkdirat(self.fd, sub_path, default_new_dir_mode); } pub fn makeDirZ(self: Dir, sub_path: [*:0]const u8) !void { - try os.mkdiratC(self.fd, sub_path, default_new_dir_mode); + try os.mkdiratZ(self.fd, sub_path, default_new_dir_mode); } pub fn makeDirW(self: Dir, sub_path: [*:0]const u16) !void { @@ -807,20 +810,22 @@ pub const Dir = struct { return self.openDirW(&sub_path_w, args); } else { const sub_path_c = try os.toPosixPath(sub_path); - return self.openDirC(&sub_path_c, args); + return self.openDirZ(&sub_path_c, args); } } + pub const openDirC = @compileError("deprecated: renamed to openDirZ"); + /// Same as `openDir` except the parameter is null-terminated. - pub fn openDirC(self: Dir, sub_path_c: [*:0]const u8, args: OpenDirOptions) OpenError!Dir { + pub fn openDirZ(self: Dir, sub_path_c: [*:0]const u8, args: OpenDirOptions) OpenError!Dir { if (builtin.os.tag == .windows) { const sub_path_w = try os.windows.cStrToPrefixedFileW(sub_path_c); return self.openDirW(&sub_path_w, args); } else if (!args.iterate) { const O_PATH = if (@hasDecl(os, "O_PATH")) os.O_PATH else 0; - return self.openDirFlagsC(sub_path_c, os.O_DIRECTORY | os.O_RDONLY | os.O_CLOEXEC | O_PATH); + return self.openDirFlagsZ(sub_path_c, os.O_DIRECTORY | os.O_RDONLY | os.O_CLOEXEC | O_PATH); } else { - return self.openDirFlagsC(sub_path_c, os.O_DIRECTORY | os.O_RDONLY | os.O_CLOEXEC); + return self.openDirFlagsZ(sub_path_c, os.O_DIRECTORY | os.O_RDONLY | os.O_CLOEXEC); } } @@ -836,11 +841,11 @@ pub const Dir = struct { } /// `flags` must contain `os.O_DIRECTORY`. - fn openDirFlagsC(self: Dir, sub_path_c: [*:0]const u8, flags: u32) OpenError!Dir { + fn openDirFlagsZ(self: Dir, sub_path_c: [*:0]const u8, flags: u32) OpenError!Dir { const result = if (need_async_thread) std.event.Loop.instance.?.openatZ(self.fd, sub_path_c, flags, 0) else - os.openatC(self.fd, sub_path_c, flags, 0); + os.openatZ(self.fd, sub_path_c, flags, 0); const fd = result catch |err| switch (err) { error.FileTooBig => unreachable, // can't happen for directories error.IsDir => unreachable, // we're providing O_DIRECTORY @@ -858,7 +863,7 @@ pub const Dir = struct { .fd = undefined, }; - const path_len_bytes = @intCast(u16, mem.toSliceConst(u16, sub_path_w).len * 2); + const path_len_bytes = @intCast(u16, mem.lenZ(sub_path_w) * 2); var nt_name = w.UNICODE_STRING{ .Length = path_len_bytes, .MaximumLength = path_len_bytes, @@ -916,9 +921,11 @@ pub const Dir = struct { }; } + pub const deleteFileC = @compileError("deprecated: renamed to deleteFileZ"); + /// Same as `deleteFile` except the parameter is null-terminated. - pub fn deleteFileC(self: Dir, sub_path_c: [*:0]const u8) DeleteFileError!void { - os.unlinkatC(self.fd, sub_path_c, 0) catch |err| switch (err) { + pub fn deleteFileZ(self: Dir, sub_path_c: [*:0]const u8) DeleteFileError!void { + os.unlinkatZ(self.fd, sub_path_c, 0) catch |err| switch (err) { error.DirNotEmpty => unreachable, // not passing AT_REMOVEDIR else => |e| return e, }; @@ -957,12 +964,12 @@ pub const Dir = struct { return self.deleteDirW(&sub_path_w); } const sub_path_c = try os.toPosixPath(sub_path); - return self.deleteDirC(&sub_path_c); + return self.deleteDirZ(&sub_path_c); } /// Same as `deleteDir` except the parameter is null-terminated. - pub fn deleteDirC(self: Dir, sub_path_c: [*:0]const u8) DeleteDirError!void { - os.unlinkatC(self.fd, sub_path_c, os.AT_REMOVEDIR) catch |err| switch (err) { + pub fn deleteDirZ(self: Dir, sub_path_c: [*:0]const u8) DeleteDirError!void { + os.unlinkatZ(self.fd, sub_path_c, os.AT_REMOVEDIR) catch |err| switch (err) { error.IsDir => unreachable, // not possible since we pass AT_REMOVEDIR else => |e| return e, }; @@ -982,12 +989,14 @@ pub const Dir = struct { /// Asserts that the path parameter has no null bytes. pub fn readLink(self: Dir, sub_path: []const u8, buffer: *[MAX_PATH_BYTES]u8) ![]u8 { const sub_path_c = try os.toPosixPath(sub_path); - return self.readLinkC(&sub_path_c, buffer); + return self.readLinkZ(&sub_path_c, buffer); } + pub const readLinkC = @compileError("deprecated: renamed to readLinkZ"); + /// Same as `readLink`, except the `pathname` parameter is null-terminated. - pub fn readLinkC(self: Dir, sub_path_c: [*:0]const u8, buffer: *[MAX_PATH_BYTES]u8) ![]u8 { - return os.readlinkatC(self.fd, sub_path_c, buffer); + pub fn readLinkZ(self: Dir, sub_path_c: [*:0]const u8, buffer: *[MAX_PATH_BYTES]u8) ![]u8 { + return os.readlinkatZ(self.fd, sub_path_c, buffer); } /// On success, caller owns returned buffer. @@ -1005,7 +1014,7 @@ pub const Dir = struct { max_bytes: usize, comptime A: u29, ) ![]align(A) u8 { - var file = try self.openRead(file_path); + var file = try self.openFile(file_path, .{}); defer file.close(); const size = math.cast(usize, try file.getEndPos()) catch math.maxInt(usize); @@ -1329,9 +1338,9 @@ pub const Dir = struct { pub fn atomicFile(self: Dir, dest_path: []const u8, options: AtomicFileOptions) !AtomicFile { if (path.dirname(dest_path)) |dirname| { const dir = try self.openDir(dirname, .{}); - return AtomicFile.init2(path.basename(dest_path), options.mode, dir, true); + return AtomicFile.init(path.basename(dest_path), options.mode, dir, true); } else { - return AtomicFile.init2(dest_path, options.mode, self, false); + return AtomicFile.init(dest_path, options.mode, self, false); } } }; @@ -1358,9 +1367,11 @@ pub fn openFileAbsolute(absolute_path: []const u8, flags: File.OpenFlags) File.O return cwd().openFile(absolute_path, flags); } +pub const openFileAbsoluteC = @compileError("deprecated: renamed to openFileAbsoluteZ"); + /// Same as `openFileAbsolute` but the path parameter is null-terminated. -pub fn openFileAbsoluteC(absolute_path_c: [*:0]const u8, flags: File.OpenFlags) File.OpenError!File { - assert(path.isAbsoluteC(absolute_path_c)); +pub fn openFileAbsoluteZ(absolute_path_c: [*:0]const u8, flags: File.OpenFlags) File.OpenError!File { + assert(path.isAbsoluteZ(absolute_path_c)); return cwd().openFileZ(absolute_path_c, flags); } @@ -1381,10 +1392,12 @@ pub fn createFileAbsolute(absolute_path: []const u8, flags: File.CreateFlags) Fi return cwd().createFile(absolute_path, flags); } +pub const createFileAbsoluteC = @compileError("deprecated: renamed to createFileAbsoluteZ"); + /// Same as `createFileAbsolute` but the path parameter is null-terminated. -pub fn createFileAbsoluteC(absolute_path_c: [*:0]const u8, flags: File.CreateFlags) File.OpenError!File { - assert(path.isAbsoluteC(absolute_path_c)); - return cwd().createFileC(absolute_path_c, flags); +pub fn createFileAbsoluteZ(absolute_path_c: [*:0]const u8, flags: File.CreateFlags) File.OpenError!File { + assert(path.isAbsoluteZ(absolute_path_c)); + return cwd().createFileZ(absolute_path_c, flags); } /// Same as `createFileAbsolute` but the path parameter is WTF-16 encoded. @@ -1402,10 +1415,12 @@ pub fn deleteFileAbsolute(absolute_path: []const u8) DeleteFileError!void { return cwd().deleteFile(absolute_path); } +pub const deleteFileAbsoluteC = @compileError("deprecated: renamed to deleteFileAbsoluteZ"); + /// Same as `deleteFileAbsolute` except the parameter is null-terminated. -pub fn deleteFileAbsoluteC(absolute_path_c: [*:0]const u8) DeleteFileError!void { - assert(path.isAbsoluteC(absolute_path_c)); - return cwd().deleteFileC(absolute_path_c); +pub fn deleteFileAbsoluteZ(absolute_path_c: [*:0]const u8) DeleteFileError!void { + assert(path.isAbsoluteZ(absolute_path_c)); + return cwd().deleteFileZ(absolute_path_c); } /// Same as `deleteFileAbsolute` except the parameter is WTF-16 encoded. @@ -1433,15 +1448,31 @@ pub fn deleteTreeAbsolute(absolute_path: []const u8) !void { return dir.deleteTree(path.basename(absolute_path)); } +/// Same as `Dir.readLink`, except it asserts the path is absolute. +pub fn readLinkAbsolute(pathname: []const u8, buffer: *[MAX_PATH_BYTES]u8) ![]u8 { + assert(path.isAbsolute(pathname)); + return os.readlink(pathname, buffer); +} + +/// Same as `readLink`, except the path parameter is null-terminated. +pub fn readLinkAbsoluteZ(pathname_c: [*]const u8, buffer: *[MAX_PATH_BYTES]u8) ![]u8 { + assert(path.isAbsoluteZ(pathname_c)); + return os.readlinkZ(pathname_c, buffer); +} + +pub const readLink = @compileError("deprecated; use Dir.readLink or readLinkAbsolute"); +pub const readLinkC = @compileError("deprecated; use Dir.readLinkZ or readLinkAbsoluteZ"); + pub const Walker = struct { stack: std.ArrayList(StackItem), - name_buffer: std.Buffer, + name_buffer: std.ArrayList(u8), pub const Entry = struct { /// The containing directory. This can be used to operate directly on `basename` /// rather than `path`, avoiding `error.NameTooLong` for deeply nested paths. /// The directory remains open until `next` or `deinit` is called. dir: Dir, + /// TODO make this null terminated for API convenience basename: []const u8, path: []const u8, @@ -1460,12 +1491,12 @@ pub const Walker = struct { while (true) { if (self.stack.len == 0) return null; // `top` becomes invalid after appending to `self.stack`. - const top = &self.stack.toSlice()[self.stack.len - 1]; + const top = &self.stack.span()[self.stack.len - 1]; const dirname_len = top.dirname_len; if (try top.dir_it.next()) |base| { self.name_buffer.shrink(dirname_len); - try self.name_buffer.appendByte(path.sep); - try self.name_buffer.append(base.name); + try self.name_buffer.append(path.sep); + try self.name_buffer.appendSlice(base.name); if (base.kind == .Directory) { var new_dir = top.dir_it.dir.openDir(base.name, .{ .iterate = true }) catch |err| switch (err) { error.NameTooLong => unreachable, // no path sep in base.name @@ -1475,14 +1506,14 @@ pub const Walker = struct { errdefer new_dir.close(); try self.stack.append(StackItem{ .dir_it = new_dir.iterate(), - .dirname_len = self.name_buffer.len(), + .dirname_len = self.name_buffer.len, }); } } return Entry{ .dir = top.dir_it.dir, - .basename = self.name_buffer.toSliceConst()[dirname_len + 1 ..], - .path = self.name_buffer.toSliceConst(), + .basename = self.name_buffer.span()[dirname_len + 1 ..], + .path = self.name_buffer.span(), .kind = base.kind, }; } else { @@ -1508,9 +1539,11 @@ pub fn walkPath(allocator: *Allocator, dir_path: []const u8) !Walker { var dir = try cwd().openDir(dir_path, .{ .iterate = true }); errdefer dir.close(); - var name_buffer = try std.Buffer.init(allocator, dir_path); + var name_buffer = std.ArrayList(u8).init(allocator); errdefer name_buffer.deinit(); + try name_buffer.appendSlice(dir_path); + var walker = Walker{ .stack = std.ArrayList(Walker.StackItem).init(allocator), .name_buffer = name_buffer, @@ -1524,31 +1557,21 @@ pub fn walkPath(allocator: *Allocator, dir_path: []const u8) !Walker { return walker; } -/// Deprecated; use `Dir.readLink`. -pub fn readLink(pathname: []const u8, buffer: *[MAX_PATH_BYTES]u8) ![]u8 { - return os.readlink(pathname, buffer); -} - -/// Deprecated; use `Dir.readLinkC`. -pub fn readLinkC(pathname_c: [*]const u8, buffer: *[MAX_PATH_BYTES]u8) ![]u8 { - return os.readlinkC(pathname_c, buffer); -} - pub const OpenSelfExeError = os.OpenError || os.windows.CreateFileError || SelfExePathError || os.FcntlError; pub fn openSelfExe() OpenSelfExeError!File { if (builtin.os.tag == .linux) { - return openFileAbsoluteC("/proc/self/exe", .{}); + return openFileAbsoluteZ("/proc/self/exe", .{}); } if (builtin.os.tag == .windows) { const wide_slice = selfExePathW(); const prefixed_path_w = try os.windows.wToPrefixedFileW(wide_slice); - return cwd().openReadW(&prefixed_path_w); + return cwd().openFileW(&prefixed_path_w, .{}); } var buf: [MAX_PATH_BYTES]u8 = undefined; const self_exe_path = try selfExePath(&buf); buf[self_exe_path.len] = 0; - return openFileAbsoluteC(self_exe_path[0..self_exe_path.len :0].ptr, .{}); + return openFileAbsoluteZ(self_exe_path[0..self_exe_path.len :0].ptr, .{}); } test "openSelfExe" { @@ -1582,23 +1605,23 @@ pub fn selfExePath(out_buffer: *[MAX_PATH_BYTES]u8) SelfExePathError![]u8 { var u32_len: u32 = out_buffer.len; const rc = std.c._NSGetExecutablePath(out_buffer, &u32_len); if (rc != 0) return error.NameTooLong; - return mem.toSlice(u8, @ptrCast([*:0]u8, out_buffer)); + return mem.spanZ(@ptrCast([*:0]u8, out_buffer)); } switch (builtin.os.tag) { - .linux => return os.readlinkC("/proc/self/exe", out_buffer), + .linux => return os.readlinkZ("/proc/self/exe", out_buffer), .freebsd, .dragonfly => { var mib = [4]c_int{ os.CTL_KERN, os.KERN_PROC, os.KERN_PROC_PATHNAME, -1 }; var out_len: usize = out_buffer.len; try os.sysctl(&mib, out_buffer, &out_len, null, 0); // TODO could this slice from 0 to out_len instead? - return mem.toSlice(u8, @ptrCast([*:0]u8, out_buffer)); + return mem.spanZ(@ptrCast([*:0]u8, out_buffer)); }, .netbsd => { var mib = [4]c_int{ os.CTL_KERN, os.KERN_PROC_ARGS, -1, os.KERN_PROC_PATHNAME }; var out_len: usize = out_buffer.len; try os.sysctl(&mib, out_buffer, &out_len, null, 0); // TODO could this slice from 0 to out_len instead? - return mem.toSlice(u8, @ptrCast([*:0]u8, out_buffer)); + return mem.spanZ(@ptrCast([*:0]u8, out_buffer)); }, .windows => { const utf16le_slice = selfExePathW(); @@ -1613,7 +1636,7 @@ pub fn selfExePath(out_buffer: *[MAX_PATH_BYTES]u8) SelfExePathError![]u8 { /// The result is UTF16LE-encoded. pub fn selfExePathW() [:0]const u16 { const image_path_name = &os.windows.peb().ProcessParameters.ImagePathName; - return mem.toSliceConst(u16, @ptrCast([*:0]const u16, image_path_name.Buffer)); + return mem.spanZ(@ptrCast([*:0]const u16, image_path_name.Buffer)); } /// `selfExeDirPath` except allocates the result on the heap. diff --git a/lib/std/fs/file.zig b/lib/std/fs/file.zig index 454f1e503c..52b33d5660 100644 --- a/lib/std/fs/file.zig +++ b/lib/std/fs/file.zig @@ -110,7 +110,7 @@ pub const File = struct { if (self.isTty()) { if (self.handle == os.STDOUT_FILENO or self.handle == os.STDERR_FILENO) { // Use getenvC to workaround https://github.com/ziglang/zig/issues/3511 - if (os.getenvC("TERM")) |term| { + if (os.getenvZ("TERM")) |term| { if (std.mem.eql(u8, term, "dumb")) return false; } diff --git a/lib/std/fs/get_app_data_dir.zig b/lib/std/fs/get_app_data_dir.zig index 31aab590d8..e104aa99e9 100644 --- a/lib/std/fs/get_app_data_dir.zig +++ b/lib/std/fs/get_app_data_dir.zig @@ -24,7 +24,7 @@ pub fn getAppDataDir(allocator: *mem.Allocator, appname: []const u8) GetAppDataD )) { os.windows.S_OK => { defer os.windows.ole32.CoTaskMemFree(@ptrCast(*c_void, dir_path_ptr)); - const global_dir = unicode.utf16leToUtf8Alloc(allocator, mem.toSliceConst(u16, dir_path_ptr)) catch |err| switch (err) { + const global_dir = unicode.utf16leToUtf8Alloc(allocator, mem.spanZ(dir_path_ptr)) catch |err| switch (err) { error.UnexpectedSecondSurrogateHalf => return error.AppDataDirUnavailable, error.ExpectedSecondSurrogateHalf => return error.AppDataDirUnavailable, error.DanglingSurrogateHalf => return error.AppDataDirUnavailable, diff --git a/lib/std/fs/path.zig b/lib/std/fs/path.zig index 35bc9b53b0..ba375645d5 100644 --- a/lib/std/fs/path.zig +++ b/lib/std/fs/path.zig @@ -128,11 +128,13 @@ test "join" { testJoinPosix(&[_][]const u8{ "a/", "/c" }, "a/c"); } -pub fn isAbsoluteC(path_c: [*:0]const u8) bool { +pub const isAbsoluteC = @compileError("deprecated: renamed to isAbsoluteZ"); + +pub fn isAbsoluteZ(path_c: [*:0]const u8) bool { if (builtin.os.tag == .windows) { - return isAbsoluteWindowsC(path_c); + return isAbsoluteWindowsZ(path_c); } else { - return isAbsolutePosixC(path_c); + return isAbsolutePosixZ(path_c); } } @@ -172,19 +174,23 @@ pub fn isAbsoluteWindows(path: []const u8) bool { } pub fn isAbsoluteWindowsW(path_w: [*:0]const u16) bool { - return isAbsoluteWindowsImpl(u16, mem.toSliceConst(u16, path_w)); + return isAbsoluteWindowsImpl(u16, mem.spanZ(path_w)); } -pub fn isAbsoluteWindowsC(path_c: [*:0]const u8) bool { - return isAbsoluteWindowsImpl(u8, mem.toSliceConst(u8, path_c)); +pub const isAbsoluteWindowsC = @compileError("deprecated: renamed to isAbsoluteWindowsZ"); + +pub fn isAbsoluteWindowsZ(path_c: [*:0]const u8) bool { + return isAbsoluteWindowsImpl(u8, mem.spanZ(path_c)); } pub fn isAbsolutePosix(path: []const u8) bool { return path.len > 0 and path[0] == sep_posix; } -pub fn isAbsolutePosixC(path_c: [*:0]const u8) bool { - return isAbsolutePosix(mem.toSliceConst(u8, path_c)); +pub const isAbsolutePosixC = @compileError("deprecated: renamed to isAbsolutePosixZ"); + +pub fn isAbsolutePosixZ(path_c: [*:0]const u8) bool { + return isAbsolutePosix(mem.spanZ(path_c)); } test "isAbsoluteWindows" { diff --git a/lib/std/fs/watch.zig b/lib/std/fs/watch.zig index 96fe1538e4..8c5a983735 100644 --- a/lib/std/fs/watch.zig +++ b/lib/std/fs/watch.zig @@ -326,7 +326,7 @@ pub fn Watch(comptime V: type) type { var basename_with_null_consumed = false; defer if (!basename_with_null_consumed) self.allocator.free(basename_with_null); - const wd = try os.inotify_add_watchC( + const wd = try os.inotify_add_watchZ( self.os_data.inotify_fd, dirname_with_null.ptr, os.linux.IN_CLOSE_WRITE | os.linux.IN_ONLYDIR | os.linux.IN_EXCL_UNLINK, diff --git a/lib/std/hash/adler.zig b/lib/std/hash/adler.zig index 3cc3171e49..173a07596c 100644 --- a/lib/std/hash/adler.zig +++ b/lib/std/hash/adler.zig @@ -42,18 +42,23 @@ pub const Adler32 = struct { s2 %= base; } else { - var i: usize = 0; - while (i + nmax <= input.len) : (i += nmax) { - const n = nmax / 16; // note: 16 | nmax + const n = nmax / 16; // note: 16 | nmax + var i: usize = 0; + + while (i + nmax <= input.len) { var rounds: usize = 0; while (rounds < n) : (rounds += 1) { comptime var j: usize = 0; inline while (j < 16) : (j += 1) { - s1 +%= input[i + n * j]; + s1 +%= input[i + j]; s2 +%= s1; } + i += 16; } + + s1 %= base; + s2 %= base; } if (i < input.len) { @@ -89,19 +94,35 @@ pub const Adler32 = struct { }; test "adler32 sanity" { - testing.expect(Adler32.hash("a") == 0x620062); - testing.expect(Adler32.hash("example") == 0xbc002ed); + testing.expectEqual(@as(u32, 0x620062), Adler32.hash("a")); + testing.expectEqual(@as(u32, 0xbc002ed), Adler32.hash("example")); } test "adler32 long" { const long1 = [_]u8{1} ** 1024; - testing.expect(Adler32.hash(long1[0..]) == 0x06780401); + testing.expectEqual(@as(u32, 0x06780401), Adler32.hash(long1[0..])); const long2 = [_]u8{1} ** 1025; - testing.expect(Adler32.hash(long2[0..]) == 0x0a7a0402); + testing.expectEqual(@as(u32, 0x0a7a0402), Adler32.hash(long2[0..])); } test "adler32 very long" { const long = [_]u8{1} ** 5553; - testing.expect(Adler32.hash(long[0..]) == 0x707f15b2); + testing.expectEqual(@as(u32, 0x707f15b2), Adler32.hash(long[0..])); +} + +test "adler32 very long with variation" { + const long = comptime blk: { + @setEvalBranchQuota(7000); + var result: [6000]u8 = undefined; + + var i: usize = 0; + while (i < result.len) : (i += 1) { + result[i] = @truncate(u8, i); + } + + break :blk result; + }; + + testing.expectEqual(@as(u32, 0x5af38d6e), std.hash.Adler32.hash(long[0..])); } diff --git a/lib/std/heap.zig b/lib/std/heap.zig index 8c79249d4b..e4a409b218 100644 --- a/lib/std/heap.zig +++ b/lib/std/heap.zig @@ -51,8 +51,7 @@ var wasm_page_allocator_state = Allocator{ .shrinkFn = WasmPageAllocator.shrink, }; -/// Deprecated. Use `page_allocator`. -pub const direct_allocator = page_allocator; +pub const direct_allocator = @compileError("deprecated; use std.heap.page_allocator"); const PageAllocator = struct { fn alloc(allocator: *Allocator, n: usize, alignment: u29) error{OutOfMemory}![]u8 { diff --git a/lib/std/http/headers.zig b/lib/std/http/headers.zig index 1e1e71e3eb..a455843539 100644 --- a/lib/std/http/headers.zig +++ b/lib/std/http/headers.zig @@ -129,7 +129,7 @@ pub const Headers = struct { self.index.deinit(); } { - for (self.data.toSliceConst()) |entry| { + for (self.data.span()) |entry| { entry.deinit(); } self.data.deinit(); @@ -141,14 +141,14 @@ pub const Headers = struct { errdefer other.deinit(); try other.data.ensureCapacity(self.data.len); try other.index.initCapacity(self.index.entries.len); - for (self.data.toSliceConst()) |entry| { + for (self.data.span()) |entry| { try other.append(entry.name, entry.value, entry.never_index); } return other; } pub fn toSlice(self: Self) []const HeaderEntry { - return self.data.toSliceConst(); + return self.data.span(); } pub fn append(self: *Self, name: []const u8, value: []const u8, never_index: ?bool) !void { @@ -279,7 +279,7 @@ pub const Headers = struct { const buf = try allocator.alloc(HeaderEntry, dex.len); var n: usize = 0; - for (dex.toSliceConst()) |idx| { + for (dex.span()) |idx| { buf[n] = self.data.at(idx); n += 1; } @@ -302,7 +302,7 @@ pub const Headers = struct { // adapted from mem.join const total_len = blk: { var sum: usize = dex.len - 1; // space for separator(s) - for (dex.toSliceConst()) |idx| + for (dex.span()) |idx| sum += self.data.at(idx).value.len; break :blk sum; }; @@ -334,7 +334,7 @@ pub const Headers = struct { } } { // fill up indexes again; we know capacity is fine from before - for (self.data.toSliceConst()) |entry, i| { + for (self.data.span()) |entry, i| { var dex = &self.index.get(entry.name).?.value; dex.appendAssumeCapacity(i); } @@ -495,8 +495,8 @@ test "Headers.getIndices" { try h.append("set-cookie", "y=2", null); testing.expect(null == h.getIndices("not-present")); - testing.expectEqualSlices(usize, &[_]usize{0}, h.getIndices("foo").?.toSliceConst()); - testing.expectEqualSlices(usize, &[_]usize{ 1, 2 }, h.getIndices("set-cookie").?.toSliceConst()); + testing.expectEqualSlices(usize, &[_]usize{0}, h.getIndices("foo").?.span()); + testing.expectEqualSlices(usize, &[_]usize{ 1, 2 }, h.getIndices("set-cookie").?.span()); } test "Headers.get" { diff --git a/lib/std/io.zig b/lib/std/io.zig index 243dd5ca95..b498f2a299 100644 --- a/lib/std/io.zig +++ b/lib/std/io.zig @@ -128,16 +128,6 @@ pub const BufferedAtomicFile = @import("io/buffered_atomic_file.zig").BufferedAt pub const StreamSource = @import("io/stream_source.zig").StreamSource; -/// Deprecated; use `std.fs.Dir.writeFile`. -pub fn writeFile(path: []const u8, data: []const u8) !void { - return fs.cwd().writeFile(path, data); -} - -/// Deprecated; use `std.fs.Dir.readFileAlloc`. -pub fn readFileAlloc(allocator: *mem.Allocator, path: []const u8) ![]u8 { - return fs.cwd().readFileAlloc(allocator, path, math.maxInt(usize)); -} - /// An OutStream that doesn't write to anything. pub const null_out_stream = @as(NullOutStream, .{ .context = {} }); @@ -151,5 +141,22 @@ test "null_out_stream" { } test "" { + _ = @import("io/bit_in_stream.zig"); + _ = @import("io/bit_out_stream.zig"); + _ = @import("io/buffered_atomic_file.zig"); + _ = @import("io/buffered_in_stream.zig"); + _ = @import("io/buffered_out_stream.zig"); + _ = @import("io/c_out_stream.zig"); + _ = @import("io/counting_out_stream.zig"); + _ = @import("io/fixed_buffer_stream.zig"); + _ = @import("io/in_stream.zig"); + _ = @import("io/out_stream.zig"); + _ = @import("io/peek_stream.zig"); + _ = @import("io/seekable_stream.zig"); + _ = @import("io/serialization.zig"); + _ = @import("io/stream_source.zig"); _ = @import("io/test.zig"); } + +pub const writeFile = @compileError("deprecated: use std.fs.Dir.writeFile with math.maxInt(usize)"); +pub const readFileAlloc = @compileError("deprecated: use std.fs.Dir.readFileAlloc"); diff --git a/lib/std/io/buffered_atomic_file.zig b/lib/std/io/buffered_atomic_file.zig index e2f8c75af0..b450a578ce 100644 --- a/lib/std/io/buffered_atomic_file.zig +++ b/lib/std/io/buffered_atomic_file.zig @@ -15,6 +15,7 @@ pub const BufferedAtomicFile = struct { /// TODO when https://github.com/ziglang/zig/issues/2761 is solved /// this API will not need an allocator + /// TODO integrate this with Dir API pub fn create(allocator: *mem.Allocator, dest_path: []const u8) !*BufferedAtomicFile { var self = try allocator.create(BufferedAtomicFile); self.* = BufferedAtomicFile{ @@ -25,7 +26,7 @@ pub const BufferedAtomicFile = struct { }; errdefer allocator.destroy(self); - self.atomic_file = try fs.AtomicFile.init(dest_path, File.default_mode); + self.atomic_file = try fs.cwd().atomicFile(dest_path, .{}); errdefer self.atomic_file.deinit(); self.file_stream = self.atomic_file.file.outStream(); diff --git a/lib/std/io/c_out_stream.zig b/lib/std/io/c_out_stream.zig index 106fc601a2..119b7f9d29 100644 --- a/lib/std/io/c_out_stream.zig +++ b/lib/std/io/c_out_stream.zig @@ -36,9 +36,9 @@ test "" { const out_file = std.c.fopen(filename, "w") orelse return error.UnableToOpenTestFile; defer { _ = std.c.fclose(out_file); - fs.cwd().deleteFileC(filename) catch {}; + std.fs.cwd().deleteFileZ(filename) catch {}; } - const out_stream = &io.COutStream.init(out_file).stream; + const out_stream = cOutStream(out_file); try out_stream.print("hi: {}\n", .{@as(i32, 123)}); } diff --git a/lib/std/io/in_stream.zig b/lib/std/io/in_stream.zig index d1d24ab427..340995198f 100644 --- a/lib/std/io/in_stream.zig +++ b/lib/std/io/in_stream.zig @@ -3,7 +3,6 @@ const builtin = std.builtin; const math = std.math; const assert = std.debug.assert; const mem = std.mem; -const Buffer = std.Buffer; const testing = std.testing; pub fn InStream( @@ -48,13 +47,7 @@ pub fn InStream( if (amt_read < buf.len) return error.EndOfStream; } - /// Deprecated: use `readAllArrayList`. - pub fn readAllBuffer(self: Self, buffer: *Buffer, max_size: usize) !void { - buffer.list.shrink(0); - try self.readAllArrayList(&buffer.list, max_size); - errdefer buffer.shrink(0); - try buffer.list.append(0); - } + pub const readAllBuffer = @compileError("deprecated; use readAllArrayList()"); /// Appends to the `std.ArrayList` contents by reading from the stream until end of stream is found. /// If the number of bytes appended would exceed `max_append_size`, `error.StreamTooLong` is returned diff --git a/lib/std/io/peek_stream.zig b/lib/std/io/peek_stream.zig index 5ee30ce273..3362efe419 100644 --- a/lib/std/io/peek_stream.zig +++ b/lib/std/io/peek_stream.zig @@ -24,7 +24,7 @@ pub fn PeekStream( .Static => struct { pub fn init(base: InStreamType) Self { return .{ - .base = base, + .unbuffered_in_stream = base, .fifo = FifoType.init(), }; } @@ -32,7 +32,7 @@ pub fn PeekStream( .Slice => struct { pub fn init(base: InStreamType, buf: []u8) Self { return .{ - .base = base, + .unbuffered_in_stream = base, .fifo = FifoType.init(buf), }; } @@ -40,7 +40,7 @@ pub fn PeekStream( .Dynamic => struct { pub fn init(base: InStreamType, allocator: *mem.Allocator) Self { return .{ - .base = base, + .unbuffered_in_stream = base, .fifo = FifoType.init(allocator), }; } @@ -61,7 +61,7 @@ pub fn PeekStream( if (dest_index == dest.len) return dest_index; // ask the backing stream for more - dest_index += try self.base.read(dest[dest_index..]); + dest_index += try self.unbuffered_in_stream.read(dest[dest_index..]); return dest_index; } diff --git a/lib/std/io/serialization.zig b/lib/std/io/serialization.zig index da04c63661..6ce18b780c 100644 --- a/lib/std/io/serialization.zig +++ b/lib/std/io/serialization.zig @@ -5,6 +5,7 @@ const assert = std.debug.assert; const math = std.math; const meta = std.meta; const trait = meta.trait; +const testing = std.testing; pub const Packing = enum { /// Pack data to byte alignment @@ -273,7 +274,7 @@ pub fn Serializer(comptime endian: builtin.Endian, comptime packing: Packing, co if (comptime trait.hasFn("serialize")(T)) return T.serialize(value, self); if (comptime trait.isPacked(T) and packing != .Bit) { - var packed_serializer = Serializer(endian, .Bit, Error).init(self.out_stream); + var packed_serializer = Serializer(endian, .Bit, OutStreamType).init(self.out_stream); try packed_serializer.serialize(value); try packed_serializer.flush(); return; @@ -364,28 +365,28 @@ fn testIntSerializerDeserializer(comptime endian: builtin.Endian, comptime packi var data_mem: [total_bytes]u8 = undefined; var out = io.fixedBufferStream(&data_mem); - var serializer = serializer(endian, packing, out.outStream()); + var _serializer = serializer(endian, packing, out.outStream()); var in = io.fixedBufferStream(&data_mem); - var deserializer = Deserializer(endian, packing, in.inStream()); + var _deserializer = deserializer(endian, packing, in.inStream()); comptime var i = 0; inline while (i <= max_test_bitsize) : (i += 1) { const U = std.meta.IntType(false, i); const S = std.meta.IntType(true, i); - try serializer.serializeInt(@as(U, i)); - if (i != 0) try serializer.serializeInt(@as(S, -1)) else try serializer.serialize(@as(S, 0)); + try _serializer.serializeInt(@as(U, i)); + if (i != 0) try _serializer.serializeInt(@as(S, -1)) else try _serializer.serialize(@as(S, 0)); } - try serializer.flush(); + try _serializer.flush(); i = 0; inline while (i <= max_test_bitsize) : (i += 1) { const U = std.meta.IntType(false, i); const S = std.meta.IntType(true, i); - const x = try deserializer.deserializeInt(U); - const y = try deserializer.deserializeInt(S); - expect(x == @as(U, i)); - if (i != 0) expect(y == @as(S, -1)) else expect(y == 0); + const x = try _deserializer.deserializeInt(U); + const y = try _deserializer.deserializeInt(S); + testing.expect(x == @as(U, i)); + if (i != 0) testing.expect(y == @as(S, -1)) else testing.expect(y == 0); } const u8_bit_count = comptime meta.bitCount(u8); @@ -395,7 +396,7 @@ fn testIntSerializerDeserializer(comptime endian: builtin.Endian, comptime packi const extra_packed_byte = @boolToInt(total_bits % u8_bit_count > 0); const total_packed_bytes = (total_bits / u8_bit_count) + extra_packed_byte; - expect(in.pos == if (packing == .Bit) total_packed_bytes else total_bytes); + testing.expect(in.pos == if (packing == .Bit) total_packed_bytes else total_bytes); //Verify that empty error set works with serializer. //deserializer is covered by FixedBufferStream @@ -421,35 +422,35 @@ fn testIntSerializerDeserializerInfNaN( var data_mem: [mem_size]u8 = undefined; var out = io.fixedBufferStream(&data_mem); - var serializer = serializer(endian, packing, out.outStream()); + var _serializer = serializer(endian, packing, out.outStream()); var in = io.fixedBufferStream(&data_mem); - var deserializer = deserializer(endian, packing, in.inStream()); + var _deserializer = deserializer(endian, packing, in.inStream()); //@TODO: isInf/isNan not currently implemented for f128. - try serializer.serialize(std.math.nan(f16)); - try serializer.serialize(std.math.inf(f16)); - try serializer.serialize(std.math.nan(f32)); - try serializer.serialize(std.math.inf(f32)); - try serializer.serialize(std.math.nan(f64)); - try serializer.serialize(std.math.inf(f64)); + try _serializer.serialize(std.math.nan(f16)); + try _serializer.serialize(std.math.inf(f16)); + try _serializer.serialize(std.math.nan(f32)); + try _serializer.serialize(std.math.inf(f32)); + try _serializer.serialize(std.math.nan(f64)); + try _serializer.serialize(std.math.inf(f64)); //try serializer.serialize(std.math.nan(f128)); //try serializer.serialize(std.math.inf(f128)); - const nan_check_f16 = try deserializer.deserialize(f16); - const inf_check_f16 = try deserializer.deserialize(f16); - const nan_check_f32 = try deserializer.deserialize(f32); - deserializer.alignToByte(); - const inf_check_f32 = try deserializer.deserialize(f32); - const nan_check_f64 = try deserializer.deserialize(f64); - const inf_check_f64 = try deserializer.deserialize(f64); + const nan_check_f16 = try _deserializer.deserialize(f16); + const inf_check_f16 = try _deserializer.deserialize(f16); + const nan_check_f32 = try _deserializer.deserialize(f32); + _deserializer.alignToByte(); + const inf_check_f32 = try _deserializer.deserialize(f32); + const nan_check_f64 = try _deserializer.deserialize(f64); + const inf_check_f64 = try _deserializer.deserialize(f64); //const nan_check_f128 = try deserializer.deserialize(f128); //const inf_check_f128 = try deserializer.deserialize(f128); - expect(std.math.isNan(nan_check_f16)); - expect(std.math.isInf(inf_check_f16)); - expect(std.math.isNan(nan_check_f32)); - expect(std.math.isInf(inf_check_f32)); - expect(std.math.isNan(nan_check_f64)); - expect(std.math.isInf(inf_check_f64)); + testing.expect(std.math.isNan(nan_check_f16)); + testing.expect(std.math.isInf(inf_check_f16)); + testing.expect(std.math.isNan(nan_check_f32)); + testing.expect(std.math.isInf(inf_check_f32)); + testing.expect(std.math.isNan(nan_check_f64)); + testing.expect(std.math.isInf(inf_check_f64)); //expect(std.math.isNan(nan_check_f128)); //expect(std.math.isInf(inf_check_f128)); } @@ -461,8 +462,8 @@ test "Serializer/Deserializer Int: Inf/NaN" { try testIntSerializerDeserializerInfNaN(.Little, .Bit); } -fn testAlternateSerializer(self: var, serializer: var) !void { - try serializer.serialize(self.f_f16); +fn testAlternateSerializer(self: var, _serializer: var) !void { + try _serializer.serialize(self.f_f16); } fn testSerializerDeserializer(comptime endian: builtin.Endian, comptime packing: io.Packing) !void { @@ -502,8 +503,8 @@ fn testSerializerDeserializer(comptime endian: builtin.Endian, comptime packing: f_f16: f16, f_unused_u32: u32, - pub fn deserialize(self: *@This(), deserializer: var) !void { - try deserializer.deserializeInto(&self.f_f16); + pub fn deserialize(self: *@This(), _deserializer: var) !void { + try _deserializer.deserializeInto(&self.f_f16); self.f_unused_u32 = 47; } @@ -550,15 +551,15 @@ fn testSerializerDeserializer(comptime endian: builtin.Endian, comptime packing: var data_mem: [@sizeOf(MyStruct)]u8 = undefined; var out = io.fixedBufferStream(&data_mem); - var serializer = serializer(endian, packing, out.outStream()); + var _serializer = serializer(endian, packing, out.outStream()); var in = io.fixedBufferStream(&data_mem); - var deserializer = deserializer(endian, packing, in.inStream()); + var _deserializer = deserializer(endian, packing, in.inStream()); - try serializer.serialize(my_inst); + try _serializer.serialize(my_inst); - const my_copy = try deserializer.deserialize(MyStruct); - expect(meta.eql(my_copy, my_inst)); + const my_copy = try _deserializer.deserialize(MyStruct); + testing.expect(meta.eql(my_copy, my_inst)); } test "Serializer/Deserializer generic" { @@ -584,18 +585,18 @@ fn testBadData(comptime endian: builtin.Endian, comptime packing: io.Packing) !v }; var data_mem: [4]u8 = undefined; - var out = io.fixedBufferStream.init(&data_mem); - var serializer = serializer(endian, packing, out.outStream()); + var out = io.fixedBufferStream(&data_mem); + var _serializer = serializer(endian, packing, out.outStream()); var in = io.fixedBufferStream(&data_mem); - var deserializer = deserializer(endian, packing, in.inStream()); + var _deserializer = deserializer(endian, packing, in.inStream()); - try serializer.serialize(@as(u14, 3)); - expectError(error.InvalidEnumTag, deserializer.deserialize(A)); + try _serializer.serialize(@as(u14, 3)); + testing.expectError(error.InvalidEnumTag, _deserializer.deserialize(A)); out.pos = 0; - try serializer.serialize(@as(u14, 3)); - try serializer.serialize(@as(u14, 88)); - expectError(error.InvalidEnumTag, deserializer.deserialize(C)); + try _serializer.serialize(@as(u14, 3)); + try _serializer.serialize(@as(u14, 88)); + testing.expectError(error.InvalidEnumTag, _deserializer.deserialize(C)); } test "Deserializer bad data" { diff --git a/lib/std/json.zig b/lib/std/json.zig index 49afb6bea6..12020e6e25 100644 --- a/lib/std/json.zig +++ b/lib/std/json.zig @@ -1233,43 +1233,120 @@ pub const Value = union(enum) { Array: Array, Object: ObjectMap, + pub fn jsonStringify( + value: @This(), + options: StringifyOptions, + out_stream: var, + ) @TypeOf(out_stream).Error!void { + switch (value) { + .Null => try stringify(null, options, out_stream), + .Bool => |inner| try stringify(inner, options, out_stream), + .Integer => |inner| try stringify(inner, options, out_stream), + .Float => |inner| try stringify(inner, options, out_stream), + .String => |inner| try stringify(inner, options, out_stream), + .Array => |inner| try stringify(inner.span(), options, out_stream), + .Object => |inner| { + try out_stream.writeByte('{'); + var field_output = false; + var child_options = options; + if (child_options.whitespace) |*child_whitespace| { + child_whitespace.indent_level += 1; + } + var it = inner.iterator(); + while (it.next()) |entry| { + if (!field_output) { + field_output = true; + } else { + try out_stream.writeByte(','); + } + if (child_options.whitespace) |child_whitespace| { + try out_stream.writeByte('\n'); + try child_whitespace.outputIndent(out_stream); + } + + try stringify(entry.key, options, out_stream); + try out_stream.writeByte(':'); + if (child_options.whitespace) |child_whitespace| { + if (child_whitespace.separator) { + try out_stream.writeByte(' '); + } + } + try stringify(entry.value, child_options, out_stream); + } + if (field_output) { + if (options.whitespace) |whitespace| { + try out_stream.writeByte('\n'); + try whitespace.outputIndent(out_stream); + } + } + try out_stream.writeByte('}'); + }, + } + } + pub fn dump(self: Value) void { var held = std.debug.getStderrMutex().acquire(); defer held.release(); const stderr = std.debug.getStderrStream(); - self.dumpStream(stderr, 1024) catch return; - } - - pub fn dumpIndent(self: Value, comptime indent: usize) void { - if (indent == 0) { - self.dump(); - } else { - var held = std.debug.getStderrMutex().acquire(); - defer held.release(); - - const stderr = std.debug.getStderrStream(); - self.dumpStreamIndent(indent, stderr, 1024) catch return; - } - } - - pub fn dumpStream(self: @This(), stream: var, comptime max_depth: usize) !void { - var w = std.json.WriteStream(@TypeOf(stream).Child, max_depth).init(stream); - w.newline = ""; - w.one_indent = ""; - w.space = ""; - try w.emitJson(self); - } - - pub fn dumpStreamIndent(self: @This(), comptime indent: usize, stream: var, comptime max_depth: usize) !void { - var one_indent = " " ** indent; - - var w = std.json.WriteStream(@TypeOf(stream).Child, max_depth).init(stream); - w.one_indent = one_indent; - try w.emitJson(self); + std.json.stringify(self, std.json.StringifyOptions{ .whitespace = null }, stderr) catch return; } }; +test "Value.jsonStringify" { + { + var buffer: [10]u8 = undefined; + var fbs = std.io.fixedBufferStream(&buffer); + try @as(Value, .Null).jsonStringify(.{}, fbs.outStream()); + testing.expectEqualSlices(u8, fbs.getWritten(), "null"); + } + { + var buffer: [10]u8 = undefined; + var fbs = std.io.fixedBufferStream(&buffer); + try (Value{ .Bool = true }).jsonStringify(.{}, fbs.outStream()); + testing.expectEqualSlices(u8, fbs.getWritten(), "true"); + } + { + var buffer: [10]u8 = undefined; + var fbs = std.io.fixedBufferStream(&buffer); + try (Value{ .Integer = 42 }).jsonStringify(.{}, fbs.outStream()); + testing.expectEqualSlices(u8, fbs.getWritten(), "42"); + } + { + var buffer: [10]u8 = undefined; + var fbs = std.io.fixedBufferStream(&buffer); + try (Value{ .Float = 42 }).jsonStringify(.{}, fbs.outStream()); + testing.expectEqualSlices(u8, fbs.getWritten(), "4.2e+01"); + } + { + var buffer: [10]u8 = undefined; + var fbs = std.io.fixedBufferStream(&buffer); + try (Value{ .String = "weeee" }).jsonStringify(.{}, fbs.outStream()); + testing.expectEqualSlices(u8, fbs.getWritten(), "\"weeee\""); + } + { + var buffer: [10]u8 = undefined; + var fbs = std.io.fixedBufferStream(&buffer); + try (Value{ + .Array = Array.fromOwnedSlice(undefined, &[_]Value{ + .{ .Integer = 1 }, + .{ .Integer = 2 }, + .{ .Integer = 3 }, + }), + }).jsonStringify(.{}, fbs.outStream()); + testing.expectEqualSlices(u8, fbs.getWritten(), "[1,2,3]"); + } + { + var buffer: [10]u8 = undefined; + var fbs = std.io.fixedBufferStream(&buffer); + var obj = ObjectMap.init(testing.allocator); + defer obj.deinit(); + try obj.putNoClobber("a", .{ .String = "b" }); + try (Value{ .Object = obj }).jsonStringify(.{}, fbs.outStream()); + testing.expectEqualSlices(u8, fbs.getWritten(), "{\"a\":\"b\"}"); + } +} + pub const ParseOptions = struct { allocator: ?*Allocator = null, @@ -1658,9 +1735,6 @@ test "parse into tagged union" { } test "parseFree descends into tagged union" { - // tagged unions are broken on arm64: https://github.com/ziglang/zig/issues/4492 - if (std.builtin.arch == .aarch64) return error.SkipZigTest; - var fail_alloc = testing.FailingAllocator.init(testing.allocator, 1); const options = ParseOptions{ .allocator = &fail_alloc.allocator }; const T = union(enum) { @@ -1947,7 +2021,7 @@ pub const Parser = struct { } fn pushToParent(p: *Parser, value: *const Value) !void { - switch (p.stack.toSlice()[p.stack.len - 1]) { + switch (p.stack.span()[p.stack.len - 1]) { // Object Parent -> [ ..., object, , value ] Value.String => |key| { _ = p.stack.pop(); @@ -2244,11 +2318,86 @@ test "string copy option" { } pub const StringifyOptions = struct { - // TODO: indentation options? - // TODO: make escaping '/' in strings optional? - // TODO: allow picking if []u8 is string or array? + pub const Whitespace = struct { + /// How many indentation levels deep are we? + indent_level: usize = 0, + + pub const Indentation = union(enum) { + Space: u8, + Tab: void, + }; + + /// What character(s) should be used for indentation? + indent: Indentation = Indentation{ .Space = 4 }, + + fn outputIndent( + whitespace: @This(), + out_stream: var, + ) @TypeOf(out_stream).Error!void { + var char: u8 = undefined; + var n_chars: usize = undefined; + switch (whitespace.indent) { + .Space => |n_spaces| { + char = ' '; + n_chars = n_spaces; + }, + .Tab => { + char = '\t'; + n_chars = 1; + }, + } + n_chars *= whitespace.indent_level; + try out_stream.writeByteNTimes(char, n_chars); + } + + /// After a colon, should whitespace be inserted? + separator: bool = true, + }; + + /// Controls the whitespace emitted + whitespace: ?Whitespace = null, + + /// Should []u8 be serialised as a string? or an array? + pub const StringOptions = union(enum) { + Array, + + /// String output options + const StringOutputOptions = struct { + /// Should '/' be escaped in strings? + escape_solidus: bool = false, + + /// Should unicode characters be escaped in strings? + escape_unicode: bool = false, + }; + String: StringOutputOptions, + }; + + string: StringOptions = StringOptions{ .String = .{} }, }; +fn outputUnicodeEscape( + codepoint: u21, + out_stream: var, +) !void { + if (codepoint <= 0xFFFF) { + // If the character is in the Basic Multilingual Plane (U+0000 through U+FFFF), + // then it may be represented as a six-character sequence: a reverse solidus, followed + // by the lowercase letter u, followed by four hexadecimal digits that encode the character's code point. + try out_stream.writeAll("\\u"); + try std.fmt.formatIntValue(codepoint, "x", std.fmt.FormatOptions{ .width = 4, .fill = '0' }, out_stream); + } else { + assert(codepoint <= 0x10FFFF); + // To escape an extended character that is not in the Basic Multilingual Plane, + // the character is represented as a 12-character sequence, encoding the UTF-16 surrogate pair. + const high = @intCast(u16, (codepoint - 0x10000) >> 10) + 0xD800; + const low = @intCast(u16, codepoint & 0x3FF) + 0xDC00; + try out_stream.writeAll("\\u"); + try std.fmt.formatIntValue(high, "x", std.fmt.FormatOptions{ .width = 4, .fill = '0' }, out_stream); + try out_stream.writeAll("\\u"); + try std.fmt.formatIntValue(low, "x", std.fmt.FormatOptions{ .width = 4, .fill = '0' }, out_stream); + } +} + pub fn stringify( value: var, options: StringifyOptions, @@ -2265,11 +2414,14 @@ pub fn stringify( .Bool => { return out_stream.writeAll(if (value) "true" else "false"); }, + .Null => { + return out_stream.writeAll("null"); + }, .Optional => { if (value) |payload| { return try stringify(payload, options, out_stream); } else { - return out_stream.writeAll("null"); + return try stringify(null, options, out_stream); } }, .Enum => { @@ -2300,8 +2452,12 @@ pub fn stringify( return value.jsonStringify(options, out_stream); } - try out_stream.writeAll("{"); + try out_stream.writeByte('{'); comptime var field_output = false; + var child_options = options; + if (child_options.whitespace) |*child_whitespace| { + child_whitespace.indent_level += 1; + } inline for (S.fields) |Field, field_i| { // don't include void fields if (Field.field_type == void) continue; @@ -2309,14 +2465,28 @@ pub fn stringify( if (!field_output) { field_output = true; } else { - try out_stream.writeAll(","); + try out_stream.writeByte(','); + } + if (child_options.whitespace) |child_whitespace| { + try out_stream.writeByte('\n'); + try child_whitespace.outputIndent(out_stream); } - try stringify(Field.name, options, out_stream); - try out_stream.writeAll(":"); - try stringify(@field(value, Field.name), options, out_stream); + try out_stream.writeByte(':'); + if (child_options.whitespace) |child_whitespace| { + if (child_whitespace.separator) { + try out_stream.writeByte(' '); + } + } + try stringify(@field(value, Field.name), child_options, out_stream); } - try out_stream.writeAll("}"); + if (field_output) { + if (options.whitespace) |whitespace| { + try out_stream.writeByte('\n'); + try whitespace.outputIndent(out_stream); + } + } + try out_stream.writeByte('}'); return; }, .Pointer => |ptr_info| switch (ptr_info.size) { @@ -2332,17 +2502,26 @@ pub fn stringify( }, // TODO: .Many when there is a sentinel (waiting for https://github.com/ziglang/zig/pull/3972) .Slice => { - if (ptr_info.child == u8 and std.unicode.utf8ValidateSlice(value)) { - try out_stream.writeAll("\""); + if (ptr_info.child == u8 and options.string == .String and std.unicode.utf8ValidateSlice(value)) { + try out_stream.writeByte('\"'); var i: usize = 0; while (i < value.len) : (i += 1) { switch (value[i]) { - // normal ascii characters - 0x20...0x21, 0x23...0x2E, 0x30...0x5B, 0x5D...0x7F => try out_stream.writeAll(value[i .. i + 1]), - // control characters with short escapes + // normal ascii character + 0x20...0x21, 0x23...0x2E, 0x30...0x5B, 0x5D...0x7F => |c| try out_stream.writeByte(c), + // only 2 characters that *must* be escaped '\\' => try out_stream.writeAll("\\\\"), '\"' => try out_stream.writeAll("\\\""), - '/' => try out_stream.writeAll("\\/"), + // solidus is optional to escape + '/' => { + if (options.string.String.escape_solidus) { + try out_stream.writeAll("\\/"); + } else { + try out_stream.writeByte('\\'); + } + }, + // control characters with short escapes + // TODO: option to switch between unicode and 'short' forms? 0x8 => try out_stream.writeAll("\\b"), 0xC => try out_stream.writeAll("\\f"), '\n' => try out_stream.writeAll("\\n"), @@ -2350,39 +2529,43 @@ pub fn stringify( '\t' => try out_stream.writeAll("\\t"), else => { const ulen = std.unicode.utf8ByteSequenceLength(value[i]) catch unreachable; - const codepoint = std.unicode.utf8Decode(value[i .. i + ulen]) catch unreachable; - if (codepoint <= 0xFFFF) { - // If the character is in the Basic Multilingual Plane (U+0000 through U+FFFF), - // then it may be represented as a six-character sequence: a reverse solidus, followed - // by the lowercase letter u, followed by four hexadecimal digits that encode the character's code point. - try out_stream.writeAll("\\u"); - try std.fmt.formatIntValue(codepoint, "x", std.fmt.FormatOptions{ .width = 4, .fill = '0' }, out_stream); + // control characters (only things left with 1 byte length) should always be printed as unicode escapes + if (ulen == 1 or options.string.String.escape_unicode) { + const codepoint = std.unicode.utf8Decode(value[i .. i + ulen]) catch unreachable; + try outputUnicodeEscape(codepoint, out_stream); } else { - // To escape an extended character that is not in the Basic Multilingual Plane, - // the character is represented as a 12-character sequence, encoding the UTF-16 surrogate pair. - const high = @intCast(u16, (codepoint - 0x10000) >> 10) + 0xD800; - const low = @intCast(u16, codepoint & 0x3FF) + 0xDC00; - try out_stream.writeAll("\\u"); - try std.fmt.formatIntValue(high, "x", std.fmt.FormatOptions{ .width = 4, .fill = '0' }, out_stream); - try out_stream.writeAll("\\u"); - try std.fmt.formatIntValue(low, "x", std.fmt.FormatOptions{ .width = 4, .fill = '0' }, out_stream); + try out_stream.writeAll(value[i .. i + ulen]); } i += ulen - 1; }, } } - try out_stream.writeAll("\""); + try out_stream.writeByte('\"'); return; } - try out_stream.writeAll("["); + try out_stream.writeByte('['); + var child_options = options; + if (child_options.whitespace) |*whitespace| { + whitespace.indent_level += 1; + } for (value) |x, i| { if (i != 0) { - try out_stream.writeAll(","); + try out_stream.writeByte(','); } - try stringify(x, options, out_stream); + if (child_options.whitespace) |child_whitespace| { + try out_stream.writeByte('\n'); + try child_whitespace.outputIndent(out_stream); + } + try stringify(x, child_options, out_stream); } - try out_stream.writeAll("]"); + if (value.len != 0) { + if (options.whitespace) |whitespace| { + try out_stream.writeByte('\n'); + try whitespace.outputIndent(out_stream); + } + } + try out_stream.writeByte(']'); return; }, else => @compileError("Unable to stringify type '" ++ @typeName(T) ++ "'"), @@ -2393,7 +2576,7 @@ pub fn stringify( unreachable; } -fn teststringify(expected: []const u8, value: var) !void { +fn teststringify(expected: []const u8, value: var, options: StringifyOptions) !void { const ValidationOutStream = struct { const Self = @This(); pub const OutStream = std.io.OutStream(*Self, Error, write); @@ -2445,55 +2628,105 @@ fn teststringify(expected: []const u8, value: var) !void { }; var vos = ValidationOutStream.init(expected); - try stringify(value, StringifyOptions{}, vos.outStream()); + try stringify(value, options, vos.outStream()); if (vos.expected_remaining.len > 0) return error.NotEnoughData; } test "stringify basic types" { - try teststringify("false", false); - try teststringify("true", true); - try teststringify("null", @as(?u8, null)); - try teststringify("null", @as(?*u32, null)); - try teststringify("42", 42); - try teststringify("4.2e+01", 42.0); - try teststringify("42", @as(u8, 42)); - try teststringify("42", @as(u128, 42)); - try teststringify("4.2e+01", @as(f32, 42)); - try teststringify("4.2e+01", @as(f64, 42)); + try teststringify("false", false, StringifyOptions{}); + try teststringify("true", true, StringifyOptions{}); + try teststringify("null", @as(?u8, null), StringifyOptions{}); + try teststringify("null", @as(?*u32, null), StringifyOptions{}); + try teststringify("42", 42, StringifyOptions{}); + try teststringify("4.2e+01", 42.0, StringifyOptions{}); + try teststringify("42", @as(u8, 42), StringifyOptions{}); + try teststringify("42", @as(u128, 42), StringifyOptions{}); + try teststringify("4.2e+01", @as(f32, 42), StringifyOptions{}); + try teststringify("4.2e+01", @as(f64, 42), StringifyOptions{}); } test "stringify string" { - try teststringify("\"hello\"", "hello"); - try teststringify("\"with\\nescapes\\r\"", "with\nescapes\r"); - try teststringify("\"with unicode\\u0001\"", "with unicode\u{1}"); - try teststringify("\"with unicode\\u0080\"", "with unicode\u{80}"); - try teststringify("\"with unicode\\u00ff\"", "with unicode\u{FF}"); - try teststringify("\"with unicode\\u0100\"", "with unicode\u{100}"); - try teststringify("\"with unicode\\u0800\"", "with unicode\u{800}"); - try teststringify("\"with unicode\\u8000\"", "with unicode\u{8000}"); - try teststringify("\"with unicode\\ud799\"", "with unicode\u{D799}"); - try teststringify("\"with unicode\\ud800\\udc00\"", "with unicode\u{10000}"); - try teststringify("\"with unicode\\udbff\\udfff\"", "with unicode\u{10FFFF}"); + try teststringify("\"hello\"", "hello", StringifyOptions{}); + try teststringify("\"with\\nescapes\\r\"", "with\nescapes\r", StringifyOptions{}); + try teststringify("\"with\\nescapes\\r\"", "with\nescapes\r", StringifyOptions{ .string = .{ .String = .{ .escape_unicode = true } } }); + try teststringify("\"with unicode\\u0001\"", "with unicode\u{1}", StringifyOptions{}); + try teststringify("\"with unicode\\u0001\"", "with unicode\u{1}", StringifyOptions{ .string = .{ .String = .{ .escape_unicode = true } } }); + try teststringify("\"with unicode\u{80}\"", "with unicode\u{80}", StringifyOptions{}); + try teststringify("\"with unicode\\u0080\"", "with unicode\u{80}", StringifyOptions{ .string = .{ .String = .{ .escape_unicode = true } } }); + try teststringify("\"with unicode\u{FF}\"", "with unicode\u{FF}", StringifyOptions{}); + try teststringify("\"with unicode\\u00ff\"", "with unicode\u{FF}", StringifyOptions{ .string = .{ .String = .{ .escape_unicode = true } } }); + try teststringify("\"with unicode\u{100}\"", "with unicode\u{100}", StringifyOptions{}); + try teststringify("\"with unicode\\u0100\"", "with unicode\u{100}", StringifyOptions{ .string = .{ .String = .{ .escape_unicode = true } } }); + try teststringify("\"with unicode\u{800}\"", "with unicode\u{800}", StringifyOptions{}); + try teststringify("\"with unicode\\u0800\"", "with unicode\u{800}", StringifyOptions{ .string = .{ .String = .{ .escape_unicode = true } } }); + try teststringify("\"with unicode\u{8000}\"", "with unicode\u{8000}", StringifyOptions{}); + try teststringify("\"with unicode\\u8000\"", "with unicode\u{8000}", StringifyOptions{ .string = .{ .String = .{ .escape_unicode = true } } }); + try teststringify("\"with unicode\u{D799}\"", "with unicode\u{D799}", StringifyOptions{}); + try teststringify("\"with unicode\\ud799\"", "with unicode\u{D799}", StringifyOptions{ .string = .{ .String = .{ .escape_unicode = true } } }); + try teststringify("\"with unicode\u{10000}\"", "with unicode\u{10000}", StringifyOptions{}); + try teststringify("\"with unicode\\ud800\\udc00\"", "with unicode\u{10000}", StringifyOptions{ .string = .{ .String = .{ .escape_unicode = true } } }); + try teststringify("\"with unicode\u{10FFFF}\"", "with unicode\u{10FFFF}", StringifyOptions{}); + try teststringify("\"with unicode\\udbff\\udfff\"", "with unicode\u{10FFFF}", StringifyOptions{ .string = .{ .String = .{ .escape_unicode = true } } }); } test "stringify tagged unions" { try teststringify("42", union(enum) { Foo: u32, Bar: bool, - }{ .Foo = 42 }); + }{ .Foo = 42 }, StringifyOptions{}); } test "stringify struct" { try teststringify("{\"foo\":42}", struct { foo: u32, - }{ .foo = 42 }); + }{ .foo = 42 }, StringifyOptions{}); +} + +test "stringify struct with indentation" { + try teststringify( + \\{ + \\ "foo": 42, + \\ "bar": [ + \\ 1, + \\ 2, + \\ 3 + \\ ] + \\} + , + struct { + foo: u32, + bar: [3]u32, + }{ + .foo = 42, + .bar = .{ 1, 2, 3 }, + }, + StringifyOptions{ + .whitespace = .{}, + }, + ); + try teststringify( + "{\n\t\"foo\":42,\n\t\"bar\":[\n\t\t1,\n\t\t2,\n\t\t3\n\t]\n}", + struct { + foo: u32, + bar: [3]u32, + }{ + .foo = 42, + .bar = .{ 1, 2, 3 }, + }, + StringifyOptions{ + .whitespace = .{ + .indent = .Tab, + .separator = false, + }, + }, + ); } test "stringify struct with void field" { try teststringify("{\"foo\":42}", struct { foo: u32, bar: void = {}, - }{ .foo = 42 }); + }{ .foo = 42 }, StringifyOptions{}); } test "stringify array of structs" { @@ -2504,7 +2737,7 @@ test "stringify array of structs" { MyStruct{ .foo = 42 }, MyStruct{ .foo = 100 }, MyStruct{ .foo = 1000 }, - }); + }, StringifyOptions{}); } test "stringify struct with custom stringifier" { @@ -2518,7 +2751,7 @@ test "stringify struct with custom stringifier" { ) !void { try out_stream.writeAll("[\"something special\","); try stringify(42, options, out_stream); - try out_stream.writeAll("]"); + try out_stream.writeByte(']'); } - }{ .foo = 42 }); + }{ .foo = 42 }, StringifyOptions{}); } diff --git a/lib/std/json/test.zig b/lib/std/json/test.zig index 6873fa038a..5d46b75a48 100644 --- a/lib/std/json/test.zig +++ b/lib/std/json/test.zig @@ -1751,11 +1751,9 @@ test "i_number_double_huge_neg_exp" { } test "i_number_huge_exp" { - return error.SkipZigTest; - // FIXME Integer overflow in parseFloat - // any( - // \\[0.4e00669999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999969999999006] - // ); + any( + \\[0.4e00669999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999969999999006] + ); } test "i_number_neg_int_huge_exp" { diff --git a/lib/std/json/write_stream.zig b/lib/std/json/write_stream.zig index f4d171011c..60974a207e 100644 --- a/lib/std/json/write_stream.zig +++ b/lib/std/json/write_stream.zig @@ -21,14 +21,10 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type { pub const Stream = OutStream; - /// The string used for indenting. - one_indent: []const u8 = " ", - - /// The string used as a newline character. - newline: []const u8 = "\n", - - /// The string used as spacing. - space: []const u8 = " ", + whitespace: std.json.StringifyOptions.Whitespace = std.json.StringifyOptions.Whitespace{ + .indent_level = 0, + .indent = .{ .Space = 1 }, + }, stream: OutStream, state_index: usize, @@ -49,12 +45,14 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type { assert(self.state[self.state_index] == State.Value); // need to call arrayElem or objectField try self.stream.writeByte('['); self.state[self.state_index] = State.ArrayStart; + self.whitespace.indent_level += 1; } pub fn beginObject(self: *Self) !void { assert(self.state[self.state_index] == State.Value); // need to call arrayElem or objectField try self.stream.writeByte('{'); self.state[self.state_index] = State.ObjectStart; + self.whitespace.indent_level += 1; } pub fn arrayElem(self: *Self) !void { @@ -90,8 +88,10 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type { self.pushState(.Value); try self.indent(); try self.writeEscapedString(name); - try self.stream.writeAll(":"); - try self.stream.writeAll(self.space); + try self.stream.writeByte(':'); + if (self.whitespace.separator) { + try self.stream.writeByte(' '); + } }, } } @@ -103,10 +103,12 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type { .ObjectStart => unreachable, .Object => unreachable, .ArrayStart => { + self.whitespace.indent_level -= 1; try self.stream.writeByte(']'); self.popState(); }, .Array => { + self.whitespace.indent_level -= 1; try self.indent(); self.popState(); try self.stream.writeByte(']'); @@ -121,10 +123,12 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type { .ArrayStart => unreachable, .Array => unreachable, .ObjectStart => { + self.whitespace.indent_level -= 1; try self.stream.writeByte('}'); self.popState(); }, .Object => { + self.whitespace.indent_level -= 1; try self.indent(); self.popState(); try self.stream.writeByte('}'); @@ -134,17 +138,13 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type { pub fn emitNull(self: *Self) !void { assert(self.state[self.state_index] == State.Value); - try self.stream.writeAll("null"); + try self.stringify(null); self.popState(); } pub fn emitBool(self: *Self, value: bool) !void { assert(self.state[self.state_index] == State.Value); - if (value) { - try self.stream.writeAll("true"); - } else { - try self.stream.writeAll("false"); - } + try self.stringify(value); self.popState(); } @@ -185,57 +185,19 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type { } fn writeEscapedString(self: *Self, string: []const u8) !void { - try self.stream.writeByte('"'); - for (string) |s| { - switch (s) { - '"' => try self.stream.writeAll("\\\""), - '\t' => try self.stream.writeAll("\\t"), - '\r' => try self.stream.writeAll("\\r"), - '\n' => try self.stream.writeAll("\\n"), - 8 => try self.stream.writeAll("\\b"), - 12 => try self.stream.writeAll("\\f"), - '\\' => try self.stream.writeAll("\\\\"), - else => try self.stream.writeByte(s), - } - } - try self.stream.writeByte('"'); + assert(std.unicode.utf8ValidateSlice(string)); + try self.stringify(string); } /// Writes the complete json into the output stream pub fn emitJson(self: *Self, json: std.json.Value) Stream.Error!void { - switch (json) { - .Null => try self.emitNull(), - .Bool => |inner| try self.emitBool(inner), - .Integer => |inner| try self.emitNumber(inner), - .Float => |inner| try self.emitNumber(inner), - .String => |inner| try self.emitString(inner), - .Array => |inner| { - try self.beginArray(); - for (inner.toSliceConst()) |elem| { - try self.arrayElem(); - try self.emitJson(elem); - } - try self.endArray(); - }, - .Object => |inner| { - try self.beginObject(); - var it = inner.iterator(); - while (it.next()) |entry| { - try self.objectField(entry.key); - try self.emitJson(entry.value); - } - try self.endObject(); - }, - } + try self.stringify(json); } fn indent(self: *Self) !void { assert(self.state_index >= 1); - try self.stream.writeAll(self.newline); - var i: usize = 0; - while (i < self.state_index - 1) : (i += 1) { - try self.stream.writeAll(self.one_indent); - } + try self.stream.writeByte('\n'); + try self.whitespace.outputIndent(self.stream); } fn pushState(self: *Self, state: State) void { @@ -246,6 +208,12 @@ pub fn WriteStream(comptime OutStream: type, comptime max_depth: usize) type { fn popState(self: *Self) void { self.state_index -= 1; } + + fn stringify(self: *Self, value: var) !void { + try std.json.stringify(value, std.json.StringifyOptions{ + .whitespace = self.whitespace, + }, self.stream); + } }; } diff --git a/lib/std/mem.zig b/lib/std/mem.zig index fa2794160b..f54eb03d65 100644 --- a/lib/std/mem.zig +++ b/lib/std/mem.zig @@ -341,11 +341,7 @@ pub fn zeroes(comptime T: type) T { } }, .Array => |info| { - var array: T = undefined; - for (array) |*element| { - element.* = zeroes(info.child); - } - return array; + return [_]info.child{zeroes(info.child)} ** info.len; }, .Vector, .ErrorUnion, @@ -496,15 +492,8 @@ pub fn eql(comptime T: type, a: []const T, b: []const T) bool { return true; } -/// Deprecated. Use `spanZ`. -pub fn toSliceConst(comptime T: type, ptr: [*:0]const T) [:0]const T { - return ptr[0..lenZ(ptr) :0]; -} - -/// Deprecated. Use `spanZ`. -pub fn toSlice(comptime T: type, ptr: [*:0]T) [:0]T { - return ptr[0..lenZ(ptr) :0]; -} +pub const toSliceConst = @compileError("deprecated; use std.mem.spanZ"); +pub const toSlice = @compileError("deprecated; use std.mem.spanZ"); /// Takes a pointer to an array, a sentinel-terminated pointer, or a slice, and /// returns a slice. If there is a sentinel on the input type, there will be a @@ -512,36 +501,54 @@ pub fn toSlice(comptime T: type, ptr: [*:0]T) [:0]T { /// the constness of the input type. `[*c]` pointers are assumed to be 0-terminated, /// and assumed to not allow null. pub fn Span(comptime T: type) type { - var ptr_info = @typeInfo(T).Pointer; - switch (ptr_info.size) { - .One => switch (@typeInfo(ptr_info.child)) { - .Array => |info| { - ptr_info.child = info.child; - ptr_info.sentinel = info.sentinel; - }, - else => @compileError("invalid type given to std.mem.Span"), + switch(@typeInfo(T)) { + .Optional => |optional_info| { + return ?Span(optional_info.child); }, - .C => { - ptr_info.sentinel = 0; - ptr_info.is_allowzero = false; + .Pointer => |ptr_info| { + var new_ptr_info = ptr_info; + switch (ptr_info.size) { + .One => switch (@typeInfo(ptr_info.child)) { + .Array => |info| { + new_ptr_info.child = info.child; + new_ptr_info.sentinel = info.sentinel; + }, + else => @compileError("invalid type given to std.mem.Span"), + }, + .C => { + new_ptr_info.sentinel = 0; + new_ptr_info.is_allowzero = false; + }, + .Many, .Slice => {}, + } + new_ptr_info.size = .Slice; + return @Type(std.builtin.TypeInfo{ .Pointer = new_ptr_info }); }, - .Many, .Slice => {}, + else => @compileError("invalid type given to std.mem.Span"), } - ptr_info.size = .Slice; - return @Type(std.builtin.TypeInfo{ .Pointer = ptr_info }); } test "Span" { testing.expect(Span(*[5]u16) == []u16); + testing.expect(Span(?*[5]u16) == ?[]u16); testing.expect(Span(*const [5]u16) == []const u16); + testing.expect(Span(?*const [5]u16) == ?[]const u16); testing.expect(Span([]u16) == []u16); + testing.expect(Span(?[]u16) == ?[]u16); testing.expect(Span([]const u8) == []const u8); + testing.expect(Span(?[]const u8) == ?[]const u8); testing.expect(Span([:1]u16) == [:1]u16); + testing.expect(Span(?[:1]u16) == ?[:1]u16); testing.expect(Span([:1]const u8) == [:1]const u8); + testing.expect(Span(?[:1]const u8) == ?[:1]const u8); testing.expect(Span([*:1]u16) == [:1]u16); + testing.expect(Span(?[*:1]u16) == ?[:1]u16); testing.expect(Span([*:1]const u8) == [:1]const u8); + testing.expect(Span(?[*:1]const u8) == ?[:1]const u8); testing.expect(Span([*c]u16) == [:0]u16); + testing.expect(Span(?[*c]u16) == ?[:0]u16); testing.expect(Span([*c]const u8) == [:0]const u8); + testing.expect(Span(?[*c]const u8) == ?[:0]const u8); } /// Takes a pointer to an array, a sentinel-terminated pointer, or a slice, and @@ -552,6 +559,13 @@ test "Span" { /// When there is both a sentinel and an array length or slice length, the /// length value is used instead of the sentinel. pub fn span(ptr: var) Span(@TypeOf(ptr)) { + if (@typeInfo(@TypeOf(ptr)) == .Optional) { + if (ptr) |non_null| { + return span(non_null); + } else { + return null; + } + } const Result = Span(@TypeOf(ptr)); const l = len(ptr); if (@typeInfo(Result).Pointer.sentinel) |s| { @@ -566,12 +580,20 @@ test "span" { const ptr = @as([*:3]u16, array[0..2 :3]); testing.expect(eql(u16, span(ptr), &[_]u16{ 1, 2 })); testing.expect(eql(u16, span(&array), &[_]u16{ 1, 2, 3, 4, 5 })); + testing.expectEqual(@as(?[:0]u16, null), span(@as(?[*:0]u16, null))); } /// Same as `span`, except when there is both a sentinel and an array /// length or slice length, scans the memory for the sentinel value /// rather than using the length. pub fn spanZ(ptr: var) Span(@TypeOf(ptr)) { + if (@typeInfo(@TypeOf(ptr)) == .Optional) { + if (ptr) |non_null| { + return spanZ(non_null); + } else { + return null; + } + } const Result = Span(@TypeOf(ptr)); const l = lenZ(ptr); if (@typeInfo(Result).Pointer.sentinel) |s| { @@ -586,6 +608,7 @@ test "spanZ" { const ptr = @as([*:3]u16, array[0..2 :3]); testing.expect(eql(u16, spanZ(ptr), &[_]u16{ 1, 2 })); testing.expect(eql(u16, spanZ(&array), &[_]u16{ 1, 2, 3, 4, 5 })); + testing.expectEqual(@as(?[:0]u16, null), spanZ(@as(?[*:0]u16, null))); } /// Takes a pointer to an array, an array, a sentinel-terminated pointer, diff --git a/lib/std/net.zig b/lib/std/net.zig index 0a789b0dde..0f7118c331 100644 --- a/lib/std/net.zig +++ b/lib/std/net.zig @@ -397,13 +397,12 @@ pub const AddressList = struct { /// All memory allocated with `allocator` will be freed before this function returns. pub fn tcpConnectToHost(allocator: *mem.Allocator, name: []const u8, port: u16) !fs.File { - const list = getAddressList(allocator, name, port); + const list = try getAddressList(allocator, name, port); defer list.deinit(); - const addrs = list.addrs.toSliceConst(); - if (addrs.len == 0) return error.UnknownHostName; + if (list.addrs.len == 0) return error.UnknownHostName; - return tcpConnectToAddress(addrs[0], port); + return tcpConnectToAddress(list.addrs[0]); } pub fn tcpConnectToAddress(address: Address) !fs.File { @@ -491,7 +490,7 @@ pub fn getAddressList(allocator: *mem.Allocator, name: []const u8, port: u16) !* if (info.canonname) |n| { if (result.canon_name == null) { - result.canon_name = try mem.dupe(arena, u8, mem.toSliceConst(u8, n)); + result.canon_name = try mem.dupe(arena, u8, mem.spanZ(n)); } } i += 1; @@ -505,7 +504,7 @@ pub fn getAddressList(allocator: *mem.Allocator, name: []const u8, port: u16) !* var lookup_addrs = std.ArrayList(LookupAddr).init(allocator); defer lookup_addrs.deinit(); - var canon = std.Buffer.initNull(arena); + var canon = std.ArrayListSentineled(u8, 0).initNull(arena); defer canon.deinit(); try linuxLookupName(&lookup_addrs, &canon, name, family, flags, port); @@ -515,7 +514,7 @@ pub fn getAddressList(allocator: *mem.Allocator, name: []const u8, port: u16) !* result.canon_name = canon.toOwnedSlice(); } - for (lookup_addrs.toSliceConst()) |lookup_addr, i| { + for (lookup_addrs.span()) |lookup_addr, i| { result.addrs[i] = lookup_addr.addr; assert(result.addrs[i].getPort() == port); } @@ -540,7 +539,7 @@ const DAS_ORDER_SHIFT = 0; fn linuxLookupName( addrs: *std.ArrayList(LookupAddr), - canon: *std.Buffer, + canon: *std.ArrayListSentineled(u8, 0), opt_name: ?[]const u8, family: os.sa_family_t, flags: u32, @@ -568,7 +567,7 @@ fn linuxLookupName( // No further processing is needed if there are fewer than 2 // results or if there are only IPv4 results. if (addrs.len == 1 or family == os.AF_INET) return; - const all_ip4 = for (addrs.toSliceConst()) |addr| { + const all_ip4 = for (addrs.span()) |addr| { if (addr.addr.any.family != os.AF_INET) break false; } else true; if (all_ip4) return; @@ -580,7 +579,7 @@ fn linuxLookupName( // So far the label/precedence table cannot be customized. // This implementation is ported from musl libc. // A more idiomatic "ziggy" implementation would be welcome. - for (addrs.toSlice()) |*addr, i| { + for (addrs.span()) |*addr, i| { var key: i32 = 0; var sa6: os.sockaddr_in6 = undefined; @memset(@ptrCast([*]u8, &sa6), 0, @sizeOf(os.sockaddr_in6)); @@ -645,7 +644,7 @@ fn linuxLookupName( key |= (MAXADDRS - @intCast(i32, i)) << DAS_ORDER_SHIFT; addr.sortkey = key; } - std.sort.sort(LookupAddr, addrs.toSlice(), addrCmpLessThan); + std.sort.sort(LookupAddr, addrs.span(), addrCmpLessThan); } const Policy = struct { @@ -799,12 +798,12 @@ fn linuxLookupNameFromNull( fn linuxLookupNameFromHosts( addrs: *std.ArrayList(LookupAddr), - canon: *std.Buffer, + canon: *std.ArrayListSentineled(u8, 0), name: []const u8, family: os.sa_family_t, port: u16, ) !void { - const file = fs.openFileAbsoluteC("/etc/hosts", .{}) catch |err| switch (err) { + const file = fs.openFileAbsoluteZ("/etc/hosts", .{}) catch |err| switch (err) { error.FileNotFound, error.NotDir, error.AccessDenied, @@ -869,7 +868,7 @@ pub fn isValidHostName(hostname: []const u8) bool { fn linuxLookupNameFromDnsSearch( addrs: *std.ArrayList(LookupAddr), - canon: *std.Buffer, + canon: *std.ArrayListSentineled(u8, 0), name: []const u8, family: os.sa_family_t, port: u16, @@ -888,7 +887,7 @@ fn linuxLookupNameFromDnsSearch( const search = if (rc.search.isNull() or dots >= rc.ndots or mem.endsWith(u8, name, ".")) &[_]u8{} else - rc.search.toSliceConst(); + rc.search.span(); var canon_name = name; @@ -901,14 +900,14 @@ fn linuxLookupNameFromDnsSearch( // name is not a CNAME record) and serves as a buffer for passing // the full requested name to name_from_dns. try canon.resize(canon_name.len); - mem.copy(u8, canon.toSlice(), canon_name); - try canon.appendByte('.'); + mem.copy(u8, canon.span(), canon_name); + try canon.append('.'); var tok_it = mem.tokenize(search, " \t"); while (tok_it.next()) |tok| { canon.shrink(canon_name.len + 1); - try canon.append(tok); - try linuxLookupNameFromDns(addrs, canon, canon.toSliceConst(), family, rc, port); + try canon.appendSlice(tok); + try linuxLookupNameFromDns(addrs, canon, canon.span(), family, rc, port); if (addrs.len != 0) return; } @@ -918,13 +917,13 @@ fn linuxLookupNameFromDnsSearch( const dpc_ctx = struct { addrs: *std.ArrayList(LookupAddr), - canon: *std.Buffer, + canon: *std.ArrayListSentineled(u8, 0), port: u16, }; fn linuxLookupNameFromDns( addrs: *std.ArrayList(LookupAddr), - canon: *std.Buffer, + canon: *std.ArrayListSentineled(u8, 0), name: []const u8, family: os.sa_family_t, rc: ResolvConf, @@ -979,7 +978,7 @@ const ResolvConf = struct { attempts: u32, ndots: u32, timeout: u32, - search: std.Buffer, + search: std.ArrayListSentineled(u8, 0), ns: std.ArrayList(LookupAddr), fn deinit(rc: *ResolvConf) void { @@ -994,14 +993,14 @@ const ResolvConf = struct { fn getResolvConf(allocator: *mem.Allocator, rc: *ResolvConf) !void { rc.* = ResolvConf{ .ns = std.ArrayList(LookupAddr).init(allocator), - .search = std.Buffer.initNull(allocator), + .search = std.ArrayListSentineled(u8, 0).initNull(allocator), .ndots = 1, .timeout = 5, .attempts = 2, }; errdefer rc.deinit(); - const file = fs.openFileAbsoluteC("/etc/resolv.conf", .{}) catch |err| switch (err) { + const file = fs.openFileAbsoluteZ("/etc/resolv.conf", .{}) catch |err| switch (err) { error.FileNotFound, error.NotDir, error.AccessDenied, @@ -1080,9 +1079,9 @@ fn resMSendRc( defer ns_list.deinit(); try ns_list.resize(rc.ns.len); - const ns = ns_list.toSlice(); + const ns = ns_list.span(); - for (rc.ns.toSliceConst()) |iplit, i| { + for (rc.ns.span()) |iplit, i| { ns[i] = iplit.addr; assert(ns[i].getPort() == 53); if (iplit.addr.any.family != os.AF_INET) { @@ -1266,7 +1265,7 @@ fn dnsParseCallback(ctx: dpc_ctx, rr: u8, data: []const u8, packet: []const u8) var tmp: [256]u8 = undefined; // Returns len of compressed name. strlen to get canon name. _ = try os.dn_expand(packet, data, &tmp); - const canon_name = mem.toSliceConst(u8, @ptrCast([*:0]const u8, &tmp)); + const canon_name = mem.spanZ(@ptrCast([*:0]const u8, &tmp)); if (isValidHostName(canon_name)) { try ctx.canon.replaceContents(canon_name); } diff --git a/lib/std/os.zig b/lib/std/os.zig index 48f4209ed3..49edda23ba 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -163,7 +163,7 @@ pub fn getrandom(buffer: []u8) GetRandomError!void { } fn getRandomBytesDevURandom(buf: []u8) !void { - const fd = try openC("/dev/urandom", O_RDONLY | O_CLOEXEC, 0); + const fd = try openZ("/dev/urandom", O_RDONLY | O_CLOEXEC, 0); defer close(fd); const st = try fstat(fd); @@ -853,13 +853,15 @@ pub const OpenError = error{ /// TODO support windows pub fn open(file_path: []const u8, flags: u32, perm: usize) OpenError!fd_t { const file_path_c = try toPosixPath(file_path); - return openC(&file_path_c, flags, perm); + return openZ(&file_path_c, flags, perm); } +pub const openC = @compileError("deprecated: renamed to openZ"); + /// Open and possibly create a file. Keeps trying if it gets interrupted. /// See also `open`. /// TODO support windows -pub fn openC(file_path: [*:0]const u8, flags: u32, perm: usize) OpenError!fd_t { +pub fn openZ(file_path: [*:0]const u8, flags: u32, perm: usize) OpenError!fd_t { while (true) { const rc = system.open(file_path, flags, perm); switch (errno(rc)) { @@ -895,14 +897,16 @@ pub fn openC(file_path: [*:0]const u8, flags: u32, perm: usize) OpenError!fd_t { /// TODO support windows pub fn openat(dir_fd: fd_t, file_path: []const u8, flags: u32, mode: mode_t) OpenError!fd_t { const file_path_c = try toPosixPath(file_path); - return openatC(dir_fd, &file_path_c, flags, mode); + return openatZ(dir_fd, &file_path_c, flags, mode); } +pub const openatC = @compileError("deprecated: renamed to openatZ"); + /// Open and possibly create a file. Keeps trying if it gets interrupted. /// `file_path` is relative to the open directory handle `dir_fd`. /// See also `openat`. /// TODO support windows -pub fn openatC(dir_fd: fd_t, file_path: [*:0]const u8, flags: u32, mode: mode_t) OpenError!fd_t { +pub fn openatZ(dir_fd: fd_t, file_path: [*:0]const u8, flags: u32, mode: mode_t) OpenError!fd_t { while (true) { const rc = system.openat(dir_fd, file_path, flags, mode); switch (errno(rc)) { @@ -959,8 +963,7 @@ pub const ExecveError = error{ NameTooLong, } || UnexpectedError; -/// Deprecated in favor of `execveZ`. -pub const execveC = execveZ; +pub const execveC = @compileError("deprecated: use execveZ"); /// Like `execve` except the parameters are null-terminated, /// matching the syscall API on all targets. This removes the need for an allocator. @@ -992,8 +995,7 @@ pub fn execveZ( } } -/// Deprecated in favor of `execvpeZ`. -pub const execvpeC = execvpeZ; +pub const execvpeC = @compileError("deprecated in favor of execvpeZ"); pub const Arg0Expand = enum { expand, @@ -1012,7 +1014,7 @@ pub fn execvpeZ_expandArg0( }, envp: [*:null]const ?[*:0]const u8, ) ExecveError { - const file_slice = mem.toSliceConst(u8, file); + const file_slice = mem.spanZ(file); if (mem.indexOfScalar(u8, file_slice, '/') != null) return execveZ(file, child_argv, envp); const PATH = getenvZ("PATH") orelse "/usr/local/bin:/bin/:/usr/bin"; @@ -1076,7 +1078,7 @@ pub fn execvpe_expandArg0( mem.set(?[*:0]u8, argv_buf, null); defer { for (argv_buf) |arg| { - const arg_buf = if (arg) |ptr| mem.toSlice(u8, ptr) else break; + const arg_buf = mem.spanZ(arg) orelse break; allocator.free(arg_buf); } allocator.free(argv_buf); @@ -1189,30 +1191,32 @@ pub fn getenv(key: []const u8) ?[]const u8 { return null; } -/// Deprecated in favor of `getenvZ`. -pub const getenvC = getenvZ; +pub const getenvC = @compileError("Deprecated in favor of `getenvZ`"); /// Get an environment variable with a null-terminated name. /// See also `getenv`. pub fn getenvZ(key: [*:0]const u8) ?[]const u8 { if (builtin.link_libc) { const value = system.getenv(key) orelse return null; - return mem.toSliceConst(u8, value); + return mem.spanZ(value); } if (builtin.os.tag == .windows) { @compileError("std.os.getenvZ is unavailable for Windows because environment string is in WTF-16 format. See std.process.getEnvVarOwned for cross-platform API or std.os.getenvW for Windows-specific API."); } - return getenv(mem.toSliceConst(u8, key)); + return getenv(mem.spanZ(key)); } /// Windows-only. Get an environment variable with a null-terminated, WTF-16 encoded name. /// See also `getenv`. +/// This function first attempts a case-sensitive lookup. If no match is found, and `key` +/// is ASCII, then it attempts a second case-insensitive lookup. pub fn getenvW(key: [*:0]const u16) ?[:0]const u16 { if (builtin.os.tag != .windows) { @compileError("std.os.getenvW is a Windows-only API"); } - const key_slice = mem.toSliceConst(u16, key); + const key_slice = mem.spanZ(key); const ptr = windows.peb().ProcessParameters.Environment; + var ascii_match: ?[:0]const u16 = null; var i: usize = 0; while (ptr[i] != 0) { const key_start = i; @@ -1228,9 +1232,20 @@ pub fn getenvW(key: [*:0]const u16) ?[:0]const u16 { if (mem.eql(u16, key_slice, this_key)) return this_value; + ascii_check: { + if (ascii_match != null) break :ascii_check; + if (key_slice.len != this_key.len) break :ascii_check; + for (key_slice) |a_c, key_index| { + const a = math.cast(u8, a_c) catch break :ascii_check; + const b = math.cast(u8, this_key[key_index]) catch break :ascii_check; + if (std.ascii.toLower(a) != std.ascii.toLower(b)) break :ascii_check; + } + ascii_match = this_value; + } + i += 1; // skip over null byte } - return null; + return ascii_match; } pub const GetCwdError = error{ @@ -1250,7 +1265,7 @@ pub fn getcwd(out_buffer: []u8) GetCwdError![]u8 { break :blk errno(system.getcwd(out_buffer.ptr, out_buffer.len)); }; switch (err) { - 0 => return mem.toSlice(u8, @ptrCast([*:0]u8, out_buffer.ptr)), + 0 => return mem.spanZ(@ptrCast([*:0]u8, out_buffer.ptr)), EFAULT => unreachable, EINVAL => unreachable, ENOENT => return error.CurrentWorkingDirectoryUnlinked, @@ -1288,13 +1303,15 @@ pub fn symlink(target_path: []const u8, sym_link_path: []const u8) SymLinkError! } else { const target_path_c = try toPosixPath(target_path); const sym_link_path_c = try toPosixPath(sym_link_path); - return symlinkC(&target_path_c, &sym_link_path_c); + return symlinkZ(&target_path_c, &sym_link_path_c); } } +pub const symlinkC = @compileError("deprecated: renamed to symlinkZ"); + /// This is the same as `symlink` except the parameters are null-terminated pointers. /// See also `symlink`. -pub fn symlinkC(target_path: [*:0]const u8, sym_link_path: [*:0]const u8) SymLinkError!void { +pub fn symlinkZ(target_path: [*:0]const u8, sym_link_path: [*:0]const u8) SymLinkError!void { if (builtin.os.tag == .windows) { const target_path_w = try windows.cStrToPrefixedFileW(target_path); const sym_link_path_w = try windows.cStrToPrefixedFileW(sym_link_path); @@ -1323,10 +1340,12 @@ pub fn symlinkC(target_path: [*:0]const u8, sym_link_path: [*:0]const u8) SymLin pub fn symlinkat(target_path: []const u8, newdirfd: fd_t, sym_link_path: []const u8) SymLinkError!void { const target_path_c = try toPosixPath(target_path); const sym_link_path_c = try toPosixPath(sym_link_path); - return symlinkatC(target_path_c, newdirfd, sym_link_path_c); + return symlinkatZ(target_path_c, newdirfd, sym_link_path_c); } -pub fn symlinkatC(target_path: [*:0]const u8, newdirfd: fd_t, sym_link_path: [*:0]const u8) SymLinkError!void { +pub const symlinkatC = @compileError("deprecated: renamed to symlinkatZ"); + +pub fn symlinkatZ(target_path: [*:0]const u8, newdirfd: fd_t, sym_link_path: [*:0]const u8) SymLinkError!void { switch (errno(system.symlinkat(target_path, newdirfd, sym_link_path))) { 0 => return, EFAULT => unreachable, @@ -1375,12 +1394,14 @@ pub fn unlink(file_path: []const u8) UnlinkError!void { return windows.DeleteFileW(&file_path_w); } else { const file_path_c = try toPosixPath(file_path); - return unlinkC(&file_path_c); + return unlinkZ(&file_path_c); } } +pub const unlinkC = @compileError("deprecated: renamed to unlinkZ"); + /// Same as `unlink` except the parameter is a null terminated UTF8-encoded string. -pub fn unlinkC(file_path: [*:0]const u8) UnlinkError!void { +pub fn unlinkZ(file_path: [*:0]const u8) UnlinkError!void { if (builtin.os.tag == .windows) { const file_path_w = try windows.cStrToPrefixedFileW(file_path); return windows.DeleteFileW(&file_path_w); @@ -1417,11 +1438,13 @@ pub fn unlinkat(dirfd: fd_t, file_path: []const u8, flags: u32) UnlinkatError!vo return unlinkatW(dirfd, &file_path_w, flags); } const file_path_c = try toPosixPath(file_path); - return unlinkatC(dirfd, &file_path_c, flags); + return unlinkatZ(dirfd, &file_path_c, flags); } +pub const unlinkatC = @compileError("deprecated: renamed to unlinkatZ"); + /// Same as `unlinkat` but `file_path` is a null-terminated string. -pub fn unlinkatC(dirfd: fd_t, file_path_c: [*:0]const u8, flags: u32) UnlinkatError!void { +pub fn unlinkatZ(dirfd: fd_t, file_path_c: [*:0]const u8, flags: u32) UnlinkatError!void { if (builtin.os.tag == .windows) { const file_path_w = try windows.cStrToPrefixedFileW(file_path_c); return unlinkatW(dirfd, &file_path_w, flags); @@ -1459,7 +1482,7 @@ pub fn unlinkatW(dirfd: fd_t, sub_path_w: [*:0]const u16, flags: u32) UnlinkatEr else @as(w.ULONG, w.FILE_DELETE_ON_CLOSE | w.FILE_NON_DIRECTORY_FILE); - const path_len_bytes = @intCast(u16, mem.toSliceConst(u16, sub_path_w).len * 2); + const path_len_bytes = @intCast(u16, mem.lenZ(sub_path_w) * 2); var nt_name = w.UNICODE_STRING{ .Length = path_len_bytes, .MaximumLength = path_len_bytes, @@ -1543,12 +1566,14 @@ pub fn rename(old_path: []const u8, new_path: []const u8) RenameError!void { } else { const old_path_c = try toPosixPath(old_path); const new_path_c = try toPosixPath(new_path); - return renameC(&old_path_c, &new_path_c); + return renameZ(&old_path_c, &new_path_c); } } +pub const renameC = @compileError("deprecated: renamed to renameZ"); + /// Same as `rename` except the parameters are null-terminated byte arrays. -pub fn renameC(old_path: [*:0]const u8, new_path: [*:0]const u8) RenameError!void { +pub fn renameZ(old_path: [*:0]const u8, new_path: [*:0]const u8) RenameError!void { if (builtin.os.tag == .windows) { const old_path_w = try windows.cStrToPrefixedFileW(old_path); const new_path_w = try windows.cStrToPrefixedFileW(new_path); @@ -1715,11 +1740,13 @@ pub fn mkdirat(dir_fd: fd_t, sub_dir_path: []const u8, mode: u32) MakeDirError!v return mkdiratW(dir_fd, &sub_dir_path_w, mode); } else { const sub_dir_path_c = try toPosixPath(sub_dir_path); - return mkdiratC(dir_fd, &sub_dir_path_c, mode); + return mkdiratZ(dir_fd, &sub_dir_path_c, mode); } } -pub fn mkdiratC(dir_fd: fd_t, sub_dir_path: [*:0]const u8, mode: u32) MakeDirError!void { +pub const mkdiratC = @compileError("deprecated: renamed to mkdiratZ"); + +pub fn mkdiratZ(dir_fd: fd_t, sub_dir_path: [*:0]const u8, mode: u32) MakeDirError!void { if (builtin.os.tag == .windows) { const sub_dir_path_w = try windows.cStrToPrefixedFileW(sub_dir_path); return mkdiratW(dir_fd, &sub_dir_path_w, mode); @@ -1810,12 +1837,14 @@ pub fn rmdir(dir_path: []const u8) DeleteDirError!void { return windows.RemoveDirectoryW(&dir_path_w); } else { const dir_path_c = try toPosixPath(dir_path); - return rmdirC(&dir_path_c); + return rmdirZ(&dir_path_c); } } +pub const rmdirC = @compileError("deprecated: renamed to rmdirZ"); + /// Same as `rmdir` except the parameter is null-terminated. -pub fn rmdirC(dir_path: [*:0]const u8) DeleteDirError!void { +pub fn rmdirZ(dir_path: [*:0]const u8) DeleteDirError!void { if (builtin.os.tag == .windows) { const dir_path_w = try windows.cStrToPrefixedFileW(dir_path); return windows.RemoveDirectoryW(&dir_path_w); @@ -1857,12 +1886,14 @@ pub fn chdir(dir_path: []const u8) ChangeCurDirError!void { @compileError("TODO implement chdir for Windows"); } else { const dir_path_c = try toPosixPath(dir_path); - return chdirC(&dir_path_c); + return chdirZ(&dir_path_c); } } +pub const chdirC = @compileError("deprecated: renamed to chdirZ"); + /// Same as `chdir` except the parameter is null-terminated. -pub fn chdirC(dir_path: [*:0]const u8) ChangeCurDirError!void { +pub fn chdirZ(dir_path: [*:0]const u8) ChangeCurDirError!void { if (builtin.os.tag == .windows) { const dir_path_w = try windows.cStrToPrefixedFileW(dir_path); @compileError("TODO implement chdir for Windows"); @@ -1919,12 +1950,14 @@ pub fn readlink(file_path: []const u8, out_buffer: []u8) ReadLinkError![]u8 { @compileError("TODO implement readlink for Windows"); } else { const file_path_c = try toPosixPath(file_path); - return readlinkC(&file_path_c, out_buffer); + return readlinkZ(&file_path_c, out_buffer); } } +pub const readlinkC = @compileError("deprecated: renamed to readlinkZ"); + /// Same as `readlink` except `file_path` is null-terminated. -pub fn readlinkC(file_path: [*:0]const u8, out_buffer: []u8) ReadLinkError![]u8 { +pub fn readlinkZ(file_path: [*:0]const u8, out_buffer: []u8) ReadLinkError![]u8 { if (builtin.os.tag == .windows) { const file_path_w = try windows.cStrToPrefixedFileW(file_path); @compileError("TODO implement readlink for Windows"); @@ -1945,7 +1978,9 @@ pub fn readlinkC(file_path: [*:0]const u8, out_buffer: []u8) ReadLinkError![]u8 } } -pub fn readlinkatC(dirfd: fd_t, file_path: [*:0]const u8, out_buffer: []u8) ReadLinkError![]u8 { +pub const readlinkatC = @compileError("deprecated: renamed to readlinkatZ"); + +pub fn readlinkatZ(dirfd: fd_t, file_path: [*:0]const u8, out_buffer: []u8) ReadLinkError![]u8 { if (builtin.os.tag == .windows) { const file_path_w = try windows.cStrToPrefixedFileW(file_path); @compileError("TODO implement readlink for Windows"); @@ -2044,7 +2079,7 @@ pub fn isatty(handle: fd_t) bool { } if (builtin.os.tag == .linux) { var wsz: linux.winsize = undefined; - return linux.syscall3(linux.SYS_ioctl, @bitCast(usize, @as(isize, handle)), linux.TIOCGWINSZ, @ptrToInt(&wsz)) == 0; + return linux.syscall3(.ioctl, @bitCast(usize, @as(isize, handle)), linux.TIOCGWINSZ, @ptrToInt(&wsz)) == 0; } unreachable; } @@ -2532,14 +2567,7 @@ pub const FStatError = error{ pub fn fstat(fd: fd_t) FStatError!Stat { var stat: Stat = undefined; - const symbol_name = if (comptime std.Target.current.isDarwin()) - "fstat$INODE64" - else if (std.Target.current.os.tag == .netbsd) - "__fstat50" - else - "fstat"; - - switch (errno(@field(system, symbol_name)(fd, &stat))) { + switch (errno(system.fstat(fd, &stat))) { 0 => return stat, EINVAL => unreachable, EBADF => unreachable, // Always a race condition. @@ -2553,10 +2581,12 @@ const FStatAtError = FStatError || error{NameTooLong}; pub fn fstatat(dirfd: fd_t, pathname: []const u8, flags: u32) FStatAtError![]Stat { const pathname_c = try toPosixPath(pathname); - return fstatatC(dirfd, &pathname_c, flags); + return fstatatZ(dirfd, &pathname_c, flags); } -pub fn fstatatC(dirfd: fd_t, pathname: [*:0]const u8, flags: u32) FStatAtError!Stat { +pub const fstatatC = @compileError("deprecated: renamed to fstatatZ"); + +pub fn fstatatZ(dirfd: fd_t, pathname: [*:0]const u8, flags: u32) FStatAtError!Stat { var stat: Stat = undefined; switch (errno(system.fstatat(dirfd, pathname, &stat, flags))) { 0 => return stat, @@ -2668,11 +2698,13 @@ pub const INotifyAddWatchError = error{ /// add a watch to an initialized inotify instance pub fn inotify_add_watch(inotify_fd: i32, pathname: []const u8, mask: u32) INotifyAddWatchError!i32 { const pathname_c = try toPosixPath(pathname); - return inotify_add_watchC(inotify_fd, &pathname_c, mask); + return inotify_add_watchZ(inotify_fd, &pathname_c, mask); } +pub const inotify_add_watchC = @compileError("deprecated: renamed to inotify_add_watchZ"); + /// Same as `inotify_add_watch` except pathname is null-terminated. -pub fn inotify_add_watchC(inotify_fd: i32, pathname: [*:0]const u8, mask: u32) INotifyAddWatchError!i32 { +pub fn inotify_add_watchZ(inotify_fd: i32, pathname: [*:0]const u8, mask: u32) INotifyAddWatchError!i32 { const rc = system.inotify_add_watch(inotify_fd, pathname, mask); switch (errno(rc)) { 0 => return @intCast(i32, rc), @@ -2829,11 +2861,10 @@ pub fn access(path: []const u8, mode: u32) AccessError!void { return; } const path_c = try toPosixPath(path); - return accessC(&path_c, mode); + return accessZ(&path_c, mode); } -/// Deprecated in favor of `accessZ`. -pub const accessC = accessZ; +pub const accessC = @compileError("Deprecated in favor of `accessZ`"); /// Same as `access` except `path` is null-terminated. pub fn accessZ(path: [*:0]const u8, mode: u32) AccessError!void { @@ -2920,7 +2951,7 @@ pub fn faccessatW(dirfd: fd_t, sub_path_w: [*:0]const u16, mode: u32, flags: u32 return; } - const path_len_bytes = math.cast(u16, mem.toSliceConst(u16, sub_path_w).len * 2) catch |err| switch (err) { + const path_len_bytes = math.cast(u16, mem.lenZ(sub_path_w) * 2) catch |err| switch (err) { error.Overflow => return error.NameTooLong, }; var nt_name = windows.UNICODE_STRING{ @@ -3019,7 +3050,9 @@ pub fn sysctl( } } -pub fn sysctlbynameC( +pub const sysctlbynameC = @compileError("deprecated: renamed to sysctlbynameZ"); + +pub fn sysctlbynameZ( name: [*:0]const u8, oldp: ?*c_void, oldlenp: ?*usize, @@ -3224,23 +3257,25 @@ pub fn realpath(pathname: []const u8, out_buffer: *[MAX_PATH_BYTES]u8) RealPathE return realpathW(&pathname_w, out_buffer); } const pathname_c = try toPosixPath(pathname); - return realpathC(&pathname_c, out_buffer); + return realpathZ(&pathname_c, out_buffer); } +pub const realpathC = @compileError("deprecated: renamed realpathZ"); + /// Same as `realpath` except `pathname` is null-terminated. -pub fn realpathC(pathname: [*:0]const u8, out_buffer: *[MAX_PATH_BYTES]u8) RealPathError![]u8 { +pub fn realpathZ(pathname: [*:0]const u8, out_buffer: *[MAX_PATH_BYTES]u8) RealPathError![]u8 { if (builtin.os.tag == .windows) { const pathname_w = try windows.cStrToPrefixedFileW(pathname); return realpathW(&pathname_w, out_buffer); } if (builtin.os.tag == .linux and !builtin.link_libc) { - const fd = try openC(pathname, linux.O_PATH | linux.O_NONBLOCK | linux.O_CLOEXEC, 0); + const fd = try openZ(pathname, linux.O_PATH | linux.O_NONBLOCK | linux.O_CLOEXEC, 0); defer close(fd); var procfs_buf: ["/proc/self/fd/-2147483648".len:0]u8 = undefined; const proc_path = std.fmt.bufPrint(procfs_buf[0..], "/proc/self/fd/{}\x00", .{fd}) catch unreachable; - return readlinkC(@ptrCast([*:0]const u8, proc_path.ptr), out_buffer); + return readlinkZ(@ptrCast([*:0]const u8, proc_path.ptr), out_buffer); } const result_path = std.c.realpath(pathname, out_buffer) orelse switch (std.c._errno().*) { EINVAL => unreachable, @@ -3255,7 +3290,7 @@ pub fn realpathC(pathname: [*:0]const u8, out_buffer: *[MAX_PATH_BYTES]u8) RealP EIO => return error.InputOutput, else => |err| return unexpectedErrno(@intCast(usize, err)), }; - return mem.toSlice(u8, result_path); + return mem.spanZ(result_path); } /// Same as `realpath` except `pathname` is null-terminated and UTF16LE-encoded. @@ -3399,12 +3434,7 @@ pub fn clock_gettime(clk_id: i32, tp: *timespec) ClockGetTimeError!void { return; } - const symbol_name = if (std.Target.current.os.tag == .netbsd) - "__clock_gettime50" - else - "clock_gettime"; - - switch (errno(@field(system, symbol_name)(clk_id, tp))) { + switch (errno(system.clock_gettime(clk_id, tp))) { 0 => return, EFAULT => unreachable, EINVAL => return error.UnsupportedClock, @@ -3426,12 +3456,7 @@ pub fn clock_getres(clk_id: i32, res: *timespec) ClockGetTimeError!void { return; } - const symbol_name = if (std.Target.current.os.tag == .netbsd) - "__clock_getres50" - else - "clock_getres"; - - switch (errno(@field(system, symbol_name)(clk_id, res))) { + switch (errno(system.clock_getres(clk_id, res))) { 0 => return, EFAULT => unreachable, EINVAL => return error.UnsupportedClock, @@ -3497,12 +3522,7 @@ pub const SigaltstackError = error{ } || UnexpectedError; pub fn sigaltstack(ss: ?*stack_t, old_ss: ?*stack_t) SigaltstackError!void { - const symbol_name = if (std.Target.current.os.tag == .netbsd) - "__sigaltstack14" - else - "sigaltstack"; - - switch (errno(@field(system, symbol_name)(ss, old_ss))) { + switch (errno(system.sigaltstack(ss, old_ss))) { 0 => return, EFAULT => unreachable, EINVAL => unreachable, @@ -3564,7 +3584,7 @@ pub const GetHostNameError = error{PermissionDenied} || UnexpectedError; pub fn gethostname(name_buffer: *[HOST_NAME_MAX]u8) GetHostNameError![]u8 { if (builtin.link_libc) { switch (errno(system.gethostname(name_buffer, name_buffer.len))) { - 0 => return mem.toSlice(u8, @ptrCast([*:0]u8, name_buffer)), + 0 => return mem.spanZ(@ptrCast([*:0]u8, name_buffer)), EFAULT => unreachable, ENAMETOOLONG => unreachable, // HOST_NAME_MAX prevents this EPERM => return error.PermissionDenied, @@ -3573,7 +3593,7 @@ pub fn gethostname(name_buffer: *[HOST_NAME_MAX]u8) GetHostNameError![]u8 { } if (builtin.os.tag == .linux) { const uts = uname(); - const hostname = mem.toSliceConst(u8, @ptrCast([*:0]const u8, &uts.nodename)); + const hostname = mem.spanZ(@ptrCast([*:0]const u8, &uts.nodename)); mem.copy(u8, name_buffer, hostname); return name_buffer[0..hostname.len]; } @@ -4260,7 +4280,9 @@ pub const MemFdCreateError = error{ SystemOutdated, } || UnexpectedError; -pub fn memfd_createC(name: [*:0]const u8, flags: u32) MemFdCreateError!fd_t { +pub const memfd_createC = @compileError("deprecated: renamed to memfd_createZ"); + +pub fn memfd_createZ(name: [*:0]const u8, flags: u32) MemFdCreateError!fd_t { // memfd_create is available only in glibc versions starting with 2.27. const use_c = std.c.versionCheck(.{ .major = 2, .minor = 27, .patch = 0 }).ok; const sys = if (use_c) std.c else linux; @@ -4291,7 +4313,7 @@ fn toMemFdPath(name: []const u8) ![MFD_MAX_NAME_LEN:0]u8 { pub fn memfd_create(name: []const u8, flags: u32) !fd_t { const name_t = try toMemFdPath(name); - return memfd_createC(&name_t, flags); + return memfd_createZ(&name_t, flags); } pub fn getrusage(who: i32) rusage { diff --git a/lib/std/os/bits/linux.zig b/lib/std/os/bits/linux.zig index 89364909c9..4bc3357ce5 100644 --- a/lib/std/os/bits/linux.zig +++ b/lib/std/os/bits/linux.zig @@ -88,11 +88,29 @@ pub const FUTEX_PRIVATE_FLAG = 128; pub const FUTEX_CLOCK_REALTIME = 256; -pub const PROT_NONE = 0; -pub const PROT_READ = 1; -pub const PROT_WRITE = 2; -pub const PROT_EXEC = 4; +/// page can not be accessed +pub const PROT_NONE = 0x0; + +/// page can be read +pub const PROT_READ = 0x1; + +/// page can be written +pub const PROT_WRITE = 0x2; + +/// page can be executed +pub const PROT_EXEC = 0x4; + +/// page may be used for atomic ops +pub const PROT_SEM = switch (builtin.arch) { + // TODO: also xtensa + .mips, .mipsel, .mips64, .mips64el => 0x10, + else => 0x8, +}; + +/// mprotect flag: extend change to start of growsdown vma pub const PROT_GROWSDOWN = 0x01000000; + +/// mprotect flag: extend change to end of growsup vma pub const PROT_GROWSUP = 0x02000000; /// Share changes @@ -617,6 +635,11 @@ pub const CLONE_IO = 0x80000000; /// Clear any signal handler and reset to SIG_DFL. pub const CLONE_CLEAR_SIGHAND = 0x100000000; +// cloning flags intersect with CSIGNAL so can be used with unshare and clone3 syscalls only. + +/// New time namespace +pub const CLONE_NEWTIME = 0x00000080; + pub const EFD_SEMAPHORE = 1; pub const EFD_CLOEXEC = O_CLOEXEC; pub const EFD_NONBLOCK = O_NONBLOCK; @@ -790,13 +813,13 @@ pub const app_mask: sigset_t = [2]u32{ 0xfffffffc, 0x7fffffff } ++ [_]u32{0xffff pub const k_sigaction = if (is_mips) extern struct { flags: usize, - sigaction: ?extern fn (i32, *siginfo_t, *c_void) void, + sigaction: ?extern fn (i32, *siginfo_t, ?*c_void) void, mask: [4]u32, restorer: extern fn () void, } else extern struct { - sigaction: ?extern fn (i32, *siginfo_t, *c_void) void, + sigaction: ?extern fn (i32, *siginfo_t, ?*c_void) void, flags: usize, restorer: extern fn () void, mask: [2]u32, @@ -804,15 +827,17 @@ else /// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall. pub const Sigaction = extern struct { - sigaction: ?extern fn (i32, *siginfo_t, *c_void) void, + pub const sigaction_fn = fn (i32, *siginfo_t, ?*c_void) callconv(.C) void; + sigaction: ?sigaction_fn, mask: sigset_t, flags: u32, restorer: ?extern fn () void = null, }; -pub const SIG_ERR = @intToPtr(extern fn (i32, *siginfo_t, *c_void) void, maxInt(usize)); -pub const SIG_DFL = @intToPtr(?extern fn (i32, *siginfo_t, *c_void) void, 0); -pub const SIG_IGN = @intToPtr(extern fn (i32, *siginfo_t, *c_void) void, 1); +pub const SIG_ERR = @intToPtr(?Sigaction.sigaction_fn, maxInt(usize)); +pub const SIG_DFL = @intToPtr(?Sigaction.sigaction_fn, 0); +pub const SIG_IGN = @intToPtr(?Sigaction.sigaction_fn, 1); + pub const empty_sigset = [_]u32{0} ** sigset_t.len; pub const in_port_t = u16; @@ -1125,7 +1150,8 @@ pub const io_uring_params = extern struct { sq_thread_cpu: u32, sq_thread_idle: u32, features: u32, - resv: [4]u32, + wq_fd: u32, + resv: [3]u32, sq_off: io_sqring_offsets, cq_off: io_cqring_offsets, }; @@ -1135,6 +1161,8 @@ pub const io_uring_params = extern struct { pub const IORING_FEAT_SINGLE_MMAP = 1 << 0; pub const IORING_FEAT_NODROP = 1 << 1; pub const IORING_FEAT_SUBMIT_STABLE = 1 << 2; +pub const IORING_FEAT_RW_CUR_POS = 1 << 3; +pub const IORING_FEAT_CUR_PERSONALITY = 1 << 4; // io_uring_params.flags @@ -1150,6 +1178,12 @@ pub const IORING_SETUP_SQ_AFF = 1 << 2; /// app defines CQ size pub const IORING_SETUP_CQSIZE = 1 << 3; +/// clamp SQ/CQ ring sizes +pub const IORING_SETUP_CLAMP = 1 << 4; + +/// attach to existing wq +pub const IORING_SETUP_ATTACH_WQ = 1 << 5; + pub const io_sqring_offsets = extern struct { /// offset of ring head head: u32, @@ -1192,7 +1226,7 @@ pub const io_cqring_offsets = extern struct { }; pub const io_uring_sqe = extern struct { - opcode: u8, + opcode: IORING_OP, flags: u8, ioprio: u16, fd: i32, @@ -1212,31 +1246,53 @@ pub const io_uring_sqe = extern struct { timeout_flags: u32, accept_flags: u32, cancel_flags: u32, + open_flags: u32, + statx_flags: u32, + fadvise_flags: u32, }; union2: union2, user_data: u64, pub const union3 = extern union { - buf_index: u16, + struct1: extern struct { + /// index into fixed buffers, if used + buf_index: u16, + + /// personality to use, if used + personality: u16, + }, __pad2: [3]u64, }; union3: union3, }; +pub const IOSQE_BIT = extern enum { + FIXED_FILE, + IO_DRAIN, + IO_LINK, + IO_HARDLINK, + ASYNC, + + _, +}; + // io_uring_sqe.flags /// use fixed fileset -pub const IOSQE_FIXED_FILE = 1 << 0; +pub const IOSQE_FIXED_FILE = 1 << IOSQE_BIT.FIXED_FILE; /// issue after inflight IO -pub const IOSQE_IO_DRAIN = 1 << 1; +pub const IOSQE_IO_DRAIN = 1 << IOSQE_BIT.IO_DRAIN; /// links next sqe -pub const IOSQE_IO_LINK = 1 << 2; +pub const IOSQE_IO_LINK = 1 << IOSQE_BIT.IO_LINK; /// like LINK, but stronger -pub const IOSQE_IO_HARDLINK = 1 << 3; +pub const IOSQE_IO_HARDLINK = 1 << IOSQE_BIT.IO_HARDLINK; -pub const IORING_OP = extern enum { +/// always go async +pub const IOSQE_ASYNC = 1 << IOSQE_BIT.ASYNC; + +pub const IORING_OP = extern enum(u8) { NOP, READV, WRITEV, @@ -1254,6 +1310,19 @@ pub const IORING_OP = extern enum { ASYNC_CANCEL, LINK_TIMEOUT, CONNECT, + FALLOCATE, + OPENAT, + CLOSE, + FILES_UPDATE, + STATX, + READ, + WRITE, + FADVISE, + MADVISE, + SEND, + RECV, + OPENAT2, + EPOLL_CTL, _, }; @@ -1283,13 +1352,21 @@ pub const IORING_ENTER_GETEVENTS = 1 << 0; pub const IORING_ENTER_SQ_WAKEUP = 1 << 1; // io_uring_register opcodes and arguments -pub const IORING_REGISTER_BUFFERS = 0; -pub const IORING_UNREGISTER_BUFFERS = 1; -pub const IORING_REGISTER_FILES = 2; -pub const IORING_UNREGISTER_FILES = 3; -pub const IORING_REGISTER_EVENTFD = 4; -pub const IORING_UNREGISTER_EVENTFD = 5; -pub const IORING_REGISTER_FILES_UPDATE = 6; +pub const IORING_REGISTER = extern enum(u32) { + REGISTER_BUFFERS, + UNREGISTER_BUFFERS, + REGISTER_FILES, + UNREGISTER_FILES, + REGISTER_EVENTFD, + UNREGISTER_EVENTFD, + REGISTER_FILES_UPDATE, + REGISTER_EVENTFD_ASYNC, + REGISTER_PROBE, + REGISTER_PERSONALITY, + UNREGISTER_PERSONALITY, + + _, +}; pub const io_uring_files_update = struct { offset: u32, @@ -1297,6 +1374,32 @@ pub const io_uring_files_update = struct { fds: u64, }; +pub const IO_URING_OP_SUPPORTED = 1 << 0; + +pub const io_uring_probe_op = struct { + op: IORING_OP, + + resv: u8, + + /// IO_URING_OP_* flags + flags: u16, + + resv2: u32, +}; + +pub const io_uring_probe = struct { + /// last opcode supported + last_op: IORING_OP, + + /// Number of io_uring_probe_op following + ops_len: u8, + + resv: u16, + resv2: u32[3], + + // Followed by up to `ops_len` io_uring_probe_op structures +}; + pub const utsname = extern struct { sysname: [64:0]u8, nodename: [64:0]u8, diff --git a/lib/std/os/bits/linux/arm-eabi.zig b/lib/std/os/bits/linux/arm-eabi.zig index 3788d17a98..d85b6b53c1 100644 --- a/lib/std/os/bits/linux/arm-eabi.zig +++ b/lib/std/os/bits/linux/arm-eabi.zig @@ -10,404 +10,410 @@ const uid_t = linux.uid_t; const gid_t = linux.gid_t; const pid_t = linux.pid_t; -pub const SYS_restart_syscall = 0; -pub const SYS_exit = 1; -pub const SYS_fork = 2; -pub const SYS_read = 3; -pub const SYS_write = 4; -pub const SYS_open = 5; -pub const SYS_close = 6; -pub const SYS_creat = 8; -pub const SYS_link = 9; -pub const SYS_unlink = 10; -pub const SYS_execve = 11; -pub const SYS_chdir = 12; -pub const SYS_mknod = 14; -pub const SYS_chmod = 15; -pub const SYS_lchown = 16; -pub const SYS_lseek = 19; -pub const SYS_getpid = 20; -pub const SYS_mount = 21; -pub const SYS_setuid = 23; -pub const SYS_getuid = 24; -pub const SYS_ptrace = 26; -pub const SYS_pause = 29; -pub const SYS_access = 33; -pub const SYS_nice = 34; -pub const SYS_sync = 36; -pub const SYS_kill = 37; -pub const SYS_rename = 38; -pub const SYS_mkdir = 39; -pub const SYS_rmdir = 40; -pub const SYS_dup = 41; -pub const SYS_pipe = 42; -pub const SYS_times = 43; -pub const SYS_brk = 45; -pub const SYS_setgid = 46; -pub const SYS_getgid = 47; -pub const SYS_geteuid = 49; -pub const SYS_getegid = 50; -pub const SYS_acct = 51; -pub const SYS_umount2 = 52; -pub const SYS_ioctl = 54; -pub const SYS_fcntl = 55; -pub const SYS_setpgid = 57; -pub const SYS_umask = 60; -pub const SYS_chroot = 61; -pub const SYS_ustat = 62; -pub const SYS_dup2 = 63; -pub const SYS_getppid = 64; -pub const SYS_getpgrp = 65; -pub const SYS_setsid = 66; -pub const SYS_sigaction = 67; -pub const SYS_setreuid = 70; -pub const SYS_setregid = 71; -pub const SYS_sigsuspend = 72; -pub const SYS_sigpending = 73; -pub const SYS_sethostname = 74; -pub const SYS_setrlimit = 75; -pub const SYS_getrusage = 77; -pub const SYS_gettimeofday = 78; -pub const SYS_settimeofday = 79; -pub const SYS_getgroups = 80; -pub const SYS_setgroups = 81; -pub const SYS_symlink = 83; -pub const SYS_readlink = 85; -pub const SYS_uselib = 86; -pub const SYS_swapon = 87; -pub const SYS_reboot = 88; -pub const SYS_munmap = 91; -pub const SYS_truncate = 92; -pub const SYS_ftruncate = 93; -pub const SYS_fchmod = 94; -pub const SYS_fchown = 95; -pub const SYS_getpriority = 96; -pub const SYS_setpriority = 97; -pub const SYS_statfs = 99; -pub const SYS_fstatfs = 100; -pub const SYS_syslog = 103; -pub const SYS_setitimer = 104; -pub const SYS_getitimer = 105; -pub const SYS_stat = 106; -pub const SYS_lstat = 107; -pub const SYS_fstat = 108; -pub const SYS_vhangup = 111; -pub const SYS_wait4 = 114; -pub const SYS_swapoff = 115; -pub const SYS_sysinfo = 116; -pub const SYS_fsync = 118; -pub const SYS_sigreturn = 119; -pub const SYS_clone = 120; -pub const SYS_setdomainname = 121; -pub const SYS_uname = 122; -pub const SYS_adjtimex = 124; -pub const SYS_mprotect = 125; -pub const SYS_sigprocmask = 126; -pub const SYS_init_module = 128; -pub const SYS_delete_module = 129; -pub const SYS_quotactl = 131; -pub const SYS_getpgid = 132; -pub const SYS_fchdir = 133; -pub const SYS_bdflush = 134; -pub const SYS_sysfs = 135; -pub const SYS_personality = 136; -pub const SYS_setfsuid = 138; -pub const SYS_setfsgid = 139; -pub const SYS__llseek = 140; -pub const SYS_getdents = 141; -pub const SYS__newselect = 142; -pub const SYS_flock = 143; -pub const SYS_msync = 144; -pub const SYS_readv = 145; -pub const SYS_writev = 146; -pub const SYS_getsid = 147; -pub const SYS_fdatasync = 148; -pub const SYS__sysctl = 149; -pub const SYS_mlock = 150; -pub const SYS_munlock = 151; -pub const SYS_mlockall = 152; -pub const SYS_munlockall = 153; -pub const SYS_sched_setparam = 154; -pub const SYS_sched_getparam = 155; -pub const SYS_sched_setscheduler = 156; -pub const SYS_sched_getscheduler = 157; -pub const SYS_sched_yield = 158; -pub const SYS_sched_get_priority_max = 159; -pub const SYS_sched_get_priority_min = 160; -pub const SYS_sched_rr_get_interval = 161; -pub const SYS_nanosleep = 162; -pub const SYS_mremap = 163; -pub const SYS_setresuid = 164; -pub const SYS_getresuid = 165; -pub const SYS_poll = 168; -pub const SYS_nfsservctl = 169; -pub const SYS_setresgid = 170; -pub const SYS_getresgid = 171; -pub const SYS_prctl = 172; -pub const SYS_rt_sigreturn = 173; -pub const SYS_rt_sigaction = 174; -pub const SYS_rt_sigprocmask = 175; -pub const SYS_rt_sigpending = 176; -pub const SYS_rt_sigtimedwait = 177; -pub const SYS_rt_sigqueueinfo = 178; -pub const SYS_rt_sigsuspend = 179; -pub const SYS_pread64 = 180; -pub const SYS_pwrite64 = 181; -pub const SYS_chown = 182; -pub const SYS_getcwd = 183; -pub const SYS_capget = 184; -pub const SYS_capset = 185; -pub const SYS_sigaltstack = 186; -pub const SYS_sendfile = 187; -pub const SYS_vfork = 190; -pub const SYS_ugetrlimit = 191; -pub const SYS_mmap2 = 192; -pub const SYS_truncate64 = 193; -pub const SYS_ftruncate64 = 194; -pub const SYS_stat64 = 195; -pub const SYS_lstat64 = 196; -pub const SYS_fstat64 = 197; -pub const SYS_lchown32 = 198; -pub const SYS_getuid32 = 199; -pub const SYS_getgid32 = 200; -pub const SYS_geteuid32 = 201; -pub const SYS_getegid32 = 202; -pub const SYS_setreuid32 = 203; -pub const SYS_setregid32 = 204; -pub const SYS_getgroups32 = 205; -pub const SYS_setgroups32 = 206; -pub const SYS_fchown32 = 207; -pub const SYS_setresuid32 = 208; -pub const SYS_getresuid32 = 209; -pub const SYS_setresgid32 = 210; -pub const SYS_getresgid32 = 211; -pub const SYS_chown32 = 212; -pub const SYS_setuid32 = 213; -pub const SYS_setgid32 = 214; -pub const SYS_setfsuid32 = 215; -pub const SYS_setfsgid32 = 216; -pub const SYS_getdents64 = 217; -pub const SYS_pivot_root = 218; -pub const SYS_mincore = 219; -pub const SYS_madvise = 220; -pub const SYS_fcntl64 = 221; -pub const SYS_gettid = 224; -pub const SYS_readahead = 225; -pub const SYS_setxattr = 226; -pub const SYS_lsetxattr = 227; -pub const SYS_fsetxattr = 228; -pub const SYS_getxattr = 229; -pub const SYS_lgetxattr = 230; -pub const SYS_fgetxattr = 231; -pub const SYS_listxattr = 232; -pub const SYS_llistxattr = 233; -pub const SYS_flistxattr = 234; -pub const SYS_removexattr = 235; -pub const SYS_lremovexattr = 236; -pub const SYS_fremovexattr = 237; -pub const SYS_tkill = 238; -pub const SYS_sendfile64 = 239; -pub const SYS_futex = 240; -pub const SYS_sched_setaffinity = 241; -pub const SYS_sched_getaffinity = 242; -pub const SYS_io_setup = 243; -pub const SYS_io_destroy = 244; -pub const SYS_io_getevents = 245; -pub const SYS_io_submit = 246; -pub const SYS_io_cancel = 247; -pub const SYS_exit_group = 248; -pub const SYS_lookup_dcookie = 249; -pub const SYS_epoll_create = 250; -pub const SYS_epoll_ctl = 251; -pub const SYS_epoll_wait = 252; -pub const SYS_remap_file_pages = 253; -pub const SYS_set_tid_address = 256; -pub const SYS_timer_create = 257; -pub const SYS_timer_settime = 258; -pub const SYS_timer_gettime = 259; -pub const SYS_timer_getoverrun = 260; -pub const SYS_timer_delete = 261; -pub const SYS_clock_settime = 262; -pub const SYS_clock_gettime = 263; -pub const SYS_clock_getres = 264; -pub const SYS_clock_nanosleep = 265; -pub const SYS_statfs64 = 266; -pub const SYS_fstatfs64 = 267; -pub const SYS_tgkill = 268; -pub const SYS_utimes = 269; -pub const SYS_fadvise64_64 = 270; -pub const SYS_arm_fadvise64_64 = 270; -pub const SYS_pciconfig_iobase = 271; -pub const SYS_pciconfig_read = 272; -pub const SYS_pciconfig_write = 273; -pub const SYS_mq_open = 274; -pub const SYS_mq_unlink = 275; -pub const SYS_mq_timedsend = 276; -pub const SYS_mq_timedreceive = 277; -pub const SYS_mq_notify = 278; -pub const SYS_mq_getsetattr = 279; -pub const SYS_waitid = 280; -pub const SYS_socket = 281; -pub const SYS_bind = 282; -pub const SYS_connect = 283; -pub const SYS_listen = 284; -pub const SYS_accept = 285; -pub const SYS_getsockname = 286; -pub const SYS_getpeername = 287; -pub const SYS_socketpair = 288; -pub const SYS_send = 289; -pub const SYS_sendto = 290; -pub const SYS_recv = 291; -pub const SYS_recvfrom = 292; -pub const SYS_shutdown = 293; -pub const SYS_setsockopt = 294; -pub const SYS_getsockopt = 295; -pub const SYS_sendmsg = 296; -pub const SYS_recvmsg = 297; -pub const SYS_semop = 298; -pub const SYS_semget = 299; -pub const SYS_semctl = 300; -pub const SYS_msgsnd = 301; -pub const SYS_msgrcv = 302; -pub const SYS_msgget = 303; -pub const SYS_msgctl = 304; -pub const SYS_shmat = 305; -pub const SYS_shmdt = 306; -pub const SYS_shmget = 307; -pub const SYS_shmctl = 308; -pub const SYS_add_key = 309; -pub const SYS_request_key = 310; -pub const SYS_keyctl = 311; -pub const SYS_semtimedop = 312; -pub const SYS_vserver = 313; -pub const SYS_ioprio_set = 314; -pub const SYS_ioprio_get = 315; -pub const SYS_inotify_init = 316; -pub const SYS_inotify_add_watch = 317; -pub const SYS_inotify_rm_watch = 318; -pub const SYS_mbind = 319; -pub const SYS_get_mempolicy = 320; -pub const SYS_set_mempolicy = 321; -pub const SYS_openat = 322; -pub const SYS_mkdirat = 323; -pub const SYS_mknodat = 324; -pub const SYS_fchownat = 325; -pub const SYS_futimesat = 326; -pub const SYS_fstatat64 = 327; -pub const SYS_unlinkat = 328; -pub const SYS_renameat = 329; -pub const SYS_linkat = 330; -pub const SYS_symlinkat = 331; -pub const SYS_readlinkat = 332; -pub const SYS_fchmodat = 333; -pub const SYS_faccessat = 334; -pub const SYS_pselect6 = 335; -pub const SYS_ppoll = 336; -pub const SYS_unshare = 337; -pub const SYS_set_robust_list = 338; -pub const SYS_get_robust_list = 339; -pub const SYS_splice = 340; -pub const SYS_sync_file_range2 = 341; -pub const SYS_arm_sync_file_range = 341; -pub const SYS_tee = 342; -pub const SYS_vmsplice = 343; -pub const SYS_move_pages = 344; -pub const SYS_getcpu = 345; -pub const SYS_epoll_pwait = 346; -pub const SYS_kexec_load = 347; -pub const SYS_utimensat = 348; -pub const SYS_signalfd = 349; -pub const SYS_timerfd_create = 350; -pub const SYS_eventfd = 351; -pub const SYS_fallocate = 352; -pub const SYS_timerfd_settime = 353; -pub const SYS_timerfd_gettime = 354; -pub const SYS_signalfd4 = 355; -pub const SYS_eventfd2 = 356; -pub const SYS_epoll_create1 = 357; -pub const SYS_dup3 = 358; -pub const SYS_pipe2 = 359; -pub const SYS_inotify_init1 = 360; -pub const SYS_preadv = 361; -pub const SYS_pwritev = 362; -pub const SYS_rt_tgsigqueueinfo = 363; -pub const SYS_perf_event_open = 364; -pub const SYS_recvmmsg = 365; -pub const SYS_accept4 = 366; -pub const SYS_fanotify_init = 367; -pub const SYS_fanotify_mark = 368; -pub const SYS_prlimit64 = 369; -pub const SYS_name_to_handle_at = 370; -pub const SYS_open_by_handle_at = 371; -pub const SYS_clock_adjtime = 372; -pub const SYS_syncfs = 373; -pub const SYS_sendmmsg = 374; -pub const SYS_setns = 375; -pub const SYS_process_vm_readv = 376; -pub const SYS_process_vm_writev = 377; -pub const SYS_kcmp = 378; -pub const SYS_finit_module = 379; -pub const SYS_sched_setattr = 380; -pub const SYS_sched_getattr = 381; -pub const SYS_renameat2 = 382; -pub const SYS_seccomp = 383; -pub const SYS_getrandom = 384; -pub const SYS_memfd_create = 385; -pub const SYS_bpf = 386; -pub const SYS_execveat = 387; -pub const SYS_userfaultfd = 388; -pub const SYS_membarrier = 389; -pub const SYS_mlock2 = 390; -pub const SYS_copy_file_range = 391; -pub const SYS_preadv2 = 392; -pub const SYS_pwritev2 = 393; -pub const SYS_pkey_mprotect = 394; -pub const SYS_pkey_alloc = 395; -pub const SYS_pkey_free = 396; -pub const SYS_statx = 397; -pub const SYS_rseq = 398; -pub const SYS_io_pgetevents = 399; -pub const SYS_migrate_pages = 400; -pub const SYS_kexec_file_load = 401; -pub const SYS_clock_gettime64 = 403; -pub const SYS_clock_settime64 = 404; -pub const SYS_clock_adjtime64 = 405; -pub const SYS_clock_getres_time64 = 406; -pub const SYS_clock_nanosleep_time64 = 407; -pub const SYS_timer_gettime64 = 408; -pub const SYS_timer_settime64 = 409; -pub const SYS_timerfd_gettime64 = 410; -pub const SYS_timerfd_settime64 = 411; -pub const SYS_utimensat_time64 = 412; -pub const SYS_pselect6_time64 = 413; -pub const SYS_ppoll_time64 = 414; -pub const SYS_io_pgetevents_time64 = 416; -pub const SYS_recvmmsg_time64 = 417; -pub const SYS_mq_timedsend_time64 = 418; -pub const SYS_mq_timedreceive_time64 = 419; -pub const SYS_semtimedop_time64 = 420; -pub const SYS_rt_sigtimedwait_time64 = 421; -pub const SYS_futex_time64 = 422; -pub const SYS_sched_rr_get_interval_time64 = 423; -pub const SYS_pidfd_send_signal = 424; -pub const SYS_io_uring_setup = 425; -pub const SYS_io_uring_enter = 426; -pub const SYS_io_uring_register = 427; -pub const SYS_open_tree = 428; -pub const SYS_move_mount = 429; -pub const SYS_fsopen = 430; -pub const SYS_fsconfig = 431; -pub const SYS_fsmount = 432; -pub const SYS_fspick = 433; -pub const SYS_pidfd_open = 434; -pub const SYS_clone3 = 435; +pub const SYS = extern enum(usize) { + restart_syscall = 0, + exit = 1, + fork = 2, + read = 3, + write = 4, + open = 5, + close = 6, + creat = 8, + link = 9, + unlink = 10, + execve = 11, + chdir = 12, + mknod = 14, + chmod = 15, + lchown = 16, + lseek = 19, + getpid = 20, + mount = 21, + setuid = 23, + getuid = 24, + ptrace = 26, + pause = 29, + access = 33, + nice = 34, + sync = 36, + kill = 37, + rename = 38, + mkdir = 39, + rmdir = 40, + dup = 41, + pipe = 42, + times = 43, + brk = 45, + setgid = 46, + getgid = 47, + geteuid = 49, + getegid = 50, + acct = 51, + umount2 = 52, + ioctl = 54, + fcntl = 55, + setpgid = 57, + umask = 60, + chroot = 61, + ustat = 62, + dup2 = 63, + getppid = 64, + getpgrp = 65, + setsid = 66, + sigaction = 67, + setreuid = 70, + setregid = 71, + sigsuspend = 72, + sigpending = 73, + sethostname = 74, + setrlimit = 75, + getrusage = 77, + gettimeofday = 78, + settimeofday = 79, + getgroups = 80, + setgroups = 81, + symlink = 83, + readlink = 85, + uselib = 86, + swapon = 87, + reboot = 88, + munmap = 91, + truncate = 92, + ftruncate = 93, + fchmod = 94, + fchown = 95, + getpriority = 96, + setpriority = 97, + statfs = 99, + fstatfs = 100, + syslog = 103, + setitimer = 104, + getitimer = 105, + stat = 106, + lstat = 107, + fstat = 108, + vhangup = 111, + wait4 = 114, + swapoff = 115, + sysinfo = 116, + fsync = 118, + sigreturn = 119, + clone = 120, + setdomainname = 121, + uname = 122, + adjtimex = 124, + mprotect = 125, + sigprocmask = 126, + init_module = 128, + delete_module = 129, + quotactl = 131, + getpgid = 132, + fchdir = 133, + bdflush = 134, + sysfs = 135, + personality = 136, + setfsuid = 138, + setfsgid = 139, + _llseek = 140, + getdents = 141, + _newselect = 142, + flock = 143, + msync = 144, + readv = 145, + writev = 146, + getsid = 147, + fdatasync = 148, + _sysctl = 149, + mlock = 150, + munlock = 151, + mlockall = 152, + munlockall = 153, + sched_setparam = 154, + sched_getparam = 155, + sched_setscheduler = 156, + sched_getscheduler = 157, + sched_yield = 158, + sched_get_priority_max = 159, + sched_get_priority_min = 160, + sched_rr_get_interval = 161, + nanosleep = 162, + mremap = 163, + setresuid = 164, + getresuid = 165, + poll = 168, + nfsservctl = 169, + setresgid = 170, + getresgid = 171, + prctl = 172, + rt_sigreturn = 173, + rt_sigaction = 174, + rt_sigprocmask = 175, + rt_sigpending = 176, + rt_sigtimedwait = 177, + rt_sigqueueinfo = 178, + rt_sigsuspend = 179, + pread64 = 180, + pwrite64 = 181, + chown = 182, + getcwd = 183, + capget = 184, + capset = 185, + sigaltstack = 186, + sendfile = 187, + vfork = 190, + ugetrlimit = 191, + mmap2 = 192, + truncate64 = 193, + ftruncate64 = 194, + stat64 = 195, + lstat64 = 196, + fstat64 = 197, + lchown32 = 198, + getuid32 = 199, + getgid32 = 200, + geteuid32 = 201, + getegid32 = 202, + setreuid32 = 203, + setregid32 = 204, + getgroups32 = 205, + setgroups32 = 206, + fchown32 = 207, + setresuid32 = 208, + getresuid32 = 209, + setresgid32 = 210, + getresgid32 = 211, + chown32 = 212, + setuid32 = 213, + setgid32 = 214, + setfsuid32 = 215, + setfsgid32 = 216, + getdents64 = 217, + pivot_root = 218, + mincore = 219, + madvise = 220, + fcntl64 = 221, + gettid = 224, + readahead = 225, + setxattr = 226, + lsetxattr = 227, + fsetxattr = 228, + getxattr = 229, + lgetxattr = 230, + fgetxattr = 231, + listxattr = 232, + llistxattr = 233, + flistxattr = 234, + removexattr = 235, + lremovexattr = 236, + fremovexattr = 237, + tkill = 238, + sendfile64 = 239, + futex = 240, + sched_setaffinity = 241, + sched_getaffinity = 242, + io_setup = 243, + io_destroy = 244, + io_getevents = 245, + io_submit = 246, + io_cancel = 247, + exit_group = 248, + lookup_dcookie = 249, + epoll_create = 250, + epoll_ctl = 251, + epoll_wait = 252, + remap_file_pages = 253, + set_tid_address = 256, + timer_create = 257, + timer_settime = 258, + timer_gettime = 259, + timer_getoverrun = 260, + timer_delete = 261, + clock_settime = 262, + clock_gettime = 263, + clock_getres = 264, + clock_nanosleep = 265, + statfs64 = 266, + fstatfs64 = 267, + tgkill = 268, + utimes = 269, + fadvise64_64 = 270, + arm_fadvise64_64 = 270, + pciconfig_iobase = 271, + pciconfig_read = 272, + pciconfig_write = 273, + mq_open = 274, + mq_unlink = 275, + mq_timedsend = 276, + mq_timedreceive = 277, + mq_notify = 278, + mq_getsetattr = 279, + waitid = 280, + socket = 281, + bind = 282, + connect = 283, + listen = 284, + accept = 285, + getsockname = 286, + getpeername = 287, + socketpair = 288, + send = 289, + sendto = 290, + recv = 291, + recvfrom = 292, + shutdown = 293, + setsockopt = 294, + getsockopt = 295, + sendmsg = 296, + recvmsg = 297, + semop = 298, + semget = 299, + semctl = 300, + msgsnd = 301, + msgrcv = 302, + msgget = 303, + msgctl = 304, + shmat = 305, + shmdt = 306, + shmget = 307, + shmctl = 308, + add_key = 309, + request_key = 310, + keyctl = 311, + semtimedop = 312, + vserver = 313, + ioprio_set = 314, + ioprio_get = 315, + inotify_init = 316, + inotify_add_watch = 317, + inotify_rm_watch = 318, + mbind = 319, + get_mempolicy = 320, + set_mempolicy = 321, + openat = 322, + mkdirat = 323, + mknodat = 324, + fchownat = 325, + futimesat = 326, + fstatat64 = 327, + unlinkat = 328, + renameat = 329, + linkat = 330, + symlinkat = 331, + readlinkat = 332, + fchmodat = 333, + faccessat = 334, + pselect6 = 335, + ppoll = 336, + unshare = 337, + set_robust_list = 338, + get_robust_list = 339, + splice = 340, + sync_file_range2 = 341, + arm_sync_file_range = 341, + tee = 342, + vmsplice = 343, + move_pages = 344, + getcpu = 345, + epoll_pwait = 346, + kexec_load = 347, + utimensat = 348, + signalfd = 349, + timerfd_create = 350, + eventfd = 351, + fallocate = 352, + timerfd_settime = 353, + timerfd_gettime = 354, + signalfd4 = 355, + eventfd2 = 356, + epoll_create1 = 357, + dup3 = 358, + pipe2 = 359, + inotify_init1 = 360, + preadv = 361, + pwritev = 362, + rt_tgsigqueueinfo = 363, + perf_event_open = 364, + recvmmsg = 365, + accept4 = 366, + fanotify_init = 367, + fanotify_mark = 368, + prlimit64 = 369, + name_to_handle_at = 370, + open_by_handle_at = 371, + clock_adjtime = 372, + syncfs = 373, + sendmmsg = 374, + setns = 375, + process_vm_readv = 376, + process_vm_writev = 377, + kcmp = 378, + finit_module = 379, + sched_setattr = 380, + sched_getattr = 381, + renameat2 = 382, + seccomp = 383, + getrandom = 384, + memfd_create = 385, + bpf = 386, + execveat = 387, + userfaultfd = 388, + membarrier = 389, + mlock2 = 390, + copy_file_range = 391, + preadv2 = 392, + pwritev2 = 393, + pkey_mprotect = 394, + pkey_alloc = 395, + pkey_free = 396, + statx = 397, + rseq = 398, + io_pgetevents = 399, + migrate_pages = 400, + kexec_file_load = 401, + clock_gettime64 = 403, + clock_settime64 = 404, + clock_adjtime64 = 405, + clock_getres_time64 = 406, + clock_nanosleep_time64 = 407, + timer_gettime64 = 408, + timer_settime64 = 409, + timerfd_gettime64 = 410, + timerfd_settime64 = 411, + utimensat_time64 = 412, + pselect6_time64 = 413, + ppoll_time64 = 414, + io_pgetevents_time64 = 416, + recvmmsg_time64 = 417, + mq_timedsend_time64 = 418, + mq_timedreceive_time64 = 419, + semtimedop_time64 = 420, + rt_sigtimedwait_time64 = 421, + futex_time64 = 422, + sched_rr_get_interval_time64 = 423, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + openat2 = 437, + pidfd_getfd = 438, -pub const SYS_breakpoint = 0x0f0001; -pub const SYS_cacheflush = 0x0f0002; -pub const SYS_usr26 = 0x0f0003; -pub const SYS_usr32 = 0x0f0004; -pub const SYS_set_tls = 0x0f0005; -pub const SYS_get_tls = 0x0f0006; + breakpoint = 0x0f0001, + cacheflush = 0x0f0002, + usr26 = 0x0f0003, + usr32 = 0x0f0004, + set_tls = 0x0f0005, + get_tls = 0x0f0006, + + _, +}; pub const MMAP2_UNIT = 4096; diff --git a/lib/std/os/bits/linux/arm64.zig b/lib/std/os/bits/linux/arm64.zig index a715a2fa21..038cfd92d4 100644 --- a/lib/std/os/bits/linux/arm64.zig +++ b/lib/std/os/bits/linux/arm64.zig @@ -11,298 +11,303 @@ const gid_t = linux.gid_t; const pid_t = linux.pid_t; const stack_t = linux.stack_t; const sigset_t = linux.sigset_t; +pub const SYS = extern enum(usize) { + io_setup = 0, + io_destroy = 1, + io_submit = 2, + io_cancel = 3, + io_getevents = 4, + setxattr = 5, + lsetxattr = 6, + fsetxattr = 7, + getxattr = 8, + lgetxattr = 9, + fgetxattr = 10, + listxattr = 11, + llistxattr = 12, + flistxattr = 13, + removexattr = 14, + lremovexattr = 15, + fremovexattr = 16, + getcwd = 17, + lookup_dcookie = 18, + eventfd2 = 19, + epoll_create1 = 20, + epoll_ctl = 21, + epoll_pwait = 22, + dup = 23, + dup3 = 24, + fcntl = 25, + inotify_init1 = 26, + inotify_add_watch = 27, + inotify_rm_watch = 28, + ioctl = 29, + ioprio_set = 30, + ioprio_get = 31, + flock = 32, + mknodat = 33, + mkdirat = 34, + unlinkat = 35, + symlinkat = 36, + linkat = 37, + renameat = 38, + umount2 = 39, + mount = 40, + pivot_root = 41, + nfsservctl = 42, + statfs = 43, + fstatfs = 44, + truncate = 45, + ftruncate = 46, + fallocate = 47, + faccessat = 48, + chdir = 49, + fchdir = 50, + chroot = 51, + fchmod = 52, + fchmodat = 53, + fchownat = 54, + fchown = 55, + openat = 56, + close = 57, + vhangup = 58, + pipe2 = 59, + quotactl = 60, + getdents64 = 61, + lseek = 62, + read = 63, + write = 64, + readv = 65, + writev = 66, + pread64 = 67, + pwrite64 = 68, + preadv = 69, + pwritev = 70, + sendfile = 71, + pselect6 = 72, + ppoll = 73, + signalfd4 = 74, + vmsplice = 75, + splice = 76, + tee = 77, + readlinkat = 78, + fstatat = 79, + fstat = 80, + sync = 81, + fsync = 82, + fdatasync = 83, + sync_file_range2 = 84, + sync_file_range = 84, + timerfd_create = 85, + timerfd_settime = 86, + timerfd_gettime = 87, + utimensat = 88, + acct = 89, + capget = 90, + capset = 91, + personality = 92, + exit = 93, + exit_group = 94, + waitid = 95, + set_tid_address = 96, + unshare = 97, + futex = 98, + set_robust_list = 99, + get_robust_list = 100, + nanosleep = 101, + getitimer = 102, + setitimer = 103, + kexec_load = 104, + init_module = 105, + delete_module = 106, + timer_create = 107, + timer_gettime = 108, + timer_getoverrun = 109, + timer_settime = 110, + timer_delete = 111, + clock_settime = 112, + clock_gettime = 113, + clock_getres = 114, + clock_nanosleep = 115, + syslog = 116, + ptrace = 117, + sched_setparam = 118, + sched_setscheduler = 119, + sched_getscheduler = 120, + sched_getparam = 121, + sched_setaffinity = 122, + sched_getaffinity = 123, + sched_yield = 124, + sched_get_priority_max = 125, + sched_get_priority_min = 126, + sched_rr_get_interval = 127, + restart_syscall = 128, + kill = 129, + tkill = 130, + tgkill = 131, + sigaltstack = 132, + rt_sigsuspend = 133, + rt_sigaction = 134, + rt_sigprocmask = 135, + rt_sigpending = 136, + rt_sigtimedwait = 137, + rt_sigqueueinfo = 138, + rt_sigreturn = 139, + setpriority = 140, + getpriority = 141, + reboot = 142, + setregid = 143, + setgid = 144, + setreuid = 145, + setuid = 146, + setresuid = 147, + getresuid = 148, + setresgid = 149, + getresgid = 150, + setfsuid = 151, + setfsgid = 152, + times = 153, + setpgid = 154, + getpgid = 155, + getsid = 156, + setsid = 157, + getgroups = 158, + setgroups = 159, + uname = 160, + sethostname = 161, + setdomainname = 162, + getrlimit = 163, + setrlimit = 164, + getrusage = 165, + umask = 166, + prctl = 167, + getcpu = 168, + gettimeofday = 169, + settimeofday = 170, + adjtimex = 171, + getpid = 172, + getppid = 173, + getuid = 174, + geteuid = 175, + getgid = 176, + getegid = 177, + gettid = 178, + sysinfo = 179, + mq_open = 180, + mq_unlink = 181, + mq_timedsend = 182, + mq_timedreceive = 183, + mq_notify = 184, + mq_getsetattr = 185, + msgget = 186, + msgctl = 187, + msgrcv = 188, + msgsnd = 189, + semget = 190, + semctl = 191, + semtimedop = 192, + semop = 193, + shmget = 194, + shmctl = 195, + shmat = 196, + shmdt = 197, + socket = 198, + socketpair = 199, + bind = 200, + listen = 201, + accept = 202, + connect = 203, + getsockname = 204, + getpeername = 205, + sendto = 206, + recvfrom = 207, + setsockopt = 208, + getsockopt = 209, + shutdown = 210, + sendmsg = 211, + recvmsg = 212, + readahead = 213, + brk = 214, + munmap = 215, + mremap = 216, + add_key = 217, + request_key = 218, + keyctl = 219, + clone = 220, + execve = 221, + mmap = 222, + fadvise64 = 223, + swapon = 224, + swapoff = 225, + mprotect = 226, + msync = 227, + mlock = 228, + munlock = 229, + mlockall = 230, + munlockall = 231, + mincore = 232, + madvise = 233, + remap_file_pages = 234, + mbind = 235, + get_mempolicy = 236, + set_mempolicy = 237, + migrate_pages = 238, + move_pages = 239, + rt_tgsigqueueinfo = 240, + perf_event_open = 241, + accept4 = 242, + recvmmsg = 243, + arch_specific_syscall = 244, + wait4 = 260, + prlimit64 = 261, + fanotify_init = 262, + fanotify_mark = 263, + clock_adjtime = 266, + syncfs = 267, + setns = 268, + sendmmsg = 269, + process_vm_readv = 270, + process_vm_writev = 271, + kcmp = 272, + finit_module = 273, + sched_setattr = 274, + sched_getattr = 275, + renameat2 = 276, + seccomp = 277, + getrandom = 278, + memfd_create = 279, + bpf = 280, + execveat = 281, + userfaultfd = 282, + membarrier = 283, + mlock2 = 284, + copy_file_range = 285, + preadv2 = 286, + pwritev2 = 287, + pkey_mprotect = 288, + pkey_alloc = 289, + pkey_free = 290, + statx = 291, + io_pgetevents = 292, + rseq = 293, + kexec_file_load = 294, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + openat2 = 437, + pidfd_getfd = 438, -pub const SYS_io_setup = 0; -pub const SYS_io_destroy = 1; -pub const SYS_io_submit = 2; -pub const SYS_io_cancel = 3; -pub const SYS_io_getevents = 4; -pub const SYS_setxattr = 5; -pub const SYS_lsetxattr = 6; -pub const SYS_fsetxattr = 7; -pub const SYS_getxattr = 8; -pub const SYS_lgetxattr = 9; -pub const SYS_fgetxattr = 10; -pub const SYS_listxattr = 11; -pub const SYS_llistxattr = 12; -pub const SYS_flistxattr = 13; -pub const SYS_removexattr = 14; -pub const SYS_lremovexattr = 15; -pub const SYS_fremovexattr = 16; -pub const SYS_getcwd = 17; -pub const SYS_lookup_dcookie = 18; -pub const SYS_eventfd2 = 19; -pub const SYS_epoll_create1 = 20; -pub const SYS_epoll_ctl = 21; -pub const SYS_epoll_pwait = 22; -pub const SYS_dup = 23; -pub const SYS_dup3 = 24; -pub const SYS_fcntl = 25; -pub const SYS_inotify_init1 = 26; -pub const SYS_inotify_add_watch = 27; -pub const SYS_inotify_rm_watch = 28; -pub const SYS_ioctl = 29; -pub const SYS_ioprio_set = 30; -pub const SYS_ioprio_get = 31; -pub const SYS_flock = 32; -pub const SYS_mknodat = 33; -pub const SYS_mkdirat = 34; -pub const SYS_unlinkat = 35; -pub const SYS_symlinkat = 36; -pub const SYS_linkat = 37; -pub const SYS_renameat = 38; -pub const SYS_umount2 = 39; -pub const SYS_mount = 40; -pub const SYS_pivot_root = 41; -pub const SYS_nfsservctl = 42; -pub const SYS_statfs = 43; -pub const SYS_fstatfs = 44; -pub const SYS_truncate = 45; -pub const SYS_ftruncate = 46; -pub const SYS_fallocate = 47; -pub const SYS_faccessat = 48; -pub const SYS_chdir = 49; -pub const SYS_fchdir = 50; -pub const SYS_chroot = 51; -pub const SYS_fchmod = 52; -pub const SYS_fchmodat = 53; -pub const SYS_fchownat = 54; -pub const SYS_fchown = 55; -pub const SYS_openat = 56; -pub const SYS_close = 57; -pub const SYS_vhangup = 58; -pub const SYS_pipe2 = 59; -pub const SYS_quotactl = 60; -pub const SYS_getdents64 = 61; -pub const SYS_lseek = 62; -pub const SYS_read = 63; -pub const SYS_write = 64; -pub const SYS_readv = 65; -pub const SYS_writev = 66; -pub const SYS_pread64 = 67; -pub const SYS_pwrite64 = 68; -pub const SYS_preadv = 69; -pub const SYS_pwritev = 70; -pub const SYS_sendfile = 71; -pub const SYS_pselect6 = 72; -pub const SYS_ppoll = 73; -pub const SYS_signalfd4 = 74; -pub const SYS_vmsplice = 75; -pub const SYS_splice = 76; -pub const SYS_tee = 77; -pub const SYS_readlinkat = 78; -pub const SYS_fstatat = 79; -pub const SYS_fstat = 80; -pub const SYS_sync = 81; -pub const SYS_fsync = 82; -pub const SYS_fdatasync = 83; -pub const SYS_sync_file_range2 = 84; -pub const SYS_sync_file_range = 84; -pub const SYS_timerfd_create = 85; -pub const SYS_timerfd_settime = 86; -pub const SYS_timerfd_gettime = 87; -pub const SYS_utimensat = 88; -pub const SYS_acct = 89; -pub const SYS_capget = 90; -pub const SYS_capset = 91; -pub const SYS_personality = 92; -pub const SYS_exit = 93; -pub const SYS_exit_group = 94; -pub const SYS_waitid = 95; -pub const SYS_set_tid_address = 96; -pub const SYS_unshare = 97; -pub const SYS_futex = 98; -pub const SYS_set_robust_list = 99; -pub const SYS_get_robust_list = 100; -pub const SYS_nanosleep = 101; -pub const SYS_getitimer = 102; -pub const SYS_setitimer = 103; -pub const SYS_kexec_load = 104; -pub const SYS_init_module = 105; -pub const SYS_delete_module = 106; -pub const SYS_timer_create = 107; -pub const SYS_timer_gettime = 108; -pub const SYS_timer_getoverrun = 109; -pub const SYS_timer_settime = 110; -pub const SYS_timer_delete = 111; -pub const SYS_clock_settime = 112; -pub const SYS_clock_gettime = 113; -pub const SYS_clock_getres = 114; -pub const SYS_clock_nanosleep = 115; -pub const SYS_syslog = 116; -pub const SYS_ptrace = 117; -pub const SYS_sched_setparam = 118; -pub const SYS_sched_setscheduler = 119; -pub const SYS_sched_getscheduler = 120; -pub const SYS_sched_getparam = 121; -pub const SYS_sched_setaffinity = 122; -pub const SYS_sched_getaffinity = 123; -pub const SYS_sched_yield = 124; -pub const SYS_sched_get_priority_max = 125; -pub const SYS_sched_get_priority_min = 126; -pub const SYS_sched_rr_get_interval = 127; -pub const SYS_restart_syscall = 128; -pub const SYS_kill = 129; -pub const SYS_tkill = 130; -pub const SYS_tgkill = 131; -pub const SYS_sigaltstack = 132; -pub const SYS_rt_sigsuspend = 133; -pub const SYS_rt_sigaction = 134; -pub const SYS_rt_sigprocmask = 135; -pub const SYS_rt_sigpending = 136; -pub const SYS_rt_sigtimedwait = 137; -pub const SYS_rt_sigqueueinfo = 138; -pub const SYS_rt_sigreturn = 139; -pub const SYS_setpriority = 140; -pub const SYS_getpriority = 141; -pub const SYS_reboot = 142; -pub const SYS_setregid = 143; -pub const SYS_setgid = 144; -pub const SYS_setreuid = 145; -pub const SYS_setuid = 146; -pub const SYS_setresuid = 147; -pub const SYS_getresuid = 148; -pub const SYS_setresgid = 149; -pub const SYS_getresgid = 150; -pub const SYS_setfsuid = 151; -pub const SYS_setfsgid = 152; -pub const SYS_times = 153; -pub const SYS_setpgid = 154; -pub const SYS_getpgid = 155; -pub const SYS_getsid = 156; -pub const SYS_setsid = 157; -pub const SYS_getgroups = 158; -pub const SYS_setgroups = 159; -pub const SYS_uname = 160; -pub const SYS_sethostname = 161; -pub const SYS_setdomainname = 162; -pub const SYS_getrlimit = 163; -pub const SYS_setrlimit = 164; -pub const SYS_getrusage = 165; -pub const SYS_umask = 166; -pub const SYS_prctl = 167; -pub const SYS_getcpu = 168; -pub const SYS_gettimeofday = 169; -pub const SYS_settimeofday = 170; -pub const SYS_adjtimex = 171; -pub const SYS_getpid = 172; -pub const SYS_getppid = 173; -pub const SYS_getuid = 174; -pub const SYS_geteuid = 175; -pub const SYS_getgid = 176; -pub const SYS_getegid = 177; -pub const SYS_gettid = 178; -pub const SYS_sysinfo = 179; -pub const SYS_mq_open = 180; -pub const SYS_mq_unlink = 181; -pub const SYS_mq_timedsend = 182; -pub const SYS_mq_timedreceive = 183; -pub const SYS_mq_notify = 184; -pub const SYS_mq_getsetattr = 185; -pub const SYS_msgget = 186; -pub const SYS_msgctl = 187; -pub const SYS_msgrcv = 188; -pub const SYS_msgsnd = 189; -pub const SYS_semget = 190; -pub const SYS_semctl = 191; -pub const SYS_semtimedop = 192; -pub const SYS_semop = 193; -pub const SYS_shmget = 194; -pub const SYS_shmctl = 195; -pub const SYS_shmat = 196; -pub const SYS_shmdt = 197; -pub const SYS_socket = 198; -pub const SYS_socketpair = 199; -pub const SYS_bind = 200; -pub const SYS_listen = 201; -pub const SYS_accept = 202; -pub const SYS_connect = 203; -pub const SYS_getsockname = 204; -pub const SYS_getpeername = 205; -pub const SYS_sendto = 206; -pub const SYS_recvfrom = 207; -pub const SYS_setsockopt = 208; -pub const SYS_getsockopt = 209; -pub const SYS_shutdown = 210; -pub const SYS_sendmsg = 211; -pub const SYS_recvmsg = 212; -pub const SYS_readahead = 213; -pub const SYS_brk = 214; -pub const SYS_munmap = 215; -pub const SYS_mremap = 216; -pub const SYS_add_key = 217; -pub const SYS_request_key = 218; -pub const SYS_keyctl = 219; -pub const SYS_clone = 220; -pub const SYS_execve = 221; -pub const SYS_mmap = 222; -pub const SYS_fadvise64 = 223; -pub const SYS_swapon = 224; -pub const SYS_swapoff = 225; -pub const SYS_mprotect = 226; -pub const SYS_msync = 227; -pub const SYS_mlock = 228; -pub const SYS_munlock = 229; -pub const SYS_mlockall = 230; -pub const SYS_munlockall = 231; -pub const SYS_mincore = 232; -pub const SYS_madvise = 233; -pub const SYS_remap_file_pages = 234; -pub const SYS_mbind = 235; -pub const SYS_get_mempolicy = 236; -pub const SYS_set_mempolicy = 237; -pub const SYS_migrate_pages = 238; -pub const SYS_move_pages = 239; -pub const SYS_rt_tgsigqueueinfo = 240; -pub const SYS_perf_event_open = 241; -pub const SYS_accept4 = 242; -pub const SYS_recvmmsg = 243; -pub const SYS_arch_specific_syscall = 244; -pub const SYS_wait4 = 260; -pub const SYS_prlimit64 = 261; -pub const SYS_fanotify_init = 262; -pub const SYS_fanotify_mark = 263; -pub const SYS_clock_adjtime = 266; -pub const SYS_syncfs = 267; -pub const SYS_setns = 268; -pub const SYS_sendmmsg = 269; -pub const SYS_process_vm_readv = 270; -pub const SYS_process_vm_writev = 271; -pub const SYS_kcmp = 272; -pub const SYS_finit_module = 273; -pub const SYS_sched_setattr = 274; -pub const SYS_sched_getattr = 275; -pub const SYS_renameat2 = 276; -pub const SYS_seccomp = 277; -pub const SYS_getrandom = 278; -pub const SYS_memfd_create = 279; -pub const SYS_bpf = 280; -pub const SYS_execveat = 281; -pub const SYS_userfaultfd = 282; -pub const SYS_membarrier = 283; -pub const SYS_mlock2 = 284; -pub const SYS_copy_file_range = 285; -pub const SYS_preadv2 = 286; -pub const SYS_pwritev2 = 287; -pub const SYS_pkey_mprotect = 288; -pub const SYS_pkey_alloc = 289; -pub const SYS_pkey_free = 290; -pub const SYS_statx = 291; -pub const SYS_io_pgetevents = 292; -pub const SYS_rseq = 293; -pub const SYS_kexec_file_load = 294; -pub const SYS_pidfd_send_signal = 424; -pub const SYS_io_uring_setup = 425; -pub const SYS_io_uring_enter = 426; -pub const SYS_io_uring_register = 427; -pub const SYS_open_tree = 428; -pub const SYS_move_mount = 429; -pub const SYS_fsopen = 430; -pub const SYS_fsconfig = 431; -pub const SYS_fsmount = 432; -pub const SYS_fspick = 433; -pub const SYS_pidfd_open = 434; -pub const SYS_clone3 = 435; + _, +}; pub const O_CREAT = 0o100; pub const O_EXCL = 0o200; diff --git a/lib/std/os/bits/linux/errno-generic.zig b/lib/std/os/bits/linux/errno-generic.zig index 741f76fdee..53b32db6fc 100644 --- a/lib/std/os/bits/linux/errno-generic.zig +++ b/lib/std/os/bits/linux/errno-generic.zig @@ -368,6 +368,33 @@ pub const ENOMEDIUM = 123; /// Wrong medium type pub const EMEDIUMTYPE = 124; +/// Operation canceled +pub const ECANCELED = 125; + +/// Required key not available +pub const ENOKEY = 126; + +/// Key has expired +pub const EKEYEXPIRED = 127; + +/// Key has been revoked +pub const EKEYREVOKED = 128; + +/// Key was rejected by service +pub const EKEYREJECTED = 129; + +// for robust mutexes +/// Owner died +pub const EOWNERDEAD = 130; +/// State not recoverable +pub const ENOTRECOVERABLE = 131; + +/// Operation not possible due to RF-kill +pub const ERFKILL = 132; + +/// Memory page has hardware error +pub const EHWPOISON = 133; + // nameserver query return codes /// DNS server returned answer with no data diff --git a/lib/std/os/bits/linux/i386.zig b/lib/std/os/bits/linux/i386.zig index cffea9e387..731c3ba261 100644 --- a/lib/std/os/bits/linux/i386.zig +++ b/lib/std/os/bits/linux/i386.zig @@ -12,429 +12,435 @@ const pid_t = linux.pid_t; const stack_t = linux.stack_t; const sigset_t = linux.sigset_t; -pub const SYS_restart_syscall = 0; -pub const SYS_exit = 1; -pub const SYS_fork = 2; -pub const SYS_read = 3; -pub const SYS_write = 4; -pub const SYS_open = 5; -pub const SYS_close = 6; -pub const SYS_waitpid = 7; -pub const SYS_creat = 8; -pub const SYS_link = 9; -pub const SYS_unlink = 10; -pub const SYS_execve = 11; -pub const SYS_chdir = 12; -pub const SYS_time = 13; -pub const SYS_mknod = 14; -pub const SYS_chmod = 15; -pub const SYS_lchown = 16; -pub const SYS_break = 17; -pub const SYS_oldstat = 18; -pub const SYS_lseek = 19; -pub const SYS_getpid = 20; -pub const SYS_mount = 21; -pub const SYS_umount = 22; -pub const SYS_setuid = 23; -pub const SYS_getuid = 24; -pub const SYS_stime = 25; -pub const SYS_ptrace = 26; -pub const SYS_alarm = 27; -pub const SYS_oldfstat = 28; -pub const SYS_pause = 29; -pub const SYS_utime = 30; -pub const SYS_stty = 31; -pub const SYS_gtty = 32; -pub const SYS_access = 33; -pub const SYS_nice = 34; -pub const SYS_ftime = 35; -pub const SYS_sync = 36; -pub const SYS_kill = 37; -pub const SYS_rename = 38; -pub const SYS_mkdir = 39; -pub const SYS_rmdir = 40; -pub const SYS_dup = 41; -pub const SYS_pipe = 42; -pub const SYS_times = 43; -pub const SYS_prof = 44; -pub const SYS_brk = 45; -pub const SYS_setgid = 46; -pub const SYS_getgid = 47; -pub const SYS_signal = 48; -pub const SYS_geteuid = 49; -pub const SYS_getegid = 50; -pub const SYS_acct = 51; -pub const SYS_umount2 = 52; -pub const SYS_lock = 53; -pub const SYS_ioctl = 54; -pub const SYS_fcntl = 55; -pub const SYS_mpx = 56; -pub const SYS_setpgid = 57; -pub const SYS_ulimit = 58; -pub const SYS_oldolduname = 59; -pub const SYS_umask = 60; -pub const SYS_chroot = 61; -pub const SYS_ustat = 62; -pub const SYS_dup2 = 63; -pub const SYS_getppid = 64; -pub const SYS_getpgrp = 65; -pub const SYS_setsid = 66; -pub const SYS_sigaction = 67; -pub const SYS_sgetmask = 68; -pub const SYS_ssetmask = 69; -pub const SYS_setreuid = 70; -pub const SYS_setregid = 71; -pub const SYS_sigsuspend = 72; -pub const SYS_sigpending = 73; -pub const SYS_sethostname = 74; -pub const SYS_setrlimit = 75; -pub const SYS_getrlimit = 76; -pub const SYS_getrusage = 77; -pub const SYS_gettimeofday = 78; -pub const SYS_settimeofday = 79; -pub const SYS_getgroups = 80; -pub const SYS_setgroups = 81; -pub const SYS_select = 82; -pub const SYS_symlink = 83; -pub const SYS_oldlstat = 84; -pub const SYS_readlink = 85; -pub const SYS_uselib = 86; -pub const SYS_swapon = 87; -pub const SYS_reboot = 88; -pub const SYS_readdir = 89; -pub const SYS_mmap = 90; -pub const SYS_munmap = 91; -pub const SYS_truncate = 92; -pub const SYS_ftruncate = 93; -pub const SYS_fchmod = 94; -pub const SYS_fchown = 95; -pub const SYS_getpriority = 96; -pub const SYS_setpriority = 97; -pub const SYS_profil = 98; -pub const SYS_statfs = 99; -pub const SYS_fstatfs = 100; -pub const SYS_ioperm = 101; -pub const SYS_socketcall = 102; -pub const SYS_syslog = 103; -pub const SYS_setitimer = 104; -pub const SYS_getitimer = 105; -pub const SYS_stat = 106; -pub const SYS_lstat = 107; -pub const SYS_fstat = 108; -pub const SYS_olduname = 109; -pub const SYS_iopl = 110; -pub const SYS_vhangup = 111; -pub const SYS_idle = 112; -pub const SYS_vm86old = 113; -pub const SYS_wait4 = 114; -pub const SYS_swapoff = 115; -pub const SYS_sysinfo = 116; -pub const SYS_ipc = 117; -pub const SYS_fsync = 118; -pub const SYS_sigreturn = 119; -pub const SYS_clone = 120; -pub const SYS_setdomainname = 121; -pub const SYS_uname = 122; -pub const SYS_modify_ldt = 123; -pub const SYS_adjtimex = 124; -pub const SYS_mprotect = 125; -pub const SYS_sigprocmask = 126; -pub const SYS_create_module = 127; -pub const SYS_init_module = 128; -pub const SYS_delete_module = 129; -pub const SYS_get_kernel_syms = 130; -pub const SYS_quotactl = 131; -pub const SYS_getpgid = 132; -pub const SYS_fchdir = 133; -pub const SYS_bdflush = 134; -pub const SYS_sysfs = 135; -pub const SYS_personality = 136; -pub const SYS_afs_syscall = 137; -pub const SYS_setfsuid = 138; -pub const SYS_setfsgid = 139; -pub const SYS__llseek = 140; -pub const SYS_getdents = 141; -pub const SYS__newselect = 142; -pub const SYS_flock = 143; -pub const SYS_msync = 144; -pub const SYS_readv = 145; -pub const SYS_writev = 146; -pub const SYS_getsid = 147; -pub const SYS_fdatasync = 148; -pub const SYS__sysctl = 149; -pub const SYS_mlock = 150; -pub const SYS_munlock = 151; -pub const SYS_mlockall = 152; -pub const SYS_munlockall = 153; -pub const SYS_sched_setparam = 154; -pub const SYS_sched_getparam = 155; -pub const SYS_sched_setscheduler = 156; -pub const SYS_sched_getscheduler = 157; -pub const SYS_sched_yield = 158; -pub const SYS_sched_get_priority_max = 159; -pub const SYS_sched_get_priority_min = 160; -pub const SYS_sched_rr_get_interval = 161; -pub const SYS_nanosleep = 162; -pub const SYS_mremap = 163; -pub const SYS_setresuid = 164; -pub const SYS_getresuid = 165; -pub const SYS_vm86 = 166; -pub const SYS_query_module = 167; -pub const SYS_poll = 168; -pub const SYS_nfsservctl = 169; -pub const SYS_setresgid = 170; -pub const SYS_getresgid = 171; -pub const SYS_prctl = 172; -pub const SYS_rt_sigreturn = 173; -pub const SYS_rt_sigaction = 174; -pub const SYS_rt_sigprocmask = 175; -pub const SYS_rt_sigpending = 176; -pub const SYS_rt_sigtimedwait = 177; -pub const SYS_rt_sigqueueinfo = 178; -pub const SYS_rt_sigsuspend = 179; -pub const SYS_pread64 = 180; -pub const SYS_pwrite64 = 181; -pub const SYS_chown = 182; -pub const SYS_getcwd = 183; -pub const SYS_capget = 184; -pub const SYS_capset = 185; -pub const SYS_sigaltstack = 186; -pub const SYS_sendfile = 187; -pub const SYS_getpmsg = 188; -pub const SYS_putpmsg = 189; -pub const SYS_vfork = 190; -pub const SYS_ugetrlimit = 191; -pub const SYS_mmap2 = 192; -pub const SYS_truncate64 = 193; -pub const SYS_ftruncate64 = 194; -pub const SYS_stat64 = 195; -pub const SYS_lstat64 = 196; -pub const SYS_fstat64 = 197; -pub const SYS_lchown32 = 198; -pub const SYS_getuid32 = 199; -pub const SYS_getgid32 = 200; -pub const SYS_geteuid32 = 201; -pub const SYS_getegid32 = 202; -pub const SYS_setreuid32 = 203; -pub const SYS_setregid32 = 204; -pub const SYS_getgroups32 = 205; -pub const SYS_setgroups32 = 206; -pub const SYS_fchown32 = 207; -pub const SYS_setresuid32 = 208; -pub const SYS_getresuid32 = 209; -pub const SYS_setresgid32 = 210; -pub const SYS_getresgid32 = 211; -pub const SYS_chown32 = 212; -pub const SYS_setuid32 = 213; -pub const SYS_setgid32 = 214; -pub const SYS_setfsuid32 = 215; -pub const SYS_setfsgid32 = 216; -pub const SYS_pivot_root = 217; -pub const SYS_mincore = 218; -pub const SYS_madvise = 219; -pub const SYS_getdents64 = 220; -pub const SYS_fcntl64 = 221; -pub const SYS_gettid = 224; -pub const SYS_readahead = 225; -pub const SYS_setxattr = 226; -pub const SYS_lsetxattr = 227; -pub const SYS_fsetxattr = 228; -pub const SYS_getxattr = 229; -pub const SYS_lgetxattr = 230; -pub const SYS_fgetxattr = 231; -pub const SYS_listxattr = 232; -pub const SYS_llistxattr = 233; -pub const SYS_flistxattr = 234; -pub const SYS_removexattr = 235; -pub const SYS_lremovexattr = 236; -pub const SYS_fremovexattr = 237; -pub const SYS_tkill = 238; -pub const SYS_sendfile64 = 239; -pub const SYS_futex = 240; -pub const SYS_sched_setaffinity = 241; -pub const SYS_sched_getaffinity = 242; -pub const SYS_set_thread_area = 243; -pub const SYS_get_thread_area = 244; -pub const SYS_io_setup = 245; -pub const SYS_io_destroy = 246; -pub const SYS_io_getevents = 247; -pub const SYS_io_submit = 248; -pub const SYS_io_cancel = 249; -pub const SYS_fadvise64 = 250; -pub const SYS_exit_group = 252; -pub const SYS_lookup_dcookie = 253; -pub const SYS_epoll_create = 254; -pub const SYS_epoll_ctl = 255; -pub const SYS_epoll_wait = 256; -pub const SYS_remap_file_pages = 257; -pub const SYS_set_tid_address = 258; -pub const SYS_timer_create = 259; -pub const SYS_timer_settime = SYS_timer_create + 1; -pub const SYS_timer_gettime = SYS_timer_create + 2; -pub const SYS_timer_getoverrun = SYS_timer_create + 3; -pub const SYS_timer_delete = SYS_timer_create + 4; -pub const SYS_clock_settime = SYS_timer_create + 5; -pub const SYS_clock_gettime = SYS_timer_create + 6; -pub const SYS_clock_getres = SYS_timer_create + 7; -pub const SYS_clock_nanosleep = SYS_timer_create + 8; -pub const SYS_statfs64 = 268; -pub const SYS_fstatfs64 = 269; -pub const SYS_tgkill = 270; -pub const SYS_utimes = 271; -pub const SYS_fadvise64_64 = 272; -pub const SYS_vserver = 273; -pub const SYS_mbind = 274; -pub const SYS_get_mempolicy = 275; -pub const SYS_set_mempolicy = 276; -pub const SYS_mq_open = 277; -pub const SYS_mq_unlink = SYS_mq_open + 1; -pub const SYS_mq_timedsend = SYS_mq_open + 2; -pub const SYS_mq_timedreceive = SYS_mq_open + 3; -pub const SYS_mq_notify = SYS_mq_open + 4; -pub const SYS_mq_getsetattr = SYS_mq_open + 5; -pub const SYS_kexec_load = 283; -pub const SYS_waitid = 284; -pub const SYS_add_key = 286; -pub const SYS_request_key = 287; -pub const SYS_keyctl = 288; -pub const SYS_ioprio_set = 289; -pub const SYS_ioprio_get = 290; -pub const SYS_inotify_init = 291; -pub const SYS_inotify_add_watch = 292; -pub const SYS_inotify_rm_watch = 293; -pub const SYS_migrate_pages = 294; -pub const SYS_openat = 295; -pub const SYS_mkdirat = 296; -pub const SYS_mknodat = 297; -pub const SYS_fchownat = 298; -pub const SYS_futimesat = 299; -pub const SYS_fstatat64 = 300; -pub const SYS_unlinkat = 301; -pub const SYS_renameat = 302; -pub const SYS_linkat = 303; -pub const SYS_symlinkat = 304; -pub const SYS_readlinkat = 305; -pub const SYS_fchmodat = 306; -pub const SYS_faccessat = 307; -pub const SYS_pselect6 = 308; -pub const SYS_ppoll = 309; -pub const SYS_unshare = 310; -pub const SYS_set_robust_list = 311; -pub const SYS_get_robust_list = 312; -pub const SYS_splice = 313; -pub const SYS_sync_file_range = 314; -pub const SYS_tee = 315; -pub const SYS_vmsplice = 316; -pub const SYS_move_pages = 317; -pub const SYS_getcpu = 318; -pub const SYS_epoll_pwait = 319; -pub const SYS_utimensat = 320; -pub const SYS_signalfd = 321; -pub const SYS_timerfd_create = 322; -pub const SYS_eventfd = 323; -pub const SYS_fallocate = 324; -pub const SYS_timerfd_settime = 325; -pub const SYS_timerfd_gettime = 326; -pub const SYS_signalfd4 = 327; -pub const SYS_eventfd2 = 328; -pub const SYS_epoll_create1 = 329; -pub const SYS_dup3 = 330; -pub const SYS_pipe2 = 331; -pub const SYS_inotify_init1 = 332; -pub const SYS_preadv = 333; -pub const SYS_pwritev = 334; -pub const SYS_rt_tgsigqueueinfo = 335; -pub const SYS_perf_event_open = 336; -pub const SYS_recvmmsg = 337; -pub const SYS_fanotify_init = 338; -pub const SYS_fanotify_mark = 339; -pub const SYS_prlimit64 = 340; -pub const SYS_name_to_handle_at = 341; -pub const SYS_open_by_handle_at = 342; -pub const SYS_clock_adjtime = 343; -pub const SYS_syncfs = 344; -pub const SYS_sendmmsg = 345; -pub const SYS_setns = 346; -pub const SYS_process_vm_readv = 347; -pub const SYS_process_vm_writev = 348; -pub const SYS_kcmp = 349; -pub const SYS_finit_module = 350; -pub const SYS_sched_setattr = 351; -pub const SYS_sched_getattr = 352; -pub const SYS_renameat2 = 353; -pub const SYS_seccomp = 354; -pub const SYS_getrandom = 355; -pub const SYS_memfd_create = 356; -pub const SYS_bpf = 357; -pub const SYS_execveat = 358; -pub const SYS_socket = 359; -pub const SYS_socketpair = 360; -pub const SYS_bind = 361; -pub const SYS_connect = 362; -pub const SYS_listen = 363; -pub const SYS_accept4 = 364; -pub const SYS_getsockopt = 365; -pub const SYS_setsockopt = 366; -pub const SYS_getsockname = 367; -pub const SYS_getpeername = 368; -pub const SYS_sendto = 369; -pub const SYS_sendmsg = 370; -pub const SYS_recvfrom = 371; -pub const SYS_recvmsg = 372; -pub const SYS_shutdown = 373; -pub const SYS_userfaultfd = 374; -pub const SYS_membarrier = 375; -pub const SYS_mlock2 = 376; -pub const SYS_copy_file_range = 377; -pub const SYS_preadv2 = 378; -pub const SYS_pwritev2 = 379; -pub const SYS_pkey_mprotect = 380; -pub const SYS_pkey_alloc = 381; -pub const SYS_pkey_free = 382; -pub const SYS_statx = 383; -pub const SYS_arch_prctl = 384; -pub const SYS_io_pgetevents = 385; -pub const SYS_rseq = 386; -pub const SYS_semget = 393; -pub const SYS_semctl = 394; -pub const SYS_shmget = 395; -pub const SYS_shmctl = 396; -pub const SYS_shmat = 397; -pub const SYS_shmdt = 398; -pub const SYS_msgget = 399; -pub const SYS_msgsnd = 400; -pub const SYS_msgrcv = 401; -pub const SYS_msgctl = 402; -pub const SYS_clock_gettime64 = 403; -pub const SYS_clock_settime64 = 404; -pub const SYS_clock_adjtime64 = 405; -pub const SYS_clock_getres_time64 = 406; -pub const SYS_clock_nanosleep_time64 = 407; -pub const SYS_timer_gettime64 = 408; -pub const SYS_timer_settime64 = 409; -pub const SYS_timerfd_gettime64 = 410; -pub const SYS_timerfd_settime64 = 411; -pub const SYS_utimensat_time64 = 412; -pub const SYS_pselect6_time64 = 413; -pub const SYS_ppoll_time64 = 414; -pub const SYS_io_pgetevents_time64 = 416; -pub const SYS_recvmmsg_time64 = 417; -pub const SYS_mq_timedsend_time64 = 418; -pub const SYS_mq_timedreceive_time64 = 419; -pub const SYS_semtimedop_time64 = 420; -pub const SYS_rt_sigtimedwait_time64 = 421; -pub const SYS_futex_time64 = 422; -pub const SYS_sched_rr_get_interval_time64 = 423; -pub const SYS_pidfd_send_signal = 424; -pub const SYS_io_uring_setup = 425; -pub const SYS_io_uring_enter = 426; -pub const SYS_io_uring_register = 427; -pub const SYS_open_tree = 428; -pub const SYS_move_mount = 429; -pub const SYS_fsopen = 430; -pub const SYS_fsconfig = 431; -pub const SYS_fsmount = 432; -pub const SYS_fspick = 433; +pub const SYS = extern enum(usize) { + restart_syscall = 0, + exit = 1, + fork = 2, + read = 3, + write = 4, + open = 5, + close = 6, + waitpid = 7, + creat = 8, + link = 9, + unlink = 10, + execve = 11, + chdir = 12, + time = 13, + mknod = 14, + chmod = 15, + lchown = 16, + @"break" = 17, + oldstat = 18, + lseek = 19, + getpid = 20, + mount = 21, + umount = 22, + setuid = 23, + getuid = 24, + stime = 25, + ptrace = 26, + alarm = 27, + oldfstat = 28, + pause = 29, + utime = 30, + stty = 31, + gtty = 32, + access = 33, + nice = 34, + ftime = 35, + sync = 36, + kill = 37, + rename = 38, + mkdir = 39, + rmdir = 40, + dup = 41, + pipe = 42, + times = 43, + prof = 44, + brk = 45, + setgid = 46, + getgid = 47, + signal = 48, + geteuid = 49, + getegid = 50, + acct = 51, + umount2 = 52, + lock = 53, + ioctl = 54, + fcntl = 55, + mpx = 56, + setpgid = 57, + ulimit = 58, + oldolduname = 59, + umask = 60, + chroot = 61, + ustat = 62, + dup2 = 63, + getppid = 64, + getpgrp = 65, + setsid = 66, + sigaction = 67, + sgetmask = 68, + ssetmask = 69, + setreuid = 70, + setregid = 71, + sigsuspend = 72, + sigpending = 73, + sethostname = 74, + setrlimit = 75, + getrlimit = 76, + getrusage = 77, + gettimeofday = 78, + settimeofday = 79, + getgroups = 80, + setgroups = 81, + select = 82, + symlink = 83, + oldlstat = 84, + readlink = 85, + uselib = 86, + swapon = 87, + reboot = 88, + readdir = 89, + mmap = 90, + munmap = 91, + truncate = 92, + ftruncate = 93, + fchmod = 94, + fchown = 95, + getpriority = 96, + setpriority = 97, + profil = 98, + statfs = 99, + fstatfs = 100, + ioperm = 101, + socketcall = 102, + syslog = 103, + setitimer = 104, + getitimer = 105, + stat = 106, + lstat = 107, + fstat = 108, + olduname = 109, + iopl = 110, + vhangup = 111, + idle = 112, + vm86old = 113, + wait4 = 114, + swapoff = 115, + sysinfo = 116, + ipc = 117, + fsync = 118, + sigreturn = 119, + clone = 120, + setdomainname = 121, + uname = 122, + modify_ldt = 123, + adjtimex = 124, + mprotect = 125, + sigprocmask = 126, + create_module = 127, + init_module = 128, + delete_module = 129, + get_kernel_syms = 130, + quotactl = 131, + getpgid = 132, + fchdir = 133, + bdflush = 134, + sysfs = 135, + personality = 136, + afs_syscall = 137, + setfsuid = 138, + setfsgid = 139, + _llseek = 140, + getdents = 141, + _newselect = 142, + flock = 143, + msync = 144, + readv = 145, + writev = 146, + getsid = 147, + fdatasync = 148, + _sysctl = 149, + mlock = 150, + munlock = 151, + mlockall = 152, + munlockall = 153, + sched_setparam = 154, + sched_getparam = 155, + sched_setscheduler = 156, + sched_getscheduler = 157, + sched_yield = 158, + sched_get_priority_max = 159, + sched_get_priority_min = 160, + sched_rr_get_interval = 161, + nanosleep = 162, + mremap = 163, + setresuid = 164, + getresuid = 165, + vm86 = 166, + query_module = 167, + poll = 168, + nfsservctl = 169, + setresgid = 170, + getresgid = 171, + prctl = 172, + rt_sigreturn = 173, + rt_sigaction = 174, + rt_sigprocmask = 175, + rt_sigpending = 176, + rt_sigtimedwait = 177, + rt_sigqueueinfo = 178, + rt_sigsuspend = 179, + pread64 = 180, + pwrite64 = 181, + chown = 182, + getcwd = 183, + capget = 184, + capset = 185, + sigaltstack = 186, + sendfile = 187, + getpmsg = 188, + putpmsg = 189, + vfork = 190, + ugetrlimit = 191, + mmap2 = 192, + truncate64 = 193, + ftruncate64 = 194, + stat64 = 195, + lstat64 = 196, + fstat64 = 197, + lchown32 = 198, + getuid32 = 199, + getgid32 = 200, + geteuid32 = 201, + getegid32 = 202, + setreuid32 = 203, + setregid32 = 204, + getgroups32 = 205, + setgroups32 = 206, + fchown32 = 207, + setresuid32 = 208, + getresuid32 = 209, + setresgid32 = 210, + getresgid32 = 211, + chown32 = 212, + setuid32 = 213, + setgid32 = 214, + setfsuid32 = 215, + setfsgid32 = 216, + pivot_root = 217, + mincore = 218, + madvise = 219, + getdents64 = 220, + fcntl64 = 221, + gettid = 224, + readahead = 225, + setxattr = 226, + lsetxattr = 227, + fsetxattr = 228, + getxattr = 229, + lgetxattr = 230, + fgetxattr = 231, + listxattr = 232, + llistxattr = 233, + flistxattr = 234, + removexattr = 235, + lremovexattr = 236, + fremovexattr = 237, + tkill = 238, + sendfile64 = 239, + futex = 240, + sched_setaffinity = 241, + sched_getaffinity = 242, + set_thread_area = 243, + get_thread_area = 244, + io_setup = 245, + io_destroy = 246, + io_getevents = 247, + io_submit = 248, + io_cancel = 249, + fadvise64 = 250, + exit_group = 252, + lookup_dcookie = 253, + epoll_create = 254, + epoll_ctl = 255, + epoll_wait = 256, + remap_file_pages = 257, + set_tid_address = 258, + timer_create = 259, + timer_settime, // SYS_timer_create + 1 + timer_gettime, // SYS_timer_create + 2 + timer_getoverrun, // SYS_timer_create + 3 + timer_delete, // SYS_timer_create + 4 + clock_settime, // SYS_timer_create + 5 + clock_gettime, // SYS_timer_create + 6 + clock_getres, // SYS_timer_create + 7 + clock_nanosleep, // SYS_timer_create + 8 + statfs64 = 268, + fstatfs64 = 269, + tgkill = 270, + utimes = 271, + fadvise64_64 = 272, + vserver = 273, + mbind = 274, + get_mempolicy = 275, + set_mempolicy = 276, + mq_open = 277, + mq_unlink, // SYS_mq_open + 1 + mq_timedsend, // SYS_mq_open + 2 + mq_timedreceive, // SYS_mq_open + 3 + mq_notify, // SYS_mq_open + 4 + mq_getsetattr, // SYS_mq_open + 5 + kexec_load = 283, + waitid = 284, + add_key = 286, + request_key = 287, + keyctl = 288, + ioprio_set = 289, + ioprio_get = 290, + inotify_init = 291, + inotify_add_watch = 292, + inotify_rm_watch = 293, + migrate_pages = 294, + openat = 295, + mkdirat = 296, + mknodat = 297, + fchownat = 298, + futimesat = 299, + fstatat64 = 300, + unlinkat = 301, + renameat = 302, + linkat = 303, + symlinkat = 304, + readlinkat = 305, + fchmodat = 306, + faccessat = 307, + pselect6 = 308, + ppoll = 309, + unshare = 310, + set_robust_list = 311, + get_robust_list = 312, + splice = 313, + sync_file_range = 314, + tee = 315, + vmsplice = 316, + move_pages = 317, + getcpu = 318, + epoll_pwait = 319, + utimensat = 320, + signalfd = 321, + timerfd_create = 322, + eventfd = 323, + fallocate = 324, + timerfd_settime = 325, + timerfd_gettime = 326, + signalfd4 = 327, + eventfd2 = 328, + epoll_create1 = 329, + dup3 = 330, + pipe2 = 331, + inotify_init1 = 332, + preadv = 333, + pwritev = 334, + rt_tgsigqueueinfo = 335, + perf_event_open = 336, + recvmmsg = 337, + fanotify_init = 338, + fanotify_mark = 339, + prlimit64 = 340, + name_to_handle_at = 341, + open_by_handle_at = 342, + clock_adjtime = 343, + syncfs = 344, + sendmmsg = 345, + setns = 346, + process_vm_readv = 347, + process_vm_writev = 348, + kcmp = 349, + finit_module = 350, + sched_setattr = 351, + sched_getattr = 352, + renameat2 = 353, + seccomp = 354, + getrandom = 355, + memfd_create = 356, + bpf = 357, + execveat = 358, + socket = 359, + socketpair = 360, + bind = 361, + connect = 362, + listen = 363, + accept4 = 364, + getsockopt = 365, + setsockopt = 366, + getsockname = 367, + getpeername = 368, + sendto = 369, + sendmsg = 370, + recvfrom = 371, + recvmsg = 372, + shutdown = 373, + userfaultfd = 374, + membarrier = 375, + mlock2 = 376, + copy_file_range = 377, + preadv2 = 378, + pwritev2 = 379, + pkey_mprotect = 380, + pkey_alloc = 381, + pkey_free = 382, + statx = 383, + arch_prctl = 384, + io_pgetevents = 385, + rseq = 386, + semget = 393, + semctl = 394, + shmget = 395, + shmctl = 396, + shmat = 397, + shmdt = 398, + msgget = 399, + msgsnd = 400, + msgrcv = 401, + msgctl = 402, + clock_gettime64 = 403, + clock_settime64 = 404, + clock_adjtime64 = 405, + clock_getres_time64 = 406, + clock_nanosleep_time64 = 407, + timer_gettime64 = 408, + timer_settime64 = 409, + timerfd_gettime64 = 410, + timerfd_settime64 = 411, + utimensat_time64 = 412, + pselect6_time64 = 413, + ppoll_time64 = 414, + io_pgetevents_time64 = 416, + recvmmsg_time64 = 417, + mq_timedsend_time64 = 418, + mq_timedreceive_time64 = 419, + semtimedop_time64 = 420, + rt_sigtimedwait_time64 = 421, + futex_time64 = 422, + sched_rr_get_interval_time64 = 423, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + openat2 = 437, + pidfd_getfd = 438, + + _, +}; pub const O_CREAT = 0o100; pub const O_EXCL = 0o200; diff --git a/lib/std/os/bits/linux/mipsel.zig b/lib/std/os/bits/linux/mipsel.zig index b398d50760..8f2064192f 100644 --- a/lib/std/os/bits/linux/mipsel.zig +++ b/lib/std/os/bits/linux/mipsel.zig @@ -7,375 +7,382 @@ const uid_t = linux.uid_t; const gid_t = linux.gid_t; const pid_t = linux.pid_t; -pub const SYS_Linux = 4000; -pub const SYS_syscall = (SYS_Linux + 0); -pub const SYS_exit = (SYS_Linux + 1); -pub const SYS_fork = (SYS_Linux + 2); -pub const SYS_read = (SYS_Linux + 3); -pub const SYS_write = (SYS_Linux + 4); -pub const SYS_open = (SYS_Linux + 5); -pub const SYS_close = (SYS_Linux + 6); -pub const SYS_waitpid = (SYS_Linux + 7); -pub const SYS_creat = (SYS_Linux + 8); -pub const SYS_link = (SYS_Linux + 9); -pub const SYS_unlink = (SYS_Linux + 10); -pub const SYS_execve = (SYS_Linux + 11); -pub const SYS_chdir = (SYS_Linux + 12); -pub const SYS_time = (SYS_Linux + 13); -pub const SYS_mknod = (SYS_Linux + 14); -pub const SYS_chmod = (SYS_Linux + 15); -pub const SYS_lchown = (SYS_Linux + 16); -pub const SYS_break = (SYS_Linux + 17); -pub const SYS_unused18 = (SYS_Linux + 18); -pub const SYS_lseek = (SYS_Linux + 19); -pub const SYS_getpid = (SYS_Linux + 20); -pub const SYS_mount = (SYS_Linux + 21); -pub const SYS_umount = (SYS_Linux + 22); -pub const SYS_setuid = (SYS_Linux + 23); -pub const SYS_getuid = (SYS_Linux + 24); -pub const SYS_stime = (SYS_Linux + 25); -pub const SYS_ptrace = (SYS_Linux + 26); -pub const SYS_alarm = (SYS_Linux + 27); -pub const SYS_unused28 = (SYS_Linux + 28); -pub const SYS_pause = (SYS_Linux + 29); -pub const SYS_utime = (SYS_Linux + 30); -pub const SYS_stty = (SYS_Linux + 31); -pub const SYS_gtty = (SYS_Linux + 32); -pub const SYS_access = (SYS_Linux + 33); -pub const SYS_nice = (SYS_Linux + 34); -pub const SYS_ftime = (SYS_Linux + 35); -pub const SYS_sync = (SYS_Linux + 36); -pub const SYS_kill = (SYS_Linux + 37); -pub const SYS_rename = (SYS_Linux + 38); -pub const SYS_mkdir = (SYS_Linux + 39); -pub const SYS_rmdir = (SYS_Linux + 40); -pub const SYS_dup = (SYS_Linux + 41); -pub const SYS_pipe = (SYS_Linux + 42); -pub const SYS_times = (SYS_Linux + 43); -pub const SYS_prof = (SYS_Linux + 44); -pub const SYS_brk = (SYS_Linux + 45); -pub const SYS_setgid = (SYS_Linux + 46); -pub const SYS_getgid = (SYS_Linux + 47); -pub const SYS_signal = (SYS_Linux + 48); -pub const SYS_geteuid = (SYS_Linux + 49); -pub const SYS_getegid = (SYS_Linux + 50); -pub const SYS_acct = (SYS_Linux + 51); -pub const SYS_umount2 = (SYS_Linux + 52); -pub const SYS_lock = (SYS_Linux + 53); -pub const SYS_ioctl = (SYS_Linux + 54); -pub const SYS_fcntl = (SYS_Linux + 55); -pub const SYS_mpx = (SYS_Linux + 56); -pub const SYS_setpgid = (SYS_Linux + 57); -pub const SYS_ulimit = (SYS_Linux + 58); -pub const SYS_unused59 = (SYS_Linux + 59); -pub const SYS_umask = (SYS_Linux + 60); -pub const SYS_chroot = (SYS_Linux + 61); -pub const SYS_ustat = (SYS_Linux + 62); -pub const SYS_dup2 = (SYS_Linux + 63); -pub const SYS_getppid = (SYS_Linux + 64); -pub const SYS_getpgrp = (SYS_Linux + 65); -pub const SYS_setsid = (SYS_Linux + 66); -pub const SYS_sigaction = (SYS_Linux + 67); -pub const SYS_sgetmask = (SYS_Linux + 68); -pub const SYS_ssetmask = (SYS_Linux + 69); -pub const SYS_setreuid = (SYS_Linux + 70); -pub const SYS_setregid = (SYS_Linux + 71); -pub const SYS_sigsuspend = (SYS_Linux + 72); -pub const SYS_sigpending = (SYS_Linux + 73); -pub const SYS_sethostname = (SYS_Linux + 74); -pub const SYS_setrlimit = (SYS_Linux + 75); -pub const SYS_getrlimit = (SYS_Linux + 76); -pub const SYS_getrusage = (SYS_Linux + 77); -pub const SYS_gettimeofday = (SYS_Linux + 78); -pub const SYS_settimeofday = (SYS_Linux + 79); -pub const SYS_getgroups = (SYS_Linux + 80); -pub const SYS_setgroups = (SYS_Linux + 81); -pub const SYS_reserved82 = (SYS_Linux + 82); -pub const SYS_symlink = (SYS_Linux + 83); -pub const SYS_unused84 = (SYS_Linux + 84); -pub const SYS_readlink = (SYS_Linux + 85); -pub const SYS_uselib = (SYS_Linux + 86); -pub const SYS_swapon = (SYS_Linux + 87); -pub const SYS_reboot = (SYS_Linux + 88); -pub const SYS_readdir = (SYS_Linux + 89); -pub const SYS_mmap = (SYS_Linux + 90); -pub const SYS_munmap = (SYS_Linux + 91); -pub const SYS_truncate = (SYS_Linux + 92); -pub const SYS_ftruncate = (SYS_Linux + 93); -pub const SYS_fchmod = (SYS_Linux + 94); -pub const SYS_fchown = (SYS_Linux + 95); -pub const SYS_getpriority = (SYS_Linux + 96); -pub const SYS_setpriority = (SYS_Linux + 97); -pub const SYS_profil = (SYS_Linux + 98); -pub const SYS_statfs = (SYS_Linux + 99); -pub const SYS_fstatfs = (SYS_Linux + 100); -pub const SYS_ioperm = (SYS_Linux + 101); -pub const SYS_socketcall = (SYS_Linux + 102); -pub const SYS_syslog = (SYS_Linux + 103); -pub const SYS_setitimer = (SYS_Linux + 104); -pub const SYS_getitimer = (SYS_Linux + 105); -pub const SYS_stat = (SYS_Linux + 106); -pub const SYS_lstat = (SYS_Linux + 107); -pub const SYS_fstat = (SYS_Linux + 108); -pub const SYS_unused109 = (SYS_Linux + 109); -pub const SYS_iopl = (SYS_Linux + 110); -pub const SYS_vhangup = (SYS_Linux + 111); -pub const SYS_idle = (SYS_Linux + 112); -pub const SYS_vm86 = (SYS_Linux + 113); -pub const SYS_wait4 = (SYS_Linux + 114); -pub const SYS_swapoff = (SYS_Linux + 115); -pub const SYS_sysinfo = (SYS_Linux + 116); -pub const SYS_ipc = (SYS_Linux + 117); -pub const SYS_fsync = (SYS_Linux + 118); -pub const SYS_sigreturn = (SYS_Linux + 119); -pub const SYS_clone = (SYS_Linux + 120); -pub const SYS_setdomainname = (SYS_Linux + 121); -pub const SYS_uname = (SYS_Linux + 122); -pub const SYS_modify_ldt = (SYS_Linux + 123); -pub const SYS_adjtimex = (SYS_Linux + 124); -pub const SYS_mprotect = (SYS_Linux + 125); -pub const SYS_sigprocmask = (SYS_Linux + 126); -pub const SYS_create_module = (SYS_Linux + 127); -pub const SYS_init_module = (SYS_Linux + 128); -pub const SYS_delete_module = (SYS_Linux + 129); -pub const SYS_get_kernel_syms = (SYS_Linux + 130); -pub const SYS_quotactl = (SYS_Linux + 131); -pub const SYS_getpgid = (SYS_Linux + 132); -pub const SYS_fchdir = (SYS_Linux + 133); -pub const SYS_bdflush = (SYS_Linux + 134); -pub const SYS_sysfs = (SYS_Linux + 135); -pub const SYS_personality = (SYS_Linux + 136); -pub const SYS_afs_syscall = (SYS_Linux + 137); -pub const SYS_setfsuid = (SYS_Linux + 138); -pub const SYS_setfsgid = (SYS_Linux + 139); -pub const SYS__llseek = (SYS_Linux + 140); -pub const SYS_getdents = (SYS_Linux + 141); -pub const SYS__newselect = (SYS_Linux + 142); -pub const SYS_flock = (SYS_Linux + 143); -pub const SYS_msync = (SYS_Linux + 144); -pub const SYS_readv = (SYS_Linux + 145); -pub const SYS_writev = (SYS_Linux + 146); -pub const SYS_cacheflush = (SYS_Linux + 147); -pub const SYS_cachectl = (SYS_Linux + 148); -pub const SYS_sysmips = (SYS_Linux + 149); -pub const SYS_unused150 = (SYS_Linux + 150); -pub const SYS_getsid = (SYS_Linux + 151); -pub const SYS_fdatasync = (SYS_Linux + 152); -pub const SYS__sysctl = (SYS_Linux + 153); -pub const SYS_mlock = (SYS_Linux + 154); -pub const SYS_munlock = (SYS_Linux + 155); -pub const SYS_mlockall = (SYS_Linux + 156); -pub const SYS_munlockall = (SYS_Linux + 157); -pub const SYS_sched_setparam = (SYS_Linux + 158); -pub const SYS_sched_getparam = (SYS_Linux + 159); -pub const SYS_sched_setscheduler = (SYS_Linux + 160); -pub const SYS_sched_getscheduler = (SYS_Linux + 161); -pub const SYS_sched_yield = (SYS_Linux + 162); -pub const SYS_sched_get_priority_max = (SYS_Linux + 163); -pub const SYS_sched_get_priority_min = (SYS_Linux + 164); -pub const SYS_sched_rr_get_interval = (SYS_Linux + 165); -pub const SYS_nanosleep = (SYS_Linux + 166); -pub const SYS_mremap = (SYS_Linux + 167); -pub const SYS_accept = (SYS_Linux + 168); -pub const SYS_bind = (SYS_Linux + 169); -pub const SYS_connect = (SYS_Linux + 170); -pub const SYS_getpeername = (SYS_Linux + 171); -pub const SYS_getsockname = (SYS_Linux + 172); -pub const SYS_getsockopt = (SYS_Linux + 173); -pub const SYS_listen = (SYS_Linux + 174); -pub const SYS_recv = (SYS_Linux + 175); -pub const SYS_recvfrom = (SYS_Linux + 176); -pub const SYS_recvmsg = (SYS_Linux + 177); -pub const SYS_send = (SYS_Linux + 178); -pub const SYS_sendmsg = (SYS_Linux + 179); -pub const SYS_sendto = (SYS_Linux + 180); -pub const SYS_setsockopt = (SYS_Linux + 181); -pub const SYS_shutdown = (SYS_Linux + 182); -pub const SYS_socket = (SYS_Linux + 183); -pub const SYS_socketpair = (SYS_Linux + 184); -pub const SYS_setresuid = (SYS_Linux + 185); -pub const SYS_getresuid = (SYS_Linux + 186); -pub const SYS_query_module = (SYS_Linux + 187); -pub const SYS_poll = (SYS_Linux + 188); -pub const SYS_nfsservctl = (SYS_Linux + 189); -pub const SYS_setresgid = (SYS_Linux + 190); -pub const SYS_getresgid = (SYS_Linux + 191); -pub const SYS_prctl = (SYS_Linux + 192); -pub const SYS_rt_sigreturn = (SYS_Linux + 193); -pub const SYS_rt_sigaction = (SYS_Linux + 194); -pub const SYS_rt_sigprocmask = (SYS_Linux + 195); -pub const SYS_rt_sigpending = (SYS_Linux + 196); -pub const SYS_rt_sigtimedwait = (SYS_Linux + 197); -pub const SYS_rt_sigqueueinfo = (SYS_Linux + 198); -pub const SYS_rt_sigsuspend = (SYS_Linux + 199); -pub const SYS_pread64 = (SYS_Linux + 200); -pub const SYS_pwrite64 = (SYS_Linux + 201); -pub const SYS_chown = (SYS_Linux + 202); -pub const SYS_getcwd = (SYS_Linux + 203); -pub const SYS_capget = (SYS_Linux + 204); -pub const SYS_capset = (SYS_Linux + 205); -pub const SYS_sigaltstack = (SYS_Linux + 206); -pub const SYS_sendfile = (SYS_Linux + 207); -pub const SYS_getpmsg = (SYS_Linux + 208); -pub const SYS_putpmsg = (SYS_Linux + 209); -pub const SYS_mmap2 = (SYS_Linux + 210); -pub const SYS_truncate64 = (SYS_Linux + 211); -pub const SYS_ftruncate64 = (SYS_Linux + 212); -pub const SYS_stat64 = (SYS_Linux + 213); -pub const SYS_lstat64 = (SYS_Linux + 214); -pub const SYS_fstat64 = (SYS_Linux + 215); -pub const SYS_pivot_root = (SYS_Linux + 216); -pub const SYS_mincore = (SYS_Linux + 217); -pub const SYS_madvise = (SYS_Linux + 218); -pub const SYS_getdents64 = (SYS_Linux + 219); -pub const SYS_fcntl64 = (SYS_Linux + 220); -pub const SYS_reserved221 = (SYS_Linux + 221); -pub const SYS_gettid = (SYS_Linux + 222); -pub const SYS_readahead = (SYS_Linux + 223); -pub const SYS_setxattr = (SYS_Linux + 224); -pub const SYS_lsetxattr = (SYS_Linux + 225); -pub const SYS_fsetxattr = (SYS_Linux + 226); -pub const SYS_getxattr = (SYS_Linux + 227); -pub const SYS_lgetxattr = (SYS_Linux + 228); -pub const SYS_fgetxattr = (SYS_Linux + 229); -pub const SYS_listxattr = (SYS_Linux + 230); -pub const SYS_llistxattr = (SYS_Linux + 231); -pub const SYS_flistxattr = (SYS_Linux + 232); -pub const SYS_removexattr = (SYS_Linux + 233); -pub const SYS_lremovexattr = (SYS_Linux + 234); -pub const SYS_fremovexattr = (SYS_Linux + 235); -pub const SYS_tkill = (SYS_Linux + 236); -pub const SYS_sendfile64 = (SYS_Linux + 237); -pub const SYS_futex = (SYS_Linux + 238); -pub const SYS_sched_setaffinity = (SYS_Linux + 239); -pub const SYS_sched_getaffinity = (SYS_Linux + 240); -pub const SYS_io_setup = (SYS_Linux + 241); -pub const SYS_io_destroy = (SYS_Linux + 242); -pub const SYS_io_getevents = (SYS_Linux + 243); -pub const SYS_io_submit = (SYS_Linux + 244); -pub const SYS_io_cancel = (SYS_Linux + 245); -pub const SYS_exit_group = (SYS_Linux + 246); -pub const SYS_lookup_dcookie = (SYS_Linux + 247); -pub const SYS_epoll_create = (SYS_Linux + 248); -pub const SYS_epoll_ctl = (SYS_Linux + 249); -pub const SYS_epoll_wait = (SYS_Linux + 250); -pub const SYS_remap_file_pages = (SYS_Linux + 251); -pub const SYS_set_tid_address = (SYS_Linux + 252); -pub const SYS_restart_syscall = (SYS_Linux + 253); -pub const SYS_fadvise64 = (SYS_Linux + 254); -pub const SYS_statfs64 = (SYS_Linux + 255); -pub const SYS_fstatfs64 = (SYS_Linux + 256); -pub const SYS_timer_create = (SYS_Linux + 257); -pub const SYS_timer_settime = (SYS_Linux + 258); -pub const SYS_timer_gettime = (SYS_Linux + 259); -pub const SYS_timer_getoverrun = (SYS_Linux + 260); -pub const SYS_timer_delete = (SYS_Linux + 261); -pub const SYS_clock_settime = (SYS_Linux + 262); -pub const SYS_clock_gettime = (SYS_Linux + 263); -pub const SYS_clock_getres = (SYS_Linux + 264); -pub const SYS_clock_nanosleep = (SYS_Linux + 265); -pub const SYS_tgkill = (SYS_Linux + 266); -pub const SYS_utimes = (SYS_Linux + 267); -pub const SYS_mbind = (SYS_Linux + 268); -pub const SYS_get_mempolicy = (SYS_Linux + 269); -pub const SYS_set_mempolicy = (SYS_Linux + 270); -pub const SYS_mq_open = (SYS_Linux + 271); -pub const SYS_mq_unlink = (SYS_Linux + 272); -pub const SYS_mq_timedsend = (SYS_Linux + 273); -pub const SYS_mq_timedreceive = (SYS_Linux + 274); -pub const SYS_mq_notify = (SYS_Linux + 275); -pub const SYS_mq_getsetattr = (SYS_Linux + 276); -pub const SYS_vserver = (SYS_Linux + 277); -pub const SYS_waitid = (SYS_Linux + 278); -pub const SYS_add_key = (SYS_Linux + 280); -pub const SYS_request_key = (SYS_Linux + 281); -pub const SYS_keyctl = (SYS_Linux + 282); -pub const SYS_set_thread_area = (SYS_Linux + 283); -pub const SYS_inotify_init = (SYS_Linux + 284); -pub const SYS_inotify_add_watch = (SYS_Linux + 285); -pub const SYS_inotify_rm_watch = (SYS_Linux + 286); -pub const SYS_migrate_pages = (SYS_Linux + 287); -pub const SYS_openat = (SYS_Linux + 288); -pub const SYS_mkdirat = (SYS_Linux + 289); -pub const SYS_mknodat = (SYS_Linux + 290); -pub const SYS_fchownat = (SYS_Linux + 291); -pub const SYS_futimesat = (SYS_Linux + 292); -pub const SYS_fstatat64 = (SYS_Linux + 293); -pub const SYS_unlinkat = (SYS_Linux + 294); -pub const SYS_renameat = (SYS_Linux + 295); -pub const SYS_linkat = (SYS_Linux + 296); -pub const SYS_symlinkat = (SYS_Linux + 297); -pub const SYS_readlinkat = (SYS_Linux + 298); -pub const SYS_fchmodat = (SYS_Linux + 299); -pub const SYS_faccessat = (SYS_Linux + 300); -pub const SYS_pselect6 = (SYS_Linux + 301); -pub const SYS_ppoll = (SYS_Linux + 302); -pub const SYS_unshare = (SYS_Linux + 303); -pub const SYS_splice = (SYS_Linux + 304); -pub const SYS_sync_file_range = (SYS_Linux + 305); -pub const SYS_tee = (SYS_Linux + 306); -pub const SYS_vmsplice = (SYS_Linux + 307); -pub const SYS_move_pages = (SYS_Linux + 308); -pub const SYS_set_robust_list = (SYS_Linux + 309); -pub const SYS_get_robust_list = (SYS_Linux + 310); -pub const SYS_kexec_load = (SYS_Linux + 311); -pub const SYS_getcpu = (SYS_Linux + 312); -pub const SYS_epoll_pwait = (SYS_Linux + 313); -pub const SYS_ioprio_set = (SYS_Linux + 314); -pub const SYS_ioprio_get = (SYS_Linux + 315); -pub const SYS_utimensat = (SYS_Linux + 316); -pub const SYS_signalfd = (SYS_Linux + 317); -pub const SYS_timerfd = (SYS_Linux + 318); -pub const SYS_eventfd = (SYS_Linux + 319); -pub const SYS_fallocate = (SYS_Linux + 320); -pub const SYS_timerfd_create = (SYS_Linux + 321); -pub const SYS_timerfd_gettime = (SYS_Linux + 322); -pub const SYS_timerfd_settime = (SYS_Linux + 323); -pub const SYS_signalfd4 = (SYS_Linux + 324); -pub const SYS_eventfd2 = (SYS_Linux + 325); -pub const SYS_epoll_create1 = (SYS_Linux + 326); -pub const SYS_dup3 = (SYS_Linux + 327); -pub const SYS_pipe2 = (SYS_Linux + 328); -pub const SYS_inotify_init1 = (SYS_Linux + 329); -pub const SYS_preadv = (SYS_Linux + 330); -pub const SYS_pwritev = (SYS_Linux + 331); -pub const SYS_rt_tgsigqueueinfo = (SYS_Linux + 332); -pub const SYS_perf_event_open = (SYS_Linux + 333); -pub const SYS_accept4 = (SYS_Linux + 334); -pub const SYS_recvmmsg = (SYS_Linux + 335); -pub const SYS_fanotify_init = (SYS_Linux + 336); -pub const SYS_fanotify_mark = (SYS_Linux + 337); -pub const SYS_prlimit64 = (SYS_Linux + 338); -pub const SYS_name_to_handle_at = (SYS_Linux + 339); -pub const SYS_open_by_handle_at = (SYS_Linux + 340); -pub const SYS_clock_adjtime = (SYS_Linux + 341); -pub const SYS_syncfs = (SYS_Linux + 342); -pub const SYS_sendmmsg = (SYS_Linux + 343); -pub const SYS_setns = (SYS_Linux + 344); -pub const SYS_process_vm_readv = (SYS_Linux + 345); -pub const SYS_process_vm_writev = (SYS_Linux + 346); -pub const SYS_kcmp = (SYS_Linux + 347); -pub const SYS_finit_module = (SYS_Linux + 348); -pub const SYS_sched_setattr = (SYS_Linux + 349); -pub const SYS_sched_getattr = (SYS_Linux + 350); -pub const SYS_renameat2 = (SYS_Linux + 351); -pub const SYS_seccomp = (SYS_Linux + 352); -pub const SYS_getrandom = (SYS_Linux + 353); -pub const SYS_memfd_create = (SYS_Linux + 354); -pub const SYS_bpf = (SYS_Linux + 355); -pub const SYS_execveat = (SYS_Linux + 356); -pub const SYS_userfaultfd = (SYS_Linux + 357); -pub const SYS_membarrier = (SYS_Linux + 358); -pub const SYS_mlock2 = (SYS_Linux + 359); -pub const SYS_copy_file_range = (SYS_Linux + 360); -pub const SYS_preadv2 = (SYS_Linux + 361); -pub const SYS_pwritev2 = (SYS_Linux + 362); -pub const SYS_pkey_mprotect = (SYS_Linux + 363); -pub const SYS_pkey_alloc = (SYS_Linux + 364); -pub const SYS_pkey_free = (SYS_Linux + 365); -pub const SYS_statx = (SYS_Linux + 366); -pub const SYS_rseq = (SYS_Linux + 367); -pub const SYS_io_pgetevents = (SYS_Linux + 368); +pub const SYS = extern enum(usize) { + pub const Linux = 4000; + + syscall = Linux + 0, + exit = Linux + 1, + fork = Linux + 2, + read = Linux + 3, + write = Linux + 4, + open = Linux + 5, + close = Linux + 6, + waitpid = Linux + 7, + creat = Linux + 8, + link = Linux + 9, + unlink = Linux + 10, + execve = Linux + 11, + chdir = Linux + 12, + time = Linux + 13, + mknod = Linux + 14, + chmod = Linux + 15, + lchown = Linux + 16, + @"break" = Linux + 17, + unused18 = Linux + 18, + lseek = Linux + 19, + getpid = Linux + 20, + mount = Linux + 21, + umount = Linux + 22, + setuid = Linux + 23, + getuid = Linux + 24, + stime = Linux + 25, + ptrace = Linux + 26, + alarm = Linux + 27, + unused28 = Linux + 28, + pause = Linux + 29, + utime = Linux + 30, + stty = Linux + 31, + gtty = Linux + 32, + access = Linux + 33, + nice = Linux + 34, + ftime = Linux + 35, + sync = Linux + 36, + kill = Linux + 37, + rename = Linux + 38, + mkdir = Linux + 39, + rmdir = Linux + 40, + dup = Linux + 41, + pipe = Linux + 42, + times = Linux + 43, + prof = Linux + 44, + brk = Linux + 45, + setgid = Linux + 46, + getgid = Linux + 47, + signal = Linux + 48, + geteuid = Linux + 49, + getegid = Linux + 50, + acct = Linux + 51, + umount2 = Linux + 52, + lock = Linux + 53, + ioctl = Linux + 54, + fcntl = Linux + 55, + mpx = Linux + 56, + setpgid = Linux + 57, + ulimit = Linux + 58, + unused59 = Linux + 59, + umask = Linux + 60, + chroot = Linux + 61, + ustat = Linux + 62, + dup2 = Linux + 63, + getppid = Linux + 64, + getpgrp = Linux + 65, + setsid = Linux + 66, + sigaction = Linux + 67, + sgetmask = Linux + 68, + ssetmask = Linux + 69, + setreuid = Linux + 70, + setregid = Linux + 71, + sigsuspend = Linux + 72, + sigpending = Linux + 73, + sethostname = Linux + 74, + setrlimit = Linux + 75, + getrlimit = Linux + 76, + getrusage = Linux + 77, + gettimeofday = Linux + 78, + settimeofday = Linux + 79, + getgroups = Linux + 80, + setgroups = Linux + 81, + reserved82 = Linux + 82, + symlink = Linux + 83, + unused84 = Linux + 84, + readlink = Linux + 85, + uselib = Linux + 86, + swapon = Linux + 87, + reboot = Linux + 88, + readdir = Linux + 89, + mmap = Linux + 90, + munmap = Linux + 91, + truncate = Linux + 92, + ftruncate = Linux + 93, + fchmod = Linux + 94, + fchown = Linux + 95, + getpriority = Linux + 96, + setpriority = Linux + 97, + profil = Linux + 98, + statfs = Linux + 99, + fstatfs = Linux + 100, + ioperm = Linux + 101, + socketcall = Linux + 102, + syslog = Linux + 103, + setitimer = Linux + 104, + getitimer = Linux + 105, + stat = Linux + 106, + lstat = Linux + 107, + fstat = Linux + 108, + unused109 = Linux + 109, + iopl = Linux + 110, + vhangup = Linux + 111, + idle = Linux + 112, + vm86 = Linux + 113, + wait4 = Linux + 114, + swapoff = Linux + 115, + sysinfo = Linux + 116, + ipc = Linux + 117, + fsync = Linux + 118, + sigreturn = Linux + 119, + clone = Linux + 120, + setdomainname = Linux + 121, + uname = Linux + 122, + modify_ldt = Linux + 123, + adjtimex = Linux + 124, + mprotect = Linux + 125, + sigprocmask = Linux + 126, + create_module = Linux + 127, + init_module = Linux + 128, + delete_module = Linux + 129, + get_kernel_syms = Linux + 130, + quotactl = Linux + 131, + getpgid = Linux + 132, + fchdir = Linux + 133, + bdflush = Linux + 134, + sysfs = Linux + 135, + personality = Linux + 136, + afs_syscall = Linux + 137, + setfsuid = Linux + 138, + setfsgid = Linux + 139, + _llseek = Linux + 140, + getdents = Linux + 141, + _newselect = Linux + 142, + flock = Linux + 143, + msync = Linux + 144, + readv = Linux + 145, + writev = Linux + 146, + cacheflush = Linux + 147, + cachectl = Linux + 148, + sysmips = Linux + 149, + unused150 = Linux + 150, + getsid = Linux + 151, + fdatasync = Linux + 152, + _sysctl = Linux + 153, + mlock = Linux + 154, + munlock = Linux + 155, + mlockall = Linux + 156, + munlockall = Linux + 157, + sched_setparam = Linux + 158, + sched_getparam = Linux + 159, + sched_setscheduler = Linux + 160, + sched_getscheduler = Linux + 161, + sched_yield = Linux + 162, + sched_get_priority_max = Linux + 163, + sched_get_priority_min = Linux + 164, + sched_rr_get_interval = Linux + 165, + nanosleep = Linux + 166, + mremap = Linux + 167, + accept = Linux + 168, + bind = Linux + 169, + connect = Linux + 170, + getpeername = Linux + 171, + getsockname = Linux + 172, + getsockopt = Linux + 173, + listen = Linux + 174, + recv = Linux + 175, + recvfrom = Linux + 176, + recvmsg = Linux + 177, + send = Linux + 178, + sendmsg = Linux + 179, + sendto = Linux + 180, + setsockopt = Linux + 181, + shutdown = Linux + 182, + socket = Linux + 183, + socketpair = Linux + 184, + setresuid = Linux + 185, + getresuid = Linux + 186, + query_module = Linux + 187, + poll = Linux + 188, + nfsservctl = Linux + 189, + setresgid = Linux + 190, + getresgid = Linux + 191, + prctl = Linux + 192, + rt_sigreturn = Linux + 193, + rt_sigaction = Linux + 194, + rt_sigprocmask = Linux + 195, + rt_sigpending = Linux + 196, + rt_sigtimedwait = Linux + 197, + rt_sigqueueinfo = Linux + 198, + rt_sigsuspend = Linux + 199, + pread64 = Linux + 200, + pwrite64 = Linux + 201, + chown = Linux + 202, + getcwd = Linux + 203, + capget = Linux + 204, + capset = Linux + 205, + sigaltstack = Linux + 206, + sendfile = Linux + 207, + getpmsg = Linux + 208, + putpmsg = Linux + 209, + mmap2 = Linux + 210, + truncate64 = Linux + 211, + ftruncate64 = Linux + 212, + stat64 = Linux + 213, + lstat64 = Linux + 214, + fstat64 = Linux + 215, + pivot_root = Linux + 216, + mincore = Linux + 217, + madvise = Linux + 218, + getdents64 = Linux + 219, + fcntl64 = Linux + 220, + reserved221 = Linux + 221, + gettid = Linux + 222, + readahead = Linux + 223, + setxattr = Linux + 224, + lsetxattr = Linux + 225, + fsetxattr = Linux + 226, + getxattr = Linux + 227, + lgetxattr = Linux + 228, + fgetxattr = Linux + 229, + listxattr = Linux + 230, + llistxattr = Linux + 231, + flistxattr = Linux + 232, + removexattr = Linux + 233, + lremovexattr = Linux + 234, + fremovexattr = Linux + 235, + tkill = Linux + 236, + sendfile64 = Linux + 237, + futex = Linux + 238, + sched_setaffinity = Linux + 239, + sched_getaffinity = Linux + 240, + io_setup = Linux + 241, + io_destroy = Linux + 242, + io_getevents = Linux + 243, + io_submit = Linux + 244, + io_cancel = Linux + 245, + exit_group = Linux + 246, + lookup_dcookie = Linux + 247, + epoll_create = Linux + 248, + epoll_ctl = Linux + 249, + epoll_wait = Linux + 250, + remap_file_pages = Linux + 251, + set_tid_address = Linux + 252, + restart_syscall = Linux + 253, + fadvise64 = Linux + 254, + statfs64 = Linux + 255, + fstatfs64 = Linux + 256, + timer_create = Linux + 257, + timer_settime = Linux + 258, + timer_gettime = Linux + 259, + timer_getoverrun = Linux + 260, + timer_delete = Linux + 261, + clock_settime = Linux + 262, + clock_gettime = Linux + 263, + clock_getres = Linux + 264, + clock_nanosleep = Linux + 265, + tgkill = Linux + 266, + utimes = Linux + 267, + mbind = Linux + 268, + get_mempolicy = Linux + 269, + set_mempolicy = Linux + 270, + mq_open = Linux + 271, + mq_unlink = Linux + 272, + mq_timedsend = Linux + 273, + mq_timedreceive = Linux + 274, + mq_notify = Linux + 275, + mq_getsetattr = Linux + 276, + vserver = Linux + 277, + waitid = Linux + 278, + add_key = Linux + 280, + request_key = Linux + 281, + keyctl = Linux + 282, + set_thread_area = Linux + 283, + inotify_init = Linux + 284, + inotify_add_watch = Linux + 285, + inotify_rm_watch = Linux + 286, + migrate_pages = Linux + 287, + openat = Linux + 288, + mkdirat = Linux + 289, + mknodat = Linux + 290, + fchownat = Linux + 291, + futimesat = Linux + 292, + fstatat64 = Linux + 293, + unlinkat = Linux + 294, + renameat = Linux + 295, + linkat = Linux + 296, + symlinkat = Linux + 297, + readlinkat = Linux + 298, + fchmodat = Linux + 299, + faccessat = Linux + 300, + pselect6 = Linux + 301, + ppoll = Linux + 302, + unshare = Linux + 303, + splice = Linux + 304, + sync_file_range = Linux + 305, + tee = Linux + 306, + vmsplice = Linux + 307, + move_pages = Linux + 308, + set_robust_list = Linux + 309, + get_robust_list = Linux + 310, + kexec_load = Linux + 311, + getcpu = Linux + 312, + epoll_pwait = Linux + 313, + ioprio_set = Linux + 314, + ioprio_get = Linux + 315, + utimensat = Linux + 316, + signalfd = Linux + 317, + timerfd = Linux + 318, + eventfd = Linux + 319, + fallocate = Linux + 320, + timerfd_create = Linux + 321, + timerfd_gettime = Linux + 322, + timerfd_settime = Linux + 323, + signalfd4 = Linux + 324, + eventfd2 = Linux + 325, + epoll_create1 = Linux + 326, + dup3 = Linux + 327, + pipe2 = Linux + 328, + inotify_init1 = Linux + 329, + preadv = Linux + 330, + pwritev = Linux + 331, + rt_tgsigqueueinfo = Linux + 332, + perf_event_open = Linux + 333, + accept4 = Linux + 334, + recvmmsg = Linux + 335, + fanotify_init = Linux + 336, + fanotify_mark = Linux + 337, + prlimit64 = Linux + 338, + name_to_handle_at = Linux + 339, + open_by_handle_at = Linux + 340, + clock_adjtime = Linux + 341, + syncfs = Linux + 342, + sendmmsg = Linux + 343, + setns = Linux + 344, + process_vm_readv = Linux + 345, + process_vm_writev = Linux + 346, + kcmp = Linux + 347, + finit_module = Linux + 348, + sched_setattr = Linux + 349, + sched_getattr = Linux + 350, + renameat2 = Linux + 351, + seccomp = Linux + 352, + getrandom = Linux + 353, + memfd_create = Linux + 354, + bpf = Linux + 355, + execveat = Linux + 356, + userfaultfd = Linux + 357, + membarrier = Linux + 358, + mlock2 = Linux + 359, + copy_file_range = Linux + 360, + preadv2 = Linux + 361, + pwritev2 = Linux + 362, + pkey_mprotect = Linux + 363, + pkey_alloc = Linux + 364, + pkey_free = Linux + 365, + statx = Linux + 366, + rseq = Linux + 367, + io_pgetevents = Linux + 368, + openat2 = Linux + 437, + pidfd_getfd = Linux + 438, + + _, +}; pub const O_CREAT = 0o0400; pub const O_EXCL = 0o02000; diff --git a/lib/std/os/bits/linux/riscv64.zig b/lib/std/os/bits/linux/riscv64.zig index 4b95d2739a..50fdb905b8 100644 --- a/lib/std/os/bits/linux/riscv64.zig +++ b/lib/std/os/bits/linux/riscv64.zig @@ -4,300 +4,306 @@ const uid_t = std.os.linux.uid_t; const gid_t = std.os.linux.gid_t; const pid_t = std.os.linux.pid_t; -pub const SYS_io_setup = 0; -pub const SYS_io_destroy = 1; -pub const SYS_io_submit = 2; -pub const SYS_io_cancel = 3; -pub const SYS_io_getevents = 4; -pub const SYS_setxattr = 5; -pub const SYS_lsetxattr = 6; -pub const SYS_fsetxattr = 7; -pub const SYS_getxattr = 8; -pub const SYS_lgetxattr = 9; -pub const SYS_fgetxattr = 10; -pub const SYS_listxattr = 11; -pub const SYS_llistxattr = 12; -pub const SYS_flistxattr = 13; -pub const SYS_removexattr = 14; -pub const SYS_lremovexattr = 15; -pub const SYS_fremovexattr = 16; -pub const SYS_getcwd = 17; -pub const SYS_lookup_dcookie = 18; -pub const SYS_eventfd2 = 19; -pub const SYS_epoll_create1 = 20; -pub const SYS_epoll_ctl = 21; -pub const SYS_epoll_pwait = 22; -pub const SYS_dup = 23; -pub const SYS_dup3 = 24; -pub const SYS_fcntl = 25; -pub const SYS_inotify_init1 = 26; -pub const SYS_inotify_add_watch = 27; -pub const SYS_inotify_rm_watch = 28; -pub const SYS_ioctl = 29; -pub const SYS_ioprio_set = 30; -pub const SYS_ioprio_get = 31; -pub const SYS_flock = 32; -pub const SYS_mknodat = 33; -pub const SYS_mkdirat = 34; -pub const SYS_unlinkat = 35; -pub const SYS_symlinkat = 36; -pub const SYS_linkat = 37; -pub const SYS_umount2 = 39; -pub const SYS_mount = 40; -pub const SYS_pivot_root = 41; -pub const SYS_nfsservctl = 42; -pub const SYS_statfs = 43; -pub const SYS_fstatfs = 44; -pub const SYS_truncate = 45; -pub const SYS_ftruncate = 46; -pub const SYS_fallocate = 47; -pub const SYS_faccessat = 48; -pub const SYS_chdir = 49; -pub const SYS_fchdir = 50; -pub const SYS_chroot = 51; -pub const SYS_fchmod = 52; -pub const SYS_fchmodat = 53; -pub const SYS_fchownat = 54; -pub const SYS_fchown = 55; -pub const SYS_openat = 56; -pub const SYS_close = 57; -pub const SYS_vhangup = 58; -pub const SYS_pipe2 = 59; -pub const SYS_quotactl = 60; -pub const SYS_getdents64 = 61; -pub const SYS_lseek = 62; -pub const SYS_read = 63; -pub const SYS_write = 64; -pub const SYS_readv = 65; -pub const SYS_writev = 66; -pub const SYS_pread64 = 67; -pub const SYS_pwrite64 = 68; -pub const SYS_preadv = 69; -pub const SYS_pwritev = 70; -pub const SYS_sendfile = 71; -pub const SYS_pselect6 = 72; -pub const SYS_ppoll = 73; -pub const SYS_signalfd4 = 74; -pub const SYS_vmsplice = 75; -pub const SYS_splice = 76; -pub const SYS_tee = 77; -pub const SYS_readlinkat = 78; -pub const SYS_fstatat = 79; -pub const SYS_fstat = 80; -pub const SYS_sync = 81; -pub const SYS_fsync = 82; -pub const SYS_fdatasync = 83; -pub const SYS_sync_file_range = 84; -pub const SYS_timerfd_create = 85; -pub const SYS_timerfd_settime = 86; -pub const SYS_timerfd_gettime = 87; -pub const SYS_utimensat = 88; -pub const SYS_acct = 89; -pub const SYS_capget = 90; -pub const SYS_capset = 91; -pub const SYS_personality = 92; -pub const SYS_exit = 93; -pub const SYS_exit_group = 94; -pub const SYS_waitid = 95; -pub const SYS_set_tid_address = 96; -pub const SYS_unshare = 97; -pub const SYS_futex = 98; -pub const SYS_set_robust_list = 99; -pub const SYS_get_robust_list = 100; -pub const SYS_nanosleep = 101; -pub const SYS_getitimer = 102; -pub const SYS_setitimer = 103; -pub const SYS_kexec_load = 104; -pub const SYS_init_module = 105; -pub const SYS_delete_module = 106; -pub const SYS_timer_create = 107; -pub const SYS_timer_gettime = 108; -pub const SYS_timer_getoverrun = 109; -pub const SYS_timer_settime = 110; -pub const SYS_timer_delete = 111; -pub const SYS_clock_settime = 112; -pub const SYS_clock_gettime = 113; -pub const SYS_clock_getres = 114; -pub const SYS_clock_nanosleep = 115; -pub const SYS_syslog = 116; -pub const SYS_ptrace = 117; -pub const SYS_sched_setparam = 118; -pub const SYS_sched_setscheduler = 119; -pub const SYS_sched_getscheduler = 120; -pub const SYS_sched_getparam = 121; -pub const SYS_sched_setaffinity = 122; -pub const SYS_sched_getaffinity = 123; -pub const SYS_sched_yield = 124; -pub const SYS_sched_get_priority_max = 125; -pub const SYS_sched_get_priority_min = 126; -pub const SYS_sched_rr_get_interval = 127; -pub const SYS_restart_syscall = 128; -pub const SYS_kill = 129; -pub const SYS_tkill = 130; -pub const SYS_tgkill = 131; -pub const SYS_sigaltstack = 132; -pub const SYS_rt_sigsuspend = 133; -pub const SYS_rt_sigaction = 134; -pub const SYS_rt_sigprocmask = 135; -pub const SYS_rt_sigpending = 136; -pub const SYS_rt_sigtimedwait = 137; -pub const SYS_rt_sigqueueinfo = 138; -pub const SYS_rt_sigreturn = 139; -pub const SYS_setpriority = 140; -pub const SYS_getpriority = 141; -pub const SYS_reboot = 142; -pub const SYS_setregid = 143; -pub const SYS_setgid = 144; -pub const SYS_setreuid = 145; -pub const SYS_setuid = 146; -pub const SYS_setresuid = 147; -pub const SYS_getresuid = 148; -pub const SYS_setresgid = 149; -pub const SYS_getresgid = 150; -pub const SYS_setfsuid = 151; -pub const SYS_setfsgid = 152; -pub const SYS_times = 153; -pub const SYS_setpgid = 154; -pub const SYS_getpgid = 155; -pub const SYS_getsid = 156; -pub const SYS_setsid = 157; -pub const SYS_getgroups = 158; -pub const SYS_setgroups = 159; -pub const SYS_uname = 160; -pub const SYS_sethostname = 161; -pub const SYS_setdomainname = 162; -pub const SYS_getrlimit = 163; -pub const SYS_setrlimit = 164; -pub const SYS_getrusage = 165; -pub const SYS_umask = 166; -pub const SYS_prctl = 167; -pub const SYS_getcpu = 168; -pub const SYS_gettimeofday = 169; -pub const SYS_settimeofday = 170; -pub const SYS_adjtimex = 171; -pub const SYS_getpid = 172; -pub const SYS_getppid = 173; -pub const SYS_getuid = 174; -pub const SYS_geteuid = 175; -pub const SYS_getgid = 176; -pub const SYS_getegid = 177; -pub const SYS_gettid = 178; -pub const SYS_sysinfo = 179; -pub const SYS_mq_open = 180; -pub const SYS_mq_unlink = 181; -pub const SYS_mq_timedsend = 182; -pub const SYS_mq_timedreceive = 183; -pub const SYS_mq_notify = 184; -pub const SYS_mq_getsetattr = 185; -pub const SYS_msgget = 186; -pub const SYS_msgctl = 187; -pub const SYS_msgrcv = 188; -pub const SYS_msgsnd = 189; -pub const SYS_semget = 190; -pub const SYS_semctl = 191; -pub const SYS_semtimedop = 192; -pub const SYS_semop = 193; -pub const SYS_shmget = 194; -pub const SYS_shmctl = 195; -pub const SYS_shmat = 196; -pub const SYS_shmdt = 197; -pub const SYS_socket = 198; -pub const SYS_socketpair = 199; -pub const SYS_bind = 200; -pub const SYS_listen = 201; -pub const SYS_accept = 202; -pub const SYS_connect = 203; -pub const SYS_getsockname = 204; -pub const SYS_getpeername = 205; -pub const SYS_sendto = 206; -pub const SYS_recvfrom = 207; -pub const SYS_setsockopt = 208; -pub const SYS_getsockopt = 209; -pub const SYS_shutdown = 210; -pub const SYS_sendmsg = 211; -pub const SYS_recvmsg = 212; -pub const SYS_readahead = 213; -pub const SYS_brk = 214; -pub const SYS_munmap = 215; -pub const SYS_mremap = 216; -pub const SYS_add_key = 217; -pub const SYS_request_key = 218; -pub const SYS_keyctl = 219; -pub const SYS_clone = 220; -pub const SYS_execve = 221; -pub const SYS_mmap = 222; -pub const SYS_fadvise64 = 223; -pub const SYS_swapon = 224; -pub const SYS_swapoff = 225; -pub const SYS_mprotect = 226; -pub const SYS_msync = 227; -pub const SYS_mlock = 228; -pub const SYS_munlock = 229; -pub const SYS_mlockall = 230; -pub const SYS_munlockall = 231; -pub const SYS_mincore = 232; -pub const SYS_madvise = 233; -pub const SYS_remap_file_pages = 234; -pub const SYS_mbind = 235; -pub const SYS_get_mempolicy = 236; -pub const SYS_set_mempolicy = 237; -pub const SYS_migrate_pages = 238; -pub const SYS_move_pages = 239; -pub const SYS_rt_tgsigqueueinfo = 240; -pub const SYS_perf_event_open = 241; -pub const SYS_accept4 = 242; -pub const SYS_recvmmsg = 243; +pub const SYS = extern enum(usize) { + io_setup = 0, + io_destroy = 1, + io_submit = 2, + io_cancel = 3, + io_getevents = 4, + setxattr = 5, + lsetxattr = 6, + fsetxattr = 7, + getxattr = 8, + lgetxattr = 9, + fgetxattr = 10, + listxattr = 11, + llistxattr = 12, + flistxattr = 13, + removexattr = 14, + lremovexattr = 15, + fremovexattr = 16, + getcwd = 17, + lookup_dcookie = 18, + eventfd2 = 19, + epoll_create1 = 20, + epoll_ctl = 21, + epoll_pwait = 22, + dup = 23, + dup3 = 24, + fcntl = 25, + inotify_init1 = 26, + inotify_add_watch = 27, + inotify_rm_watch = 28, + ioctl = 29, + ioprio_set = 30, + ioprio_get = 31, + flock = 32, + mknodat = 33, + mkdirat = 34, + unlinkat = 35, + symlinkat = 36, + linkat = 37, + umount2 = 39, + mount = 40, + pivot_root = 41, + nfsservctl = 42, + statfs = 43, + fstatfs = 44, + truncate = 45, + ftruncate = 46, + fallocate = 47, + faccessat = 48, + chdir = 49, + fchdir = 50, + chroot = 51, + fchmod = 52, + fchmodat = 53, + fchownat = 54, + fchown = 55, + openat = 56, + close = 57, + vhangup = 58, + pipe2 = 59, + quotactl = 60, + getdents64 = 61, + lseek = 62, + read = 63, + write = 64, + readv = 65, + writev = 66, + pread64 = 67, + pwrite64 = 68, + preadv = 69, + pwritev = 70, + sendfile = 71, + pselect6 = 72, + ppoll = 73, + signalfd4 = 74, + vmsplice = 75, + splice = 76, + tee = 77, + readlinkat = 78, + fstatat = 79, + fstat = 80, + sync = 81, + fsync = 82, + fdatasync = 83, + sync_file_range = 84, + timerfd_create = 85, + timerfd_settime = 86, + timerfd_gettime = 87, + utimensat = 88, + acct = 89, + capget = 90, + capset = 91, + personality = 92, + exit = 93, + exit_group = 94, + waitid = 95, + set_tid_address = 96, + unshare = 97, + futex = 98, + set_robust_list = 99, + get_robust_list = 100, + nanosleep = 101, + getitimer = 102, + setitimer = 103, + kexec_load = 104, + init_module = 105, + delete_module = 106, + timer_create = 107, + timer_gettime = 108, + timer_getoverrun = 109, + timer_settime = 110, + timer_delete = 111, + clock_settime = 112, + clock_gettime = 113, + clock_getres = 114, + clock_nanosleep = 115, + syslog = 116, + ptrace = 117, + sched_setparam = 118, + sched_setscheduler = 119, + sched_getscheduler = 120, + sched_getparam = 121, + sched_setaffinity = 122, + sched_getaffinity = 123, + sched_yield = 124, + sched_get_priority_max = 125, + sched_get_priority_min = 126, + sched_rr_get_interval = 127, + restart_syscall = 128, + kill = 129, + tkill = 130, + tgkill = 131, + sigaltstack = 132, + rt_sigsuspend = 133, + rt_sigaction = 134, + rt_sigprocmask = 135, + rt_sigpending = 136, + rt_sigtimedwait = 137, + rt_sigqueueinfo = 138, + rt_sigreturn = 139, + setpriority = 140, + getpriority = 141, + reboot = 142, + setregid = 143, + setgid = 144, + setreuid = 145, + setuid = 146, + setresuid = 147, + getresuid = 148, + setresgid = 149, + getresgid = 150, + setfsuid = 151, + setfsgid = 152, + times = 153, + setpgid = 154, + getpgid = 155, + getsid = 156, + setsid = 157, + getgroups = 158, + setgroups = 159, + uname = 160, + sethostname = 161, + setdomainname = 162, + getrlimit = 163, + setrlimit = 164, + getrusage = 165, + umask = 166, + prctl = 167, + getcpu = 168, + gettimeofday = 169, + settimeofday = 170, + adjtimex = 171, + getpid = 172, + getppid = 173, + getuid = 174, + geteuid = 175, + getgid = 176, + getegid = 177, + gettid = 178, + sysinfo = 179, + mq_open = 180, + mq_unlink = 181, + mq_timedsend = 182, + mq_timedreceive = 183, + mq_notify = 184, + mq_getsetattr = 185, + msgget = 186, + msgctl = 187, + msgrcv = 188, + msgsnd = 189, + semget = 190, + semctl = 191, + semtimedop = 192, + semop = 193, + shmget = 194, + shmctl = 195, + shmat = 196, + shmdt = 197, + socket = 198, + socketpair = 199, + bind = 200, + listen = 201, + accept = 202, + connect = 203, + getsockname = 204, + getpeername = 205, + sendto = 206, + recvfrom = 207, + setsockopt = 208, + getsockopt = 209, + shutdown = 210, + sendmsg = 211, + recvmsg = 212, + readahead = 213, + brk = 214, + munmap = 215, + mremap = 216, + add_key = 217, + request_key = 218, + keyctl = 219, + clone = 220, + execve = 221, + mmap = 222, + fadvise64 = 223, + swapon = 224, + swapoff = 225, + mprotect = 226, + msync = 227, + mlock = 228, + munlock = 229, + mlockall = 230, + munlockall = 231, + mincore = 232, + madvise = 233, + remap_file_pages = 234, + mbind = 235, + get_mempolicy = 236, + set_mempolicy = 237, + migrate_pages = 238, + move_pages = 239, + rt_tgsigqueueinfo = 240, + perf_event_open = 241, + accept4 = 242, + recvmmsg = 243, -pub const SYS_arch_specific_syscall = 244; -pub const SYS_riscv_flush_icache = SYS_arch_specific_syscall + 15; + pub const arch_specific_syscall = 244; + riscv_flush_icache = arch_specific_syscall + 15, -pub const SYS_wait4 = 260; -pub const SYS_prlimit64 = 261; -pub const SYS_fanotify_init = 262; -pub const SYS_fanotify_mark = 263; -pub const SYS_name_to_handle_at = 264; -pub const SYS_open_by_handle_at = 265; -pub const SYS_clock_adjtime = 266; -pub const SYS_syncfs = 267; -pub const SYS_setns = 268; -pub const SYS_sendmmsg = 269; -pub const SYS_process_vm_readv = 270; -pub const SYS_process_vm_writev = 271; -pub const SYS_kcmp = 272; -pub const SYS_finit_module = 273; -pub const SYS_sched_setattr = 274; -pub const SYS_sched_getattr = 275; -pub const SYS_renameat2 = 276; -pub const SYS_seccomp = 277; -pub const SYS_getrandom = 278; -pub const SYS_memfd_create = 279; -pub const SYS_bpf = 280; -pub const SYS_execveat = 281; -pub const SYS_userfaultfd = 282; -pub const SYS_membarrier = 283; -pub const SYS_mlock2 = 284; -pub const SYS_copy_file_range = 285; -pub const SYS_preadv2 = 286; -pub const SYS_pwritev2 = 287; -pub const SYS_pkey_mprotect = 288; -pub const SYS_pkey_alloc = 289; -pub const SYS_pkey_free = 290; -pub const SYS_statx = 291; -pub const SYS_io_pgetevents = 292; -pub const SYS_rseq = 293; -pub const SYS_kexec_file_load = 294; -pub const SYS_pidfd_send_signal = 424; -pub const SYS_io_uring_setup = 425; -pub const SYS_io_uring_enter = 426; -pub const SYS_io_uring_register = 427; -pub const SYS_open_tree = 428; -pub const SYS_move_mount = 429; -pub const SYS_fsopen = 430; -pub const SYS_fsconfig = 431; -pub const SYS_fsmount = 432; -pub const SYS_fspick = 433; -pub const SYS_pidfd_open = 434; -pub const SYS_clone3 = 435; + wait4 = 260, + prlimit64 = 261, + fanotify_init = 262, + fanotify_mark = 263, + name_to_handle_at = 264, + open_by_handle_at = 265, + clock_adjtime = 266, + syncfs = 267, + setns = 268, + sendmmsg = 269, + process_vm_readv = 270, + process_vm_writev = 271, + kcmp = 272, + finit_module = 273, + sched_setattr = 274, + sched_getattr = 275, + renameat2 = 276, + seccomp = 277, + getrandom = 278, + memfd_create = 279, + bpf = 280, + execveat = 281, + userfaultfd = 282, + membarrier = 283, + mlock2 = 284, + copy_file_range = 285, + preadv2 = 286, + pwritev2 = 287, + pkey_mprotect = 288, + pkey_alloc = 289, + pkey_free = 290, + statx = 291, + io_pgetevents = 292, + rseq = 293, + kexec_file_load = 294, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + openat2 = 437, + pidfd_getfd = 438, + + _, +}; pub const O_CREAT = 0o100; pub const O_EXCL = 0o200; diff --git a/lib/std/os/bits/linux/x86_64.zig b/lib/std/os/bits/linux/x86_64.zig index ab37391a6a..f5eaf30544 100644 --- a/lib/std/os/bits/linux/x86_64.zig +++ b/lib/std/os/bits/linux/x86_64.zig @@ -14,354 +14,360 @@ const iovec_const = linux.iovec_const; pub const mode_t = usize; -pub const SYS_read = 0; -pub const SYS_write = 1; -pub const SYS_open = 2; -pub const SYS_close = 3; -pub const SYS_stat = 4; -pub const SYS_fstat = 5; -pub const SYS_lstat = 6; -pub const SYS_poll = 7; -pub const SYS_lseek = 8; -pub const SYS_mmap = 9; -pub const SYS_mprotect = 10; -pub const SYS_munmap = 11; -pub const SYS_brk = 12; -pub const SYS_rt_sigaction = 13; -pub const SYS_rt_sigprocmask = 14; -pub const SYS_rt_sigreturn = 15; -pub const SYS_ioctl = 16; -pub const SYS_pread = 17; -pub const SYS_pwrite = 18; -pub const SYS_readv = 19; -pub const SYS_writev = 20; -pub const SYS_access = 21; -pub const SYS_pipe = 22; -pub const SYS_select = 23; -pub const SYS_sched_yield = 24; -pub const SYS_mremap = 25; -pub const SYS_msync = 26; -pub const SYS_mincore = 27; -pub const SYS_madvise = 28; -pub const SYS_shmget = 29; -pub const SYS_shmat = 30; -pub const SYS_shmctl = 31; -pub const SYS_dup = 32; -pub const SYS_dup2 = 33; -pub const SYS_pause = 34; -pub const SYS_nanosleep = 35; -pub const SYS_getitimer = 36; -pub const SYS_alarm = 37; -pub const SYS_setitimer = 38; -pub const SYS_getpid = 39; -pub const SYS_sendfile = 40; -pub const SYS_socket = 41; -pub const SYS_connect = 42; -pub const SYS_accept = 43; -pub const SYS_sendto = 44; -pub const SYS_recvfrom = 45; -pub const SYS_sendmsg = 46; -pub const SYS_recvmsg = 47; -pub const SYS_shutdown = 48; -pub const SYS_bind = 49; -pub const SYS_listen = 50; -pub const SYS_getsockname = 51; -pub const SYS_getpeername = 52; -pub const SYS_socketpair = 53; -pub const SYS_setsockopt = 54; -pub const SYS_getsockopt = 55; -pub const SYS_clone = 56; -pub const SYS_fork = 57; -pub const SYS_vfork = 58; -pub const SYS_execve = 59; -pub const SYS_exit = 60; -pub const SYS_wait4 = 61; -pub const SYS_kill = 62; -pub const SYS_uname = 63; -pub const SYS_semget = 64; -pub const SYS_semop = 65; -pub const SYS_semctl = 66; -pub const SYS_shmdt = 67; -pub const SYS_msgget = 68; -pub const SYS_msgsnd = 69; -pub const SYS_msgrcv = 70; -pub const SYS_msgctl = 71; -pub const SYS_fcntl = 72; -pub const SYS_flock = 73; -pub const SYS_fsync = 74; -pub const SYS_fdatasync = 75; -pub const SYS_truncate = 76; -pub const SYS_ftruncate = 77; -pub const SYS_getdents = 78; -pub const SYS_getcwd = 79; -pub const SYS_chdir = 80; -pub const SYS_fchdir = 81; -pub const SYS_rename = 82; -pub const SYS_mkdir = 83; -pub const SYS_rmdir = 84; -pub const SYS_creat = 85; -pub const SYS_link = 86; -pub const SYS_unlink = 87; -pub const SYS_symlink = 88; -pub const SYS_readlink = 89; -pub const SYS_chmod = 90; -pub const SYS_fchmod = 91; -pub const SYS_chown = 92; -pub const SYS_fchown = 93; -pub const SYS_lchown = 94; -pub const SYS_umask = 95; -pub const SYS_gettimeofday = 96; -pub const SYS_getrlimit = 97; -pub const SYS_getrusage = 98; -pub const SYS_sysinfo = 99; -pub const SYS_times = 100; -pub const SYS_ptrace = 101; -pub const SYS_getuid = 102; -pub const SYS_syslog = 103; -pub const SYS_getgid = 104; -pub const SYS_setuid = 105; -pub const SYS_setgid = 106; -pub const SYS_geteuid = 107; -pub const SYS_getegid = 108; -pub const SYS_setpgid = 109; -pub const SYS_getppid = 110; -pub const SYS_getpgrp = 111; -pub const SYS_setsid = 112; -pub const SYS_setreuid = 113; -pub const SYS_setregid = 114; -pub const SYS_getgroups = 115; -pub const SYS_setgroups = 116; -pub const SYS_setresuid = 117; -pub const SYS_getresuid = 118; -pub const SYS_setresgid = 119; -pub const SYS_getresgid = 120; -pub const SYS_getpgid = 121; -pub const SYS_setfsuid = 122; -pub const SYS_setfsgid = 123; -pub const SYS_getsid = 124; -pub const SYS_capget = 125; -pub const SYS_capset = 126; -pub const SYS_rt_sigpending = 127; -pub const SYS_rt_sigtimedwait = 128; -pub const SYS_rt_sigqueueinfo = 129; -pub const SYS_rt_sigsuspend = 130; -pub const SYS_sigaltstack = 131; -pub const SYS_utime = 132; -pub const SYS_mknod = 133; -pub const SYS_uselib = 134; -pub const SYS_personality = 135; -pub const SYS_ustat = 136; -pub const SYS_statfs = 137; -pub const SYS_fstatfs = 138; -pub const SYS_sysfs = 139; -pub const SYS_getpriority = 140; -pub const SYS_setpriority = 141; -pub const SYS_sched_setparam = 142; -pub const SYS_sched_getparam = 143; -pub const SYS_sched_setscheduler = 144; -pub const SYS_sched_getscheduler = 145; -pub const SYS_sched_get_priority_max = 146; -pub const SYS_sched_get_priority_min = 147; -pub const SYS_sched_rr_get_interval = 148; -pub const SYS_mlock = 149; -pub const SYS_munlock = 150; -pub const SYS_mlockall = 151; -pub const SYS_munlockall = 152; -pub const SYS_vhangup = 153; -pub const SYS_modify_ldt = 154; -pub const SYS_pivot_root = 155; -pub const SYS__sysctl = 156; -pub const SYS_prctl = 157; -pub const SYS_arch_prctl = 158; -pub const SYS_adjtimex = 159; -pub const SYS_setrlimit = 160; -pub const SYS_chroot = 161; -pub const SYS_sync = 162; -pub const SYS_acct = 163; -pub const SYS_settimeofday = 164; -pub const SYS_mount = 165; -pub const SYS_umount2 = 166; -pub const SYS_swapon = 167; -pub const SYS_swapoff = 168; -pub const SYS_reboot = 169; -pub const SYS_sethostname = 170; -pub const SYS_setdomainname = 171; -pub const SYS_iopl = 172; -pub const SYS_ioperm = 173; -pub const SYS_create_module = 174; -pub const SYS_init_module = 175; -pub const SYS_delete_module = 176; -pub const SYS_get_kernel_syms = 177; -pub const SYS_query_module = 178; -pub const SYS_quotactl = 179; -pub const SYS_nfsservctl = 180; -pub const SYS_getpmsg = 181; -pub const SYS_putpmsg = 182; -pub const SYS_afs_syscall = 183; -pub const SYS_tuxcall = 184; -pub const SYS_security = 185; -pub const SYS_gettid = 186; -pub const SYS_readahead = 187; -pub const SYS_setxattr = 188; -pub const SYS_lsetxattr = 189; -pub const SYS_fsetxattr = 190; -pub const SYS_getxattr = 191; -pub const SYS_lgetxattr = 192; -pub const SYS_fgetxattr = 193; -pub const SYS_listxattr = 194; -pub const SYS_llistxattr = 195; -pub const SYS_flistxattr = 196; -pub const SYS_removexattr = 197; -pub const SYS_lremovexattr = 198; -pub const SYS_fremovexattr = 199; -pub const SYS_tkill = 200; -pub const SYS_time = 201; -pub const SYS_futex = 202; -pub const SYS_sched_setaffinity = 203; -pub const SYS_sched_getaffinity = 204; -pub const SYS_set_thread_area = 205; -pub const SYS_io_setup = 206; -pub const SYS_io_destroy = 207; -pub const SYS_io_getevents = 208; -pub const SYS_io_submit = 209; -pub const SYS_io_cancel = 210; -pub const SYS_get_thread_area = 211; -pub const SYS_lookup_dcookie = 212; -pub const SYS_epoll_create = 213; -pub const SYS_epoll_ctl_old = 214; -pub const SYS_epoll_wait_old = 215; -pub const SYS_remap_file_pages = 216; -pub const SYS_getdents64 = 217; -pub const SYS_set_tid_address = 218; -pub const SYS_restart_syscall = 219; -pub const SYS_semtimedop = 220; -pub const SYS_fadvise64 = 221; -pub const SYS_timer_create = 222; -pub const SYS_timer_settime = 223; -pub const SYS_timer_gettime = 224; -pub const SYS_timer_getoverrun = 225; -pub const SYS_timer_delete = 226; -pub const SYS_clock_settime = 227; -pub const SYS_clock_gettime = 228; -pub const SYS_clock_getres = 229; -pub const SYS_clock_nanosleep = 230; -pub const SYS_exit_group = 231; -pub const SYS_epoll_wait = 232; -pub const SYS_epoll_ctl = 233; -pub const SYS_tgkill = 234; -pub const SYS_utimes = 235; -pub const SYS_vserver = 236; -pub const SYS_mbind = 237; -pub const SYS_set_mempolicy = 238; -pub const SYS_get_mempolicy = 239; -pub const SYS_mq_open = 240; -pub const SYS_mq_unlink = 241; -pub const SYS_mq_timedsend = 242; -pub const SYS_mq_timedreceive = 243; -pub const SYS_mq_notify = 244; -pub const SYS_mq_getsetattr = 245; -pub const SYS_kexec_load = 246; -pub const SYS_waitid = 247; -pub const SYS_add_key = 248; -pub const SYS_request_key = 249; -pub const SYS_keyctl = 250; -pub const SYS_ioprio_set = 251; -pub const SYS_ioprio_get = 252; -pub const SYS_inotify_init = 253; -pub const SYS_inotify_add_watch = 254; -pub const SYS_inotify_rm_watch = 255; -pub const SYS_migrate_pages = 256; -pub const SYS_openat = 257; -pub const SYS_mkdirat = 258; -pub const SYS_mknodat = 259; -pub const SYS_fchownat = 260; -pub const SYS_futimesat = 261; -pub const SYS_newfstatat = 262; -pub const SYS_fstatat = 262; -pub const SYS_unlinkat = 263; -pub const SYS_renameat = 264; -pub const SYS_linkat = 265; -pub const SYS_symlinkat = 266; -pub const SYS_readlinkat = 267; -pub const SYS_fchmodat = 268; -pub const SYS_faccessat = 269; -pub const SYS_pselect6 = 270; -pub const SYS_ppoll = 271; -pub const SYS_unshare = 272; -pub const SYS_set_robust_list = 273; -pub const SYS_get_robust_list = 274; -pub const SYS_splice = 275; -pub const SYS_tee = 276; -pub const SYS_sync_file_range = 277; -pub const SYS_vmsplice = 278; -pub const SYS_move_pages = 279; -pub const SYS_utimensat = 280; -pub const SYS_epoll_pwait = 281; -pub const SYS_signalfd = 282; -pub const SYS_timerfd_create = 283; -pub const SYS_eventfd = 284; -pub const SYS_fallocate = 285; -pub const SYS_timerfd_settime = 286; -pub const SYS_timerfd_gettime = 287; -pub const SYS_accept4 = 288; -pub const SYS_signalfd4 = 289; -pub const SYS_eventfd2 = 290; -pub const SYS_epoll_create1 = 291; -pub const SYS_dup3 = 292; -pub const SYS_pipe2 = 293; -pub const SYS_inotify_init1 = 294; -pub const SYS_preadv = 295; -pub const SYS_pwritev = 296; -pub const SYS_rt_tgsigqueueinfo = 297; -pub const SYS_perf_event_open = 298; -pub const SYS_recvmmsg = 299; -pub const SYS_fanotify_init = 300; -pub const SYS_fanotify_mark = 301; -pub const SYS_prlimit64 = 302; -pub const SYS_name_to_handle_at = 303; -pub const SYS_open_by_handle_at = 304; -pub const SYS_clock_adjtime = 305; -pub const SYS_syncfs = 306; -pub const SYS_sendmmsg = 307; -pub const SYS_setns = 308; -pub const SYS_getcpu = 309; -pub const SYS_process_vm_readv = 310; -pub const SYS_process_vm_writev = 311; -pub const SYS_kcmp = 312; -pub const SYS_finit_module = 313; -pub const SYS_sched_setattr = 314; -pub const SYS_sched_getattr = 315; -pub const SYS_renameat2 = 316; -pub const SYS_seccomp = 317; -pub const SYS_getrandom = 318; -pub const SYS_memfd_create = 319; -pub const SYS_kexec_file_load = 320; -pub const SYS_bpf = 321; -pub const SYS_execveat = 322; -pub const SYS_userfaultfd = 323; -pub const SYS_membarrier = 324; -pub const SYS_mlock2 = 325; -pub const SYS_copy_file_range = 326; -pub const SYS_preadv2 = 327; -pub const SYS_pwritev2 = 328; -pub const SYS_pkey_mprotect = 329; -pub const SYS_pkey_alloc = 330; -pub const SYS_pkey_free = 331; -pub const SYS_statx = 332; -pub const SYS_io_pgetevents = 333; -pub const SYS_rseq = 334; -pub const SYS_pidfd_send_signal = 424; -pub const SYS_io_uring_setup = 425; -pub const SYS_io_uring_enter = 426; -pub const SYS_io_uring_register = 427; -pub const SYS_open_tree = 428; -pub const SYS_move_mount = 429; -pub const SYS_fsopen = 430; -pub const SYS_fsconfig = 431; -pub const SYS_fsmount = 432; -pub const SYS_fspick = 433; -pub const SYS_pidfd_open = 434; -pub const SYS_clone3 = 435; +pub const SYS = extern enum(usize) { + read = 0, + write = 1, + open = 2, + close = 3, + stat = 4, + fstat = 5, + lstat = 6, + poll = 7, + lseek = 8, + mmap = 9, + mprotect = 10, + munmap = 11, + brk = 12, + rt_sigaction = 13, + rt_sigprocmask = 14, + rt_sigreturn = 15, + ioctl = 16, + pread = 17, + pwrite = 18, + readv = 19, + writev = 20, + access = 21, + pipe = 22, + select = 23, + sched_yield = 24, + mremap = 25, + msync = 26, + mincore = 27, + madvise = 28, + shmget = 29, + shmat = 30, + shmctl = 31, + dup = 32, + dup2 = 33, + pause = 34, + nanosleep = 35, + getitimer = 36, + alarm = 37, + setitimer = 38, + getpid = 39, + sendfile = 40, + socket = 41, + connect = 42, + accept = 43, + sendto = 44, + recvfrom = 45, + sendmsg = 46, + recvmsg = 47, + shutdown = 48, + bind = 49, + listen = 50, + getsockname = 51, + getpeername = 52, + socketpair = 53, + setsockopt = 54, + getsockopt = 55, + clone = 56, + fork = 57, + vfork = 58, + execve = 59, + exit = 60, + wait4 = 61, + kill = 62, + uname = 63, + semget = 64, + semop = 65, + semctl = 66, + shmdt = 67, + msgget = 68, + msgsnd = 69, + msgrcv = 70, + msgctl = 71, + fcntl = 72, + flock = 73, + fsync = 74, + fdatasync = 75, + truncate = 76, + ftruncate = 77, + getdents = 78, + getcwd = 79, + chdir = 80, + fchdir = 81, + rename = 82, + mkdir = 83, + rmdir = 84, + creat = 85, + link = 86, + unlink = 87, + symlink = 88, + readlink = 89, + chmod = 90, + fchmod = 91, + chown = 92, + fchown = 93, + lchown = 94, + umask = 95, + gettimeofday = 96, + getrlimit = 97, + getrusage = 98, + sysinfo = 99, + times = 100, + ptrace = 101, + getuid = 102, + syslog = 103, + getgid = 104, + setuid = 105, + setgid = 106, + geteuid = 107, + getegid = 108, + setpgid = 109, + getppid = 110, + getpgrp = 111, + setsid = 112, + setreuid = 113, + setregid = 114, + getgroups = 115, + setgroups = 116, + setresuid = 117, + getresuid = 118, + setresgid = 119, + getresgid = 120, + getpgid = 121, + setfsuid = 122, + setfsgid = 123, + getsid = 124, + capget = 125, + capset = 126, + rt_sigpending = 127, + rt_sigtimedwait = 128, + rt_sigqueueinfo = 129, + rt_sigsuspend = 130, + sigaltstack = 131, + utime = 132, + mknod = 133, + uselib = 134, + personality = 135, + ustat = 136, + statfs = 137, + fstatfs = 138, + sysfs = 139, + getpriority = 140, + setpriority = 141, + sched_setparam = 142, + sched_getparam = 143, + sched_setscheduler = 144, + sched_getscheduler = 145, + sched_get_priority_max = 146, + sched_get_priority_min = 147, + sched_rr_get_interval = 148, + mlock = 149, + munlock = 150, + mlockall = 151, + munlockall = 152, + vhangup = 153, + modify_ldt = 154, + pivot_root = 155, + _sysctl = 156, + prctl = 157, + arch_prctl = 158, + adjtimex = 159, + setrlimit = 160, + chroot = 161, + sync = 162, + acct = 163, + settimeofday = 164, + mount = 165, + umount2 = 166, + swapon = 167, + swapoff = 168, + reboot = 169, + sethostname = 170, + setdomainname = 171, + iopl = 172, + ioperm = 173, + create_module = 174, + init_module = 175, + delete_module = 176, + get_kernel_syms = 177, + query_module = 178, + quotactl = 179, + nfsservctl = 180, + getpmsg = 181, + putpmsg = 182, + afs_syscall = 183, + tuxcall = 184, + security = 185, + gettid = 186, + readahead = 187, + setxattr = 188, + lsetxattr = 189, + fsetxattr = 190, + getxattr = 191, + lgetxattr = 192, + fgetxattr = 193, + listxattr = 194, + llistxattr = 195, + flistxattr = 196, + removexattr = 197, + lremovexattr = 198, + fremovexattr = 199, + tkill = 200, + time = 201, + futex = 202, + sched_setaffinity = 203, + sched_getaffinity = 204, + set_thread_area = 205, + io_setup = 206, + io_destroy = 207, + io_getevents = 208, + io_submit = 209, + io_cancel = 210, + get_thread_area = 211, + lookup_dcookie = 212, + epoll_create = 213, + epoll_ctl_old = 214, + epoll_wait_old = 215, + remap_file_pages = 216, + getdents64 = 217, + set_tid_address = 218, + restart_syscall = 219, + semtimedop = 220, + fadvise64 = 221, + timer_create = 222, + timer_settime = 223, + timer_gettime = 224, + timer_getoverrun = 225, + timer_delete = 226, + clock_settime = 227, + clock_gettime = 228, + clock_getres = 229, + clock_nanosleep = 230, + exit_group = 231, + epoll_wait = 232, + epoll_ctl = 233, + tgkill = 234, + utimes = 235, + vserver = 236, + mbind = 237, + set_mempolicy = 238, + get_mempolicy = 239, + mq_open = 240, + mq_unlink = 241, + mq_timedsend = 242, + mq_timedreceive = 243, + mq_notify = 244, + mq_getsetattr = 245, + kexec_load = 246, + waitid = 247, + add_key = 248, + request_key = 249, + keyctl = 250, + ioprio_set = 251, + ioprio_get = 252, + inotify_init = 253, + inotify_add_watch = 254, + inotify_rm_watch = 255, + migrate_pages = 256, + openat = 257, + mkdirat = 258, + mknodat = 259, + fchownat = 260, + futimesat = 261, + newfstatat = 262, + fstatat = 262, + unlinkat = 263, + renameat = 264, + linkat = 265, + symlinkat = 266, + readlinkat = 267, + fchmodat = 268, + faccessat = 269, + pselect6 = 270, + ppoll = 271, + unshare = 272, + set_robust_list = 273, + get_robust_list = 274, + splice = 275, + tee = 276, + sync_file_range = 277, + vmsplice = 278, + move_pages = 279, + utimensat = 280, + epoll_pwait = 281, + signalfd = 282, + timerfd_create = 283, + eventfd = 284, + fallocate = 285, + timerfd_settime = 286, + timerfd_gettime = 287, + accept4 = 288, + signalfd4 = 289, + eventfd2 = 290, + epoll_create1 = 291, + dup3 = 292, + pipe2 = 293, + inotify_init1 = 294, + preadv = 295, + pwritev = 296, + rt_tgsigqueueinfo = 297, + perf_event_open = 298, + recvmmsg = 299, + fanotify_init = 300, + fanotify_mark = 301, + prlimit64 = 302, + name_to_handle_at = 303, + open_by_handle_at = 304, + clock_adjtime = 305, + syncfs = 306, + sendmmsg = 307, + setns = 308, + getcpu = 309, + process_vm_readv = 310, + process_vm_writev = 311, + kcmp = 312, + finit_module = 313, + sched_setattr = 314, + sched_getattr = 315, + renameat2 = 316, + seccomp = 317, + getrandom = 318, + memfd_create = 319, + kexec_file_load = 320, + bpf = 321, + execveat = 322, + userfaultfd = 323, + membarrier = 324, + mlock2 = 325, + copy_file_range = 326, + preadv2 = 327, + pwritev2 = 328, + pkey_mprotect = 329, + pkey_alloc = 330, + pkey_free = 331, + statx = 332, + io_pgetevents = 333, + rseq = 334, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + openat2 = 437, + pidfd_getfd = 438, + + _, +}; pub const O_CREAT = 0o100; pub const O_EXCL = 0o200; diff --git a/lib/std/os/bits/netbsd.zig b/lib/std/os/bits/netbsd.zig index eab858891e..fa733fd0b5 100644 --- a/lib/std/os/bits/netbsd.zig +++ b/lib/std/os/bits/netbsd.zig @@ -1,12 +1,22 @@ const std = @import("../../std.zig"); +const builtin = std.builtin; const maxInt = std.math.maxInt; +pub const blkcnt_t = i64; +pub const blksize_t = i32; +pub const clock_t = u32; +pub const dev_t = u64; pub const fd_t = i32; -pub const pid_t = i32; -pub const mode_t = u32; +pub const gid_t = u32; pub const ino_t = u64; +pub const mode_t = u32; +pub const nlink_t = u32; pub const off_t = i64; +pub const pid_t = i32; pub const socklen_t = u32; +pub const time_t = i64; +pub const uid_t = u32; +pub const lwpid_t = i32; /// Renamed from `kevent` to `Kevent` to avoid conflict with function name. pub const Kevent = extern struct { @@ -145,23 +155,20 @@ pub const msghdr_const = extern struct { /// in C, macros are used to hide the differences. Here we use /// methods to accomplish this. pub const Stat = extern struct { - dev: u64, - mode: u32, + dev: dev_t, + mode: mode_t, ino: ino_t, - nlink: usize, - - uid: u32, - gid: u32, - rdev: u64, - + nlink: nlink_t, + uid: uid_t, + gid: gid_t, + rdev: dev_t, atim: timespec, mtim: timespec, ctim: timespec, birthtim: timespec, - size: off_t, - blocks: i64, - blksize: isize, + blocks: blkcnt_t, + blksize: blksize_t, flags: u32, gen: u32, __spare: [2]u32, @@ -184,12 +191,14 @@ pub const timespec = extern struct { tv_nsec: isize, }; +pub const MAXNAMLEN = 511; + pub const dirent = extern struct { - d_fileno: u64, + d_fileno: ino_t, d_reclen: u16, d_namlen: u16, d_type: u8, - d_name: [512]u8, + d_name: [MAXNAMLEN:0]u8, pub fn reclen(self: dirent) u16 { return self.d_reclen; @@ -697,23 +706,74 @@ pub const winsize = extern struct { const NSIG = 32; -pub const SIG_ERR = @intToPtr(extern fn (i32) void, maxInt(usize)); -pub const SIG_DFL = @intToPtr(extern fn (i32) void, 0); -pub const SIG_IGN = @intToPtr(extern fn (i32) void, 1); +pub const SIG_ERR = @intToPtr(?Sigaction.sigaction_fn, maxInt(usize)); +pub const SIG_DFL = @intToPtr(?Sigaction.sigaction_fn, 0); +pub const SIG_IGN = @intToPtr(?Sigaction.sigaction_fn, 1); /// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall. pub const Sigaction = extern struct { + pub const sigaction_fn = fn (i32, *siginfo_t, ?*c_void) callconv(.C) void; /// signal handler - __sigaction_u: extern union { - __sa_handler: extern fn (i32) void, - __sa_sigaction: extern fn (i32, *__siginfo, usize) void, - }, - - /// see signal options - sa_flags: u32, - + sigaction: ?sigaction_fn, /// signal mask to apply - sa_mask: sigset_t, + mask: sigset_t, + /// signal options + flags: u32, +}; + +pub const sigval_t = extern union { + int: i32, + ptr: ?*c_void, +}; + +pub const siginfo_t = extern union { + pad: [128]u8, + info: _ksiginfo, +}; + +pub const _ksiginfo = extern struct { + signo: i32, + code: i32, + errno: i32, + // 64bit architectures insert 4bytes of padding here, this is done by + // correctly aligning the reason field + reason: extern union { + rt: extern struct { + pid: pid_t, + uid: uid_t, + value: sigval_t, + }, + child: extern struct { + pid: pid_t, + uid: uid_t, + status: i32, + utime: clock_t, + stime: clock_t, + }, + fault: extern struct { + addr: ?*c_void, + trap: i32, + trap2: i32, + trap3: i32, + }, + poll: extern struct { + band: i32, + fd: i32, + }, + syscall: extern struct { + sysnum: i32, + retval: [2]i32, + @"error": i32, + args: [8]u64, + }, + ptrace_state: extern struct { + pe_report_event: i32, + option: extern union { + pe_other_pid: pid_t, + pe_lwp: lwpid_t, + }, + }, + } align(@sizeOf(usize)), }; pub const _SIG_WORDS = 4; @@ -736,6 +796,34 @@ pub const sigset_t = extern struct { __bits: [_SIG_WORDS]u32, }; +pub const empty_sigset = sigset_t{ .__bits = [_]u32{0} ** _SIG_WORDS }; + +// XXX x86_64 specific +pub const mcontext_t = extern struct { + gregs: [26]u64, + mc_tlsbase: u64, + fpregs: [512]u8 align(8), +}; + +pub const REG_RBP = 12; +pub const REG_RIP = 21; +pub const REG_RSP = 24; + +pub const ucontext_t = extern struct { + flags: u32, + link: ?*ucontext_t, + sigmask: sigset_t, + stack: stack_t, + mcontext: mcontext_t, + __pad: [switch (builtin.arch) { + .i386 => 4, + .mips, .mipsel, .mips64, .mips64el => 14, + .arm, .armeb, .thumb, .thumbeb => 1, + .sparc, .sparcel, .sparcv9 => if (@sizeOf(usize) == 4) 43 else 8, + else => 0, + }]u32, +}; + pub const EPERM = 1; // Operation not permitted pub const ENOENT = 2; // No such file or directory pub const ESRCH = 3; // No such process diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index ae48d831cf..1ed8370274 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -53,46 +53,46 @@ pub fn getErrno(r: usize) u12 { } pub fn dup2(old: i32, new: i32) usize { - if (@hasDecl(@This(), "SYS_dup2")) { - return syscall2(SYS_dup2, @bitCast(usize, @as(isize, old)), @bitCast(usize, @as(isize, new))); + if (@hasField(SYS, "dup2")) { + return syscall2(.dup2, @bitCast(usize, @as(isize, old)), @bitCast(usize, @as(isize, new))); } else { if (old == new) { if (std.debug.runtime_safety) { - const rc = syscall2(SYS_fcntl, @bitCast(usize, @as(isize, old)), F_GETFD); + const rc = syscall2(.fcntl, @bitCast(usize, @as(isize, old)), F_GETFD); if (@bitCast(isize, rc) < 0) return rc; } return @intCast(usize, old); } else { - return syscall3(SYS_dup3, @bitCast(usize, @as(isize, old)), @bitCast(usize, @as(isize, new)), 0); + return syscall3(.dup3, @bitCast(usize, @as(isize, old)), @bitCast(usize, @as(isize, new)), 0); } } } pub fn dup3(old: i32, new: i32, flags: u32) usize { - return syscall3(SYS_dup3, @bitCast(usize, @as(isize, old)), @bitCast(usize, @as(isize, new)), flags); + return syscall3(.dup3, @bitCast(usize, @as(isize, old)), @bitCast(usize, @as(isize, new)), flags); } pub fn chdir(path: [*:0]const u8) usize { - return syscall1(SYS_chdir, @ptrToInt(path)); + return syscall1(.chdir, @ptrToInt(path)); } pub fn fchdir(fd: fd_t) usize { - return syscall1(SYS_fchdir, @bitCast(usize, @as(isize, fd))); + return syscall1(.fchdir, @bitCast(usize, @as(isize, fd))); } pub fn chroot(path: [*:0]const u8) usize { - return syscall1(SYS_chroot, @ptrToInt(path)); + return syscall1(.chroot, @ptrToInt(path)); } pub fn execve(path: [*:0]const u8, argv: [*:null]const ?[*:0]const u8, envp: [*:null]const ?[*:0]const u8) usize { - return syscall3(SYS_execve, @ptrToInt(path), @ptrToInt(argv), @ptrToInt(envp)); + return syscall3(.execve, @ptrToInt(path), @ptrToInt(argv), @ptrToInt(envp)); } pub fn fork() usize { - if (@hasDecl(@This(), "SYS_fork")) { - return syscall0(SYS_fork); + if (@hasField(SYS, "fork")) { + return syscall0(.fork); } else { - return syscall2(SYS_clone, SIGCHLD, 0); + return syscall2(.clone, SIGCHLD, 0); } } @@ -102,7 +102,7 @@ pub fn fork() usize { /// the compiler is not aware of how vfork affects control flow and you may /// see different results in optimized builds. pub inline fn vfork() usize { - return @call(.{ .modifier = .always_inline }, syscall0, .{SYS_vfork}); + return @call(.{ .modifier = .always_inline }, syscall0, .{.vfork}); } pub fn futimens(fd: i32, times: *const [2]timespec) usize { @@ -110,24 +110,24 @@ pub fn futimens(fd: i32, times: *const [2]timespec) usize { } pub fn utimensat(dirfd: i32, path: ?[*:0]const u8, times: *const [2]timespec, flags: u32) usize { - return syscall4(SYS_utimensat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(times), flags); + return syscall4(.utimensat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(times), flags); } pub fn futex_wait(uaddr: *const i32, futex_op: u32, val: i32, timeout: ?*timespec) usize { - return syscall4(SYS_futex, @ptrToInt(uaddr), futex_op, @bitCast(u32, val), @ptrToInt(timeout)); + return syscall4(.futex, @ptrToInt(uaddr), futex_op, @bitCast(u32, val), @ptrToInt(timeout)); } pub fn futex_wake(uaddr: *const i32, futex_op: u32, val: i32) usize { - return syscall3(SYS_futex, @ptrToInt(uaddr), futex_op, @bitCast(u32, val)); + return syscall3(.futex, @ptrToInt(uaddr), futex_op, @bitCast(u32, val)); } pub fn getcwd(buf: [*]u8, size: usize) usize { - return syscall2(SYS_getcwd, @ptrToInt(buf), size); + return syscall2(.getcwd, @ptrToInt(buf), size); } pub fn getdents(fd: i32, dirp: [*]u8, len: usize) usize { return syscall3( - SYS_getdents, + .getdents, @bitCast(usize, @as(isize, fd)), @ptrToInt(dirp), std.math.min(len, maxInt(c_int)), @@ -136,7 +136,7 @@ pub fn getdents(fd: i32, dirp: [*]u8, len: usize) usize { pub fn getdents64(fd: i32, dirp: [*]u8, len: usize) usize { return syscall3( - SYS_getdents64, + .getdents64, @bitCast(usize, @as(isize, fd)), @ptrToInt(dirp), std.math.min(len, maxInt(c_int)), @@ -144,61 +144,61 @@ pub fn getdents64(fd: i32, dirp: [*]u8, len: usize) usize { } pub fn inotify_init1(flags: u32) usize { - return syscall1(SYS_inotify_init1, flags); + return syscall1(.inotify_init1, flags); } pub fn inotify_add_watch(fd: i32, pathname: [*:0]const u8, mask: u32) usize { - return syscall3(SYS_inotify_add_watch, @bitCast(usize, @as(isize, fd)), @ptrToInt(pathname), mask); + return syscall3(.inotify_add_watch, @bitCast(usize, @as(isize, fd)), @ptrToInt(pathname), mask); } pub fn inotify_rm_watch(fd: i32, wd: i32) usize { - return syscall2(SYS_inotify_rm_watch, @bitCast(usize, @as(isize, fd)), @bitCast(usize, @as(isize, wd))); + return syscall2(.inotify_rm_watch, @bitCast(usize, @as(isize, fd)), @bitCast(usize, @as(isize, wd))); } pub fn readlink(noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: usize) usize { - if (@hasDecl(@This(), "SYS_readlink")) { - return syscall3(SYS_readlink, @ptrToInt(path), @ptrToInt(buf_ptr), buf_len); + if (@hasField(SYS, "readlink")) { + return syscall3(.readlink, @ptrToInt(path), @ptrToInt(buf_ptr), buf_len); } else { - return syscall4(SYS_readlinkat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(path), @ptrToInt(buf_ptr), buf_len); + return syscall4(.readlinkat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(path), @ptrToInt(buf_ptr), buf_len); } } pub fn readlinkat(dirfd: i32, noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: usize) usize { - return syscall4(SYS_readlinkat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(buf_ptr), buf_len); + return syscall4(.readlinkat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(buf_ptr), buf_len); } pub fn mkdir(path: [*:0]const u8, mode: u32) usize { - if (@hasDecl(@This(), "SYS_mkdir")) { - return syscall2(SYS_mkdir, @ptrToInt(path), mode); + if (@hasField(SYS, "mkdir")) { + return syscall2(.mkdir, @ptrToInt(path), mode); } else { - return syscall3(SYS_mkdirat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(path), mode); + return syscall3(.mkdirat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(path), mode); } } pub fn mkdirat(dirfd: i32, path: [*:0]const u8, mode: u32) usize { - return syscall3(SYS_mkdirat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), mode); + return syscall3(.mkdirat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), mode); } pub fn mount(special: [*:0]const u8, dir: [*:0]const u8, fstype: [*:0]const u8, flags: u32, data: usize) usize { - return syscall5(SYS_mount, @ptrToInt(special), @ptrToInt(dir), @ptrToInt(fstype), flags, data); + return syscall5(.mount, @ptrToInt(special), @ptrToInt(dir), @ptrToInt(fstype), flags, data); } pub fn umount(special: [*:0]const u8) usize { - return syscall2(SYS_umount2, @ptrToInt(special), 0); + return syscall2(.umount2, @ptrToInt(special), 0); } pub fn umount2(special: [*:0]const u8, flags: u32) usize { - return syscall2(SYS_umount2, @ptrToInt(special), flags); + return syscall2(.umount2, @ptrToInt(special), flags); } pub fn mmap(address: ?[*]u8, length: usize, prot: usize, flags: u32, fd: i32, offset: u64) usize { - if (@hasDecl(@This(), "SYS_mmap2")) { + if (@hasField(SYS, "mmap2")) { // Make sure the offset is also specified in multiples of page size if ((offset & (MMAP2_UNIT - 1)) != 0) return @bitCast(usize, @as(isize, -EINVAL)); return syscall6( - SYS_mmap2, + .mmap2, @ptrToInt(address), length, prot, @@ -208,7 +208,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: usize, flags: u32, fd: i32, of ); } else { return syscall6( - SYS_mmap, + .mmap, @ptrToInt(address), length, prot, @@ -220,19 +220,19 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: usize, flags: u32, fd: i32, of } pub fn mprotect(address: [*]const u8, length: usize, protection: usize) usize { - return syscall3(SYS_mprotect, @ptrToInt(address), length, protection); + return syscall3(.mprotect, @ptrToInt(address), length, protection); } pub fn munmap(address: [*]const u8, length: usize) usize { - return syscall2(SYS_munmap, @ptrToInt(address), length); + return syscall2(.munmap, @ptrToInt(address), length); } pub fn poll(fds: [*]pollfd, n: nfds_t, timeout: i32) usize { - if (@hasDecl(@This(), "SYS_poll")) { - return syscall3(SYS_poll, @ptrToInt(fds), n, @bitCast(u32, timeout)); + if (@hasField(SYS, "poll")) { + return syscall3(.poll, @ptrToInt(fds), n, @bitCast(u32, timeout)); } else { return syscall6( - SYS_ppoll, + .ppoll, @ptrToInt(fds), n, @ptrToInt(if (timeout >= 0) @@ -250,12 +250,12 @@ pub fn poll(fds: [*]pollfd, n: nfds_t, timeout: i32) usize { } pub fn read(fd: i32, buf: [*]u8, count: usize) usize { - return syscall3(SYS_read, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), count); + return syscall3(.read, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), count); } pub fn preadv(fd: i32, iov: [*]const iovec, count: usize, offset: u64) usize { return syscall5( - SYS_preadv, + .preadv, @bitCast(usize, @as(isize, fd)), @ptrToInt(iov), count, @@ -266,7 +266,7 @@ pub fn preadv(fd: i32, iov: [*]const iovec, count: usize, offset: u64) usize { pub fn preadv2(fd: i32, iov: [*]const iovec, count: usize, offset: u64, flags: kernel_rwf) usize { return syscall6( - SYS_preadv2, + .preadv2, @bitCast(usize, @as(isize, fd)), @ptrToInt(iov), count, @@ -277,16 +277,16 @@ pub fn preadv2(fd: i32, iov: [*]const iovec, count: usize, offset: u64, flags: k } pub fn readv(fd: i32, iov: [*]const iovec, count: usize) usize { - return syscall3(SYS_readv, @bitCast(usize, @as(isize, fd)), @ptrToInt(iov), count); + return syscall3(.readv, @bitCast(usize, @as(isize, fd)), @ptrToInt(iov), count); } pub fn writev(fd: i32, iov: [*]const iovec_const, count: usize) usize { - return syscall3(SYS_writev, @bitCast(usize, @as(isize, fd)), @ptrToInt(iov), count); + return syscall3(.writev, @bitCast(usize, @as(isize, fd)), @ptrToInt(iov), count); } pub fn pwritev(fd: i32, iov: [*]const iovec_const, count: usize, offset: u64) usize { return syscall5( - SYS_pwritev, + .pwritev, @bitCast(usize, @as(isize, fd)), @ptrToInt(iov), count, @@ -297,7 +297,7 @@ pub fn pwritev(fd: i32, iov: [*]const iovec_const, count: usize, offset: u64) us pub fn pwritev2(fd: i32, iov: [*]const iovec_const, count: usize, offset: u64, flags: kernel_rwf) usize { return syscall6( - SYS_pwritev2, + .pwritev2, @bitCast(usize, @as(isize, fd)), @ptrToInt(iov), count, @@ -308,30 +308,30 @@ pub fn pwritev2(fd: i32, iov: [*]const iovec_const, count: usize, offset: u64, f } pub fn rmdir(path: [*:0]const u8) usize { - if (@hasDecl(@This(), "SYS_rmdir")) { - return syscall1(SYS_rmdir, @ptrToInt(path)); + if (@hasField(SYS, "rmdir")) { + return syscall1(.rmdir, @ptrToInt(path)); } else { - return syscall3(SYS_unlinkat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(path), AT_REMOVEDIR); + return syscall3(.unlinkat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(path), AT_REMOVEDIR); } } pub fn symlink(existing: [*:0]const u8, new: [*:0]const u8) usize { - if (@hasDecl(@This(), "SYS_symlink")) { - return syscall2(SYS_symlink, @ptrToInt(existing), @ptrToInt(new)); + if (@hasField(SYS, "symlink")) { + return syscall2(.symlink, @ptrToInt(existing), @ptrToInt(new)); } else { - return syscall3(SYS_symlinkat, @ptrToInt(existing), @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(new)); + return syscall3(.symlinkat, @ptrToInt(existing), @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(new)); } } pub fn symlinkat(existing: [*:0]const u8, newfd: i32, newpath: [*:0]const u8) usize { - return syscall3(SYS_symlinkat, @ptrToInt(existing), @bitCast(usize, @as(isize, newfd)), @ptrToInt(newpath)); + return syscall3(.symlinkat, @ptrToInt(existing), @bitCast(usize, @as(isize, newfd)), @ptrToInt(newpath)); } pub fn pread(fd: i32, buf: [*]u8, count: usize, offset: u64) usize { - if (@hasDecl(@This(), "SYS_pread64")) { + if (@hasField(SYS, "pread64")) { if (require_aligned_register_pair) { return syscall6( - SYS_pread64, + .pread64, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), count, @@ -341,7 +341,7 @@ pub fn pread(fd: i32, buf: [*]u8, count: usize, offset: u64) usize { ); } else { return syscall5( - SYS_pread64, + .pread64, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), count, @@ -351,7 +351,7 @@ pub fn pread(fd: i32, buf: [*]u8, count: usize, offset: u64) usize { } } else { return syscall4( - SYS_pread, + .pread, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), count, @@ -361,40 +361,40 @@ pub fn pread(fd: i32, buf: [*]u8, count: usize, offset: u64) usize { } pub fn access(path: [*:0]const u8, mode: u32) usize { - if (@hasDecl(@This(), "SYS_access")) { - return syscall2(SYS_access, @ptrToInt(path), mode); + if (@hasField(SYS, "access")) { + return syscall2(.access, @ptrToInt(path), mode); } else { - return syscall4(SYS_faccessat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(path), mode, 0); + return syscall4(.faccessat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(path), mode, 0); } } pub fn faccessat(dirfd: i32, path: [*:0]const u8, mode: u32, flags: u32) usize { - return syscall4(SYS_faccessat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), mode, flags); + return syscall4(.faccessat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), mode, flags); } pub fn pipe(fd: *[2]i32) usize { if (comptime builtin.arch.isMIPS()) { return syscall_pipe(fd); - } else if (@hasDecl(@This(), "SYS_pipe")) { - return syscall1(SYS_pipe, @ptrToInt(fd)); + } else if (@hasField(SYS, "pipe")) { + return syscall1(.pipe, @ptrToInt(fd)); } else { - return syscall2(SYS_pipe2, @ptrToInt(fd), 0); + return syscall2(.pipe2, @ptrToInt(fd), 0); } } pub fn pipe2(fd: *[2]i32, flags: u32) usize { - return syscall2(SYS_pipe2, @ptrToInt(fd), flags); + return syscall2(.pipe2, @ptrToInt(fd), flags); } pub fn write(fd: i32, buf: [*]const u8, count: usize) usize { - return syscall3(SYS_write, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), count); + return syscall3(.write, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), count); } pub fn ftruncate(fd: i32, length: u64) usize { - if (@hasDecl(@This(), "SYS_ftruncate64")) { + if (@hasField(SYS, "ftruncate64")) { if (require_aligned_register_pair) { return syscall4( - SYS_ftruncate64, + .ftruncate64, @bitCast(usize, @as(isize, fd)), 0, @truncate(usize, length), @@ -402,7 +402,7 @@ pub fn ftruncate(fd: i32, length: u64) usize { ); } else { return syscall3( - SYS_ftruncate64, + .ftruncate64, @bitCast(usize, @as(isize, fd)), @truncate(usize, length), @truncate(usize, length >> 32), @@ -410,7 +410,7 @@ pub fn ftruncate(fd: i32, length: u64) usize { } } else { return syscall2( - SYS_ftruncate, + .ftruncate, @bitCast(usize, @as(isize, fd)), @truncate(usize, length), ); @@ -418,10 +418,10 @@ pub fn ftruncate(fd: i32, length: u64) usize { } pub fn pwrite(fd: i32, buf: [*]const u8, count: usize, offset: usize) usize { - if (@hasDecl(@This(), "SYS_pwrite64")) { + if (@hasField(SYS, "pwrite64")) { if (require_aligned_register_pair) { return syscall6( - SYS_pwrite64, + .pwrite64, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), count, @@ -431,7 +431,7 @@ pub fn pwrite(fd: i32, buf: [*]const u8, count: usize, offset: usize) usize { ); } else { return syscall5( - SYS_pwrite64, + .pwrite64, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), count, @@ -441,7 +441,7 @@ pub fn pwrite(fd: i32, buf: [*]const u8, count: usize, offset: usize) usize { } } else { return syscall4( - SYS_pwrite, + .pwrite, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), count, @@ -451,19 +451,19 @@ pub fn pwrite(fd: i32, buf: [*]const u8, count: usize, offset: usize) usize { } pub fn rename(old: [*:0]const u8, new: [*:0]const u8) usize { - if (@hasDecl(@This(), "SYS_rename")) { - return syscall2(SYS_rename, @ptrToInt(old), @ptrToInt(new)); - } else if (@hasDecl(@This(), "SYS_renameat")) { - return syscall4(SYS_renameat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(old), @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(new)); + if (@hasField(SYS, "rename")) { + return syscall2(.rename, @ptrToInt(old), @ptrToInt(new)); + } else if (@hasField(SYS, "renameat")) { + return syscall4(.renameat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(old), @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(new)); } else { - return syscall5(SYS_renameat2, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(old), @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(new), 0); + return syscall5(.renameat2, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(old), @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(new), 0); } } pub fn renameat(oldfd: i32, oldpath: [*]const u8, newfd: i32, newpath: [*]const u8) usize { - if (@hasDecl(@This(), "SYS_renameat")) { + if (@hasField(SYS, "renameat")) { return syscall4( - SYS_renameat, + .renameat, @bitCast(usize, @as(isize, oldfd)), @ptrToInt(oldpath), @bitCast(usize, @as(isize, newfd)), @@ -471,7 +471,7 @@ pub fn renameat(oldfd: i32, oldpath: [*]const u8, newfd: i32, newpath: [*]const ); } else { return syscall5( - SYS_renameat2, + .renameat2, @bitCast(usize, @as(isize, oldfd)), @ptrToInt(oldpath), @bitCast(usize, @as(isize, newfd)), @@ -483,7 +483,7 @@ pub fn renameat(oldfd: i32, oldpath: [*]const u8, newfd: i32, newpath: [*]const pub fn renameat2(oldfd: i32, oldpath: [*:0]const u8, newfd: i32, newpath: [*:0]const u8, flags: u32) usize { return syscall5( - SYS_renameat2, + .renameat2, @bitCast(usize, @as(isize, oldfd)), @ptrToInt(oldpath), @bitCast(usize, @as(isize, newfd)), @@ -493,11 +493,11 @@ pub fn renameat2(oldfd: i32, oldpath: [*:0]const u8, newfd: i32, newpath: [*:0]c } pub fn open(path: [*:0]const u8, flags: u32, perm: usize) usize { - if (@hasDecl(@This(), "SYS_open")) { - return syscall3(SYS_open, @ptrToInt(path), flags, perm); + if (@hasField(SYS, "open")) { + return syscall3(.open, @ptrToInt(path), flags, perm); } else { return syscall4( - SYS_openat, + .openat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(path), flags, @@ -507,32 +507,32 @@ pub fn open(path: [*:0]const u8, flags: u32, perm: usize) usize { } pub fn create(path: [*:0]const u8, perm: usize) usize { - return syscall2(SYS_creat, @ptrToInt(path), perm); + return syscall2(.creat, @ptrToInt(path), perm); } pub fn openat(dirfd: i32, path: [*:0]const u8, flags: u32, mode: usize) usize { // dirfd could be negative, for example AT_FDCWD is -100 - return syscall4(SYS_openat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), flags, mode); + return syscall4(.openat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), flags, mode); } /// See also `clone` (from the arch-specific include) pub fn clone5(flags: usize, child_stack_ptr: usize, parent_tid: *i32, child_tid: *i32, newtls: usize) usize { - return syscall5(SYS_clone, flags, child_stack_ptr, @ptrToInt(parent_tid), @ptrToInt(child_tid), newtls); + return syscall5(.clone, flags, child_stack_ptr, @ptrToInt(parent_tid), @ptrToInt(child_tid), newtls); } /// See also `clone` (from the arch-specific include) pub fn clone2(flags: u32, child_stack_ptr: usize) usize { - return syscall2(SYS_clone, flags, child_stack_ptr); + return syscall2(.clone, flags, child_stack_ptr); } pub fn close(fd: i32) usize { - return syscall1(SYS_close, @bitCast(usize, @as(isize, fd))); + return syscall1(.close, @bitCast(usize, @as(isize, fd))); } /// Can only be called on 32 bit systems. For 64 bit see `lseek`. pub fn llseek(fd: i32, offset: u64, result: ?*u64, whence: usize) usize { return syscall5( - SYS__llseek, + ._llseek, @bitCast(usize, @as(isize, fd)), @truncate(usize, offset >> 32), @truncate(usize, offset), @@ -543,53 +543,53 @@ pub fn llseek(fd: i32, offset: u64, result: ?*u64, whence: usize) usize { /// Can only be called on 64 bit systems. For 32 bit see `llseek`. pub fn lseek(fd: i32, offset: i64, whence: usize) usize { - return syscall3(SYS_lseek, @bitCast(usize, @as(isize, fd)), @bitCast(usize, offset), whence); + return syscall3(.lseek, @bitCast(usize, @as(isize, fd)), @bitCast(usize, offset), whence); } pub fn exit(status: i32) noreturn { - _ = syscall1(SYS_exit, @bitCast(usize, @as(isize, status))); + _ = syscall1(.exit, @bitCast(usize, @as(isize, status))); unreachable; } pub fn exit_group(status: i32) noreturn { - _ = syscall1(SYS_exit_group, @bitCast(usize, @as(isize, status))); + _ = syscall1(.exit_group, @bitCast(usize, @as(isize, status))); unreachable; } pub fn getrandom(buf: [*]u8, count: usize, flags: u32) usize { - return syscall3(SYS_getrandom, @ptrToInt(buf), count, flags); + return syscall3(.getrandom, @ptrToInt(buf), count, flags); } pub fn kill(pid: pid_t, sig: i32) usize { - return syscall2(SYS_kill, @bitCast(usize, @as(isize, pid)), @bitCast(usize, @as(isize, sig))); + return syscall2(.kill, @bitCast(usize, @as(isize, pid)), @bitCast(usize, @as(isize, sig))); } pub fn tkill(tid: pid_t, sig: i32) usize { - return syscall2(SYS_tkill, @bitCast(usize, @as(isize, tid)), @bitCast(usize, @as(isize, sig))); + return syscall2(.tkill, @bitCast(usize, @as(isize, tid)), @bitCast(usize, @as(isize, sig))); } pub fn tgkill(tgid: pid_t, tid: pid_t, sig: i32) usize { - return syscall2(SYS_tgkill, @bitCast(usize, @as(isize, tgid)), @bitCast(usize, @as(isize, tid)), @bitCast(usize, @as(isize, sig))); + return syscall2(.tgkill, @bitCast(usize, @as(isize, tgid)), @bitCast(usize, @as(isize, tid)), @bitCast(usize, @as(isize, sig))); } pub fn unlink(path: [*:0]const u8) usize { - if (@hasDecl(@This(), "SYS_unlink")) { - return syscall1(SYS_unlink, @ptrToInt(path)); + if (@hasField(SYS, "unlink")) { + return syscall1(.unlink, @ptrToInt(path)); } else { - return syscall3(SYS_unlinkat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(path), 0); + return syscall3(.unlinkat, @bitCast(usize, @as(isize, AT_FDCWD)), @ptrToInt(path), 0); } } pub fn unlinkat(dirfd: i32, path: [*:0]const u8, flags: u32) usize { - return syscall3(SYS_unlinkat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), flags); + return syscall3(.unlinkat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), flags); } pub fn waitpid(pid: pid_t, status: *u32, flags: u32) usize { - return syscall4(SYS_wait4, @bitCast(usize, @as(isize, pid)), @ptrToInt(status), flags, 0); + return syscall4(.wait4, @bitCast(usize, @as(isize, pid)), @ptrToInt(status), flags, 0); } pub fn fcntl(fd: fd_t, cmd: i32, arg: usize) usize { - return syscall3(SYS_fcntl, @bitCast(usize, @as(isize, fd)), @bitCast(usize, @as(isize, cmd)), arg); + return syscall3(.fcntl, @bitCast(usize, @as(isize, fd)), @bitCast(usize, @as(isize, cmd)), arg); } var vdso_clock_gettime = @ptrCast(?*const c_void, init_vdso_clock_gettime); @@ -609,7 +609,7 @@ pub fn clock_gettime(clk_id: i32, tp: *timespec) usize { } } } - return syscall2(SYS_clock_gettime, @bitCast(usize, @as(isize, clk_id)), @ptrToInt(tp)); + return syscall2(.clock_gettime, @bitCast(usize, @as(isize, clk_id)), @ptrToInt(tp)); } fn init_vdso_clock_gettime(clk: i32, ts: *timespec) callconv(.C) usize { @@ -626,86 +626,86 @@ fn init_vdso_clock_gettime(clk: i32, ts: *timespec) callconv(.C) usize { } pub fn clock_getres(clk_id: i32, tp: *timespec) usize { - return syscall2(SYS_clock_getres, @bitCast(usize, @as(isize, clk_id)), @ptrToInt(tp)); + return syscall2(.clock_getres, @bitCast(usize, @as(isize, clk_id)), @ptrToInt(tp)); } pub fn clock_settime(clk_id: i32, tp: *const timespec) usize { - return syscall2(SYS_clock_settime, @bitCast(usize, @as(isize, clk_id)), @ptrToInt(tp)); + return syscall2(.clock_settime, @bitCast(usize, @as(isize, clk_id)), @ptrToInt(tp)); } pub fn gettimeofday(tv: *timeval, tz: *timezone) usize { - return syscall2(SYS_gettimeofday, @ptrToInt(tv), @ptrToInt(tz)); + return syscall2(.gettimeofday, @ptrToInt(tv), @ptrToInt(tz)); } pub fn settimeofday(tv: *const timeval, tz: *const timezone) usize { - return syscall2(SYS_settimeofday, @ptrToInt(tv), @ptrToInt(tz)); + return syscall2(.settimeofday, @ptrToInt(tv), @ptrToInt(tz)); } pub fn nanosleep(req: *const timespec, rem: ?*timespec) usize { - return syscall2(SYS_nanosleep, @ptrToInt(req), @ptrToInt(rem)); + return syscall2(.nanosleep, @ptrToInt(req), @ptrToInt(rem)); } pub fn setuid(uid: u32) usize { - if (@hasDecl(@This(), "SYS_setuid32")) { - return syscall1(SYS_setuid32, uid); + if (@hasField(SYS, "setuid32")) { + return syscall1(.setuid32, uid); } else { - return syscall1(SYS_setuid, uid); + return syscall1(.setuid, uid); } } pub fn setgid(gid: u32) usize { - if (@hasDecl(@This(), "SYS_setgid32")) { - return syscall1(SYS_setgid32, gid); + if (@hasField(SYS, "setgid32")) { + return syscall1(.setgid32, gid); } else { - return syscall1(SYS_setgid, gid); + return syscall1(.setgid, gid); } } pub fn setreuid(ruid: u32, euid: u32) usize { - if (@hasDecl(@This(), "SYS_setreuid32")) { - return syscall2(SYS_setreuid32, ruid, euid); + if (@hasField(SYS, "setreuid32")) { + return syscall2(.setreuid32, ruid, euid); } else { - return syscall2(SYS_setreuid, ruid, euid); + return syscall2(.setreuid, ruid, euid); } } pub fn setregid(rgid: u32, egid: u32) usize { - if (@hasDecl(@This(), "SYS_setregid32")) { - return syscall2(SYS_setregid32, rgid, egid); + if (@hasField(SYS, "setregid32")) { + return syscall2(.setregid32, rgid, egid); } else { - return syscall2(SYS_setregid, rgid, egid); + return syscall2(.setregid, rgid, egid); } } pub fn getuid() u32 { - if (@hasDecl(@This(), "SYS_getuid32")) { - return @as(u32, syscall0(SYS_getuid32)); + if (@hasField(SYS, "getuid32")) { + return @as(u32, syscall0(.getuid32)); } else { - return @as(u32, syscall0(SYS_getuid)); + return @as(u32, syscall0(.getuid)); } } pub fn getgid() u32 { - if (@hasDecl(@This(), "SYS_getgid32")) { - return @as(u32, syscall0(SYS_getgid32)); + if (@hasField(SYS, "getgid32")) { + return @as(u32, syscall0(.getgid32)); } else { - return @as(u32, syscall0(SYS_getgid)); + return @as(u32, syscall0(.getgid)); } } pub fn geteuid() u32 { - if (@hasDecl(@This(), "SYS_geteuid32")) { - return @as(u32, syscall0(SYS_geteuid32)); + if (@hasField(SYS, "geteuid32")) { + return @as(u32, syscall0(.geteuid32)); } else { - return @as(u32, syscall0(SYS_geteuid)); + return @as(u32, syscall0(.geteuid)); } } pub fn getegid() u32 { - if (@hasDecl(@This(), "SYS_getegid32")) { - return @as(u32, syscall0(SYS_getegid32)); + if (@hasField(SYS, "getegid32")) { + return @as(u32, syscall0(.getegid32)); } else { - return @as(u32, syscall0(SYS_getegid)); + return @as(u32, syscall0(.getegid)); } } @@ -718,63 +718,63 @@ pub fn setegid(egid: u32) usize { } pub fn getresuid(ruid: *u32, euid: *u32, suid: *u32) usize { - if (@hasDecl(@This(), "SYS_getresuid32")) { - return syscall3(SYS_getresuid32, @ptrToInt(ruid), @ptrToInt(euid), @ptrToInt(suid)); + if (@hasField(SYS, "getresuid32")) { + return syscall3(.getresuid32, @ptrToInt(ruid), @ptrToInt(euid), @ptrToInt(suid)); } else { - return syscall3(SYS_getresuid, @ptrToInt(ruid), @ptrToInt(euid), @ptrToInt(suid)); + return syscall3(.getresuid, @ptrToInt(ruid), @ptrToInt(euid), @ptrToInt(suid)); } } pub fn getresgid(rgid: *u32, egid: *u32, sgid: *u32) usize { - if (@hasDecl(@This(), "SYS_getresgid32")) { - return syscall3(SYS_getresgid32, @ptrToInt(rgid), @ptrToInt(egid), @ptrToInt(sgid)); + if (@hasField(SYS, "getresgid32")) { + return syscall3(.getresgid32, @ptrToInt(rgid), @ptrToInt(egid), @ptrToInt(sgid)); } else { - return syscall3(SYS_getresgid, @ptrToInt(rgid), @ptrToInt(egid), @ptrToInt(sgid)); + return syscall3(.getresgid, @ptrToInt(rgid), @ptrToInt(egid), @ptrToInt(sgid)); } } pub fn setresuid(ruid: u32, euid: u32, suid: u32) usize { - if (@hasDecl(@This(), "SYS_setresuid32")) { - return syscall3(SYS_setresuid32, ruid, euid, suid); + if (@hasField(SYS, "setresuid32")) { + return syscall3(.setresuid32, ruid, euid, suid); } else { - return syscall3(SYS_setresuid, ruid, euid, suid); + return syscall3(.setresuid, ruid, euid, suid); } } pub fn setresgid(rgid: u32, egid: u32, sgid: u32) usize { - if (@hasDecl(@This(), "SYS_setresgid32")) { - return syscall3(SYS_setresgid32, rgid, egid, sgid); + if (@hasField(SYS, "setresgid32")) { + return syscall3(.setresgid32, rgid, egid, sgid); } else { - return syscall3(SYS_setresgid, rgid, egid, sgid); + return syscall3(.setresgid, rgid, egid, sgid); } } pub fn getgroups(size: usize, list: *u32) usize { - if (@hasDecl(@This(), "SYS_getgroups32")) { - return syscall2(SYS_getgroups32, size, @ptrToInt(list)); + if (@hasField(SYS, "getgroups32")) { + return syscall2(.getgroups32, size, @ptrToInt(list)); } else { - return syscall2(SYS_getgroups, size, @ptrToInt(list)); + return syscall2(.getgroups, size, @ptrToInt(list)); } } pub fn setgroups(size: usize, list: *const u32) usize { - if (@hasDecl(@This(), "SYS_setgroups32")) { - return syscall2(SYS_setgroups32, size, @ptrToInt(list)); + if (@hasField(SYS, "setgroups32")) { + return syscall2(.setgroups32, size, @ptrToInt(list)); } else { - return syscall2(SYS_setgroups, size, @ptrToInt(list)); + return syscall2(.setgroups, size, @ptrToInt(list)); } } pub fn getpid() pid_t { - return @bitCast(pid_t, @truncate(u32, syscall0(SYS_getpid))); + return @bitCast(pid_t, @truncate(u32, syscall0(.getpid))); } pub fn gettid() pid_t { - return @bitCast(pid_t, @truncate(u32, syscall0(SYS_gettid))); + return @bitCast(pid_t, @truncate(u32, syscall0(.gettid))); } pub fn sigprocmask(flags: u32, noalias set: ?*const sigset_t, noalias oldset: ?*sigset_t) usize { - return syscall4(SYS_rt_sigprocmask, flags, @ptrToInt(set), @ptrToInt(oldset), NSIG / 8); + return syscall4(.rt_sigprocmask, flags, @ptrToInt(set), @ptrToInt(oldset), NSIG / 8); } pub fn sigaction(sig: u6, noalias act: *const Sigaction, noalias oact: ?*Sigaction) usize { @@ -792,7 +792,7 @@ pub fn sigaction(sig: u6, noalias act: *const Sigaction, noalias oact: ?*Sigacti var ksa_old: k_sigaction = undefined; const ksa_mask_size = @sizeOf(@TypeOf(ksa_old.mask)); @memcpy(@ptrCast([*]u8, &ksa.mask), @ptrCast([*]const u8, &act.mask), ksa_mask_size); - const result = syscall4(SYS_rt_sigaction, sig, @ptrToInt(&ksa), @ptrToInt(&ksa_old), ksa_mask_size); + const result = syscall4(.rt_sigaction, sig, @ptrToInt(&ksa), @ptrToInt(&ksa_old), ksa_mask_size); const err = getErrno(result); if (err != 0) { return result; @@ -819,42 +819,42 @@ pub fn getsockname(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t) us if (builtin.arch == .i386) { return socketcall(SC_getsockname, &[3]usize{ @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @ptrToInt(len) }); } - return syscall3(SYS_getsockname, @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @ptrToInt(len)); + return syscall3(.getsockname, @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @ptrToInt(len)); } pub fn getpeername(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t) usize { if (builtin.arch == .i386) { return socketcall(SC_getpeername, &[3]usize{ @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @ptrToInt(len) }); } - return syscall3(SYS_getpeername, @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @ptrToInt(len)); + return syscall3(.getpeername, @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @ptrToInt(len)); } pub fn socket(domain: u32, socket_type: u32, protocol: u32) usize { if (builtin.arch == .i386) { return socketcall(SC_socket, &[3]usize{ domain, socket_type, protocol }); } - return syscall3(SYS_socket, domain, socket_type, protocol); + return syscall3(.socket, domain, socket_type, protocol); } pub fn setsockopt(fd: i32, level: u32, optname: u32, optval: [*]const u8, optlen: socklen_t) usize { if (builtin.arch == .i386) { return socketcall(SC_setsockopt, &[5]usize{ @bitCast(usize, @as(isize, fd)), level, optname, @ptrToInt(optval), @intCast(usize, optlen) }); } - return syscall5(SYS_setsockopt, @bitCast(usize, @as(isize, fd)), level, optname, @ptrToInt(optval), @intCast(usize, optlen)); + return syscall5(.setsockopt, @bitCast(usize, @as(isize, fd)), level, optname, @ptrToInt(optval), @intCast(usize, optlen)); } pub fn getsockopt(fd: i32, level: u32, optname: u32, noalias optval: [*]u8, noalias optlen: *socklen_t) usize { if (builtin.arch == .i386) { return socketcall(SC_getsockopt, &[5]usize{ @bitCast(usize, @as(isize, fd)), level, optname, @ptrToInt(optval), @ptrToInt(optlen) }); } - return syscall5(SYS_getsockopt, @bitCast(usize, @as(isize, fd)), level, optname, @ptrToInt(optval), @ptrToInt(optlen)); + return syscall5(.getsockopt, @bitCast(usize, @as(isize, fd)), level, optname, @ptrToInt(optval), @ptrToInt(optlen)); } pub fn sendmsg(fd: i32, msg: *msghdr_const, flags: u32) usize { if (builtin.arch == .i386) { return socketcall(SC_sendmsg, &[3]usize{ @bitCast(usize, @as(isize, fd)), @ptrToInt(msg), flags }); } - return syscall3(SYS_sendmsg, @bitCast(usize, @as(isize, fd)), @ptrToInt(msg), flags); + return syscall3(.sendmsg, @bitCast(usize, @as(isize, fd)), @ptrToInt(msg), flags); } pub fn sendmmsg(fd: i32, msgvec: [*]mmsghdr_const, vlen: u32, flags: u32) usize { @@ -872,7 +872,7 @@ pub fn sendmmsg(fd: i32, msgvec: [*]mmsghdr_const, vlen: u32, flags: u32) usize // batch-send all messages up to the current message if (next_unsent < i) { const batch_size = i - next_unsent; - const r = syscall4(SYS_sendmmsg, @bitCast(usize, @as(isize, fd)), @ptrToInt(&msgvec[next_unsent]), batch_size, flags); + const r = syscall4(.sendmmsg, @bitCast(usize, @as(isize, fd)), @ptrToInt(&msgvec[next_unsent]), batch_size, flags); if (getErrno(r) != 0) return next_unsent; if (r < batch_size) return next_unsent + r; } @@ -888,68 +888,68 @@ pub fn sendmmsg(fd: i32, msgvec: [*]mmsghdr_const, vlen: u32, flags: u32) usize } if (next_unsent < kvlen or next_unsent == 0) { // want to make sure at least one syscall occurs (e.g. to trigger MSG_EOR) const batch_size = kvlen - next_unsent; - const r = syscall4(SYS_sendmmsg, @bitCast(usize, @as(isize, fd)), @ptrToInt(&msgvec[next_unsent]), batch_size, flags); + const r = syscall4(.sendmmsg, @bitCast(usize, @as(isize, fd)), @ptrToInt(&msgvec[next_unsent]), batch_size, flags); if (getErrno(r) != 0) return r; return next_unsent + r; } return kvlen; } - return syscall4(SYS_sendmmsg, @bitCast(usize, @as(isize, fd)), @ptrToInt(msgvec), vlen, flags); + return syscall4(.sendmmsg, @bitCast(usize, @as(isize, fd)), @ptrToInt(msgvec), vlen, flags); } pub fn connect(fd: i32, addr: *const c_void, len: socklen_t) usize { if (builtin.arch == .i386) { return socketcall(SC_connect, &[3]usize{ @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), len }); } - return syscall3(SYS_connect, @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), len); + return syscall3(.connect, @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), len); } pub fn recvmsg(fd: i32, msg: *msghdr, flags: u32) usize { if (builtin.arch == .i386) { return socketcall(SC_recvmsg, &[3]usize{ @bitCast(usize, @as(isize, fd)), @ptrToInt(msg), flags }); } - return syscall3(SYS_recvmsg, @bitCast(usize, @as(isize, fd)), @ptrToInt(msg), flags); + return syscall3(.recvmsg, @bitCast(usize, @as(isize, fd)), @ptrToInt(msg), flags); } pub fn recvfrom(fd: i32, noalias buf: [*]u8, len: usize, flags: u32, noalias addr: ?*sockaddr, noalias alen: ?*socklen_t) usize { if (builtin.arch == .i386) { return socketcall(SC_recvfrom, &[6]usize{ @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), len, flags, @ptrToInt(addr), @ptrToInt(alen) }); } - return syscall6(SYS_recvfrom, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), len, flags, @ptrToInt(addr), @ptrToInt(alen)); + return syscall6(.recvfrom, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), len, flags, @ptrToInt(addr), @ptrToInt(alen)); } pub fn shutdown(fd: i32, how: i32) usize { if (builtin.arch == .i386) { return socketcall(SC_shutdown, &[2]usize{ @bitCast(usize, @as(isize, fd)), @bitCast(usize, @as(isize, how)) }); } - return syscall2(SYS_shutdown, @bitCast(usize, @as(isize, fd)), @bitCast(usize, @as(isize, how))); + return syscall2(.shutdown, @bitCast(usize, @as(isize, fd)), @bitCast(usize, @as(isize, how))); } pub fn bind(fd: i32, addr: *const sockaddr, len: socklen_t) usize { if (builtin.arch == .i386) { return socketcall(SC_bind, &[3]usize{ @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @intCast(usize, len) }); } - return syscall3(SYS_bind, @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @intCast(usize, len)); + return syscall3(.bind, @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @intCast(usize, len)); } pub fn listen(fd: i32, backlog: u32) usize { if (builtin.arch == .i386) { return socketcall(SC_listen, &[2]usize{ @bitCast(usize, @as(isize, fd)), backlog }); } - return syscall2(SYS_listen, @bitCast(usize, @as(isize, fd)), backlog); + return syscall2(.listen, @bitCast(usize, @as(isize, fd)), backlog); } pub fn sendto(fd: i32, buf: [*]const u8, len: usize, flags: u32, addr: ?*const sockaddr, alen: socklen_t) usize { if (builtin.arch == .i386) { return socketcall(SC_sendto, &[6]usize{ @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), len, flags, @ptrToInt(addr), @intCast(usize, alen) }); } - return syscall6(SYS_sendto, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), len, flags, @ptrToInt(addr), @intCast(usize, alen)); + return syscall6(.sendto, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), len, flags, @ptrToInt(addr), @intCast(usize, alen)); } pub fn sendfile(outfd: i32, infd: i32, offset: ?*i64, count: usize) usize { - if (@hasDecl(@This(), "SYS_sendfile64")) { + if (@hasField(SYS, "sendfile64")) { return syscall4( - SYS_sendfile64, + .sendfile64, @bitCast(usize, @as(isize, outfd)), @bitCast(usize, @as(isize, infd)), @ptrToInt(offset), @@ -957,7 +957,7 @@ pub fn sendfile(outfd: i32, infd: i32, offset: ?*i64, count: usize) usize { ); } else { return syscall4( - SYS_sendfile, + .sendfile, @bitCast(usize, @as(isize, outfd)), @bitCast(usize, @as(isize, infd)), @ptrToInt(offset), @@ -970,7 +970,7 @@ pub fn socketpair(domain: i32, socket_type: i32, protocol: i32, fd: [2]i32) usiz if (builtin.arch == .i386) { return socketcall(SC_socketpair, &[4]usize{ @intCast(usize, domain), @intCast(usize, socket_type), @intCast(usize, protocol), @ptrToInt(&fd[0]) }); } - return syscall4(SYS_socketpair, @intCast(usize, domain), @intCast(usize, socket_type), @intCast(usize, protocol), @ptrToInt(&fd[0])); + return syscall4(.socketpair, @intCast(usize, domain), @intCast(usize, socket_type), @intCast(usize, protocol), @ptrToInt(&fd[0])); } pub fn accept(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t) usize { @@ -984,45 +984,45 @@ pub fn accept4(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t, flags: if (builtin.arch == .i386) { return socketcall(SC_accept4, &[4]usize{ @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @ptrToInt(len), flags }); } - return syscall4(SYS_accept4, @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @ptrToInt(len), flags); + return syscall4(.accept4, @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @ptrToInt(len), flags); } pub fn fstat(fd: i32, stat_buf: *Stat) usize { - if (@hasDecl(@This(), "SYS_fstat64")) { - return syscall2(SYS_fstat64, @bitCast(usize, @as(isize, fd)), @ptrToInt(stat_buf)); + if (@hasField(SYS, "fstat64")) { + return syscall2(.fstat64, @bitCast(usize, @as(isize, fd)), @ptrToInt(stat_buf)); } else { - return syscall2(SYS_fstat, @bitCast(usize, @as(isize, fd)), @ptrToInt(stat_buf)); + return syscall2(.fstat, @bitCast(usize, @as(isize, fd)), @ptrToInt(stat_buf)); } } pub fn stat(pathname: [*:0]const u8, statbuf: *Stat) usize { - if (@hasDecl(@This(), "SYS_stat64")) { - return syscall2(SYS_stat64, @ptrToInt(pathname), @ptrToInt(statbuf)); + if (@hasField(SYS, "stat64")) { + return syscall2(.stat64, @ptrToInt(pathname), @ptrToInt(statbuf)); } else { - return syscall2(SYS_stat, @ptrToInt(pathname), @ptrToInt(statbuf)); + return syscall2(.stat, @ptrToInt(pathname), @ptrToInt(statbuf)); } } pub fn lstat(pathname: [*:0]const u8, statbuf: *Stat) usize { - if (@hasDecl(@This(), "SYS_lstat64")) { - return syscall2(SYS_lstat64, @ptrToInt(pathname), @ptrToInt(statbuf)); + if (@hasField(SYS, "lstat64")) { + return syscall2(.lstat64, @ptrToInt(pathname), @ptrToInt(statbuf)); } else { - return syscall2(SYS_lstat, @ptrToInt(pathname), @ptrToInt(statbuf)); + return syscall2(.lstat, @ptrToInt(pathname), @ptrToInt(statbuf)); } } pub fn fstatat(dirfd: i32, path: [*:0]const u8, stat_buf: *Stat, flags: u32) usize { - if (@hasDecl(@This(), "SYS_fstatat64")) { - return syscall4(SYS_fstatat64, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags); + if (@hasField(SYS, "fstatat64")) { + return syscall4(.fstatat64, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags); } else { - return syscall4(SYS_fstatat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags); + return syscall4(.fstatat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags); } } pub fn statx(dirfd: i32, path: [*]const u8, flags: u32, mask: u32, statx_buf: *Statx) usize { - if (@hasDecl(@This(), "SYS_statx")) { + if (@hasField(SYS, "statx")) { return syscall5( - SYS_statx, + .statx, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), flags, @@ -1034,59 +1034,59 @@ pub fn statx(dirfd: i32, path: [*]const u8, flags: u32, mask: u32, statx_buf: *S } pub fn listxattr(path: [*:0]const u8, list: [*]u8, size: usize) usize { - return syscall3(SYS_listxattr, @ptrToInt(path), @ptrToInt(list), size); + return syscall3(.listxattr, @ptrToInt(path), @ptrToInt(list), size); } pub fn llistxattr(path: [*:0]const u8, list: [*]u8, size: usize) usize { - return syscall3(SYS_llistxattr, @ptrToInt(path), @ptrToInt(list), size); + return syscall3(.llistxattr, @ptrToInt(path), @ptrToInt(list), size); } pub fn flistxattr(fd: usize, list: [*]u8, size: usize) usize { - return syscall3(SYS_flistxattr, fd, @ptrToInt(list), size); + return syscall3(.flistxattr, fd, @ptrToInt(list), size); } pub fn getxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: usize) usize { - return syscall4(SYS_getxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), size); + return syscall4(.getxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), size); } pub fn lgetxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: usize) usize { - return syscall4(SYS_lgetxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), size); + return syscall4(.lgetxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), size); } pub fn fgetxattr(fd: usize, name: [*:0]const u8, value: [*]u8, size: usize) usize { - return syscall4(SYS_lgetxattr, fd, @ptrToInt(name), @ptrToInt(value), size); + return syscall4(.lgetxattr, fd, @ptrToInt(name), @ptrToInt(value), size); } pub fn setxattr(path: [*:0]const u8, name: [*:0]const u8, value: *const void, size: usize, flags: usize) usize { - return syscall5(SYS_setxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), size, flags); + return syscall5(.setxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), size, flags); } pub fn lsetxattr(path: [*:0]const u8, name: [*:0]const u8, value: *const void, size: usize, flags: usize) usize { - return syscall5(SYS_lsetxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), size, flags); + return syscall5(.lsetxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), size, flags); } pub fn fsetxattr(fd: usize, name: [*:0]const u8, value: *const void, size: usize, flags: usize) usize { - return syscall5(SYS_fsetxattr, fd, @ptrToInt(name), @ptrToInt(value), size, flags); + return syscall5(.fsetxattr, fd, @ptrToInt(name), @ptrToInt(value), size, flags); } pub fn removexattr(path: [*:0]const u8, name: [*:0]const u8) usize { - return syscall2(SYS_removexattr, @ptrToInt(path), @ptrToInt(name)); + return syscall2(.removexattr, @ptrToInt(path), @ptrToInt(name)); } pub fn lremovexattr(path: [*:0]const u8, name: [*:0]const u8) usize { - return syscall2(SYS_lremovexattr, @ptrToInt(path), @ptrToInt(name)); + return syscall2(.lremovexattr, @ptrToInt(path), @ptrToInt(name)); } pub fn fremovexattr(fd: usize, name: [*:0]const u8) usize { - return syscall2(SYS_fremovexattr, fd, @ptrToInt(name)); + return syscall2(.fremovexattr, fd, @ptrToInt(name)); } pub fn sched_yield() usize { - return syscall0(SYS_sched_yield); + return syscall0(.sched_yield); } pub fn sched_getaffinity(pid: pid_t, size: usize, set: *cpu_set_t) usize { - const rc = syscall3(SYS_sched_getaffinity, @bitCast(usize, @as(isize, pid)), size, @ptrToInt(set)); + const rc = syscall3(.sched_getaffinity, @bitCast(usize, @as(isize, pid)), size, @ptrToInt(set)); if (@bitCast(isize, rc) < 0) return rc; if (rc < size) @memset(@ptrCast([*]u8, set) + rc, 0, size - rc); return 0; @@ -1097,11 +1097,11 @@ pub fn epoll_create() usize { } pub fn epoll_create1(flags: usize) usize { - return syscall1(SYS_epoll_create1, flags); + return syscall1(.epoll_create1, flags); } pub fn epoll_ctl(epoll_fd: i32, op: u32, fd: i32, ev: ?*epoll_event) usize { - return syscall4(SYS_epoll_ctl, @bitCast(usize, @as(isize, epoll_fd)), @intCast(usize, op), @bitCast(usize, @as(isize, fd)), @ptrToInt(ev)); + return syscall4(.epoll_ctl, @bitCast(usize, @as(isize, epoll_fd)), @intCast(usize, op), @bitCast(usize, @as(isize, fd)), @ptrToInt(ev)); } pub fn epoll_wait(epoll_fd: i32, events: [*]epoll_event, maxevents: u32, timeout: i32) usize { @@ -1110,7 +1110,7 @@ pub fn epoll_wait(epoll_fd: i32, events: [*]epoll_event, maxevents: u32, timeout pub fn epoll_pwait(epoll_fd: i32, events: [*]epoll_event, maxevents: u32, timeout: i32, sigmask: ?*sigset_t) usize { return syscall6( - SYS_epoll_pwait, + .epoll_pwait, @bitCast(usize, @as(isize, epoll_fd)), @ptrToInt(events), @intCast(usize, maxevents), @@ -1121,11 +1121,11 @@ pub fn epoll_pwait(epoll_fd: i32, events: [*]epoll_event, maxevents: u32, timeou } pub fn eventfd(count: u32, flags: u32) usize { - return syscall2(SYS_eventfd2, count, flags); + return syscall2(.eventfd2, count, flags); } pub fn timerfd_create(clockid: i32, flags: u32) usize { - return syscall2(SYS_timerfd_create, @bitCast(usize, @as(isize, clockid)), flags); + return syscall2(.timerfd_create, @bitCast(usize, @as(isize, clockid)), flags); } pub const itimerspec = extern struct { @@ -1134,59 +1134,59 @@ pub const itimerspec = extern struct { }; pub fn timerfd_gettime(fd: i32, curr_value: *itimerspec) usize { - return syscall2(SYS_timerfd_gettime, @bitCast(usize, @as(isize, fd)), @ptrToInt(curr_value)); + return syscall2(.timerfd_gettime, @bitCast(usize, @as(isize, fd)), @ptrToInt(curr_value)); } pub fn timerfd_settime(fd: i32, flags: u32, new_value: *const itimerspec, old_value: ?*itimerspec) usize { - return syscall4(SYS_timerfd_settime, @bitCast(usize, @as(isize, fd)), flags, @ptrToInt(new_value), @ptrToInt(old_value)); + return syscall4(.timerfd_settime, @bitCast(usize, @as(isize, fd)), flags, @ptrToInt(new_value), @ptrToInt(old_value)); } pub fn unshare(flags: usize) usize { - return syscall1(SYS_unshare, flags); + return syscall1(.unshare, flags); } pub fn capget(hdrp: *cap_user_header_t, datap: *cap_user_data_t) usize { - return syscall2(SYS_capget, @ptrToInt(hdrp), @ptrToInt(datap)); + return syscall2(.capget, @ptrToInt(hdrp), @ptrToInt(datap)); } pub fn capset(hdrp: *cap_user_header_t, datap: *const cap_user_data_t) usize { - return syscall2(SYS_capset, @ptrToInt(hdrp), @ptrToInt(datap)); + return syscall2(.capset, @ptrToInt(hdrp), @ptrToInt(datap)); } pub fn sigaltstack(ss: ?*stack_t, old_ss: ?*stack_t) usize { - return syscall2(SYS_sigaltstack, @ptrToInt(ss), @ptrToInt(old_ss)); + return syscall2(.sigaltstack, @ptrToInt(ss), @ptrToInt(old_ss)); } pub fn uname(uts: *utsname) usize { - return syscall1(SYS_uname, @ptrToInt(uts)); + return syscall1(.uname, @ptrToInt(uts)); } pub fn io_uring_setup(entries: u32, p: *io_uring_params) usize { - return syscall2(SYS_io_uring_setup, entries, @ptrToInt(p)); + return syscall2(.io_uring_setup, entries, @ptrToInt(p)); } pub fn io_uring_enter(fd: i32, to_submit: u32, min_complete: u32, flags: u32, sig: ?*sigset_t) usize { - return syscall6(SYS_io_uring_enter, @bitCast(usize, @as(isize, fd)), to_submit, min_complete, flags, @ptrToInt(sig), NSIG / 8); + return syscall6(.io_uring_enter, @bitCast(usize, @as(isize, fd)), to_submit, min_complete, flags, @ptrToInt(sig), NSIG / 8); } -pub fn io_uring_register(fd: i32, opcode: u32, arg: ?*const c_void, nr_args: u32) usize { - return syscall4(SYS_io_uring_register, @bitCast(usize, @as(isize, fd)), opcode, @ptrToInt(arg), nr_args); +pub fn io_uring_register(fd: i32, opcode: IORING_REGISTER, arg: ?*const c_void, nr_args: u32) usize { + return syscall4(.io_uring_register, @bitCast(usize, @as(isize, fd)), @enumToInt(opcode), @ptrToInt(arg), nr_args); } pub fn memfd_create(name: [*:0]const u8, flags: u32) usize { - return syscall2(SYS_memfd_create, @ptrToInt(name), flags); + return syscall2(.memfd_create, @ptrToInt(name), flags); } pub fn getrusage(who: i32, usage: *rusage) usize { - return syscall2(SYS_getrusage, @bitCast(usize, @as(isize, who)), @ptrToInt(usage)); + return syscall2(.getrusage, @bitCast(usize, @as(isize, who)), @ptrToInt(usage)); } pub fn tcgetattr(fd: fd_t, termios_p: *termios) usize { - return syscall3(SYS_ioctl, @bitCast(usize, @as(isize, fd)), TCGETS, @ptrToInt(termios_p)); + return syscall3(.ioctl, @bitCast(usize, @as(isize, fd)), TCGETS, @ptrToInt(termios_p)); } pub fn tcsetattr(fd: fd_t, optional_action: TCSA, termios_p: *const termios) usize { - return syscall3(SYS_ioctl, @bitCast(usize, @as(isize, fd)), TCSETS + @enumToInt(optional_action), @ptrToInt(termios_p)); + return syscall3(.ioctl, @bitCast(usize, @as(isize, fd)), TCSETS + @enumToInt(optional_action), @ptrToInt(termios_p)); } test "" { diff --git a/lib/std/os/linux/arm-eabi.zig b/lib/std/os/linux/arm-eabi.zig index 0fbbbc4085..c052aeab4e 100644 --- a/lib/std/os/linux/arm-eabi.zig +++ b/lib/std/os/linux/arm-eabi.zig @@ -1,36 +1,36 @@ usingnamespace @import("../bits.zig"); -pub fn syscall0(number: usize) usize { +pub fn syscall0(number: SYS) usize { return asm volatile ("svc #0" : [ret] "={r0}" (-> usize) - : [number] "{r7}" (number) + : [number] "{r7}" (@enumToInt(number)) : "memory" ); } -pub fn syscall1(number: usize, arg1: usize) usize { +pub fn syscall1(number: SYS, arg1: usize) usize { return asm volatile ("svc #0" : [ret] "={r0}" (-> usize) - : [number] "{r7}" (number), + : [number] "{r7}" (@enumToInt(number)), [arg1] "{r0}" (arg1) : "memory" ); } -pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize { +pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { return asm volatile ("svc #0" : [ret] "={r0}" (-> usize) - : [number] "{r7}" (number), + : [number] "{r7}" (@enumToInt(number)), [arg1] "{r0}" (arg1), [arg2] "{r1}" (arg2) : "memory" ); } -pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { +pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { return asm volatile ("svc #0" : [ret] "={r0}" (-> usize) - : [number] "{r7}" (number), + : [number] "{r7}" (@enumToInt(number)), [arg1] "{r0}" (arg1), [arg2] "{r1}" (arg2), [arg3] "{r2}" (arg3) @@ -38,10 +38,10 @@ pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { ); } -pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { +pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { return asm volatile ("svc #0" : [ret] "={r0}" (-> usize) - : [number] "{r7}" (number), + : [number] "{r7}" (@enumToInt(number)), [arg1] "{r0}" (arg1), [arg2] "{r1}" (arg2), [arg3] "{r2}" (arg3), @@ -50,10 +50,10 @@ pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz ); } -pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { +pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { return asm volatile ("svc #0" : [ret] "={r0}" (-> usize) - : [number] "{r7}" (number), + : [number] "{r7}" (@enumToInt(number)), [arg1] "{r0}" (arg1), [arg2] "{r1}" (arg2), [arg3] "{r2}" (arg3), @@ -64,7 +64,7 @@ pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz } pub fn syscall6( - number: usize, + number: SYS, arg1: usize, arg2: usize, arg3: usize, @@ -74,7 +74,7 @@ pub fn syscall6( ) usize { return asm volatile ("svc #0" : [ret] "={r0}" (-> usize) - : [number] "{r7}" (number), + : [number] "{r7}" (@enumToInt(number)), [arg1] "{r0}" (arg1), [arg2] "{r1}" (arg2), [arg3] "{r2}" (arg3), @@ -91,7 +91,7 @@ pub extern fn clone(func: extern fn (arg: usize) u8, stack: usize, flags: u32, a pub fn restore() callconv(.Naked) void { return asm volatile ("svc #0" : - : [number] "{r7}" (@as(usize, SYS_sigreturn)) + : [number] "{r7}" (@enumToInt(SYS.sigreturn)) : "memory" ); } @@ -99,7 +99,7 @@ pub fn restore() callconv(.Naked) void { pub fn restore_rt() callconv(.Naked) void { return asm volatile ("svc #0" : - : [number] "{r7}" (@as(usize, SYS_rt_sigreturn)) + : [number] "{r7}" (@enumToInt(SYS.rt_sigreturn)) : "memory" ); } diff --git a/lib/std/os/linux/arm64.zig b/lib/std/os/linux/arm64.zig index f565bea489..52ab3656e0 100644 --- a/lib/std/os/linux/arm64.zig +++ b/lib/std/os/linux/arm64.zig @@ -1,36 +1,36 @@ usingnamespace @import("../bits.zig"); -pub fn syscall0(number: usize) usize { +pub fn syscall0(number: SYS) usize { return asm volatile ("svc #0" : [ret] "={x0}" (-> usize) - : [number] "{x8}" (number) + : [number] "{x8}" (@enumToInt(number)) : "memory", "cc" ); } -pub fn syscall1(number: usize, arg1: usize) usize { +pub fn syscall1(number: SYS, arg1: usize) usize { return asm volatile ("svc #0" : [ret] "={x0}" (-> usize) - : [number] "{x8}" (number), + : [number] "{x8}" (@enumToInt(number)), [arg1] "{x0}" (arg1) : "memory", "cc" ); } -pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize { +pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { return asm volatile ("svc #0" : [ret] "={x0}" (-> usize) - : [number] "{x8}" (number), + : [number] "{x8}" (@enumToInt(number)), [arg1] "{x0}" (arg1), [arg2] "{x1}" (arg2) : "memory", "cc" ); } -pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { +pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { return asm volatile ("svc #0" : [ret] "={x0}" (-> usize) - : [number] "{x8}" (number), + : [number] "{x8}" (@enumToInt(number)), [arg1] "{x0}" (arg1), [arg2] "{x1}" (arg2), [arg3] "{x2}" (arg3) @@ -38,10 +38,10 @@ pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { ); } -pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { +pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { return asm volatile ("svc #0" : [ret] "={x0}" (-> usize) - : [number] "{x8}" (number), + : [number] "{x8}" (@enumToInt(number)), [arg1] "{x0}" (arg1), [arg2] "{x1}" (arg2), [arg3] "{x2}" (arg3), @@ -50,10 +50,10 @@ pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz ); } -pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { +pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { return asm volatile ("svc #0" : [ret] "={x0}" (-> usize) - : [number] "{x8}" (number), + : [number] "{x8}" (@enumToInt(number)), [arg1] "{x0}" (arg1), [arg2] "{x1}" (arg2), [arg3] "{x2}" (arg3), @@ -64,7 +64,7 @@ pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz } pub fn syscall6( - number: usize, + number: SYS, arg1: usize, arg2: usize, arg3: usize, @@ -74,7 +74,7 @@ pub fn syscall6( ) usize { return asm volatile ("svc #0" : [ret] "={x0}" (-> usize) - : [number] "{x8}" (number), + : [number] "{x8}" (@enumToInt(number)), [arg1] "{x0}" (arg1), [arg2] "{x1}" (arg2), [arg3] "{x2}" (arg3), @@ -93,7 +93,7 @@ pub const restore = restore_rt; pub fn restore_rt() callconv(.Naked) void { return asm volatile ("svc #0" : - : [number] "{x8}" (@as(usize, SYS_rt_sigreturn)) + : [number] "{x8}" (@enumToInt(SYS.rt_sigreturn)) : "memory", "cc" ); } diff --git a/lib/std/os/linux/i386.zig b/lib/std/os/linux/i386.zig index ecdf361b63..0342f0754e 100644 --- a/lib/std/os/linux/i386.zig +++ b/lib/std/os/linux/i386.zig @@ -1,36 +1,36 @@ usingnamespace @import("../bits.zig"); -pub fn syscall0(number: usize) usize { +pub fn syscall0(number: SYS) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) - : [number] "{eax}" (number) + : [number] "{eax}" (@enumToInt(number)) : "memory" ); } -pub fn syscall1(number: usize, arg1: usize) usize { +pub fn syscall1(number: SYS, arg1: usize) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) - : [number] "{eax}" (number), + : [number] "{eax}" (@enumToInt(number)), [arg1] "{ebx}" (arg1) : "memory" ); } -pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize { +pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) - : [number] "{eax}" (number), + : [number] "{eax}" (@enumToInt(number)), [arg1] "{ebx}" (arg1), [arg2] "{ecx}" (arg2) : "memory" ); } -pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { +pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) - : [number] "{eax}" (number), + : [number] "{eax}" (@enumToInt(number)), [arg1] "{ebx}" (arg1), [arg2] "{ecx}" (arg2), [arg3] "{edx}" (arg3) @@ -38,10 +38,10 @@ pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { ); } -pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { +pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) - : [number] "{eax}" (number), + : [number] "{eax}" (@enumToInt(number)), [arg1] "{ebx}" (arg1), [arg2] "{ecx}" (arg2), [arg3] "{edx}" (arg3), @@ -50,10 +50,10 @@ pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz ); } -pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { +pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) - : [number] "{eax}" (number), + : [number] "{eax}" (@enumToInt(number)), [arg1] "{ebx}" (arg1), [arg2] "{ecx}" (arg2), [arg3] "{edx}" (arg3), @@ -64,7 +64,7 @@ pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz } pub fn syscall6( - number: usize, + number: SYS, arg1: usize, arg2: usize, arg3: usize, @@ -84,7 +84,7 @@ pub fn syscall6( \\ pop %%ebp \\ add $4, %%esp : [ret] "={eax}" (-> usize) - : [number] "{eax}" (number), + : [number] "{eax}" (@enumToInt(number)), [arg1] "{ebx}" (arg1), [arg2] "{ecx}" (arg2), [arg3] "{edx}" (arg3), @@ -98,7 +98,7 @@ pub fn syscall6( pub fn socketcall(call: usize, args: [*]usize) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) - : [number] "{eax}" (@as(usize, SYS_socketcall)), + : [number] "{eax}" (@enumToInt(SYS.socketcall)), [arg1] "{ebx}" (call), [arg2] "{ecx}" (@ptrToInt(args)) : "memory" @@ -111,7 +111,7 @@ pub extern fn clone(func: extern fn (arg: usize) u8, stack: usize, flags: u32, a pub fn restore() callconv(.Naked) void { return asm volatile ("int $0x80" : - : [number] "{eax}" (@as(usize, SYS_sigreturn)) + : [number] "{eax}" (@enumToInt(SYS.sigreturn)) : "memory" ); } @@ -119,7 +119,7 @@ pub fn restore() callconv(.Naked) void { pub fn restore_rt() callconv(.Naked) void { return asm volatile ("int $0x80" : - : [number] "{eax}" (@as(usize, SYS_rt_sigreturn)) + : [number] "{eax}" (@enumToInt(SYS.rt_sigreturn)) : "memory" ); } diff --git a/lib/std/os/linux/mipsel.zig b/lib/std/os/linux/mipsel.zig index 5193133f6c..87c55db9f6 100644 --- a/lib/std/os/linux/mipsel.zig +++ b/lib/std/os/linux/mipsel.zig @@ -1,13 +1,13 @@ usingnamespace @import("../bits.zig"); -pub fn syscall0(number: usize) usize { +pub fn syscall0(number: SYS) usize { return asm volatile ( \\ syscall \\ blez $7, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize) - : [number] "{$2}" (number) + : [number] "{$2}" (@enumToInt(number)) : "memory", "cc", "$7" ); } @@ -26,46 +26,46 @@ pub fn syscall_pipe(fd: *[2]i32) usize { \\ sw $3, 4($4) \\ 2: : [ret] "={$2}" (-> usize) - : [number] "{$2}" (@as(usize, SYS_pipe)) + : [number] "{$2}" (@enumToInt(SYS.pipe)) : "memory", "cc", "$7" ); } -pub fn syscall1(number: usize, arg1: usize) usize { +pub fn syscall1(number: SYS, arg1: usize) usize { return asm volatile ( \\ syscall \\ blez $7, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize) - : [number] "{$2}" (number), + : [number] "{$2}" (@enumToInt(number)), [arg1] "{$4}" (arg1) : "memory", "cc", "$7" ); } -pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize { +pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { return asm volatile ( \\ syscall \\ blez $7, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize) - : [number] "{$2}" (number), + : [number] "{$2}" (@enumToInt(number)), [arg1] "{$4}" (arg1), [arg2] "{$5}" (arg2) : "memory", "cc", "$7" ); } -pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { +pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { return asm volatile ( \\ syscall \\ blez $7, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize) - : [number] "{$2}" (number), + : [number] "{$2}" (@enumToInt(number)), [arg1] "{$4}" (arg1), [arg2] "{$5}" (arg2), [arg3] "{$6}" (arg3) @@ -73,14 +73,14 @@ pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { ); } -pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { +pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { return asm volatile ( \\ syscall \\ blez $7, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize) - : [number] "{$2}" (number), + : [number] "{$2}" (@enumToInt(number)), [arg1] "{$4}" (arg1), [arg2] "{$5}" (arg2), [arg3] "{$6}" (arg3), @@ -89,7 +89,7 @@ pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz ); } -pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { +pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { return asm volatile ( \\ .set noat \\ subu $sp, $sp, 24 @@ -100,7 +100,7 @@ pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize) - : [number] "{$2}" (number), + : [number] "{$2}" (@enumToInt(number)), [arg1] "{$4}" (arg1), [arg2] "{$5}" (arg2), [arg3] "{$6}" (arg3), @@ -111,7 +111,7 @@ pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz } pub fn syscall6( - number: usize, + number: SYS, arg1: usize, arg2: usize, arg3: usize, @@ -130,7 +130,7 @@ pub fn syscall6( \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize) - : [number] "{$2}" (number), + : [number] "{$2}" (@enumToInt(number)), [arg1] "{$4}" (arg1), [arg2] "{$5}" (arg2), [arg3] "{$6}" (arg3), @@ -147,7 +147,7 @@ pub extern fn clone(func: extern fn (arg: usize) u8, stack: usize, flags: u32, a pub fn restore() callconv(.Naked) void { return asm volatile ("syscall" : - : [number] "{$2}" (@as(usize, SYS_sigreturn)) + : [number] "{$2}" (@enumToInt(SYS.sigreturn)) : "memory", "cc", "$7" ); } @@ -155,7 +155,7 @@ pub fn restore() callconv(.Naked) void { pub fn restore_rt() callconv(.Naked) void { return asm volatile ("syscall" : - : [number] "{$2}" (@as(usize, SYS_rt_sigreturn)) + : [number] "{$2}" (@enumToInt(SYS.rt_sigreturn)) : "memory", "cc", "$7" ); } diff --git a/lib/std/os/linux/riscv64.zig b/lib/std/os/linux/riscv64.zig index 2259dad78e..3832bfbcca 100644 --- a/lib/std/os/linux/riscv64.zig +++ b/lib/std/os/linux/riscv64.zig @@ -1,36 +1,36 @@ usingnamespace @import("../bits.zig"); -pub fn syscall0(number: usize) usize { +pub fn syscall0(number: SYS) usize { return asm volatile ("ecall" : [ret] "={x10}" (-> usize) - : [number] "{x17}" (number) + : [number] "{x17}" (@enumToInt(number)) : "memory" ); } -pub fn syscall1(number: usize, arg1: usize) usize { +pub fn syscall1(number: SYS, arg1: usize) usize { return asm volatile ("ecall" : [ret] "={x10}" (-> usize) - : [number] "{x17}" (number), + : [number] "{x17}" (@enumToInt(number)), [arg1] "{x10}" (arg1) : "memory" ); } -pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize { +pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { return asm volatile ("ecall" : [ret] "={x10}" (-> usize) - : [number] "{x17}" (number), + : [number] "{x17}" (@enumToInt(number)), [arg1] "{x10}" (arg1), [arg2] "{x11}" (arg2) : "memory" ); } -pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { +pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { return asm volatile ("ecall" : [ret] "={x10}" (-> usize) - : [number] "{x17}" (number), + : [number] "{x17}" (@enumToInt(number)), [arg1] "{x10}" (arg1), [arg2] "{x11}" (arg2), [arg3] "{x12}" (arg3) @@ -38,10 +38,10 @@ pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { ); } -pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { +pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { return asm volatile ("ecall" : [ret] "={x10}" (-> usize) - : [number] "{x17}" (number), + : [number] "{x17}" (@enumToInt(number)), [arg1] "{x10}" (arg1), [arg2] "{x11}" (arg2), [arg3] "{x12}" (arg3), @@ -50,10 +50,10 @@ pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz ); } -pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { +pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { return asm volatile ("ecall" : [ret] "={x10}" (-> usize) - : [number] "{x17}" (number), + : [number] "{x17}" (@enumToInt(number)), [arg1] "{x10}" (arg1), [arg2] "{x11}" (arg2), [arg3] "{x12}" (arg3), @@ -64,7 +64,7 @@ pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz } pub fn syscall6( - number: usize, + number: SYS, arg1: usize, arg2: usize, arg3: usize, @@ -74,7 +74,7 @@ pub fn syscall6( ) usize { return asm volatile ("ecall" : [ret] "={x10}" (-> usize) - : [number] "{x17}" (number), + : [number] "{x17}" (@enumToInt(number)), [arg1] "{x10}" (arg1), [arg2] "{x11}" (arg2), [arg3] "{x12}" (arg3), @@ -92,7 +92,7 @@ pub const restore = restore_rt; pub fn restore_rt() callconv(.Naked) void { return asm volatile ("ecall" : - : [number] "{x17}" (@as(usize, SYS_rt_sigreturn)) + : [number] "{x17}" (@enumToInt(SYS.rt_sigreturn)) : "memory" ); } diff --git a/lib/std/os/linux/tls.zig b/lib/std/os/linux/tls.zig index 1c57fd06b9..e7d836eff6 100644 --- a/lib/std/os/linux/tls.zig +++ b/lib/std/os/linux/tls.zig @@ -122,7 +122,7 @@ pub fn setThreadPointer(addr: usize) void { .seg_not_present = 0, .useable = 1, }; - const rc = std.os.linux.syscall1(std.os.linux.SYS_set_thread_area, @ptrToInt(&user_desc)); + const rc = std.os.linux.syscall1(.set_thread_area, @ptrToInt(&user_desc)); assert(rc == 0); const gdt_entry_number = user_desc.entry_number; @@ -135,7 +135,7 @@ pub fn setThreadPointer(addr: usize) void { ); }, .x86_64 => { - const rc = std.os.linux.syscall2(std.os.linux.SYS_arch_prctl, std.os.linux.ARCH_SET_FS, addr); + const rc = std.os.linux.syscall2(.arch_prctl, std.os.linux.ARCH_SET_FS, addr); assert(rc == 0); }, .aarch64 => { @@ -146,7 +146,7 @@ pub fn setThreadPointer(addr: usize) void { ); }, .arm => { - const rc = std.os.linux.syscall1(std.os.linux.SYS_set_tls, addr); + const rc = std.os.linux.syscall1(.set_tls, addr); assert(rc == 0); }, .riscv64 => { @@ -157,7 +157,7 @@ pub fn setThreadPointer(addr: usize) void { ); }, .mipsel => { - const rc = std.os.linux.syscall1(std.os.linux.SYS_set_thread_area, addr); + const rc = std.os.linux.syscall1(.set_thread_area, addr); assert(rc == 0); }, else => @compileError("Unsupported architecture"), diff --git a/lib/std/os/linux/vdso.zig b/lib/std/os/linux/vdso.zig index beb98a063d..27c56d6c42 100644 --- a/lib/std/os/linux/vdso.zig +++ b/lib/std/os/linux/vdso.zig @@ -22,7 +22,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize { }) { const this_ph = @intToPtr(*elf.Phdr, ph_addr); switch (this_ph.p_type) { - // On WSL1 as well as older kernels, the VDSO ELF image is pre-linked in the upper half + // On WSL1 as well as older kernels, the VDSO ELF image is pre-linked in the upper half // of the memory space (e.g. p_vaddr = 0xffffffffff700000 on WSL1). // Wrapping operations are used on this line as well as subsequent calculations relative to base // (lines 47, 78) to ensure no overflow check is tripped. @@ -70,7 +70,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize { if (0 == (@as(u32, 1) << @intCast(u5, syms[i].st_info >> 4) & OK_BINDS)) continue; if (0 == syms[i].st_shndx) continue; const sym_name = @ptrCast([*:0]const u8, strings + syms[i].st_name); - if (!mem.eql(u8, name, mem.toSliceConst(u8, sym_name))) continue; + if (!mem.eql(u8, name, mem.spanZ(sym_name))) continue; if (maybe_versym) |versym| { if (!checkver(maybe_verdef.?, versym[i], vername, strings)) continue; @@ -93,5 +93,5 @@ fn checkver(def_arg: *elf.Verdef, vsym_arg: i32, vername: []const u8, strings: [ } const aux = @intToPtr(*elf.Verdaux, @ptrToInt(def) + def.vd_aux); const vda_name = @ptrCast([*:0]const u8, strings + aux.vda_name); - return mem.eql(u8, vername, mem.toSliceConst(u8, vda_name)); + return mem.eql(u8, vername, mem.spanZ(vda_name)); } diff --git a/lib/std/os/linux/x86_64.zig b/lib/std/os/linux/x86_64.zig index d6067f9b18..b60dcd80e9 100644 --- a/lib/std/os/linux/x86_64.zig +++ b/lib/std/os/linux/x86_64.zig @@ -1,36 +1,36 @@ usingnamespace @import("../bits.zig"); -pub fn syscall0(number: usize) usize { +pub fn syscall0(number: SYS) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number) + : [number] "{rax}" (@enumToInt(number)) : "rcx", "r11", "memory" ); } -pub fn syscall1(number: usize, arg1: usize) usize { +pub fn syscall1(number: SYS, arg1: usize) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), + : [number] "{rax}" (@enumToInt(number)), [arg1] "{rdi}" (arg1) : "rcx", "r11", "memory" ); } -pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize { +pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), + : [number] "{rax}" (@enumToInt(number)), [arg1] "{rdi}" (arg1), [arg2] "{rsi}" (arg2) : "rcx", "r11", "memory" ); } -pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { +pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), + : [number] "{rax}" (@enumToInt(number)), [arg1] "{rdi}" (arg1), [arg2] "{rsi}" (arg2), [arg3] "{rdx}" (arg3) @@ -38,10 +38,10 @@ pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { ); } -pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { +pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), + : [number] "{rax}" (@enumToInt(number)), [arg1] "{rdi}" (arg1), [arg2] "{rsi}" (arg2), [arg3] "{rdx}" (arg3), @@ -50,10 +50,10 @@ pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz ); } -pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { +pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), + : [number] "{rax}" (@enumToInt(number)), [arg1] "{rdi}" (arg1), [arg2] "{rsi}" (arg2), [arg3] "{rdx}" (arg3), @@ -64,7 +64,7 @@ pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz } pub fn syscall6( - number: usize, + number: SYS, arg1: usize, arg2: usize, arg3: usize, @@ -74,7 +74,7 @@ pub fn syscall6( ) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), + : [number] "{rax}" (@enumToInt(number)), [arg1] "{rdi}" (arg1), [arg2] "{rsi}" (arg2), [arg3] "{rdx}" (arg3), @@ -93,7 +93,7 @@ pub const restore = restore_rt; pub fn restore_rt() callconv(.Naked) void { return asm volatile ("syscall" : - : [number] "{rax}" (@as(usize, SYS_rt_sigreturn)) + : [number] "{rax}" (@enumToInt(SYS.rt_sigreturn)) : "rcx", "r11", "memory" ); } diff --git a/lib/std/os/test.zig b/lib/std/os/test.zig index 154932d9c5..9c5ee44e88 100644 --- a/lib/std/os/test.zig +++ b/lib/std/os/test.zig @@ -18,8 +18,8 @@ const AtomicOrder = builtin.AtomicOrder; test "makePath, put some files in it, deleteTree" { try fs.cwd().makePath("os_test_tmp" ++ fs.path.sep_str ++ "b" ++ fs.path.sep_str ++ "c"); - try io.writeFile("os_test_tmp" ++ fs.path.sep_str ++ "b" ++ fs.path.sep_str ++ "c" ++ fs.path.sep_str ++ "file.txt", "nonsense"); - try io.writeFile("os_test_tmp" ++ fs.path.sep_str ++ "b" ++ fs.path.sep_str ++ "file2.txt", "blah"); + try fs.cwd().writeFile("os_test_tmp" ++ fs.path.sep_str ++ "b" ++ fs.path.sep_str ++ "c" ++ fs.path.sep_str ++ "file.txt", "nonsense"); + try fs.cwd().writeFile("os_test_tmp" ++ fs.path.sep_str ++ "b" ++ fs.path.sep_str ++ "file2.txt", "blah"); try fs.cwd().deleteTree("os_test_tmp"); if (fs.cwd().openDir("os_test_tmp", .{})) |dir| { @panic("expected error"); @@ -36,8 +36,8 @@ test "access file" { expect(err == error.FileNotFound); } - try io.writeFile("os_test_tmp" ++ fs.path.sep_str ++ "file.txt", ""); - try os.access("os_test_tmp" ++ fs.path.sep_str ++ "file.txt", os.F_OK); + try fs.cwd().writeFile("os_test_tmp" ++ fs.path.sep_str ++ "file.txt", ""); + try fs.cwd().access("os_test_tmp" ++ fs.path.sep_str ++ "file.txt", .{}); try fs.cwd().deleteTree("os_test_tmp"); } @@ -65,12 +65,12 @@ test "sendfile" { }, }; - var src_file = try dir.createFileC("sendfile1.txt", .{ .read = true }); + var src_file = try dir.createFileZ("sendfile1.txt", .{ .read = true }); defer src_file.close(); try src_file.writevAll(&vecs); - var dest_file = try dir.createFileC("sendfile2.txt", .{ .read = true }); + var dest_file = try dir.createFileZ("sendfile2.txt", .{ .read = true }); defer dest_file.close(); const header1 = "header1\n"; @@ -192,12 +192,12 @@ test "AtomicFile" { \\ this is a test file ; { - var af = try fs.AtomicFile.init(test_out_file, File.default_mode); + var af = try fs.cwd().atomicFile(test_out_file, .{}); defer af.deinit(); try af.file.writeAll(test_content); try af.finish(); } - const content = try io.readFileAlloc(testing.allocator, test_out_file); + const content = try fs.cwd().readFileAlloc(testing.allocator, test_out_file, 9999); defer testing.allocator.free(content); expect(mem.eql(u8, content, test_content)); diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index 3ccd861444..efc85d38ac 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -119,7 +119,7 @@ pub fn OpenFileW( var result: HANDLE = undefined; - const path_len_bytes = math.cast(u16, mem.toSliceConst(u16, sub_path_w).len * 2) catch |err| switch (err) { + const path_len_bytes = math.cast(u16, mem.lenZ(sub_path_w) * 2) catch |err| switch (err) { error.Overflow => return error.NameTooLong, }; var nt_name = UNICODE_STRING{ @@ -697,7 +697,7 @@ pub fn CreateDirectoryW( sub_path_w: [*:0]const u16, sa: ?*SECURITY_ATTRIBUTES, ) CreateDirectoryError!HANDLE { - const path_len_bytes = math.cast(u16, mem.toSliceConst(u16, sub_path_w).len * 2) catch |err| switch (err) { + const path_len_bytes = math.cast(u16, mem.lenZ(sub_path_w) * 2) catch |err| switch (err) { error.Overflow => return error.NameTooLong, }; var nt_name = UNICODE_STRING{ @@ -905,7 +905,7 @@ pub fn WSAStartup(majorVersion: u8, minorVersion: u8) !ws2_32.WSADATA { var wsadata: ws2_32.WSADATA = undefined; return switch (ws2_32.WSAStartup((@as(WORD, minorVersion) << 8) | majorVersion, &wsadata)) { 0 => wsadata, - else => |err| unexpectedWSAError(@intToEnum(WinsockError, err)), + else => |err| unexpectedWSAError(@intToEnum(ws2_32.WinsockError, @intCast(u16, err))), }; } @@ -1226,7 +1226,7 @@ pub fn nanoSecondsToFileTime(ns: i64) FILETIME { } pub fn cStrToPrefixedFileW(s: [*:0]const u8) ![PATH_MAX_WIDE:0]u16 { - return sliceToPrefixedFileW(mem.toSliceConst(u8, s)); + return sliceToPrefixedFileW(mem.spanZ(s)); } pub fn sliceToPrefixedFileW(s: []const u8) ![PATH_MAX_WIDE:0]u16 { @@ -1304,7 +1304,7 @@ pub fn unexpectedError(err: Win32Error) std.os.UnexpectedError { return error.Unexpected; } -pub fn unexpectedWSAError(err: WinsockError) std.os.UnexpectedError { +pub fn unexpectedWSAError(err: ws2_32.WinsockError) std.os.UnexpectedError { return unexpectedError(@intToEnum(Win32Error, @enumToInt(err))); } diff --git a/lib/std/pdb.zig b/lib/std/pdb.zig index 93fef0b16d..422a51a800 100644 --- a/lib/std/pdb.zig +++ b/lib/std/pdb.zig @@ -649,7 +649,7 @@ const MsfStream = struct { while (true) { const byte = try self.inStream().readByte(); if (byte == 0) { - return list.toSlice(); + return list.span(); } try list.append(byte); } diff --git a/lib/std/process.zig b/lib/std/process.zig index 084aec4c49..89e9cea8d6 100644 --- a/lib/std/process.zig +++ b/lib/std/process.zig @@ -83,7 +83,7 @@ pub fn getEnvMap(allocator: *Allocator) !BufMap { for (environ) |env| { if (env) |ptr| { - const pair = mem.toSlice(u8, ptr); + const pair = mem.spanZ(ptr); var parts = mem.separate(pair, "="); const key = parts.next().?; const value = parts.next().?; @@ -176,7 +176,7 @@ pub const ArgIteratorPosix = struct { const s = os.argv[self.index]; self.index += 1; - return mem.toSlice(u8, s); + return mem.spanZ(s); } pub fn skip(self: *ArgIteratorPosix) bool { @@ -401,7 +401,7 @@ pub fn argsAlloc(allocator: *mem.Allocator) ![][]u8 { var i: usize = 0; while (i < count) : (i += 1) { - result_slice[i] = mem.toSlice(u8, argv[i]); + result_slice[i] = mem.spanZ(argv[i]); } return result_slice; @@ -422,8 +422,8 @@ pub fn argsAlloc(allocator: *mem.Allocator) ![][]u8 { try slice_list.append(arg.len); } - const contents_slice = contents.toSliceConst(); - const slice_sizes = slice_list.toSliceConst(); + const contents_slice = contents.span(); + const slice_sizes = slice_list.span(); const slice_list_bytes = try math.mul(usize, @sizeOf([]u8), slice_sizes.len); const total_bytes = try math.add(usize, slice_list_bytes, contents_slice.len); const buf = try allocator.alignedAlloc(u8, @alignOf([]u8), total_bytes); @@ -636,7 +636,7 @@ pub fn getSelfExeSharedLibPaths(allocator: *Allocator) error{OutOfMemory}![][:0] fn callback(info: *os.dl_phdr_info, size: usize, list: *List) !void { const name = info.dlpi_name orelse return; if (name[0] == '/') { - const item = try mem.dupeZ(list.allocator, u8, mem.toSliceConst(u8, name)); + const item = try mem.dupeZ(list.allocator, u8, mem.spanZ(name)); errdefer list.allocator.free(item); try list.append(item); } @@ -657,7 +657,7 @@ pub fn getSelfExeSharedLibPaths(allocator: *Allocator) error{OutOfMemory}![][:0] var i: u32 = 0; while (i < img_count) : (i += 1) { const name = std.c._dyld_get_image_name(i); - const item = try mem.dupeZ(allocator, u8, mem.toSliceConst(u8, name)); + const item = try mem.dupeZ(allocator, u8, mem.spanZ(name)); errdefer allocator.free(item); try paths.append(item); } diff --git a/lib/std/rand.zig b/lib/std/rand.zig index ede46e3065..5b4655bc5d 100644 --- a/lib/std/rand.zig +++ b/lib/std/rand.zig @@ -59,7 +59,7 @@ pub const Random = struct { return @bitCast(T, unsigned_result); } - /// Constant-time implementation off ::uintLessThan. + /// Constant-time implementation off `uintLessThan`. /// The results of this function may be biased. pub fn uintLessThanBiased(r: *Random, comptime T: type, less_than: T) T { comptime assert(T.is_signed == false); @@ -73,13 +73,13 @@ pub const Random = struct { } /// Returns an evenly distributed random unsigned integer `0 <= i < less_than`. - /// This function assumes that the underlying ::fillFn produces evenly distributed values. + /// This function assumes that the underlying `fillFn` produces evenly distributed values. /// Within this assumption, the runtime of this function is exponentially distributed. - /// If ::fillFn were backed by a true random generator, + /// If `fillFn` were backed by a true random generator, /// the runtime of this function would technically be unbounded. - /// However, if ::fillFn is backed by any evenly distributed pseudo random number generator, + /// However, if `fillFn` is backed by any evenly distributed pseudo random number generator, /// this function is guaranteed to return. - /// If you need deterministic runtime bounds, use `::uintLessThanBiased`. + /// If you need deterministic runtime bounds, use `uintLessThanBiased`. pub fn uintLessThan(r: *Random, comptime T: type, less_than: T) T { comptime assert(T.is_signed == false); comptime assert(T.bit_count <= 64); // TODO: workaround: LLVM ERROR: Unsupported library call operation! @@ -116,7 +116,7 @@ pub const Random = struct { return @intCast(T, m >> Small.bit_count); } - /// Constant-time implementation off ::uintAtMost. + /// Constant-time implementation off `uintAtMost`. /// The results of this function may be biased. pub fn uintAtMostBiased(r: *Random, comptime T: type, at_most: T) T { assert(T.is_signed == false); @@ -128,7 +128,7 @@ pub const Random = struct { } /// Returns an evenly distributed random unsigned integer `0 <= i <= at_most`. - /// See ::uintLessThan, which this function uses in most cases, + /// See `uintLessThan`, which this function uses in most cases, /// for commentary on the runtime of this function. pub fn uintAtMost(r: *Random, comptime T: type, at_most: T) T { assert(T.is_signed == false); @@ -139,7 +139,7 @@ pub const Random = struct { return r.uintLessThan(T, at_most + 1); } - /// Constant-time implementation off ::intRangeLessThan. + /// Constant-time implementation off `intRangeLessThan`. /// The results of this function may be biased. pub fn intRangeLessThanBiased(r: *Random, comptime T: type, at_least: T, less_than: T) T { assert(at_least < less_than); @@ -157,7 +157,7 @@ pub const Random = struct { } /// Returns an evenly distributed random integer `at_least <= i < less_than`. - /// See ::uintLessThan, which this function uses in most cases, + /// See `uintLessThan`, which this function uses in most cases, /// for commentary on the runtime of this function. pub fn intRangeLessThan(r: *Random, comptime T: type, at_least: T, less_than: T) T { assert(at_least < less_than); @@ -174,7 +174,7 @@ pub const Random = struct { } } - /// Constant-time implementation off ::intRangeAtMostBiased. + /// Constant-time implementation off `intRangeAtMostBiased`. /// The results of this function may be biased. pub fn intRangeAtMostBiased(r: *Random, comptime T: type, at_least: T, at_most: T) T { assert(at_least <= at_most); @@ -192,7 +192,7 @@ pub const Random = struct { } /// Returns an evenly distributed random integer `at_least <= i <= at_most`. - /// See ::uintLessThan, which this function uses in most cases, + /// See `uintLessThan`, which this function uses in most cases, /// for commentary on the runtime of this function. pub fn intRangeAtMost(r: *Random, comptime T: type, at_least: T, at_most: T) T { assert(at_least <= at_most); @@ -209,15 +209,9 @@ pub const Random = struct { } } - /// TODO: deprecated. use ::boolean or ::int instead. - pub fn scalar(r: *Random, comptime T: type) T { - return if (T == bool) r.boolean() else r.int(T); - } + pub const scalar = @compileError("deprecated; use boolean() or int() instead"); - /// TODO: deprecated. renamed to ::intRangeLessThan - pub fn range(r: *Random, comptime T: type, start: T, end: T) T { - return r.intRangeLessThan(T, start, end); - } + pub const range = @compileError("deprecated; use intRangeLessThan()"); /// Return a floating point value evenly distributed in the range [0, 1). pub fn float(r: *Random, comptime T: type) T { diff --git a/lib/std/sort.zig b/lib/std/sort.zig index 938c5e98f1..3447a05769 100644 --- a/lib/std/sort.zig +++ b/lib/std/sort.zig @@ -1227,13 +1227,13 @@ test "sort fuzz testing" { var fixed_buffer_mem: [100 * 1024]u8 = undefined; fn fuzzTest(rng: *std.rand.Random) !void { - const array_size = rng.range(usize, 0, 1000); + const array_size = rng.intRangeLessThan(usize, 0, 1000); var array = try testing.allocator.alloc(IdAndValue, array_size); defer testing.allocator.free(array); // populate with random data for (array) |*item, index| { item.id = index; - item.value = rng.range(i32, 0, 100); + item.value = rng.intRangeLessThan(i32, 0, 100); } sort(IdAndValue, array, cmpByValue); diff --git a/lib/std/special/build_runner.zig b/lib/std/special/build_runner.zig index 974247e2a1..665d47c1bd 100644 --- a/lib/std/special/build_runner.zig +++ b/lib/std/special/build_runner.zig @@ -116,7 +116,7 @@ pub fn main() !void { if (builder.validateUserInputDidItFail()) return usageAndErr(builder, true, stderr_stream); - builder.make(targets.toSliceConst()) catch |err| { + builder.make(targets.span()) catch |err| { switch (err) { error.InvalidStepName => { return usageAndErr(builder, true, stderr_stream); @@ -151,7 +151,7 @@ fn usage(builder: *Builder, already_ran_build: bool, out_stream: var) !void { , .{builder.zig_exe}); const allocator = builder.allocator; - for (builder.top_level_steps.toSliceConst()) |top_level_step| { + for (builder.top_level_steps.span()) |top_level_step| { const name = if (&top_level_step.step == builder.default_step) try fmt.allocPrint(allocator, "{} (default)", .{top_level_step.step.name}) else @@ -174,7 +174,7 @@ fn usage(builder: *Builder, already_ran_build: bool, out_stream: var) !void { if (builder.available_options_list.len == 0) { try out_stream.print(" (none)\n", .{}); } else { - for (builder.available_options_list.toSliceConst()) |option| { + for (builder.available_options_list.span()) |option| { const name = try fmt.allocPrint(allocator, " -D{}=[{}]", .{ option.name, Builder.typeIdName(option.type_id), diff --git a/lib/std/special/compiler_rt.zig b/lib/std/special/compiler_rt.zig index f0cf85a7a9..2a454b19dc 100644 --- a/lib/std/special/compiler_rt.zig +++ b/lib/std/special/compiler_rt.zig @@ -10,13 +10,19 @@ comptime { const strong_linkage = if (is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.Strong; switch (builtin.arch) { - .i386, .x86_64 => @export(@import("compiler_rt/stack_probe.zig").zig_probe_stack, .{ .name = "__zig_probe_stack", .linkage = linkage }), - .aarch64, .aarch64_be, .aarch64_32 => { - @export(@import("compiler_rt/clear_cache.zig").clear_cache, .{ .name = "__clear_cache", .linkage = linkage }); - }, + .i386, + .x86_64, + => @export(@import("compiler_rt/stack_probe.zig").zig_probe_stack, .{ + .name = "__zig_probe_stack", + .linkage = linkage, + }), + else => {}, } + // __clear_cache manages its own logic about whether to be exported or not. + _ = @import("compiler_rt/clear_cache.zig").clear_cache; + @export(@import("compiler_rt/compareXf2.zig").__lesf2, .{ .name = "__lesf2", .linkage = linkage }); @export(@import("compiler_rt/compareXf2.zig").__ledf2, .{ .name = "__ledf2", .linkage = linkage }); @export(@import("compiler_rt/compareXf2.zig").__letf2, .{ .name = "__letf2", .linkage = linkage }); @@ -69,9 +75,12 @@ comptime { @export(@import("compiler_rt/divdf3.zig").__divdf3, .{ .name = "__divdf3", .linkage = linkage }); @export(@import("compiler_rt/divtf3.zig").__divtf3, .{ .name = "__divtf3", .linkage = linkage }); - @export(@import("compiler_rt/ashlti3.zig").__ashlti3, .{ .name = "__ashlti3", .linkage = linkage }); - @export(@import("compiler_rt/lshrti3.zig").__lshrti3, .{ .name = "__lshrti3", .linkage = linkage }); - @export(@import("compiler_rt/ashrti3.zig").__ashrti3, .{ .name = "__ashrti3", .linkage = linkage }); + @export(@import("compiler_rt/shift.zig").__ashldi3, .{ .name = "__ashldi3", .linkage = linkage }); + @export(@import("compiler_rt/shift.zig").__ashlti3, .{ .name = "__ashlti3", .linkage = linkage }); + @export(@import("compiler_rt/shift.zig").__ashrdi3, .{ .name = "__ashrdi3", .linkage = linkage }); + @export(@import("compiler_rt/shift.zig").__ashrti3, .{ .name = "__ashrti3", .linkage = linkage }); + @export(@import("compiler_rt/shift.zig").__lshrdi3, .{ .name = "__lshrdi3", .linkage = linkage }); + @export(@import("compiler_rt/shift.zig").__lshrti3, .{ .name = "__lshrti3", .linkage = linkage }); @export(@import("compiler_rt/floatsiXf.zig").__floatsidf, .{ .name = "__floatsidf", .linkage = linkage }); @export(@import("compiler_rt/floatsiXf.zig").__floatsisf, .{ .name = "__floatsisf", .linkage = linkage }); @@ -229,6 +238,10 @@ comptime { @export(@import("compiler_rt/divsf3.zig").__aeabi_fdiv, .{ .name = "__aeabi_fdiv", .linkage = linkage }); @export(@import("compiler_rt/divdf3.zig").__aeabi_ddiv, .{ .name = "__aeabi_ddiv", .linkage = linkage }); + @export(@import("compiler_rt/shift.zig").__aeabi_llsl, .{ .name = "__aeabi_llsl", .linkage = linkage }); + @export(@import("compiler_rt/shift.zig").__aeabi_lasr, .{ .name = "__aeabi_lasr", .linkage = linkage }); + @export(@import("compiler_rt/shift.zig").__aeabi_llsr, .{ .name = "__aeabi_llsr", .linkage = linkage }); + @export(@import("compiler_rt/compareXf2.zig").__aeabi_fcmpeq, .{ .name = "__aeabi_fcmpeq", .linkage = linkage }); @export(@import("compiler_rt/compareXf2.zig").__aeabi_fcmplt, .{ .name = "__aeabi_fcmplt", .linkage = linkage }); @export(@import("compiler_rt/compareXf2.zig").__aeabi_fcmple, .{ .name = "__aeabi_fcmple", .linkage = linkage }); diff --git a/lib/std/special/compiler_rt/ashldi3_test.zig b/lib/std/special/compiler_rt/ashldi3_test.zig new file mode 100644 index 0000000000..547c315b24 --- /dev/null +++ b/lib/std/special/compiler_rt/ashldi3_test.zig @@ -0,0 +1,32 @@ +const __ashldi3 = @import("shift.zig").__ashldi3; +const testing = @import("std").testing; + +fn test__ashldi3(a: i64, b: i32, expected: u64) void { + const x = __ashldi3(a, b); + testing.expectEqual(@bitCast(i64, expected), x); +} + +test "ashldi3" { + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 0, 0x123456789ABCDEF); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 1, 0x2468ACF13579BDE); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 2, 0x48D159E26AF37BC); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 3, 0x91A2B3C4D5E6F78); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 4, 0x123456789ABCDEF0); + + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 28, 0x789ABCDEF0000000); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 29, 0xF13579BDE0000000); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 30, 0xE26AF37BC0000000); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 31, 0xC4D5E6F780000000); + + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 32, 0x89ABCDEF00000000); + + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 33, 0x13579BDE00000000); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 34, 0x26AF37BC00000000); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 35, 0x4D5E6F7800000000); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 36, 0x9ABCDEF000000000); + + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 60, 0xF000000000000000); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 61, 0xE000000000000000); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 62, 0xC000000000000000); + test__ashldi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 63, 0x8000000000000000); +} diff --git a/lib/std/special/compiler_rt/ashlti3.zig b/lib/std/special/compiler_rt/ashlti3.zig deleted file mode 100644 index e3bc60bbb9..0000000000 --- a/lib/std/special/compiler_rt/ashlti3.zig +++ /dev/null @@ -1,41 +0,0 @@ -const builtin = @import("builtin"); -const compiler_rt = @import("../compiler_rt.zig"); - -pub fn __ashlti3(a: i128, b: i32) callconv(.C) i128 { - var input = twords{ .all = a }; - var result: twords = undefined; - - if (b > 63) { - // 64 <= b < 128 - result.s.low = 0; - result.s.high = input.s.low << @intCast(u6, b - 64); - } else { - // 0 <= b < 64 - if (b == 0) return a; - result.s.low = input.s.low << @intCast(u6, b); - result.s.high = input.s.low >> @intCast(u6, 64 - b); - result.s.high |= input.s.high << @intCast(u6, b); - } - - return result.all; -} - -const twords = extern union { - all: i128, - s: S, - - const S = if (builtin.endian == .Little) - struct { - low: u64, - high: u64, - } - else - struct { - high: u64, - low: u64, - }; -}; - -test "import ashlti3" { - _ = @import("ashlti3_test.zig"); -} diff --git a/lib/std/special/compiler_rt/ashlti3_test.zig b/lib/std/special/compiler_rt/ashlti3_test.zig index 4ba21c138e..a4510f52d7 100644 --- a/lib/std/special/compiler_rt/ashlti3_test.zig +++ b/lib/std/special/compiler_rt/ashlti3_test.zig @@ -1,9 +1,9 @@ -const __ashlti3 = @import("ashlti3.zig").__ashlti3; +const __ashlti3 = @import("shift.zig").__ashlti3; const testing = @import("std").testing; fn test__ashlti3(a: i128, b: i32, expected: i128) void { const x = __ashlti3(a, b); - testing.expect(x == expected); + testing.expectEqual(expected, x); } test "ashlti3" { diff --git a/lib/std/special/compiler_rt/ashrdi3_test.zig b/lib/std/special/compiler_rt/ashrdi3_test.zig new file mode 100644 index 0000000000..3ba30edbfe --- /dev/null +++ b/lib/std/special/compiler_rt/ashrdi3_test.zig @@ -0,0 +1,55 @@ +const __ashrdi3 = @import("shift.zig").__ashrdi3; +const testing = @import("std").testing; + +fn test__ashrdi3(a: i64, b: i32, expected: u64) void { + const x = __ashrdi3(a, b); + testing.expectEqual(@bitCast(i64, expected), x); +} + +test "ashrdi3" { + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 0, 0x123456789ABCDEF); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 1, 0x91A2B3C4D5E6F7); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 2, 0x48D159E26AF37B); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 3, 0x2468ACF13579BD); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 4, 0x123456789ABCDE); + + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 28, 0x12345678); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 29, 0x91A2B3C); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 30, 0x48D159E); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 31, 0x2468ACF); + + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 32, 0x1234567); + + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 33, 0x91A2B3); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 34, 0x48D159); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 35, 0x2468AC); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 36, 0x123456); + + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 60, 0); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 61, 0); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 62, 0); + test__ashrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 63, 0); + + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 0, 0xFEDCBA9876543210); + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 1, 0xFF6E5D4C3B2A1908); + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 2, 0xFFB72EA61D950C84); + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 3, 0xFFDB97530ECA8642); + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 4, 0xFFEDCBA987654321); + + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 28, 0xFFFFFFFFEDCBA987); + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 29, 0xFFFFFFFFF6E5D4C3); + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 30, 0xFFFFFFFFFB72EA61); + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 31, 0xFFFFFFFFFDB97530); + + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 32, 0xFFFFFFFFFEDCBA98); + + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 33, 0xFFFFFFFFFF6E5D4C); + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 34, 0xFFFFFFFFFFB72EA6); + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 35, 0xFFFFFFFFFFDB9753); + test__ashrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 36, 0xFFFFFFFFFFEDCBA9); + + test__ashrdi3(@bitCast(i64, @as(u64, 0xAEDCBA9876543210)), 60, 0xFFFFFFFFFFFFFFFA); + test__ashrdi3(@bitCast(i64, @as(u64, 0xAEDCBA9876543210)), 61, 0xFFFFFFFFFFFFFFFD); + test__ashrdi3(@bitCast(i64, @as(u64, 0xAEDCBA9876543210)), 62, 0xFFFFFFFFFFFFFFFE); + test__ashrdi3(@bitCast(i64, @as(u64, 0xAEDCBA9876543210)), 63, 0xFFFFFFFFFFFFFFFF); +} diff --git a/lib/std/special/compiler_rt/ashrti3.zig b/lib/std/special/compiler_rt/ashrti3.zig deleted file mode 100644 index 1cbe24fdeb..0000000000 --- a/lib/std/special/compiler_rt/ashrti3.zig +++ /dev/null @@ -1,42 +0,0 @@ -const builtin = @import("builtin"); -const compiler_rt = @import("../compiler_rt.zig"); - -pub fn __ashrti3(a: i128, b: i32) callconv(.C) i128 { - var input = twords{ .all = a }; - var result: twords = undefined; - - if (b > 63) { - // 64 <= b < 128 - result.s.low = input.s.high >> @intCast(u6, b - 64); - result.s.high = input.s.high >> 63; - } else { - // 0 <= b < 64 - if (b == 0) return a; - result.s.low = input.s.high << @intCast(u6, 64 - b); - // Avoid sign-extension here - result.s.low |= @bitCast(i64, @bitCast(u64, input.s.low) >> @intCast(u6, b)); - result.s.high = input.s.high >> @intCast(u6, b); - } - - return result.all; -} - -const twords = extern union { - all: i128, - s: S, - - const S = if (builtin.endian == .Little) - struct { - low: i64, - high: i64, - } - else - struct { - high: i64, - low: i64, - }; -}; - -test "import ashrti3" { - _ = @import("ashrti3_test.zig"); -} diff --git a/lib/std/special/compiler_rt/ashrti3_test.zig b/lib/std/special/compiler_rt/ashrti3_test.zig index 6a7565e557..43d5d11910 100644 --- a/lib/std/special/compiler_rt/ashrti3_test.zig +++ b/lib/std/special/compiler_rt/ashrti3_test.zig @@ -1,11 +1,9 @@ -const __ashrti3 = @import("ashrti3.zig").__ashrti3; +const __ashrti3 = @import("shift.zig").__ashrti3; const testing = @import("std").testing; fn test__ashrti3(a: i128, b: i32, expected: i128) void { const x = __ashrti3(a, b); - // @import("std").debug.warn("got 0x{x}\nexp 0x{x}\n", .{@truncate(u64, - // @bitCast(u128, x) >> 64), @truncate(u64, @bitCast(u128, expected)) >> 64}); - testing.expect(x == expected); + testing.expectEqual(expected, x); } test "ashrti3" { diff --git a/lib/std/special/compiler_rt/clear_cache.zig b/lib/std/special/compiler_rt/clear_cache.zig index 77470251d1..6306d5b575 100644 --- a/lib/std/special/compiler_rt/clear_cache.zig +++ b/lib/std/special/compiler_rt/clear_cache.zig @@ -26,6 +26,10 @@ pub fn clear_cache(start: usize, end: usize) callconv(.C) void { .mips, .mipsel, .mips64, .mips64el => true, else => false, }; + const riscv = switch (arch) { + .riscv32, .riscv64 => true, + else => false, + }; const powerpc64 = switch (arch) { .powerpc64, .powerpc64le => true, else => false, @@ -41,45 +45,42 @@ pub fn clear_cache(start: usize, end: usize) callconv(.C) void { if (x86) { // Intel processors have a unified instruction and data cache // so there is nothing to do + exportIt(); } else if (os == .windows and (arm32 or arm64)) { - @compileError("TODO"); + // TODO // FlushInstructionCache(GetCurrentProcess(), start, end - start); + // exportIt(); } else if (arm32 and !apple) { - @compileError("TODO"); - //#if defined(__FreeBSD__) || defined(__NetBSD__) - // struct arm_sync_icache_args arg; - // - // arg.addr = (uintptr_t)start; - // arg.len = (uintptr_t)end - (uintptr_t)start; - // - // sysarch(ARM_SYNC_ICACHE, &arg); - //#elif defined(__linux__) - //// We used to include asm/unistd.h for the __ARM_NR_cacheflush define, but - //// it also brought many other unused defines, as well as a dependency on - //// kernel headers to be installed. - //// - //// This value is stable at least since Linux 3.13 and should remain so for - //// compatibility reasons, warranting it's re-definition here. - //#define __ARM_NR_cacheflush 0x0f0002 - // register int start_reg __asm("r0") = (int)(intptr_t)start; - // const register int end_reg __asm("r1") = (int)(intptr_t)end; - // const register int flags __asm("r2") = 0; - // const register int syscall_nr __asm("r7") = __ARM_NR_cacheflush; - // __asm __volatile("svc 0x0" - // : "=r"(start_reg) - // : "r"(syscall_nr), "r"(start_reg), "r"(end_reg), "r"(flags)); - // assert(start_reg == 0 && "Cache flush syscall failed."); - //#else - // compilerrt_abort(); - //#endif + switch (os) { + .freebsd, .netbsd => { + var arg = arm_sync_icache_args{ + .addr = start, + .len = end - start, + }; + const result = sysarch(ARM_SYNC_ICACHE, @ptrToInt(&arg)); + std.debug.assert(result == 0); + exportIt(); + }, + .linux => { + const result = std.os.linux.syscall3(.cacheflush, start, end, 0); + std.debug.assert(result == 0); + exportIt(); + }, + else => {}, + } } else if (os == .linux and mips) { - @compileError("TODO"); - //const uintptr_t start_int = (uintptr_t)start; - //const uintptr_t end_int = (uintptr_t)end; - //syscall(__NR_cacheflush, start, (end_int - start_int), BCACHE); + const flags = 3; // ICACHE | DCACHE + const result = std.os.linux.syscall3(.cacheflush, start, end - start, flags); + std.debug.assert(result == 0); + exportIt(); } else if (mips and os == .openbsd) { - @compileError("TODO"); + // TODO //cacheflush(start, (uintptr_t)end - (uintptr_t)start, BCACHE); + // exportIt(); + } else if (os == .linux and riscv) { + const result = std.os.linux.syscall3(.riscv_flush_icache, start, end - start, 0); + std.debug.assert(result == 0); + exportIt(); } else if (arm64 and !apple) { // Get Cache Type Info. // TODO memoize this? @@ -118,8 +119,9 @@ pub fn clear_cache(start: usize, end: usize) callconv(.C) void { } } asm volatile ("isb sy"); + exportIt(); } else if (powerpc64) { - @compileError("TODO"); + // TODO //const size_t line_size = 32; //const size_t len = (uintptr_t)end - (uintptr_t)start; // @@ -134,8 +136,9 @@ pub fn clear_cache(start: usize, end: usize) callconv(.C) void { //for (uintptr_t line = start_line; line < end_line; line += line_size) // __asm__ volatile("icbi 0, %0" : : "r"(line)); //__asm__ volatile("isync"); + // exportIt(); } else if (sparc) { - @compileError("TODO"); + // TODO //const size_t dword_size = 8; //const size_t len = (uintptr_t)end - (uintptr_t)start; // @@ -145,13 +148,26 @@ pub fn clear_cache(start: usize, end: usize) callconv(.C) void { // //for (uintptr_t dword = start_dword; dword < end_dword; dword += dword_size) // __asm__ volatile("flush %0" : : "r"(dword)); + // exportIt(); } else if (apple) { // On Darwin, sys_icache_invalidate() provides this functionality sys_icache_invalidate(start, end - start); - } else { - @compileError("no __clear_cache implementation available for this target"); + exportIt(); } } +const linkage = if (std.builtin.is_test) std.builtin.GlobalLinkage.Internal else std.builtin.GlobalLinkage.Weak; + +fn exportIt() void { + @export(clear_cache, .{ .name = "__clear_cache", .linkage = linkage }); +} + // Darwin-only extern fn sys_icache_invalidate(start: usize, len: usize) void; +// BSD-only +const arm_sync_icache_args = extern struct { + addr: usize, // Virtual start address + len: usize, // Region size +}; +const ARM_SYNC_ICACHE = 0; +extern "c" fn sysarch(number: i32, args: usize) i32; diff --git a/lib/std/special/compiler_rt/lshrdi3_test.zig b/lib/std/special/compiler_rt/lshrdi3_test.zig new file mode 100644 index 0000000000..906d428d1e --- /dev/null +++ b/lib/std/special/compiler_rt/lshrdi3_test.zig @@ -0,0 +1,55 @@ +const __lshrdi3 = @import("shift.zig").__lshrdi3; +const testing = @import("std").testing; + +fn test__lshrdi3(a: i64, b: i32, expected: u64) void { + const x = __lshrdi3(a, b); + testing.expectEqual(@bitCast(i64, expected), x); +} + +test "lshrdi3" { + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 0, 0x123456789ABCDEF); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 1, 0x91A2B3C4D5E6F7); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 2, 0x48D159E26AF37B); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 3, 0x2468ACF13579BD); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 4, 0x123456789ABCDE); + + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 28, 0x12345678); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 29, 0x91A2B3C); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 30, 0x48D159E); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 31, 0x2468ACF); + + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 32, 0x1234567); + + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 33, 0x91A2B3); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 34, 0x48D159); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 35, 0x2468AC); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 36, 0x123456); + + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 60, 0); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 61, 0); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 62, 0); + test__lshrdi3(@bitCast(i64, @as(u64, 0x0123456789ABCDEF)), 63, 0); + + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 0, 0xFEDCBA9876543210); + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 1, 0x7F6E5D4C3B2A1908); + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 2, 0x3FB72EA61D950C84); + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 3, 0x1FDB97530ECA8642); + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 4, 0xFEDCBA987654321); + + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 28, 0xFEDCBA987); + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 29, 0x7F6E5D4C3); + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 30, 0x3FB72EA61); + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 31, 0x1FDB97530); + + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 32, 0xFEDCBA98); + + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 33, 0x7F6E5D4C); + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 34, 0x3FB72EA6); + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 35, 0x1FDB9753); + test__lshrdi3(@bitCast(i64, @as(u64, 0xFEDCBA9876543210)), 36, 0xFEDCBA9); + + test__lshrdi3(@bitCast(i64, @as(u64, 0xAEDCBA9876543210)), 60, 0xA); + test__lshrdi3(@bitCast(i64, @as(u64, 0xAEDCBA9876543210)), 61, 0x5); + test__lshrdi3(@bitCast(i64, @as(u64, 0xAEDCBA9876543210)), 62, 0x2); + test__lshrdi3(@bitCast(i64, @as(u64, 0xAEDCBA9876543210)), 63, 0x1); +} diff --git a/lib/std/special/compiler_rt/lshrti3.zig b/lib/std/special/compiler_rt/lshrti3.zig deleted file mode 100644 index e1c2bb5bd3..0000000000 --- a/lib/std/special/compiler_rt/lshrti3.zig +++ /dev/null @@ -1,41 +0,0 @@ -const builtin = @import("builtin"); -const compiler_rt = @import("../compiler_rt.zig"); - -pub fn __lshrti3(a: i128, b: i32) callconv(.C) i128 { - var input = twords{ .all = a }; - var result: twords = undefined; - - if (b > 63) { - // 64 <= b < 128 - result.s.low = input.s.high >> @intCast(u6, b - 64); - result.s.high = 0; - } else { - // 0 <= b < 64 - if (b == 0) return a; - result.s.low = input.s.high << @intCast(u6, 64 - b); - result.s.low |= input.s.low >> @intCast(u6, b); - result.s.high = input.s.high >> @intCast(u6, b); - } - - return result.all; -} - -const twords = extern union { - all: i128, - s: S, - - const S = if (builtin.endian == .Little) - struct { - low: u64, - high: u64, - } - else - struct { - high: u64, - low: u64, - }; -}; - -test "import lshrti3" { - _ = @import("lshrti3_test.zig"); -} diff --git a/lib/std/special/compiler_rt/lshrti3_test.zig b/lib/std/special/compiler_rt/lshrti3_test.zig index 60f83d816e..c0aa191a6f 100644 --- a/lib/std/special/compiler_rt/lshrti3_test.zig +++ b/lib/std/special/compiler_rt/lshrti3_test.zig @@ -1,9 +1,9 @@ -const __lshrti3 = @import("lshrti3.zig").__lshrti3; +const __lshrti3 = @import("shift.zig").__lshrti3; const testing = @import("std").testing; fn test__lshrti3(a: i128, b: i32, expected: i128) void { const x = __lshrti3(a, b); - testing.expect(x == expected); + testing.expectEqual(expected, x); } test "lshrti3" { diff --git a/lib/std/special/compiler_rt/shift.zig b/lib/std/special/compiler_rt/shift.zig new file mode 100644 index 0000000000..e21042e14e --- /dev/null +++ b/lib/std/special/compiler_rt/shift.zig @@ -0,0 +1,130 @@ +const std = @import("std"); +const builtin = std.builtin; +const Log2Int = std.math.Log2Int; + +fn Dwords(comptime T: type, comptime signed_half: bool) type { + return extern union { + pub const HalfTU = std.meta.IntType(false, @divExact(T.bit_count, 2)); + pub const HalfTS = std.meta.IntType(true, @divExact(T.bit_count, 2)); + pub const HalfT = if (signed_half) HalfTS else HalfTU; + + all: T, + s: if (builtin.endian == .Little) + struct { low: HalfT, high: HalfT } + else + struct { high: HalfT, low: HalfT }, + }; +} + +// Arithmetic shift left +// Precondition: 0 <= b < bits_in_dword +pub fn ashlXi3(comptime T: type, a: T, b: i32) T { + const dwords = Dwords(T, false); + const S = Log2Int(dwords.HalfT); + + const input = dwords{ .all = a }; + var output: dwords = undefined; + + if (b >= dwords.HalfT.bit_count) { + output.s.low = 0; + output.s.high = input.s.low << @intCast(S, b - dwords.HalfT.bit_count); + } else if (b == 0) { + return a; + } else { + output.s.low = input.s.low << @intCast(S, b); + output.s.high = input.s.high << @intCast(S, b); + output.s.high |= input.s.low >> @intCast(S, dwords.HalfT.bit_count - b); + } + + return output.all; +} + +// Arithmetic shift right +// Precondition: 0 <= b < T.bit_count +pub fn ashrXi3(comptime T: type, a: T, b: i32) T { + const dwords = Dwords(T, true); + const S = Log2Int(dwords.HalfT); + + const input = dwords{ .all = a }; + var output: dwords = undefined; + + if (b >= dwords.HalfT.bit_count) { + output.s.high = input.s.high >> (dwords.HalfT.bit_count - 1); + output.s.low = input.s.high >> @intCast(S, b - dwords.HalfT.bit_count); + } else if (b == 0) { + return a; + } else { + output.s.high = input.s.high >> @intCast(S, b); + output.s.low = input.s.high << @intCast(S, dwords.HalfT.bit_count - b); + // Avoid sign-extension here + output.s.low |= @bitCast( + dwords.HalfT, + @bitCast(dwords.HalfTU, input.s.low) >> @intCast(S, b), + ); + } + + return output.all; +} + +// Logical shift right +// Precondition: 0 <= b < T.bit_count +pub fn lshrXi3(comptime T: type, a: T, b: i32) T { + const dwords = Dwords(T, false); + const S = Log2Int(dwords.HalfT); + + const input = dwords{ .all = a }; + var output: dwords = undefined; + + if (b >= dwords.HalfT.bit_count) { + output.s.high = 0; + output.s.low = input.s.high >> @intCast(S, b - dwords.HalfT.bit_count); + } else if (b == 0) { + return a; + } else { + output.s.high = input.s.high >> @intCast(S, b); + output.s.low = input.s.high << @intCast(S, dwords.HalfT.bit_count - b); + output.s.low |= input.s.low >> @intCast(S, b); + } + + return output.all; +} + +pub fn __ashldi3(a: i64, b: i32) callconv(.C) i64 { + return @call(.{ .modifier = .always_inline }, ashlXi3, .{ i64, a, b }); +} +pub fn __ashlti3(a: i128, b: i32) callconv(.C) i128 { + return @call(.{ .modifier = .always_inline }, ashlXi3, .{ i128, a, b }); +} +pub fn __ashrdi3(a: i64, b: i32) callconv(.C) i64 { + return @call(.{ .modifier = .always_inline }, ashrXi3, .{ i64, a, b }); +} +pub fn __ashrti3(a: i128, b: i32) callconv(.C) i128 { + return @call(.{ .modifier = .always_inline }, ashrXi3, .{ i128, a, b }); +} +pub fn __lshrdi3(a: i64, b: i32) callconv(.C) i64 { + return @call(.{ .modifier = .always_inline }, lshrXi3, .{ i64, a, b }); +} +pub fn __lshrti3(a: i128, b: i32) callconv(.C) i128 { + return @call(.{ .modifier = .always_inline }, lshrXi3, .{ i128, a, b }); +} + +pub fn __aeabi_llsl(a: i64, b: i32) callconv(.AAPCS) i64 { + return __ashldi3(a, b); +} +pub fn __aeabi_lasr(a: i64, b: i32) callconv(.AAPCS) i64 { + return __ashrdi3(a, b); +} +pub fn __aeabi_llsr(a: i64, b: i32) callconv(.AAPCS) i64 { + return __lshrdi3(a, b); +} + +test "" { + _ = @import("ashrdi3_test.zig"); + _ = @import("ashrti3_test.zig"); + + _ = @import("ashldi3_test.zig"); + _ = @import("ashlti3_test.zig"); + + _ = @import("lshrdi3_test.zig"); + _ = @import("lshrti3_test.zig"); +} diff --git a/lib/std/std.zig b/lib/std/std.zig index 9277370ca6..4ea8e7170b 100644 --- a/lib/std/std.zig +++ b/lib/std/std.zig @@ -1,10 +1,10 @@ pub const AlignedArrayList = @import("array_list.zig").AlignedArrayList; pub const ArrayList = @import("array_list.zig").ArrayList; +pub const ArrayListSentineled = @import("array_list_sentineled.zig").ArrayListSentineled; pub const AutoHashMap = @import("hash_map.zig").AutoHashMap; pub const BloomFilter = @import("bloom_filter.zig").BloomFilter; pub const BufMap = @import("buf_map.zig").BufMap; pub const BufSet = @import("buf_set.zig").BufSet; -pub const Buffer = @import("buffer.zig").Buffer; pub const ChildProcess = @import("child_process.zig").ChildProcess; pub const DynLib = @import("dynamic_library.zig").DynLib; pub const HashMap = @import("hash_map.zig").HashMap; diff --git a/lib/std/target.zig b/lib/std/target.zig index 8e1b9f8736..3f18791eb9 100644 --- a/lib/std/target.zig +++ b/lib/std/target.zig @@ -967,15 +967,15 @@ pub const Target = struct { pub const stack_align = 16; - pub fn zigTriple(self: Target, allocator: *mem.Allocator) ![:0]u8 { + pub fn zigTriple(self: Target, allocator: *mem.Allocator) ![]u8 { return std.zig.CrossTarget.fromTarget(self).zigTriple(allocator); } - pub fn linuxTripleSimple(allocator: *mem.Allocator, cpu_arch: Cpu.Arch, os_tag: Os.Tag, abi: Abi) ![:0]u8 { - return std.fmt.allocPrint0(allocator, "{}-{}-{}", .{ @tagName(cpu_arch), @tagName(os_tag), @tagName(abi) }); + pub fn linuxTripleSimple(allocator: *mem.Allocator, cpu_arch: Cpu.Arch, os_tag: Os.Tag, abi: Abi) ![]u8 { + return std.fmt.allocPrint(allocator, "{}-{}-{}", .{ @tagName(cpu_arch), @tagName(os_tag), @tagName(abi) }); } - pub fn linuxTriple(self: Target, allocator: *mem.Allocator) ![:0]u8 { + pub fn linuxTriple(self: Target, allocator: *mem.Allocator) ![]u8 { return linuxTripleSimple(allocator, self.cpu.arch, self.os.tag, self.abi); } diff --git a/lib/std/thread.zig b/lib/std/thread.zig index e11d13d4a8..5f6fb5abae 100644 --- a/lib/std/thread.zig +++ b/lib/std/thread.zig @@ -464,7 +464,7 @@ pub const Thread = struct { var count: c_int = undefined; var count_len: usize = @sizeOf(c_int); const name = if (comptime std.Target.current.isDarwin()) "hw.logicalcpu" else "hw.ncpu"; - os.sysctlbynameC(name, &count, &count_len, null, 0) catch |err| switch (err) { + os.sysctlbynameZ(name, &count, &count_len, null, 0) catch |err| switch (err) { error.NameTooLong, error.UnknownName => unreachable, else => |e| return e, }; diff --git a/lib/std/zig/cross_target.zig b/lib/std/zig/cross_target.zig index bea69b3978..76aff2ae51 100644 --- a/lib/std/zig/cross_target.zig +++ b/lib/std/zig/cross_target.zig @@ -495,17 +495,19 @@ pub const CrossTarget = struct { return self.isNativeCpu() and self.isNativeOs() and self.abi == null; } - pub fn zigTriple(self: CrossTarget, allocator: *mem.Allocator) error{OutOfMemory}![:0]u8 { + pub fn zigTriple(self: CrossTarget, allocator: *mem.Allocator) error{OutOfMemory}![]u8 { if (self.isNative()) { - return mem.dupeZ(allocator, u8, "native"); + return mem.dupe(allocator, u8, "native"); } const arch_name = if (self.cpu_arch) |arch| @tagName(arch) else "native"; const os_name = if (self.os_tag) |os_tag| @tagName(os_tag) else "native"; - var result = try std.Buffer.allocPrint(allocator, "{}-{}", .{ arch_name, os_name }); + var result = std.ArrayList(u8).init(allocator); defer result.deinit(); + try result.outStream().print("{}-{}", .{ arch_name, os_name }); + // The zig target syntax does not allow specifying a max os version with no min, so // if either are present, we need the min. if (self.os_version_min != null or self.os_version_max != null) { @@ -532,13 +534,13 @@ pub const CrossTarget = struct { return result.toOwnedSlice(); } - pub fn allocDescription(self: CrossTarget, allocator: *mem.Allocator) ![:0]u8 { + pub fn allocDescription(self: CrossTarget, allocator: *mem.Allocator) ![]u8 { // TODO is there anything else worthy of the description that is not // already captured in the triple? return self.zigTriple(allocator); } - pub fn linuxTriple(self: CrossTarget, allocator: *mem.Allocator) ![:0]u8 { + pub fn linuxTriple(self: CrossTarget, allocator: *mem.Allocator) ![]u8 { return Target.linuxTripleSimple(allocator, self.getCpuArch(), self.getOsTag(), self.getAbi()); } @@ -549,7 +551,7 @@ pub const CrossTarget = struct { pub const VcpkgLinkage = std.builtin.LinkMode; /// Returned slice must be freed by the caller. - pub fn vcpkgTriplet(self: CrossTarget, allocator: *mem.Allocator, linkage: VcpkgLinkage) ![:0]u8 { + pub fn vcpkgTriplet(self: CrossTarget, allocator: *mem.Allocator, linkage: VcpkgLinkage) ![]u8 { const arch = switch (self.getCpuArch()) { .i386 => "x86", .x86_64 => "x64", @@ -580,7 +582,7 @@ pub const CrossTarget = struct { .Dynamic => "", }; - return std.fmt.allocPrint0(allocator, "{}-{}{}", .{ arch, os, static_suffix }); + return std.fmt.allocPrint(allocator, "{}-{}{}", .{ arch, os, static_suffix }); } pub const Executor = union(enum) { @@ -763,7 +765,15 @@ test "CrossTarget.parse" { const text = try cross_target.zigTriple(std.testing.allocator); defer std.testing.allocator.free(text); - std.testing.expectEqualSlices(u8, "native-native-gnu.2.1.1", text); + + var buf: [256]u8 = undefined; + const triple = std.fmt.bufPrint( + buf[0..], + "native-native-{}.2.1.1", + .{@tagName(std.Target.current.abi)}, + ) catch unreachable; + + std.testing.expectEqualSlices(u8, triple, text); } { const cross_target = try CrossTarget.parse(.{ diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index daeb197913..91921786a2 100644 --- a/lib/std/zig/parser_test.zig +++ b/lib/std/zig/parser_test.zig @@ -373,6 +373,35 @@ test "zig fmt: correctly move doc comments on struct fields" { ); } +test "zig fmt: correctly space struct fields with doc comments" { + try testTransform( + \\pub const S = struct { + \\ /// A + \\ a: u8, + \\ /// B + \\ /// B (cont) + \\ b: u8, + \\ + \\ + \\ /// C + \\ c: u8, + \\}; + \\ + , + \\pub const S = struct { + \\ /// A + \\ a: u8, + \\ /// B + \\ /// B (cont) + \\ b: u8, + \\ + \\ /// C + \\ c: u8, + \\}; + \\ + ); +} + test "zig fmt: doc comments on param decl" { try testCanonical( \\pub const Allocator = struct { @@ -2924,7 +2953,7 @@ fn testParse(source: []const u8, allocator: *mem.Allocator, anything_changed: *b return error.ParseError; } - var buffer = try std.Buffer.initSize(allocator, 0); + var buffer = std.ArrayList(u8).init(allocator); errdefer buffer.deinit(); anything_changed.* = try std.zig.render(allocator, buffer.outStream(), tree); diff --git a/lib/std/zig/render.zig b/lib/std/zig/render.zig index 37d058bebf..1fe02dce08 100644 --- a/lib/std/zig/render.zig +++ b/lib/std/zig/render.zig @@ -187,12 +187,16 @@ fn renderExtraNewline(tree: *ast.Tree, stream: var, start_col: *usize, node: *as const first_token = node.firstToken(); var prev_token = first_token; if (prev_token == 0) return; + var newline_threshold: usize = 2; while (tree.tokens.at(prev_token - 1).id == .DocComment) { + if (tree.tokenLocation(tree.tokens.at(prev_token - 1).end, prev_token).line == 1) { + newline_threshold += 1; + } prev_token -= 1; } const prev_token_end = tree.tokens.at(prev_token - 1).end; const loc = tree.tokenLocation(prev_token_end, first_token); - if (loc.line >= 2) { + if (loc.line >= newline_threshold) { try stream.writeByte('\n'); start_col.* = 0; } @@ -1527,7 +1531,7 @@ fn renderExpression( try renderToken(tree, stream, callconv_rparen, indent, start_col, Space.Space); // ) } else if (cc_rewrite_str) |str| { try stream.writeAll("callconv("); - try stream.writeAll(mem.toSliceConst(u8, str)); + try stream.writeAll(mem.spanZ(str)); try stream.writeAll(") "); } diff --git a/lib/std/zig/system.zig b/lib/std/zig/system.zig index 1714437add..2ce7b406a4 100644 --- a/lib/std/zig/system.zig +++ b/lib/std/zig/system.zig @@ -119,7 +119,7 @@ pub const NativePaths = struct { } fn deinitArray(array: *ArrayList([:0]u8)) void { - for (array.toSlice()) |item| { + for (array.span()) |item| { array.allocator.free(item); } array.deinit(); @@ -201,7 +201,7 @@ pub const NativeTargetInfo = struct { switch (Target.current.os.tag) { .linux => { const uts = std.os.uname(); - const release = mem.toSliceConst(u8, &uts.release); + const release = mem.spanZ(&uts.release); // The release field may have several other fields after the // kernel version const kernel_version = if (mem.indexOfScalar(u8, release, '-')) |pos| @@ -265,7 +265,7 @@ pub const NativeTargetInfo = struct { // The osproductversion sysctl was introduced first with // High Sierra, thankfully that's also the baseline that Zig // supports - std.os.sysctlbynameC( + std.os.sysctlbynameZ( "kern.osproductversion", &product_version, &size, @@ -460,7 +460,7 @@ pub const NativeTargetInfo = struct { return result; } - const env_file = std.fs.openFileAbsoluteC("/usr/bin/env", .{}) catch |err| switch (err) { + const env_file = std.fs.openFileAbsoluteZ("/usr/bin/env", .{}) catch |err| switch (err) { error.NoSpaceLeft => unreachable, error.NameTooLong => unreachable, error.PathAlreadyExists => unreachable, @@ -515,7 +515,7 @@ pub const NativeTargetInfo = struct { fn glibcVerFromSO(so_path: [:0]const u8) !std.builtin.Version { var link_buf: [std.os.PATH_MAX]u8 = undefined; - const link_name = std.os.readlinkC(so_path.ptr, &link_buf) catch |err| switch (err) { + const link_name = std.os.readlinkZ(so_path.ptr, &link_buf) catch |err| switch (err) { error.AccessDenied => return error.GnuLibCVersionUnavailable, error.FileSystem => return error.FileSystem, error.SymLinkLoop => return error.SymLinkLoop, @@ -625,9 +625,10 @@ pub const NativeTargetInfo = struct { const p_offset = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset); const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz); if (p_filesz > result.dynamic_linker.buffer.len) return error.NameTooLong; - _ = try preadMin(file, result.dynamic_linker.buffer[0..p_filesz], p_offset, p_filesz); - // PT_INTERP includes a null byte in p_filesz. - const len = p_filesz - 1; + const filesz = @intCast(usize, p_filesz); + _ = try preadMin(file, result.dynamic_linker.buffer[0..filesz], p_offset, filesz); + // PT_INTERP includes a null byte in filesz. + const len = filesz - 1; // dynamic_linker.max_byte is "max", not "len". // We know it will fit in u8 because we check against dynamic_linker.buffer.len above. result.dynamic_linker.max_byte = @intCast(u8, len - 1); @@ -648,7 +649,7 @@ pub const NativeTargetInfo = struct { { var dyn_off = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset); const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz); - const dyn_size: u64 = if (is_64) @sizeOf(elf.Elf64_Dyn) else @sizeOf(elf.Elf32_Dyn); + const dyn_size: usize = if (is_64) @sizeOf(elf.Elf64_Dyn) else @sizeOf(elf.Elf32_Dyn); const dyn_num = p_filesz / dyn_size; var dyn_buf: [16 * @sizeOf(elf.Elf64_Dyn)]u8 align(@alignOf(elf.Elf64_Dyn)) = undefined; var dyn_i: usize = 0; @@ -739,7 +740,7 @@ pub const NativeTargetInfo = struct { ); const sh_name_off = elfInt(is_64, need_bswap, sh32.sh_name, sh64.sh_name); // TODO this pointer cast should not be necessary - const sh_name = mem.toSliceConst(u8, @ptrCast([*:0]u8, shstrtab[sh_name_off..].ptr)); + const sh_name = mem.spanZ(@ptrCast([*:0]u8, shstrtab[sh_name_off..].ptr)); if (mem.eql(u8, sh_name, ".dynstr")) { break :find_dyn_str .{ .offset = elfInt(is_64, need_bswap, sh32.sh_offset, sh64.sh_offset), @@ -754,7 +755,10 @@ pub const NativeTargetInfo = struct { const strtab_read_len = try preadMin(file, &strtab_buf, ds.offset, shstrtab_len); const strtab = strtab_buf[0..strtab_read_len]; // TODO this pointer cast should not be necessary - const rpath_list = mem.toSliceConst(u8, @ptrCast([*:0]u8, strtab[rpoff..].ptr)); + const rpoff_usize = std.math.cast(usize, rpoff) catch |err| switch (err) { + error.Overflow => return error.InvalidElfFile, + }; + const rpath_list = mem.spanZ(@ptrCast([*:0]u8, strtab[rpoff_usize..].ptr)); var it = mem.tokenize(rpath_list, ":"); while (it.next()) |rpath| { var dir = fs.cwd().openDir(rpath, .{}) catch |err| switch (err) { @@ -779,7 +783,7 @@ pub const NativeTargetInfo = struct { defer dir.close(); var link_buf: [std.os.PATH_MAX]u8 = undefined; - const link_name = std.os.readlinkatC( + const link_name = std.os.readlinkatZ( dir.fd, glibc_so_basename, &link_buf, @@ -814,7 +818,7 @@ pub const NativeTargetInfo = struct { } fn preadMin(file: fs.File, buf: []u8, offset: u64, min_read_len: usize) !usize { - var i: u64 = 0; + var i: usize = 0; while (i < min_read_len) { const len = file.pread(buf[i .. buf.len - i], offset + i) catch |err| switch (err) { error.OperationAborted => unreachable, // Windows-only diff --git a/src-self-hosted/clang_options_data.zig b/src-self-hosted/clang_options_data.zig index 14dcec4fb1..0b3a3b9416 100644 --- a/src-self-hosted/clang_options_data.zig +++ b/src-self-hosted/clang_options_data.zig @@ -7,7 +7,7 @@ flagpd1("CC"), .{ .name = "E", .syntax = .flag, - .zig_equivalent = .preprocess, + .zig_equivalent = .pp_or_asm, .pd1 = true, .pd2 = false, .psl = false, @@ -26,12 +26,26 @@ flagpd1("H"), }, flagpd1("I-"), flagpd1("M"), -flagpd1("MD"), +.{ + .name = "MD", + .syntax = .flag, + .zig_equivalent = .dep_file, + .pd1 = true, + .pd2 = false, + .psl = false, +}, flagpd1("MG"), flagpd1("MM"), flagpd1("MMD"), flagpd1("MP"), -flagpd1("MV"), +.{ + .name = "MV", + .syntax = .flag, + .zig_equivalent = .dep_file, + .pd1 = true, + .pd2 = false, + .psl = false, +}, flagpd1("Mach"), flagpd1("O0"), flagpd1("O4"), @@ -53,7 +67,7 @@ flagpd1("Qy"), .{ .name = "S", .syntax = .flag, - .zig_equivalent = .driver_punt, + .zig_equivalent = .pp_or_asm, .pd1 = true, .pd2 = false, .psl = false, @@ -154,7 +168,7 @@ sepd1("Zlinker-input"), .{ .name = "E", .syntax = .flag, - .zig_equivalent = .preprocess, + .zig_equivalent = .pp_or_asm, .pd1 = true, .pd2 = false, .psl = true, @@ -490,7 +504,7 @@ sepd1("Zlinker-input"), .{ .name = "MD", .syntax = .flag, - .zig_equivalent = .other, + .zig_equivalent = .dep_file, .pd1 = true, .pd2 = false, .psl = true, @@ -1442,7 +1456,7 @@ sepd1("Zlinker-input"), .{ .name = "assemble", .syntax = .flag, - .zig_equivalent = .driver_punt, + .zig_equivalent = .pp_or_asm, .pd1 = false, .pd2 = true, .psl = false, @@ -1658,7 +1672,7 @@ sepd1("Zlinker-input"), .{ .name = "library-directory", .syntax = .separate, - .zig_equivalent = .other, + .zig_equivalent = .lib_dir, .pd1 = false, .pd2 = true, .psl = false, @@ -1770,7 +1784,7 @@ sepd1("Zlinker-input"), .{ .name = "preprocess", .syntax = .flag, - .zig_equivalent = .preprocess, + .zig_equivalent = .pp_or_asm, .pd1 = false, .pd2 = true, .psl = false, @@ -2554,14 +2568,7 @@ flagpd1("femulated-tls"), flagpd1("fencode-extended-block-signature"), sepd1("ferror-limit"), flagpd1("fescaping-block-tail-calls"), -.{ - .name = "fexceptions", - .syntax = .flag, - .zig_equivalent = .exceptions, - .pd1 = true, - .pd2 = false, - .psl = false, -}, +flagpd1("fexceptions"), flagpd1("fexperimental-isel"), flagpd1("fexperimental-new-constant-interpreter"), flagpd1("fexperimental-new-pass-manager"), @@ -2765,14 +2772,7 @@ flagpd1("fno-elide-type"), flagpd1("fno-eliminate-unused-debug-symbols"), flagpd1("fno-emulated-tls"), flagpd1("fno-escaping-block-tail-calls"), -.{ - .name = "fno-exceptions", - .syntax = .flag, - .zig_equivalent = .no_exceptions, - .pd1 = true, - .pd2 = false, - .psl = false, -}, +flagpd1("fno-exceptions"), flagpd1("fno-experimental-isel"), flagpd1("fno-experimental-new-pass-manager"), flagpd1("fno-fast-math"), @@ -2861,14 +2861,7 @@ flagpd1("fno-rewrite-includes"), flagpd1("fno-ropi"), flagpd1("fno-rounding-math"), flagpd1("fno-rtlib-add-rpath"), -.{ - .name = "fno-rtti", - .syntax = .flag, - .zig_equivalent = .no_rtti, - .pd1 = true, - .pd2 = false, - .psl = false, -}, +flagpd1("fno-rtti"), flagpd1("fno-rtti-data"), flagpd1("fno-rwpi"), flagpd1("fno-sanitize-address-poison-custom-array-cookie"), @@ -2996,7 +2989,14 @@ sepd1("fprofile-remapping-file"), flagpd1("fprofile-sample-accurate"), flagpd1("fprofile-sample-use"), flagpd1("fprofile-use"), -sepd1("framework"), +.{ + .name = "framework", + .syntax = .separate, + .zig_equivalent = .framework, + .pd1 = true, + .pd2 = false, + .psl = false, +}, flagpd1("freciprocal-math"), flagpd1("frecord-command-line"), flagpd1("ffree-form"), @@ -3016,14 +3016,7 @@ flagpd1("fno-frontend-optimize"), flagpd1("fropi"), flagpd1("frounding-math"), flagpd1("frtlib-add-rpath"), -.{ - .name = "frtti", - .syntax = .flag, - .zig_equivalent = .rtti, - .pd1 = true, - .pd2 = false, - .psl = false, -}, +flagpd1("frtti"), flagpd1("frwpi"), flagpd1("fsanitize-address-globals-dead-stripping"), flagpd1("fsanitize-address-poison-custom-array-cookie"), @@ -4562,7 +4555,7 @@ joinpd1("target-sdk-version="), .{ .name = "library-directory=", .syntax = .joined, - .zig_equivalent = .other, + .zig_equivalent = .lib_dir, .pd1 = false, .pd2 = true, .psl = false, @@ -5282,8 +5275,22 @@ joinpd1("fixit="), joinpd1("gstabs"), joinpd1("gxcoff"), jspd1("iquote"), -joinpd1("march="), -joinpd1("mtune="), +.{ + .name = "march=", + .syntax = .joined, + .zig_equivalent = .mcpu, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "mtune=", + .syntax = .joined, + .zig_equivalent = .mcpu, + .pd1 = true, + .pd2 = false, + .psl = false, +}, .{ .name = "rtlib=", .syntax = .joined, @@ -5348,7 +5355,14 @@ joinpd1("gcoff"), joinpd1("mabi="), joinpd1("mabs="), joinpd1("masm="), -joinpd1("mcpu="), +.{ + .name = "mcpu=", + .syntax = .joined, + .zig_equivalent = .mcpu, + .pd1 = true, + .pd2 = false, + .psl = false, +}, joinpd1("mfpu="), joinpd1("mhvx="), joinpd1("mmcu="), @@ -5441,7 +5455,14 @@ joinpd1("mtp="), joinpd1("gz="), joinpd1("A-"), joinpd1("G="), -jspd1("MF"), +.{ + .name = "MF", + .syntax = .joined_or_separate, + .zig_equivalent = .dep_file, + .pd1 = true, + .pd2 = false, + .psl = false, +}, jspd1("MJ"), jspd1("MQ"), jspd1("MT"), @@ -5656,11 +5677,25 @@ jspd1("MT"), jspd1("A"), jspd1("B"), jspd1("D"), -jspd1("F"), +.{ + .name = "F", + .syntax = .joined_or_separate, + .zig_equivalent = .framework_dir, + .pd1 = true, + .pd2 = false, + .psl = false, +}, jspd1("G"), jspd1("I"), jspd1("J"), -jspd1("L"), +.{ + .name = "L", + .syntax = .joined_or_separate, + .zig_equivalent = .lib_dir, + .pd1 = true, + .pd2 = false, + .psl = false, +}, .{ .name = "O", .syntax = .joined, @@ -5694,7 +5729,7 @@ joinpd1("Z"), .{ .name = "F", .syntax = .joined_or_separate, - .zig_equivalent = .other, + .zig_equivalent = .framework_dir, .pd1 = true, .pd2 = false, .psl = true, diff --git a/src-self-hosted/codegen.zig b/src-self-hosted/codegen.zig index 74eff90dc8..585ba6c51a 100644 --- a/src-self-hosted/codegen.zig +++ b/src-self-hosted/codegen.zig @@ -25,10 +25,10 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code) const context = llvm_handle.node.data; - const module = llvm.ModuleCreateWithNameInContext(comp.name.toSliceConst(), context) orelse return error.OutOfMemory; + const module = llvm.ModuleCreateWithNameInContext(comp.name.span(), context) orelse return error.OutOfMemory; defer llvm.DisposeModule(module); - llvm.SetTarget(module, comp.llvm_triple.toSliceConst()); + llvm.SetTarget(module, comp.llvm_triple.span()); llvm.SetDataLayout(module, comp.target_layout_str); if (comp.target.getObjectFormat() == .coff) { @@ -45,7 +45,7 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code) // Don't use ZIG_VERSION_STRING here. LLVM misparses it when it includes // the git revision. - const producer = try std.Buffer.allocPrint(&code.arena.allocator, "zig {}.{}.{}", .{ + const producer = try std.fmt.allocPrintZ(&code.arena.allocator, "zig {}.{}.{}", .{ @as(u32, c.ZIG_VERSION_MAJOR), @as(u32, c.ZIG_VERSION_MINOR), @as(u32, c.ZIG_VERSION_PATCH), @@ -54,15 +54,15 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code) const runtime_version = 0; const compile_unit_file = llvm.CreateFile( dibuilder, - comp.name.toSliceConst(), - comp.root_package.root_src_dir.toSliceConst(), + comp.name.span(), + comp.root_package.root_src_dir.span(), ) orelse return error.OutOfMemory; const is_optimized = comp.build_mode != .Debug; const compile_unit = llvm.CreateCompileUnit( dibuilder, DW.LANG_C99, compile_unit_file, - producer.toSliceConst(), + producer, is_optimized, flags, runtime_version, @@ -109,14 +109,14 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code) if (llvm.TargetMachineEmitToFile( comp.target_machine, module, - output_path.toSliceConst(), + output_path.span(), llvm.EmitBinary, &err_msg, is_debug, is_small, )) { if (std.debug.runtime_safety) { - std.debug.panic("unable to write object file {}: {s}\n", .{ output_path.toSliceConst(), err_msg }); + std.debug.panic("unable to write object file {}: {s}\n", .{ output_path.span(), err_msg }); } return error.WritingObjectFileFailed; } @@ -127,7 +127,7 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code) llvm.DumpModule(ofile.module); } if (comp.verbose_link) { - std.debug.warn("created {}\n", .{output_path.toSliceConst()}); + std.debug.warn("created {}\n", .{output_path.span()}); } } @@ -150,7 +150,7 @@ pub fn renderToLlvmModule(ofile: *ObjectFile, fn_val: *Value.Fn, code: *ir.Code) const llvm_fn_type = try fn_val.base.typ.getLlvmType(ofile.arena, ofile.context); const llvm_fn = llvm.AddFunction( ofile.module, - fn_val.symbol_name.toSliceConst(), + fn_val.symbol_name.span(), llvm_fn_type, ) orelse return error.OutOfMemory; @@ -211,7 +211,7 @@ pub fn renderToLlvmModule(ofile: *ObjectFile, fn_val: *Value.Fn, code: *ir.Code) const cur_ret_ptr = if (fn_type_normal.return_type.handleIsPtr()) llvm.GetParam(llvm_fn, 0) else null; // build all basic blocks - for (code.basic_block_list.toSlice()) |bb| { + for (code.basic_block_list.span()) |bb| { bb.llvm_block = llvm.AppendBasicBlockInContext( ofile.context, llvm_fn, @@ -226,7 +226,7 @@ pub fn renderToLlvmModule(ofile: *ObjectFile, fn_val: *Value.Fn, code: *ir.Code) // TODO set up error return tracing // TODO allocate temporary stack values - const var_list = fn_type.non_key.Normal.variable_list.toSliceConst(); + const var_list = fn_type.non_key.Normal.variable_list.span(); // create debug variable declarations for variables and allocate all local variables for (var_list) |var_scope, i| { const var_type = switch (var_scope.data) { @@ -306,9 +306,9 @@ pub fn renderToLlvmModule(ofile: *ObjectFile, fn_val: *Value.Fn, code: *ir.Code) //} } - for (code.basic_block_list.toSlice()) |current_block| { + for (code.basic_block_list.span()) |current_block| { llvm.PositionBuilderAtEnd(ofile.builder, current_block.llvm_block); - for (current_block.instruction_list.toSlice()) |instruction| { + for (current_block.instruction_list.span()) |instruction| { if (instruction.ref_count == 0 and !instruction.hasSideEffects()) continue; instruction.llvm_value = try instruction.render(ofile, fn_val); diff --git a/src-self-hosted/compilation.zig b/src-self-hosted/compilation.zig index 03e71c102d..8f9fe9ebc2 100644 --- a/src-self-hosted/compilation.zig +++ b/src-self-hosted/compilation.zig @@ -2,7 +2,7 @@ const std = @import("std"); const io = std.io; const mem = std.mem; const Allocator = mem.Allocator; -const Buffer = std.Buffer; +const ArrayListSentineled = std.ArrayListSentineled; const llvm = @import("llvm.zig"); const c = @import("c.zig"); const builtin = std.builtin; @@ -123,8 +123,8 @@ pub const LlvmHandle = struct { pub const Compilation = struct { zig_compiler: *ZigCompiler, - name: Buffer, - llvm_triple: Buffer, + name: ArrayListSentineled(u8, 0), + llvm_triple: ArrayListSentineled(u8, 0), root_src_path: ?[]const u8, target: std.Target, llvm_target: *llvm.Target, @@ -444,7 +444,7 @@ pub const Compilation = struct { comp.arena_allocator.deinit(); } - comp.name = try Buffer.init(comp.arena(), name); + comp.name = try ArrayListSentineled(u8, 0).init(comp.arena(), name); comp.llvm_triple = try util.getLLVMTriple(comp.arena(), target); comp.llvm_target = try util.llvmTargetFromTriple(comp.llvm_triple); comp.zig_std_dir = try fs.path.join(comp.arena(), &[_][]const u8{ zig_lib_dir, "std" }); @@ -465,7 +465,7 @@ pub const Compilation = struct { comp.target_machine = llvm.CreateTargetMachine( comp.llvm_target, - comp.llvm_triple.toSliceConst(), + comp.llvm_triple.span(), target_specific_cpu_args orelse "", target_specific_cpu_features orelse "", opt_level, @@ -1106,7 +1106,7 @@ pub const Compilation = struct { } } - for (self.link_libs_list.toSliceConst()) |existing_lib| { + for (self.link_libs_list.span()) |existing_lib| { if (mem.eql(u8, name, existing_lib.name)) { return existing_lib; } @@ -1151,7 +1151,7 @@ pub const Compilation = struct { /// If the temporary directory for this compilation has not been created, it creates it. /// Then it creates a random file name in that dir and returns it. - pub fn createRandomOutputPath(self: *Compilation, suffix: []const u8) !Buffer { + pub fn createRandomOutputPath(self: *Compilation, suffix: []const u8) !ArrayListSentineled(u8, 0) { const tmp_dir = try self.getTmpDir(); const file_prefix = self.getRandomFileName(); @@ -1161,7 +1161,7 @@ pub const Compilation = struct { const full_path = try fs.path.join(self.gpa(), &[_][]const u8{ tmp_dir, file_name[0..] }); errdefer self.gpa().free(full_path); - return Buffer.fromOwnedSlice(self.gpa(), full_path); + return ArrayListSentineled(u8, 0).fromOwnedSlice(self.gpa(), full_path); } /// If the temporary directory for this Compilation has not been created, creates it. @@ -1279,7 +1279,7 @@ fn generateDeclFn(comp: *Compilation, fn_decl: *Decl.Fn) !void { const fn_type = try analyzeFnType(comp, tree_scope, fn_decl.base.parent_scope, fn_decl.fn_proto); defer fn_type.base.base.deref(comp); - var symbol_name = try std.Buffer.init(comp.gpa(), fn_decl.base.name); + var symbol_name = try std.ArrayListSentineled(u8, 0).init(comp.gpa(), fn_decl.base.name); var symbol_name_consumed = false; errdefer if (!symbol_name_consumed) symbol_name.deinit(); @@ -1371,7 +1371,7 @@ fn analyzeFnType( var params = ArrayList(Type.Fn.Param).init(comp.gpa()); var params_consumed = false; defer if (!params_consumed) { - for (params.toSliceConst()) |param| { + for (params.span()) |param| { param.typ.base.deref(comp); } params.deinit(); @@ -1426,7 +1426,7 @@ fn generateDeclFnProto(comp: *Compilation, fn_decl: *Decl.Fn) !void { ); defer fn_type.base.base.deref(comp); - var symbol_name = try std.Buffer.init(comp.gpa(), fn_decl.base.name); + var symbol_name = try std.ArrayListSentineled(u8, 0).init(comp.gpa(), fn_decl.base.name); var symbol_name_consumed = false; defer if (!symbol_name_consumed) symbol_name.deinit(); diff --git a/src-self-hosted/dep_tokenizer.zig b/src-self-hosted/dep_tokenizer.zig index e0c67694e1..cad12834a7 100644 --- a/src-self-hosted/dep_tokenizer.zig +++ b/src-self-hosted/dep_tokenizer.zig @@ -33,7 +33,7 @@ pub const Tokenizer = struct { break; // advance }, else => { - self.state = State{ .target = try std.Buffer.initSize(&self.arena.allocator, 0) }; + self.state = State{ .target = try std.ArrayListSentineled(u8, 0).initSize(&self.arena.allocator, 0) }; }, }, .target => |*target| switch (char) { @@ -53,7 +53,7 @@ pub const Tokenizer = struct { break; // advance }, else => { - try target.appendByte(char); + try target.append(char); break; // advance }, }, @@ -62,24 +62,24 @@ pub const Tokenizer = struct { return self.errorIllegalChar(self.index, char, "bad target escape", .{}); }, ' ', '#', '\\' => { - try target.appendByte(char); + try target.append(char); self.state = State{ .target = target.* }; break; // advance }, '$' => { - try target.append(self.bytes[self.index - 1 .. self.index]); + try target.appendSlice(self.bytes[self.index - 1 .. self.index]); self.state = State{ .target_dollar_sign = target.* }; break; // advance }, else => { - try target.append(self.bytes[self.index - 1 .. self.index + 1]); + try target.appendSlice(self.bytes[self.index - 1 .. self.index + 1]); self.state = State{ .target = target.* }; break; // advance }, }, .target_dollar_sign => |*target| switch (char) { '$' => { - try target.appendByte(char); + try target.append(char); self.state = State{ .target = target.* }; break; // advance }, @@ -89,7 +89,7 @@ pub const Tokenizer = struct { }, .target_colon => |*target| switch (char) { '\n', '\r' => { - const bytes = target.toSlice(); + const bytes = target.span(); if (bytes.len != 0) { self.state = State{ .lhs = {} }; return Token{ .id = .target, .bytes = bytes }; @@ -103,7 +103,7 @@ pub const Tokenizer = struct { break; // advance }, else => { - const bytes = target.toSlice(); + const bytes = target.span(); if (bytes.len != 0) { self.state = State{ .rhs = {} }; return Token{ .id = .target, .bytes = bytes }; @@ -115,7 +115,7 @@ pub const Tokenizer = struct { }, .target_colon_reverse_solidus => |*target| switch (char) { '\n', '\r' => { - const bytes = target.toSlice(); + const bytes = target.span(); if (bytes.len != 0) { self.state = State{ .lhs = {} }; return Token{ .id = .target, .bytes = bytes }; @@ -125,7 +125,7 @@ pub const Tokenizer = struct { continue; }, else => { - try target.append(self.bytes[self.index - 2 .. self.index + 1]); + try target.appendSlice(self.bytes[self.index - 2 .. self.index + 1]); self.state = State{ .target = target.* }; break; }, @@ -144,11 +144,11 @@ pub const Tokenizer = struct { break; // advance }, '"' => { - self.state = State{ .prereq_quote = try std.Buffer.initSize(&self.arena.allocator, 0) }; + self.state = State{ .prereq_quote = try std.ArrayListSentineled(u8, 0).initSize(&self.arena.allocator, 0) }; break; // advance }, else => { - self.state = State{ .prereq = try std.Buffer.initSize(&self.arena.allocator, 0) }; + self.state = State{ .prereq = try std.ArrayListSentineled(u8, 0).initSize(&self.arena.allocator, 0) }; }, }, .rhs_continuation => switch (char) { @@ -175,24 +175,24 @@ pub const Tokenizer = struct { }, .prereq_quote => |*prereq| switch (char) { '"' => { - const bytes = prereq.toSlice(); + const bytes = prereq.span(); self.index += 1; self.state = State{ .rhs = {} }; return Token{ .id = .prereq, .bytes = bytes }; }, else => { - try prereq.appendByte(char); + try prereq.append(char); break; // advance }, }, .prereq => |*prereq| switch (char) { '\t', ' ' => { - const bytes = prereq.toSlice(); + const bytes = prereq.span(); self.state = State{ .rhs = {} }; return Token{ .id = .prereq, .bytes = bytes }; }, '\n', '\r' => { - const bytes = prereq.toSlice(); + const bytes = prereq.span(); self.state = State{ .lhs = {} }; return Token{ .id = .prereq, .bytes = bytes }; }, @@ -201,13 +201,13 @@ pub const Tokenizer = struct { break; // advance }, else => { - try prereq.appendByte(char); + try prereq.append(char); break; // advance }, }, .prereq_continuation => |*prereq| switch (char) { '\n' => { - const bytes = prereq.toSlice(); + const bytes = prereq.span(); self.index += 1; self.state = State{ .rhs = {} }; return Token{ .id = .prereq, .bytes = bytes }; @@ -218,14 +218,14 @@ pub const Tokenizer = struct { }, else => { // not continuation - try prereq.append(self.bytes[self.index - 1 .. self.index + 1]); + try prereq.appendSlice(self.bytes[self.index - 1 .. self.index + 1]); self.state = State{ .prereq = prereq.* }; break; // advance }, }, .prereq_continuation_linefeed => |prereq| switch (char) { '\n' => { - const bytes = prereq.toSlice(); + const bytes = prereq.span(); self.index += 1; self.state = State{ .rhs = {} }; return Token{ .id = .prereq, .bytes = bytes }; @@ -249,7 +249,7 @@ pub const Tokenizer = struct { .rhs_continuation_linefeed, => {}, .target => |target| { - return self.errorPosition(idx, target.toSlice(), "incomplete target", .{}); + return self.errorPosition(idx, target.span(), "incomplete target", .{}); }, .target_reverse_solidus, .target_dollar_sign, @@ -258,7 +258,7 @@ pub const Tokenizer = struct { return self.errorIllegalChar(idx, self.bytes[idx], "incomplete escape", .{}); }, .target_colon => |target| { - const bytes = target.toSlice(); + const bytes = target.span(); if (bytes.len != 0) { self.index += 1; self.state = State{ .rhs = {} }; @@ -268,7 +268,7 @@ pub const Tokenizer = struct { self.state = State{ .lhs = {} }; }, .target_colon_reverse_solidus => |target| { - const bytes = target.toSlice(); + const bytes = target.span(); if (bytes.len != 0) { self.index += 1; self.state = State{ .rhs = {} }; @@ -278,20 +278,20 @@ pub const Tokenizer = struct { self.state = State{ .lhs = {} }; }, .prereq_quote => |prereq| { - return self.errorPosition(idx, prereq.toSlice(), "incomplete quoted prerequisite", .{}); + return self.errorPosition(idx, prereq.span(), "incomplete quoted prerequisite", .{}); }, .prereq => |prereq| { - const bytes = prereq.toSlice(); + const bytes = prereq.span(); self.state = State{ .lhs = {} }; return Token{ .id = .prereq, .bytes = bytes }; }, .prereq_continuation => |prereq| { - const bytes = prereq.toSlice(); + const bytes = prereq.span(); self.state = State{ .lhs = {} }; return Token{ .id = .prereq, .bytes = bytes }; }, .prereq_continuation_linefeed => |prereq| { - const bytes = prereq.toSlice(); + const bytes = prereq.span(); self.state = State{ .lhs = {} }; return Token{ .id = .prereq, .bytes = bytes }; }, @@ -300,29 +300,29 @@ pub const Tokenizer = struct { } fn errorf(self: *Tokenizer, comptime fmt: []const u8, args: var) Error { - self.error_text = (try std.Buffer.allocPrint(&self.arena.allocator, fmt, args)).toSlice(); + self.error_text = try std.fmt.allocPrintZ(&self.arena.allocator, fmt, args); return Error.InvalidInput; } fn errorPosition(self: *Tokenizer, position: usize, bytes: []const u8, comptime fmt: []const u8, args: var) Error { - var buffer = try std.Buffer.initSize(&self.arena.allocator, 0); + var buffer = try std.ArrayListSentineled(u8, 0).initSize(&self.arena.allocator, 0); try buffer.outStream().print(fmt, args); - try buffer.append(" '"); - var out = makeOutput(std.Buffer.append, &buffer); + try buffer.appendSlice(" '"); + var out = makeOutput(std.ArrayListSentineled(u8, 0).appendSlice, &buffer); try printCharValues(&out, bytes); - try buffer.append("'"); + try buffer.appendSlice("'"); try buffer.outStream().print(" at position {}", .{position - (bytes.len - 1)}); - self.error_text = buffer.toSlice(); + self.error_text = buffer.span(); return Error.InvalidInput; } fn errorIllegalChar(self: *Tokenizer, position: usize, char: u8, comptime fmt: []const u8, args: var) Error { - var buffer = try std.Buffer.initSize(&self.arena.allocator, 0); - try buffer.append("illegal char "); + var buffer = try std.ArrayListSentineled(u8, 0).initSize(&self.arena.allocator, 0); + try buffer.appendSlice("illegal char "); try printUnderstandableChar(&buffer, char); try buffer.outStream().print(" at position {}", .{position}); if (fmt.len != 0) try buffer.outStream().print(": " ++ fmt, args); - self.error_text = buffer.toSlice(); + self.error_text = buffer.span(); return Error.InvalidInput; } @@ -333,18 +333,18 @@ pub const Tokenizer = struct { const State = union(enum) { lhs: void, - target: std.Buffer, - target_reverse_solidus: std.Buffer, - target_dollar_sign: std.Buffer, - target_colon: std.Buffer, - target_colon_reverse_solidus: std.Buffer, + target: std.ArrayListSentineled(u8, 0), + target_reverse_solidus: std.ArrayListSentineled(u8, 0), + target_dollar_sign: std.ArrayListSentineled(u8, 0), + target_colon: std.ArrayListSentineled(u8, 0), + target_colon_reverse_solidus: std.ArrayListSentineled(u8, 0), rhs: void, rhs_continuation: void, rhs_continuation_linefeed: void, - prereq_quote: std.Buffer, - prereq: std.Buffer, - prereq_continuation: std.Buffer, - prereq_continuation_linefeed: std.Buffer, + prereq_quote: std.ArrayListSentineled(u8, 0), + prereq: std.ArrayListSentineled(u8, 0), + prereq_continuation: std.ArrayListSentineled(u8, 0), + prereq_continuation_linefeed: std.ArrayListSentineled(u8, 0), }; const Token = struct { @@ -841,31 +841,31 @@ fn depTokenizer(input: []const u8, expect: []const u8) !void { defer arena_allocator.deinit(); var it = Tokenizer.init(arena, input); - var buffer = try std.Buffer.initSize(arena, 0); + var buffer = try std.ArrayListSentineled(u8, 0).initSize(arena, 0); var i: usize = 0; while (true) { const r = it.next() catch |err| { switch (err) { Tokenizer.Error.InvalidInput => { - if (i != 0) try buffer.append("\n"); - try buffer.append("ERROR: "); - try buffer.append(it.error_text); + if (i != 0) try buffer.appendSlice("\n"); + try buffer.appendSlice("ERROR: "); + try buffer.appendSlice(it.error_text); }, else => return err, } break; }; const token = r orelse break; - if (i != 0) try buffer.append("\n"); - try buffer.append(@tagName(token.id)); - try buffer.append(" = {"); + if (i != 0) try buffer.appendSlice("\n"); + try buffer.appendSlice(@tagName(token.id)); + try buffer.appendSlice(" = {"); for (token.bytes) |b| { - try buffer.appendByte(printable_char_tab[b]); + try buffer.append(printable_char_tab[b]); } - try buffer.append("}"); + try buffer.appendSlice("}"); i += 1; } - const got: []const u8 = buffer.toSlice(); + const got: []const u8 = buffer.span(); if (std.mem.eql(u8, expect, got)) { testing.expect(true); @@ -995,13 +995,13 @@ fn printCharValues(out: var, bytes: []const u8) !void { } } -fn printUnderstandableChar(buffer: *std.Buffer, char: u8) !void { +fn printUnderstandableChar(buffer: *std.ArrayListSentineled(u8, 0), char: u8) !void { if (!std.ascii.isPrint(char) or char == ' ') { try buffer.outStream().print("\\x{X:2}", .{char}); } else { - try buffer.append("'"); - try buffer.appendByte(printable_char_tab[char]); - try buffer.append("'"); + try buffer.appendSlice("'"); + try buffer.append(printable_char_tab[char]); + try buffer.appendSlice("'"); } } diff --git a/src-self-hosted/errmsg.zig b/src-self-hosted/errmsg.zig index 606c8c4b3a..5775c1df83 100644 --- a/src-self-hosted/errmsg.zig +++ b/src-self-hosted/errmsg.zig @@ -158,7 +158,7 @@ pub const Msg = struct { parse_error: *const ast.Error, ) !*Msg { const loc_token = parse_error.loc(); - var text_buf = try std.Buffer.initSize(comp.gpa(), 0); + var text_buf = std.ArrayList(u8).init(comp.gpa()); defer text_buf.deinit(); const realpath_copy = try mem.dupe(comp.gpa(), u8, tree_scope.root().realpath); @@ -197,7 +197,7 @@ pub const Msg = struct { realpath: []const u8, ) !*Msg { const loc_token = parse_error.loc(); - var text_buf = try std.Buffer.initSize(allocator, 0); + var text_buf = std.ArrayList(u8).init(allocator); defer text_buf.deinit(); const realpath_copy = try mem.dupe(allocator, u8, realpath); diff --git a/src-self-hosted/ir.zig b/src-self-hosted/ir.zig index 7ad9e0ccc4..ce3d9080ba 100644 --- a/src-self-hosted/ir.zig +++ b/src-self-hosted/ir.zig @@ -965,9 +965,9 @@ pub const Code = struct { pub fn dump(self: *Code) void { var bb_i: usize = 0; - for (self.basic_block_list.toSliceConst()) |bb| { + for (self.basic_block_list.span()) |bb| { std.debug.warn("{s}_{}:\n", .{ bb.name_hint, bb.debug_id }); - for (bb.instruction_list.toSliceConst()) |instr| { + for (bb.instruction_list.span()) |instr| { std.debug.warn(" ", .{}); instr.dump(); std.debug.warn("\n", .{}); @@ -978,7 +978,7 @@ pub const Code = struct { /// returns a ref-incremented value, or adds a compile error pub fn getCompTimeResult(self: *Code, comp: *Compilation) !*Value { const bb = self.basic_block_list.at(0); - for (bb.instruction_list.toSliceConst()) |inst| { + for (bb.instruction_list.span()) |inst| { if (inst.cast(Inst.Return)) |ret_inst| { const ret_value = ret_inst.params.return_value; if (ret_value.isCompTime()) { @@ -2585,6 +2585,6 @@ pub fn analyze(comp: *Compilation, old_code: *Code, expected_type: ?*Type) !*Cod return ira.irb.finish(); } - ira.irb.code.return_type = try ira.resolvePeerTypes(expected_type, ira.src_implicit_return_type_list.toSliceConst()); + ira.irb.code.return_type = try ira.resolvePeerTypes(expected_type, ira.src_implicit_return_type_list.span()); return ira.irb.finish(); } diff --git a/src-self-hosted/libc_installation.zig b/src-self-hosted/libc_installation.zig index 996f705060..60124d30e5 100644 --- a/src-self-hosted/libc_installation.zig +++ b/src-self-hosted/libc_installation.zig @@ -14,11 +14,11 @@ usingnamespace @import("windows_sdk.zig"); /// See the render function implementation for documentation of the fields. pub const LibCInstallation = struct { - include_dir: ?[:0]const u8 = null, - sys_include_dir: ?[:0]const u8 = null, - crt_dir: ?[:0]const u8 = null, - msvc_lib_dir: ?[:0]const u8 = null, - kernel32_lib_dir: ?[:0]const u8 = null, + include_dir: ?[]const u8 = null, + sys_include_dir: ?[]const u8 = null, + crt_dir: ?[]const u8 = null, + msvc_lib_dir: ?[]const u8 = null, + kernel32_lib_dir: ?[]const u8 = null, pub const FindError = error{ OutOfMemory, @@ -54,7 +54,7 @@ pub const LibCInstallation = struct { } } - const contents = try std.io.readFileAlloc(allocator, libc_file); + const contents = try std.fs.cwd().readFileAlloc(allocator, libc_file, std.math.maxInt(usize)); defer allocator.free(contents); var it = std.mem.tokenize(contents, "\n"); @@ -229,7 +229,7 @@ pub const LibCInstallation = struct { "-xc", dev_null, }; - const exec_res = std.ChildProcess.exec2(.{ + const exec_res = std.ChildProcess.exec(.{ .allocator = allocator, .argv = &argv, .max_output_bytes = 1024 * 1024, @@ -327,15 +327,14 @@ pub const LibCInstallation = struct { var search_buf: [2]Search = undefined; const searches = fillSearch(&search_buf, sdk); - var result_buf = try std.Buffer.initSize(allocator, 0); + var result_buf = std.ArrayList(u8).init(allocator); defer result_buf.deinit(); for (searches) |search| { result_buf.shrink(0); - const stream = result_buf.outStream(); - try stream.print("{}\\Include\\{}\\ucrt", .{ search.path, search.version }); + try result_buf.outStream().print("{}\\Include\\{}\\ucrt", .{ search.path, search.version }); - var dir = fs.cwd().openDir(result_buf.toSliceConst(), .{}) catch |err| switch (err) { + var dir = fs.cwd().openDir(result_buf.span(), .{}) catch |err| switch (err) { error.FileNotFound, error.NotDir, error.NoDevice, @@ -367,7 +366,7 @@ pub const LibCInstallation = struct { var search_buf: [2]Search = undefined; const searches = fillSearch(&search_buf, sdk); - var result_buf = try std.Buffer.initSize(allocator, 0); + var result_buf = std.ArrayList(u8).init(allocator); defer result_buf.deinit(); const arch_sub_dir = switch (builtin.arch) { @@ -379,10 +378,9 @@ pub const LibCInstallation = struct { for (searches) |search| { result_buf.shrink(0); - const stream = result_buf.outStream(); - try stream.print("{}\\Lib\\{}\\ucrt\\{}", .{ search.path, search.version, arch_sub_dir }); + try result_buf.outStream().print("{}\\Lib\\{}\\ucrt\\{}", .{ search.path, search.version, arch_sub_dir }); - var dir = fs.cwd().openDir(result_buf.toSliceConst(), .{}) catch |err| switch (err) { + var dir = fs.cwd().openDir(result_buf.span(), .{}) catch |err| switch (err) { error.FileNotFound, error.NotDir, error.NoDevice, @@ -422,7 +420,7 @@ pub const LibCInstallation = struct { var search_buf: [2]Search = undefined; const searches = fillSearch(&search_buf, sdk); - var result_buf = try std.Buffer.initSize(allocator, 0); + var result_buf = std.ArrayList(u8).init(allocator); defer result_buf.deinit(); const arch_sub_dir = switch (builtin.arch) { @@ -437,7 +435,7 @@ pub const LibCInstallation = struct { const stream = result_buf.outStream(); try stream.print("{}\\Lib\\{}\\um\\{}", .{ search.path, search.version, arch_sub_dir }); - var dir = fs.cwd().openDir(result_buf.toSliceConst(), .{}) catch |err| switch (err) { + var dir = fs.cwd().openDir(result_buf.span(), .{}) catch |err| switch (err) { error.FileNotFound, error.NotDir, error.NoDevice, @@ -470,12 +468,10 @@ pub const LibCInstallation = struct { const up1 = fs.path.dirname(msvc_lib_dir) orelse return error.LibCStdLibHeaderNotFound; const up2 = fs.path.dirname(up1) orelse return error.LibCStdLibHeaderNotFound; - var result_buf = try std.Buffer.init(allocator, up2); - defer result_buf.deinit(); + const dir_path = try fs.path.join(allocator, &[_][]const u8{ up2, "include" }); + errdefer allocator.free(dir_path); - try result_buf.append("\\include"); - - var dir = fs.cwd().openDir(result_buf.toSliceConst(), .{}) catch |err| switch (err) { + var dir = fs.cwd().openDir(dir_path, .{}) catch |err| switch (err) { error.FileNotFound, error.NotDir, error.NoDevice, @@ -490,7 +486,7 @@ pub const LibCInstallation = struct { else => return error.FileSystem, }; - self.sys_include_dir = result_buf.toOwnedSlice(); + self.sys_include_dir = dir_path; } fn findNativeMsvcLibDir( @@ -522,7 +518,7 @@ fn ccPrintFileName(args: CCPrintFileNameOptions) ![:0]u8 { defer allocator.free(arg1); const argv = [_][]const u8{ cc_exe, arg1 }; - const exec_res = std.ChildProcess.exec2(.{ + const exec_res = std.ChildProcess.exec(.{ .allocator = allocator, .argv = &argv, .max_output_bytes = 1024 * 1024, diff --git a/src-self-hosted/link.zig b/src-self-hosted/link.zig index e67b307097..013a6248cc 100644 --- a/src-self-hosted/link.zig +++ b/src-self-hosted/link.zig @@ -15,10 +15,10 @@ const Context = struct { link_in_crt: bool, link_err: error{OutOfMemory}!void, - link_msg: std.Buffer, + link_msg: std.ArrayListSentineled(u8, 0), libc: *LibCInstallation, - out_file_path: std.Buffer, + out_file_path: std.ArrayListSentineled(u8, 0), }; pub fn link(comp: *Compilation) !void { @@ -34,9 +34,9 @@ pub fn link(comp: *Compilation) !void { }; defer ctx.arena.deinit(); ctx.args = std.ArrayList([*:0]const u8).init(&ctx.arena.allocator); - ctx.link_msg = std.Buffer.initNull(&ctx.arena.allocator); + ctx.link_msg = std.ArrayListSentineled(u8, 0).initNull(&ctx.arena.allocator); - ctx.out_file_path = try std.Buffer.init(&ctx.arena.allocator, comp.name.toSliceConst()); + ctx.out_file_path = try std.ArrayListSentineled(u8, 0).init(&ctx.arena.allocator, comp.name.span()); switch (comp.kind) { .Exe => { try ctx.out_file_path.append(comp.target.exeFileExt()); @@ -70,7 +70,7 @@ pub fn link(comp: *Compilation) !void { try constructLinkerArgs(&ctx); if (comp.verbose_link) { - for (ctx.args.toSliceConst()) |arg, i| { + for (ctx.args.span()) |arg, i| { const space = if (i == 0) "" else " "; std.debug.warn("{}{s}", .{ space, arg }); } @@ -78,7 +78,7 @@ pub fn link(comp: *Compilation) !void { } const extern_ofmt = toExternObjectFormatType(comp.target.getObjectFormat()); - const args_slice = ctx.args.toSlice(); + const args_slice = ctx.args.span(); { // LLD is not thread-safe, so we grab a global lock. @@ -91,7 +91,7 @@ pub fn link(comp: *Compilation) !void { // TODO capture these messages and pass them through the system, reporting them through the // event system instead of printing them directly here. // perhaps try to parse and understand them. - std.debug.warn("{}\n", .{ctx.link_msg.toSliceConst()}); + std.debug.warn("{}\n", .{ctx.link_msg.span()}); } return error.LinkFailed; } @@ -173,7 +173,7 @@ fn constructLinkerArgsElf(ctx: *Context) !void { //} try ctx.args.append("-o"); - try ctx.args.append(ctx.out_file_path.toSliceConst()); + try ctx.args.append(ctx.out_file_path.span()); if (ctx.link_in_crt) { const crt1o = if (ctx.comp.is_static) "crt1.o" else "Scrt1.o"; @@ -291,7 +291,7 @@ fn constructLinkerArgsCoff(ctx: *Context) !void { const is_library = ctx.comp.kind == .Lib; - const out_arg = try std.fmt.allocPrint(&ctx.arena.allocator, "-OUT:{}\x00", .{ctx.out_file_path.toSliceConst()}); + const out_arg = try std.fmt.allocPrint(&ctx.arena.allocator, "-OUT:{}\x00", .{ctx.out_file_path.span()}); try ctx.args.append(@ptrCast([*:0]const u8, out_arg.ptr)); if (ctx.comp.haveLibC()) { @@ -394,7 +394,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void { } try ctx.args.append("-o"); - try ctx.args.append(ctx.out_file_path.toSliceConst()); + try ctx.args.append(ctx.out_file_path.span()); if (shared) { try ctx.args.append("-headerpad_max_install_names"); @@ -432,7 +432,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void { // TODO //if (ctx.comp.target == Target.Native) { - // for (ctx.comp.link_libs_list.toSliceConst()) |lib| { + // for (ctx.comp.link_libs_list.span()) |lib| { // if (mem.eql(u8, lib.name, "c")) { // // on Darwin, libSystem has libc in it, but also you have to use it // // to make syscalls because the syscall numbers are not documented @@ -482,7 +482,7 @@ fn addFnObjects(ctx: *Context) !void { ctx.comp.gpa().destroy(node); continue; }; - try ctx.args.append(fn_val.containing_object.toSliceConst()); + try ctx.args.append(fn_val.containing_object.span()); it = node.next; } } diff --git a/src-self-hosted/main.zig b/src-self-hosted/main.zig index f5faa26615..fb96e0260a 100644 --- a/src-self-hosted/main.zig +++ b/src-self-hosted/main.zig @@ -421,7 +421,7 @@ fn buildOutputType(allocator: *Allocator, args: []const []const u8, out_type: Co process.exit(1); } - try ZigCompiler.setLlvmArgv(allocator, mllvm_flags.toSliceConst()); + try ZigCompiler.setLlvmArgv(allocator, mllvm_flags.span()); const zig_lib_dir = introspect.resolveZigLibDir(allocator) catch process.exit(1); defer allocator.free(zig_lib_dir); @@ -448,14 +448,14 @@ fn buildOutputType(allocator: *Allocator, args: []const []const u8, out_type: Co comp.override_libc = &override_libc; } - for (system_libs.toSliceConst()) |lib| { + for (system_libs.span()) |lib| { _ = try comp.addLinkLib(lib, true); } comp.version = version; comp.is_test = false; comp.linker_script = linker_script; - comp.clang_argv = clang_argv_buf.toSliceConst(); + comp.clang_argv = clang_argv_buf.span(); comp.strip = strip; comp.verbose_tokenize = verbose_tokenize; @@ -488,8 +488,8 @@ fn buildOutputType(allocator: *Allocator, args: []const []const u8, out_type: Co comp.emit_asm = emit_asm; comp.emit_llvm_ir = emit_llvm_ir; comp.emit_h = emit_h; - comp.assembly_files = assembly_files.toSliceConst(); - comp.link_objects = link_objects.toSliceConst(); + comp.assembly_files = assembly_files.span(); + comp.link_objects = link_objects.span(); comp.start(); processBuildEvents(comp, color); @@ -683,7 +683,7 @@ fn cmdFmt(allocator: *Allocator, args: []const []const u8) !void { }; var group = event.Group(FmtError!void).init(allocator); - for (input_files.toSliceConst()) |file_path| { + for (input_files.span()) |file_path| { try group.call(fmtPath, .{ &fmt, file_path, check_flag }); } try group.wait(); @@ -898,7 +898,7 @@ const CliPkg = struct { } pub fn deinit(self: *CliPkg) void { - for (self.children.toSliceConst()) |child| { + for (self.children.span()) |child| { child.deinit(); } self.children.deinit(); diff --git a/src-self-hosted/package.zig b/src-self-hosted/package.zig index c8d46c7719..3111555878 100644 --- a/src-self-hosted/package.zig +++ b/src-self-hosted/package.zig @@ -1,11 +1,11 @@ const std = @import("std"); const mem = std.mem; const assert = std.debug.assert; -const Buffer = std.Buffer; +const ArrayListSentineled = std.ArrayListSentineled; pub const Package = struct { - root_src_dir: Buffer, - root_src_path: Buffer, + root_src_dir: ArrayListSentineled(u8, 0), + root_src_path: ArrayListSentineled(u8, 0), /// relative to root_src_dir table: Table, @@ -17,8 +17,8 @@ pub const Package = struct { pub fn create(allocator: *mem.Allocator, root_src_dir: []const u8, root_src_path: []const u8) !*Package { const ptr = try allocator.create(Package); ptr.* = Package{ - .root_src_dir = try Buffer.init(allocator, root_src_dir), - .root_src_path = try Buffer.init(allocator, root_src_path), + .root_src_dir = try ArrayListSentineled(u8, 0).init(allocator, root_src_dir), + .root_src_path = try ArrayListSentineled(u8, 0).init(allocator, root_src_path), .table = Table.init(allocator), }; return ptr; diff --git a/src-self-hosted/stage2.zig b/src-self-hosted/stage2.zig index 957b295f4a..802493b7c0 100644 --- a/src-self-hosted/stage2.zig +++ b/src-self-hosted/stage2.zig @@ -8,7 +8,7 @@ const fs = std.fs; const process = std.process; const Allocator = mem.Allocator; const ArrayList = std.ArrayList; -const Buffer = std.Buffer; +const ArrayListSentineled = std.ArrayListSentineled; const Target = std.Target; const CrossTarget = std.zig.CrossTarget; const self_hosted_main = @import("main.zig"); @@ -188,14 +188,14 @@ fn fmtMain(argc: c_int, argv: [*]const [*:0]const u8) !void { const argc_usize = @intCast(usize, argc); var arg_i: usize = 0; while (arg_i < argc_usize) : (arg_i += 1) { - try args_list.append(mem.toSliceConst(u8, argv[arg_i])); + try args_list.append(mem.spanZ(argv[arg_i])); } stdout = std.io.getStdOut().outStream(); stderr_file = std.io.getStdErr(); stderr = stderr_file.outStream(); - const args = args_list.toSliceConst()[2..]; + const args = args_list.span()[2..]; var color: errmsg.Color = .Auto; var stdin_flag: bool = false; @@ -288,7 +288,7 @@ fn fmtMain(argc: c_int, argv: [*]const [*:0]const u8) !void { .allocator = allocator, }; - for (input_files.toSliceConst()) |file_path| { + for (input_files.span()) |file_path| { try fmtPath(&fmt, file_path, check_flag); } if (fmt.any_error) { @@ -321,7 +321,8 @@ fn fmtPath(fmt: *Fmt, file_path: []const u8, check_mode: bool) FmtError!void { if (fmt.seen.exists(file_path)) return; try fmt.seen.put(file_path); - const source_code = io.readFileAlloc(fmt.allocator, file_path) catch |err| switch (err) { + const max = std.math.maxInt(usize); + const source_code = fs.cwd().readFileAlloc(fmt.allocator, file_path, max) catch |err| switch (err) { error.IsDir, error.AccessDenied => { // TODO make event based (and dir.next()) var dir = try fs.cwd().openDir(file_path, .{ .iterate = true }); @@ -413,12 +414,13 @@ fn printErrMsgToFile( const start_loc = tree.tokenLocationPtr(0, first_token); const end_loc = tree.tokenLocationPtr(first_token.end, last_token); - var text_buf = try std.Buffer.initSize(allocator, 0); - const out_stream = &text_buf.outStream(); + var text_buf = std.ArrayList(u8).init(allocator); + defer text_buf.deinit(); + const out_stream = text_buf.outStream(); try parse_error.render(&tree.tokens, out_stream); - const text = text_buf.toOwnedSlice(); + const text = text_buf.span(); - const stream = &file.outStream(); + const stream = file.outStream(); try stream.print("{}:{}:{}: error: {}\n", .{ path, start_loc.line + 1, start_loc.column + 1, text }); if (!color_on) return; @@ -450,10 +452,10 @@ export fn stage2_DepTokenizer_deinit(self: *stage2_DepTokenizer) void { export fn stage2_DepTokenizer_next(self: *stage2_DepTokenizer) stage2_DepNextResult { const otoken = self.handle.next() catch { - const textz = std.Buffer.init(&self.handle.arena.allocator, self.handle.error_text) catch @panic("failed to create .d tokenizer error text"); + const textz = std.ArrayListSentineled(u8, 0).init(&self.handle.arena.allocator, self.handle.error_text) catch @panic("failed to create .d tokenizer error text"); return stage2_DepNextResult{ .type_id = .error_, - .textz = textz.toSlice().ptr, + .textz = textz.span().ptr, }; }; const token = otoken orelse { @@ -462,13 +464,13 @@ export fn stage2_DepTokenizer_next(self: *stage2_DepTokenizer) stage2_DepNextRes .textz = undefined, }; }; - const textz = std.Buffer.init(&self.handle.arena.allocator, token.bytes) catch @panic("failed to create .d tokenizer token text"); + const textz = std.ArrayListSentineled(u8, 0).init(&self.handle.arena.allocator, token.bytes) catch @panic("failed to create .d tokenizer token text"); return stage2_DepNextResult{ .type_id = switch (token.id) { .target => .target, .prereq => .prereq, }, - .textz = textz.toSlice().ptr, + .textz = textz.span().ptr, }; } @@ -575,7 +577,7 @@ fn detectNativeCpuWithLLVM( var result = Target.Cpu.baseline(arch); if (llvm_cpu_name_z) |cpu_name_z| { - const llvm_cpu_name = mem.toSliceConst(u8, cpu_name_z); + const llvm_cpu_name = mem.spanZ(cpu_name_z); for (arch.allCpuModels()) |model| { const this_llvm_name = model.llvm_name orelse continue; @@ -596,7 +598,7 @@ fn detectNativeCpuWithLLVM( const all_features = arch.allFeaturesList(); if (llvm_cpu_features_opt) |llvm_cpu_features| { - var it = mem.tokenize(mem.toSliceConst(u8, llvm_cpu_features), ","); + var it = mem.tokenize(mem.spanZ(llvm_cpu_features), ","); while (it.next()) |decorated_llvm_feat| { var op: enum { add, @@ -691,12 +693,11 @@ fn stage2CrossTarget( mcpu_oz: ?[*:0]const u8, dynamic_linker_oz: ?[*:0]const u8, ) !CrossTarget { - const zig_triple = if (zig_triple_oz) |zig_triple_z| mem.toSliceConst(u8, zig_triple_z) else "native"; - const mcpu = if (mcpu_oz) |mcpu_z| mem.toSliceConst(u8, mcpu_z) else null; - const dynamic_linker = if (dynamic_linker_oz) |dl_z| mem.toSliceConst(u8, dl_z) else null; + const mcpu = mem.spanZ(mcpu_oz); + const dynamic_linker = mem.spanZ(dynamic_linker_oz); var diags: CrossTarget.ParseOptions.Diagnostics = .{}; const target: CrossTarget = CrossTarget.parse(.{ - .arch_os_abi = zig_triple, + .arch_os_abi = mem.spanZ(zig_triple_oz) orelse "native", .cpu_features = mcpu, .dynamic_linker = dynamic_linker, .diagnostics = &diags, @@ -743,15 +744,15 @@ fn stage2TargetParse( // ABI warning const Stage2LibCInstallation = extern struct { - include_dir: [*:0]const u8, + include_dir: [*]const u8, include_dir_len: usize, - sys_include_dir: [*:0]const u8, + sys_include_dir: [*]const u8, sys_include_dir_len: usize, - crt_dir: [*:0]const u8, + crt_dir: [*]const u8, crt_dir_len: usize, - msvc_lib_dir: [*:0]const u8, + msvc_lib_dir: [*]const u8, msvc_lib_dir_len: usize, - kernel32_lib_dir: [*:0]const u8, + kernel32_lib_dir: [*]const u8, kernel32_lib_dir_len: usize, fn initFromStage2(self: *Stage2LibCInstallation, libc: LibCInstallation) void { @@ -795,19 +796,19 @@ const Stage2LibCInstallation = extern struct { fn toStage2(self: Stage2LibCInstallation) LibCInstallation { var libc: LibCInstallation = .{}; if (self.include_dir_len != 0) { - libc.include_dir = self.include_dir[0..self.include_dir_len :0]; + libc.include_dir = self.include_dir[0..self.include_dir_len]; } if (self.sys_include_dir_len != 0) { - libc.sys_include_dir = self.sys_include_dir[0..self.sys_include_dir_len :0]; + libc.sys_include_dir = self.sys_include_dir[0..self.sys_include_dir_len]; } if (self.crt_dir_len != 0) { - libc.crt_dir = self.crt_dir[0..self.crt_dir_len :0]; + libc.crt_dir = self.crt_dir[0..self.crt_dir_len]; } if (self.msvc_lib_dir_len != 0) { - libc.msvc_lib_dir = self.msvc_lib_dir[0..self.msvc_lib_dir_len :0]; + libc.msvc_lib_dir = self.msvc_lib_dir[0..self.msvc_lib_dir_len]; } if (self.kernel32_lib_dir_len != 0) { - libc.kernel32_lib_dir = self.kernel32_lib_dir[0..self.kernel32_lib_dir_len :0]; + libc.kernel32_lib_dir = self.kernel32_lib_dir[0..self.kernel32_lib_dir_len]; } return libc; } @@ -817,7 +818,7 @@ const Stage2LibCInstallation = extern struct { export fn stage2_libc_parse(stage1_libc: *Stage2LibCInstallation, libc_file_z: [*:0]const u8) Error { stderr_file = std.io.getStdErr(); stderr = stderr_file.outStream(); - const libc_file = mem.toSliceConst(u8, libc_file_z); + const libc_file = mem.spanZ(libc_file_z); var libc = LibCInstallation.parse(std.heap.c_allocator, libc_file, stderr) catch |err| switch (err) { error.ParseError => return .SemanticAnalyzeFail, error.DiskQuota => return .DiskQuota, @@ -929,14 +930,14 @@ const Stage2Target = extern struct { var dynamic_linker: ?[*:0]u8 = null; const target = try crossTargetToTarget(cross_target, &dynamic_linker); - var cache_hash = try std.Buffer.allocPrint(allocator, "{}\n{}\n", .{ + var cache_hash = try std.ArrayListSentineled(u8, 0).allocPrint(allocator, "{}\n{}\n", .{ target.cpu.model.name, target.cpu.features.asBytes(), }); defer cache_hash.deinit(); const generic_arch_name = target.cpu.arch.genericName(); - var cpu_builtin_str_buffer = try std.Buffer.allocPrint(allocator, + var cpu_builtin_str_buffer = try std.ArrayListSentineled(u8, 0).allocPrint(allocator, \\Cpu{{ \\ .arch = .{}, \\ .model = &Target.{}.cpu.{}, @@ -951,7 +952,7 @@ const Stage2Target = extern struct { }); defer cpu_builtin_str_buffer.deinit(); - var llvm_features_buffer = try std.Buffer.initSize(allocator, 0); + var llvm_features_buffer = try std.ArrayListSentineled(u8, 0).initSize(allocator, 0); defer llvm_features_buffer.deinit(); // Unfortunately we have to do the work twice, because Clang does not support @@ -966,17 +967,17 @@ const Stage2Target = extern struct { if (feature.llvm_name) |llvm_name| { const plus_or_minus = "-+"[@boolToInt(is_enabled)]; - try llvm_features_buffer.appendByte(plus_or_minus); - try llvm_features_buffer.append(llvm_name); - try llvm_features_buffer.append(","); + try llvm_features_buffer.append(plus_or_minus); + try llvm_features_buffer.appendSlice(llvm_name); + try llvm_features_buffer.appendSlice(","); } if (is_enabled) { // TODO some kind of "zig identifier escape" function rather than // unconditionally using @"" syntax - try cpu_builtin_str_buffer.append(" .@\""); - try cpu_builtin_str_buffer.append(feature.name); - try cpu_builtin_str_buffer.append("\",\n"); + try cpu_builtin_str_buffer.appendSlice(" .@\""); + try cpu_builtin_str_buffer.appendSlice(feature.name); + try cpu_builtin_str_buffer.appendSlice("\",\n"); } } @@ -995,16 +996,16 @@ const Stage2Target = extern struct { }, } - try cpu_builtin_str_buffer.append( + try cpu_builtin_str_buffer.appendSlice( \\ }), \\}; \\ ); - assert(mem.endsWith(u8, llvm_features_buffer.toSliceConst(), ",")); + assert(mem.endsWith(u8, llvm_features_buffer.span(), ",")); llvm_features_buffer.shrink(llvm_features_buffer.len() - 1); - var os_builtin_str_buffer = try std.Buffer.allocPrint(allocator, + var os_builtin_str_buffer = try std.ArrayListSentineled(u8, 0).allocPrint(allocator, \\Os{{ \\ .tag = .{}, \\ .version_range = .{{ @@ -1047,7 +1048,7 @@ const Stage2Target = extern struct { .emscripten, .uefi, .other, - => try os_builtin_str_buffer.append(" .none = {} }\n"), + => try os_builtin_str_buffer.appendSlice(" .none = {} }\n"), .freebsd, .macosx, @@ -1123,10 +1124,10 @@ const Stage2Target = extern struct { @tagName(target.os.version_range.windows.max), }), } - try os_builtin_str_buffer.append("};\n"); + try os_builtin_str_buffer.appendSlice("};\n"); - try cache_hash.append( - os_builtin_str_buffer.toSlice()[os_builtin_str_ver_start_index..os_builtin_str_buffer.len()], + try cache_hash.appendSlice( + os_builtin_str_buffer.span()[os_builtin_str_ver_start_index..os_builtin_str_buffer.len()], ); const glibc_or_darwin_version = blk: { @@ -1238,10 +1239,10 @@ fn stage2DetectNativePaths(stage1_paths: *Stage2NativePaths) !void { var paths = try std.zig.system.NativePaths.detect(std.heap.c_allocator); errdefer paths.deinit(); - try convertSlice(paths.include_dirs.toSlice(), &stage1_paths.include_dirs_ptr, &stage1_paths.include_dirs_len); - try convertSlice(paths.lib_dirs.toSlice(), &stage1_paths.lib_dirs_ptr, &stage1_paths.lib_dirs_len); - try convertSlice(paths.rpaths.toSlice(), &stage1_paths.rpaths_ptr, &stage1_paths.rpaths_len); - try convertSlice(paths.warnings.toSlice(), &stage1_paths.warnings_ptr, &stage1_paths.warnings_len); + try convertSlice(paths.include_dirs.span(), &stage1_paths.include_dirs_ptr, &stage1_paths.include_dirs_len); + try convertSlice(paths.lib_dirs.span(), &stage1_paths.lib_dirs_ptr, &stage1_paths.lib_dirs_len); + try convertSlice(paths.rpaths.span(), &stage1_paths.rpaths_ptr, &stage1_paths.rpaths_len); + try convertSlice(paths.warnings.span(), &stage1_paths.warnings_ptr, &stage1_paths.warnings_len); } fn convertSlice(slice: [][:0]u8, ptr: *[*][*:0]u8, len: *usize) !void { @@ -1285,18 +1286,19 @@ pub const ClangArgIterator = extern struct { shared, rdynamic, wl, - preprocess, + pp_or_asm, optimize, debug, sanitize, linker_script, verbose_cmds, - exceptions, - no_exceptions, - rtti, - no_rtti, for_linker, linker_input_z, + lib_dir, + mcpu, + dep_file, + framework_dir, + framework, }; const Args = struct { diff --git a/src-self-hosted/test.zig b/src-self-hosted/test.zig index b146d6607a..9038b8128d 100644 --- a/src-self-hosted/test.zig +++ b/src-self-hosted/test.zig @@ -88,8 +88,7 @@ pub const TestContext = struct { try std.fs.cwd().makePath(dirname); } - // TODO async I/O - try std.io.writeFile(file1_path, source); + try std.fs.cwd().writeFile(file1_path, source); var comp = try Compilation.create( &self.zig_compiler, @@ -122,8 +121,7 @@ pub const TestContext = struct { try std.fs.cwd().makePath(dirname); } - // TODO async I/O - try std.io.writeFile(file1_path, source); + try std.fs.cwd().writeFile(file1_path, source); var comp = try Compilation.create( &self.zig_compiler, @@ -156,7 +154,11 @@ pub const TestContext = struct { .Ok => { const argv = [_][]const u8{exe_file}; // TODO use event loop - const child = try std.ChildProcess.exec(allocator, argv, null, null, 1024 * 1024); + const child = try std.ChildProcess.exec(.{ + .allocator = allocator, + .argv = argv, + .max_output_bytes = 1024 * 1024, + }); switch (child.term) { .Exited => |code| { if (code != 0) { diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 3235ac90c0..6ba7fc8ca1 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -209,7 +209,7 @@ const Scope = struct { pub const Context = struct { tree: *ast.Tree, - source_buffer: *std.Buffer, + source_buffer: *std.ArrayList(u8), err: Error, source_manager: *ZigClangSourceManager, decl_table: DeclTable, @@ -235,7 +235,7 @@ pub const Context = struct { /// Convert a null-terminated C string to a slice allocated in the arena fn str(c: *Context, s: [*:0]const u8) ![]u8 { - return mem.dupe(c.a(), u8, mem.toSliceConst(u8, s)); + return mem.dupe(c.a(), u8, mem.spanZ(s)); } /// Convert a clang source location to a file:line:column string @@ -275,7 +275,7 @@ pub fn translate( const tree = try tree_arena.allocator.create(ast.Tree); tree.* = ast.Tree{ - .source = undefined, // need to use Buffer.toOwnedSlice later + .source = undefined, // need to use toOwnedSlice later .root_node = undefined, .arena_allocator = tree_arena, .tokens = undefined, // can't reference the allocator yet @@ -296,7 +296,7 @@ pub fn translate( .eof_token = undefined, }; - var source_buffer = try std.Buffer.initSize(arena, 0); + var source_buffer = std.ArrayList(u8).init(arena); var context = Context{ .tree = tree, @@ -3845,7 +3845,9 @@ fn transCreateNodePtrType( } fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node { - const num_limbs = ZigClangAPSInt_getNumWords(int); + const num_limbs = math.cast(usize, ZigClangAPSInt_getNumWords(int)) catch |err| switch (err) { + error.Overflow => return error.OutOfMemory, + }; var aps_int = int; const is_negative = ZigClangAPSInt_isSigned(int) and ZigClangAPSInt_isNegative(int); if (is_negative) @@ -3855,8 +3857,26 @@ fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node { big.negate(); defer big.deinit(); const data = ZigClangAPSInt_getRawData(aps_int); - var i: @TypeOf(num_limbs) = 0; - while (i < num_limbs) : (i += 1) big.limbs[i] = data[i]; + switch (@sizeOf(std.math.big.Limb)) { + 8 => { + var i: usize = 0; + while (i < num_limbs) : (i += 1) { + big.limbs[i] = data[i]; + } + }, + 4 => { + var limb_i: usize = 0; + var data_i: usize = 0; + while (limb_i < num_limbs) : ({ + limb_i += 2; + data_i += 1; + }) { + big.limbs[limb_i] = @truncate(u32, data[data_i]); + big.limbs[limb_i + 1] = @truncate(u32, data[data_i] >> 32); + } + }, + else => @compileError("unimplemented"), + } const str = big.toString(c.a(), 10) catch |err| switch (err) { error.OutOfMemory => return error.OutOfMemory, else => unreachable, @@ -4289,7 +4309,7 @@ fn makeRestorePoint(c: *Context) RestorePoint { return RestorePoint{ .c = c, .token_index = c.tree.tokens.len, - .src_buf_index = c.source_buffer.len(), + .src_buf_index = c.source_buffer.len, }; } @@ -4751,11 +4771,11 @@ fn appendToken(c: *Context, token_id: Token.Id, bytes: []const u8) !ast.TokenInd fn appendTokenFmt(c: *Context, token_id: Token.Id, comptime format: []const u8, args: var) !ast.TokenIndex { assert(token_id != .Invalid); - const start_index = c.source_buffer.len(); + const start_index = c.source_buffer.len; errdefer c.source_buffer.shrink(start_index); try c.source_buffer.outStream().print(format, args); - const end_index = c.source_buffer.len(); + const end_index = c.source_buffer.len; const token_index = c.tree.tokens.len; const new_token = try c.tree.tokens.addOne(); errdefer c.tree.tokens.shrink(token_index); @@ -4765,7 +4785,7 @@ fn appendTokenFmt(c: *Context, token_id: Token.Id, comptime format: []const u8, .start = start_index, .end = end_index, }; - try c.source_buffer.appendByte(' '); + try c.source_buffer.append(' '); return token_index; } @@ -5782,6 +5802,18 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, op_id = .Mod; op_token = try appendToken(c, .Percent, "%"); }, + .StringLiteral => { + op_id = .ArrayCat; + op_token = try appendToken(c, .PlusPlus, "++"); + + _ = it.prev(); + }, + .Identifier => { + op_id = .ArrayCat; + op_token = try appendToken(c, .PlusPlus, "++"); + + _ = it.prev(); + }, else => { _ = it.prev(); return node; @@ -5839,7 +5871,7 @@ fn parseCPrefixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, fn tokenSlice(c: *Context, token: ast.TokenIndex) []u8 { const tok = c.tree.tokens.at(token); - const slice = c.source_buffer.toSlice()[tok.start..tok.end]; + const slice = c.source_buffer.span()[tok.start..tok.end]; return if (mem.startsWith(u8, slice, "@\"")) slice[2 .. slice.len - 1] else diff --git a/src-self-hosted/type.zig b/src-self-hosted/type.zig index 70ed754cea..6adad9fa67 100644 --- a/src-self-hosted/type.zig +++ b/src-self-hosted/type.zig @@ -387,10 +387,10 @@ pub const Type = struct { }; errdefer comp.gpa().destroy(self); - var name_buf = try std.Buffer.initSize(comp.gpa(), 0); + var name_buf = std.ArrayList(u8).init(comp.gpa()); defer name_buf.deinit(); - const name_stream = &std.io.BufferOutStream.init(&name_buf).stream; + const name_stream = name_buf.outStream(); switch (key.data) { .Generic => |generic| { diff --git a/src-self-hosted/util.zig b/src-self-hosted/util.zig index ec68823ebd..6585fd7c6f 100644 --- a/src-self-hosted/util.zig +++ b/src-self-hosted/util.zig @@ -16,11 +16,11 @@ pub fn getDarwinArchString(self: Target) [:0]const u8 { } } -pub fn llvmTargetFromTriple(triple: std.Buffer) !*llvm.Target { +pub fn llvmTargetFromTriple(triple: [:0]const u8) !*llvm.Target { var result: *llvm.Target = undefined; var err_msg: [*:0]u8 = undefined; - if (llvm.GetTargetFromTriple(triple.toSlice(), &result, &err_msg) != 0) { - std.debug.warn("triple: {s} error: {s}\n", .{ triple.toSlice(), err_msg }); + if (llvm.GetTargetFromTriple(triple, &result, &err_msg) != 0) { + std.debug.warn("triple: {s} error: {s}\n", .{ triple, err_msg }); return error.UnsupportedTarget; } return result; @@ -34,14 +34,14 @@ pub fn initializeAllTargets() void { llvm.InitializeAllAsmParsers(); } -pub fn getLLVMTriple(allocator: *std.mem.Allocator, target: std.Target) !std.Buffer { - var result = try std.Buffer.initSize(allocator, 0); - errdefer result.deinit(); +pub fn getLLVMTriple(allocator: *std.mem.Allocator, target: std.Target) ![:0]u8 { + var result = try std.ArrayListSentineled(u8, 0).initSize(allocator, 0); + defer result.deinit(); try result.outStream().print( "{}-unknown-{}-{}", .{ @tagName(target.cpu.arch), @tagName(target.os.tag), @tagName(target.abi) }, ); - return result; + return result.toOwnedSlice(); } diff --git a/src-self-hosted/value.zig b/src-self-hosted/value.zig index 03c0db0c3c..c35289e238 100644 --- a/src-self-hosted/value.zig +++ b/src-self-hosted/value.zig @@ -3,7 +3,7 @@ const Scope = @import("scope.zig").Scope; const Compilation = @import("compilation.zig").Compilation; const ObjectFile = @import("codegen.zig").ObjectFile; const llvm = @import("llvm.zig"); -const Buffer = std.Buffer; +const ArrayListSentineled = std.ArrayListSentineled; const assert = std.debug.assert; /// Values are ref-counted, heap-allocated, and copy-on-write @@ -131,9 +131,9 @@ pub const Value = struct { /// The main external name that is used in the .o file. /// TODO https://github.com/ziglang/zig/issues/265 - symbol_name: Buffer, + symbol_name: ArrayListSentineled(u8, 0), - pub fn create(comp: *Compilation, fn_type: *Type.Fn, symbol_name: Buffer) !*FnProto { + pub fn create(comp: *Compilation, fn_type: *Type.Fn, symbol_name: ArrayListSentineled(u8, 0)) !*FnProto { const self = try comp.gpa().create(FnProto); self.* = FnProto{ .base = Value{ @@ -156,7 +156,7 @@ pub const Value = struct { const llvm_fn_type = try self.base.typ.getLlvmType(ofile.arena, ofile.context); const llvm_fn = llvm.AddFunction( ofile.module, - self.symbol_name.toSliceConst(), + self.symbol_name.span(), llvm_fn_type, ) orelse return error.OutOfMemory; @@ -171,7 +171,7 @@ pub const Value = struct { /// The main external name that is used in the .o file. /// TODO https://github.com/ziglang/zig/issues/265 - symbol_name: Buffer, + symbol_name: ArrayListSentineled(u8, 0), /// parent should be the top level decls or container decls fndef_scope: *Scope.FnDef, @@ -183,13 +183,13 @@ pub const Value = struct { block_scope: ?*Scope.Block, /// Path to the object file that contains this function - containing_object: Buffer, + containing_object: ArrayListSentineled(u8, 0), link_set_node: *std.TailQueue(?*Value.Fn).Node, /// Creates a Fn value with 1 ref /// Takes ownership of symbol_name - pub fn create(comp: *Compilation, fn_type: *Type.Fn, fndef_scope: *Scope.FnDef, symbol_name: Buffer) !*Fn { + pub fn create(comp: *Compilation, fn_type: *Type.Fn, fndef_scope: *Scope.FnDef, symbol_name: ArrayListSentineled(u8, 0)) !*Fn { const link_set_node = try comp.gpa().create(Compilation.FnLinkSet.Node); link_set_node.* = Compilation.FnLinkSet.Node{ .data = null, @@ -209,7 +209,7 @@ pub const Value = struct { .child_scope = &fndef_scope.base, .block_scope = null, .symbol_name = symbol_name, - .containing_object = Buffer.initNull(comp.gpa()), + .containing_object = ArrayListSentineled(u8, 0).initNull(comp.gpa()), .link_set_node = link_set_node, }; fn_type.base.base.ref(); @@ -241,7 +241,7 @@ pub const Value = struct { const llvm_fn_type = try self.base.typ.getLlvmType(ofile.arena, ofile.context); const llvm_fn = llvm.AddFunction( ofile.module, - self.symbol_name.toSliceConst(), + self.symbol_name.span(), llvm_fn_type, ) orelse return error.OutOfMemory; diff --git a/src/all_types.hpp b/src/all_types.hpp index 6c7b465025..9b22279b91 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -54,6 +54,16 @@ struct ResultLocCast; struct ResultLocReturn; struct IrExecutableGen; +enum FileExt { + FileExtUnknown, + FileExtAsm, + FileExtC, + FileExtCpp, + FileExtHeader, + FileExtLLVMIr, + FileExtLLVMBitCode, +}; + enum PtrLen { PtrLenUnknown, PtrLenSingle, @@ -1324,6 +1334,7 @@ struct ZigTypeFloat { size_t bit_count; }; +// Needs to have the same memory layout as ZigTypeVector struct ZigTypeArray { ZigType *child_type; uint64_t len; @@ -1512,12 +1523,17 @@ struct ZigTypeBoundFn { ZigType *fn_type; }; +// Needs to have the same memory layout as ZigTypeArray struct ZigTypeVector { // The type must be a pointer, integer, bool, or float ZigType *elem_type; - uint32_t len; + uint64_t len; + size_t padding; }; +// A lot of code is relying on ZigTypeArray and ZigTypeVector having the same layout/size +static_assert(sizeof(ZigTypeVector) == sizeof(ZigTypeArray), "Size of ZigTypeVector and ZigTypeArray do not match!"); + enum ZigTypeId { ZigTypeIdInvalid, ZigTypeIdMetaType, @@ -1999,6 +2015,12 @@ enum WantCSanitize { WantCSanitizeEnabled, }; +enum OptionalBool { + OptionalBoolNull, + OptionalBoolFalse, + OptionalBoolTrue, +}; + struct CFile { ZigList args; const char *source_path; @@ -2214,6 +2236,7 @@ struct CodeGen { bool reported_bad_link_libc_error; bool is_dynamic; // shared library rather than static library. dynamic musl rather than static musl. bool need_frame_size_prefix_data; + bool disable_c_depfile; //////////////////////////// Participates in Input Parameter Cache Hash /////// Note: there is a separate cache hash for builtin.zig, when adding fields, @@ -2242,6 +2265,9 @@ struct CodeGen { const ZigTarget *zig_target; TargetSubsystem subsystem; // careful using this directly; see detect_subsystem ValgrindSupport valgrind_support; + CodeModel code_model; + OptionalBool linker_gc_sections; + OptionalBool linker_allow_shlib_undefined; bool strip_debug_symbols; bool is_test_build; bool is_single_threaded; @@ -2262,9 +2288,8 @@ struct CodeGen { bool emit_asm; bool emit_llvm_ir; bool test_is_evented; - bool cpp_rtti; - bool cpp_exceptions; - CodeModel code_model; + bool linker_z_nodelete; + bool linker_z_defs; Buf *root_out_name; Buf *test_filter; @@ -2273,6 +2298,7 @@ struct CodeGen { Buf *zig_std_dir; Buf *version_script_path; Buf *override_soname; + Buf *linker_optimization; const char **llvm_argv; size_t llvm_argv_len; diff --git a/src/analyze.cpp b/src/analyze.cpp index df7bcdf9de..e627eaf91b 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -363,6 +363,7 @@ bool type_is_resolved(ZigType *type_entry, ResolveStatus status) { case ResolveStatusLLVMFull: return type_entry->llvm_type != nullptr; } + zig_unreachable(); case ZigTypeIdOpaque: return status < ResolveStatusSizeKnown; case ZigTypeIdPointer: @@ -381,6 +382,7 @@ bool type_is_resolved(ZigType *type_entry, ResolveStatus status) { case ResolveStatusLLVMFull: return type_entry->llvm_type != nullptr; } + zig_unreachable(); case ZigTypeIdMetaType: case ZigTypeIdVoid: case ZigTypeIdBool: @@ -5156,6 +5158,7 @@ ZigType *get_vector_type(CodeGen *g, uint32_t len, ZigType *elem_type) { } entry->data.vector.len = len; entry->data.vector.elem_type = elem_type; + entry->data.vector.padding = 0; buf_resize(&entry->name, 0); buf_appendf(&entry->name, "@Vector(%u, %s)", len, buf_ptr(&elem_type->name)); @@ -5358,7 +5361,7 @@ static uint32_t hash_const_val(ZigValue *const_val) { return result; } case ZigTypeIdEnumLiteral: - return buf_hash(const_val->data.x_enum_literal) * 2691276464; + return buf_hash(const_val->data.x_enum_literal) * (uint32_t)2691276464; case ZigTypeIdEnum: { uint32_t result = 31643936; @@ -5426,12 +5429,12 @@ static uint32_t hash_const_val(ZigValue *const_val) { return 2709806591; case ZigTypeIdOptional: if (get_src_ptr_type(const_val->type) != nullptr) { - return hash_const_val_ptr(const_val) * 1992916303; + return hash_const_val_ptr(const_val) * (uint32_t)1992916303; } else if (const_val->type->data.maybe.child_type->id == ZigTypeIdErrorSet) { - return hash_const_val_error_set(const_val) * 3147031929; + return hash_const_val_error_set(const_val) * (uint32_t)3147031929; } else { if (const_val->data.x_optional) { - return hash_const_val(const_val->data.x_optional) * 1992916303; + return hash_const_val(const_val->data.x_optional) * (uint32_t)1992916303; } else { return 4016830364; } diff --git a/src/analyze.hpp b/src/analyze.hpp index ee069427bd..ae010c87e1 100644 --- a/src/analyze.hpp +++ b/src/analyze.hpp @@ -257,14 +257,8 @@ Error create_c_object_cache(CodeGen *g, CacheHash **out_cache_hash, bool verbose LLVMTypeRef get_llvm_type(CodeGen *g, ZigType *type); ZigLLVMDIType *get_llvm_di_type(CodeGen *g, ZigType *type); -enum CSourceKind { - CSourceKindAsm, - CSourceKindC, - CSourceKindCpp, -}; - void add_cc_args(CodeGen *g, ZigList &args, const char *out_dep_path, bool translate_c, - CSourceKind source_kind); + FileExt source_kind); void src_assert(bool ok, AstNode *source_node); bool is_container(ZigType *type_entry); diff --git a/src/bigint.cpp b/src/bigint.cpp index 644e25837e..dd04363e82 100644 --- a/src/bigint.cpp +++ b/src/bigint.cpp @@ -1430,7 +1430,7 @@ void bigint_shr(BigInt *dest, const BigInt *op1, const BigInt *op2) { uint64_t digit = op1_digits[op_digit_index]; size_t dest_digit_index = op_digit_index - digit_shift_count; digits[dest_digit_index] = carry | (digit >> leftover_shift_count); - carry = digit << (64 - leftover_shift_count); + carry = (leftover_shift_count != 0) ? (digit << (64 - leftover_shift_count)) : 0; if (dest_digit_index == 0) { break; } op_digit_index -= 1; diff --git a/src/buffer.hpp b/src/buffer.hpp index 82bcb56611..8876316589 100644 --- a/src/buffer.hpp +++ b/src/buffer.hpp @@ -178,10 +178,7 @@ static inline bool buf_starts_with_str(Buf *buf, const char *str) { } static inline bool buf_ends_with_mem(Buf *buf, const char *mem, size_t mem_len) { - if (buf_len(buf) < mem_len) { - return false; - } - return memcmp(buf_ptr(buf) + buf_len(buf) - mem_len, mem, mem_len) == 0; + return mem_ends_with_mem(buf_ptr(buf), buf_len(buf), mem, mem_len); } static inline bool buf_ends_with_str(Buf *buf, const char *str) { diff --git a/src/cache_hash.cpp b/src/cache_hash.cpp index 3cff34ea5c..c12d8f29ef 100644 --- a/src/cache_hash.cpp +++ b/src/cache_hash.cpp @@ -27,11 +27,17 @@ void cache_init(CacheHash *ch, Buf *manifest_dir) { void cache_mem(CacheHash *ch, const char *ptr, size_t len) { assert(ch->manifest_file_path == nullptr); assert(ptr != nullptr); - // + 1 to include the null byte blake2b_update(&ch->blake, ptr, len); } +void cache_slice(CacheHash *ch, Slice slice) { + // mix the length into the hash so that two juxtaposed cached slices can't collide + cache_usize(ch, slice.len); + cache_mem(ch, slice.ptr, slice.len); +} + void cache_str(CacheHash *ch, const char *ptr) { + // + 1 to include the null byte cache_mem(ch, ptr, strlen(ptr) + 1); } diff --git a/src/cache_hash.hpp b/src/cache_hash.hpp index 9e4c41b1e0..ba2434076a 100644 --- a/src/cache_hash.hpp +++ b/src/cache_hash.hpp @@ -36,6 +36,7 @@ void cache_init(CacheHash *ch, Buf *manifest_dir); // Next, use the hash population functions to add the initial parameters. void cache_mem(CacheHash *ch, const char *ptr, size_t len); +void cache_slice(CacheHash *ch, Slice slice); void cache_str(CacheHash *ch, const char *ptr); void cache_int(CacheHash *ch, int x); void cache_bool(CacheHash *ch, bool x); diff --git a/src/codegen.cpp b/src/codegen.cpp index f02253fb1a..c9e67dcac5 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -714,7 +714,7 @@ static LLVMValueRef get_arithmetic_overflow_fn(CodeGen *g, ZigType *operand_type }; if (operand_type->id == ZigTypeIdVector) { - sprintf(fn_name, "llvm.%s.with.overflow.v%" PRIu32 "i%" PRIu32, signed_str, + sprintf(fn_name, "llvm.%s.with.overflow.v%" PRIu64 "i%" PRIu32, signed_str, operand_type->data.vector.len, int_type->data.integral.bit_count); LLVMTypeRef return_elem_types[] = { @@ -3954,8 +3954,9 @@ static void render_async_var_decls(CodeGen *g, Scope *scope) { if (var->did_the_decl_codegen) { render_decl_var(g, var); } - // fallthrough } + ZIG_FALLTHROUGH; + case ScopeIdDecls: case ScopeIdBlock: case ScopeIdDefer: @@ -8784,8 +8785,6 @@ static Error define_builtin_compile_vars(CodeGen *g) { cache_bool(&cache_hash, g->is_test_build); cache_bool(&cache_hash, g->is_single_threaded); cache_bool(&cache_hash, g->test_is_evented); - cache_bool(&cache_hash, g->cpp_rtti); - cache_bool(&cache_hash, g->cpp_exceptions); cache_int(&cache_hash, g->code_model); cache_int(&cache_hash, g->zig_target->is_native_os); cache_int(&cache_hash, g->zig_target->is_native_cpu); @@ -9125,21 +9124,29 @@ static void detect_libc(CodeGen *g) { g->libc_include_dir_len = 0; g->libc_include_dir_list = heap::c_allocator.allocate(dir_count); - g->libc_include_dir_list[g->libc_include_dir_len] = g->libc->include_dir; + g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_create_from_mem( + g->libc->include_dir, g->libc->include_dir_len)); g->libc_include_dir_len += 1; if (want_sys_dir) { - g->libc_include_dir_list[g->libc_include_dir_len] = g->libc->sys_include_dir; + g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_create_from_mem( + g->libc->sys_include_dir, g->libc->sys_include_dir_len)); g->libc_include_dir_len += 1; } if (want_um_and_shared_dirs != 0) { - g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_sprintf( - "%s" OS_SEP ".." OS_SEP "um", g->libc->include_dir)); + Buf *include_dir_parent = buf_alloc(); + os_path_join(buf_create_from_mem(g->libc->include_dir, g->libc->include_dir_len), + buf_create_from_str(".."), include_dir_parent); + + Buf *buff1 = buf_alloc(); + os_path_join(include_dir_parent, buf_create_from_str("um"), buff1); + g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buff1); g->libc_include_dir_len += 1; - g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_sprintf( - "%s" OS_SEP ".." OS_SEP "shared", g->libc->include_dir)); + Buf *buff2 = buf_alloc(); + os_path_join(include_dir_parent, buf_create_from_str("shared"), buff2); + g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buff2); g->libc_include_dir_len += 1; } assert(g->libc_include_dir_len == dir_count); @@ -9163,20 +9170,13 @@ static void detect_libc(CodeGen *g) { // does not add the "cc" arg void add_cc_args(CodeGen *g, ZigList &args, const char *out_dep_path, - bool translate_c, CSourceKind source_kind) + bool translate_c, FileExt source_kind) { if (translate_c) { args.append("-x"); args.append("c"); } - if (source_kind != CSourceKindAsm && out_dep_path != nullptr) { - args.append("-MD"); - args.append("-MV"); - args.append("-MF"); - args.append(out_dep_path); - } - args.append("-nostdinc"); args.append("-fno-spell-checking"); @@ -9184,14 +9184,7 @@ void add_cc_args(CodeGen *g, ZigList &args, const char *out_dep_pa args.append("-ffunction-sections"); } - if (translate_c) { - if (source_kind != CSourceKindAsm) { - // this gives us access to preprocessing entities, presumably at - // the cost of performance - args.append("-Xclang"); - args.append("-detailed-preprocessing-record"); - } - } else { + if (!translate_c) { switch (g->err_color) { case ErrColorAuto: break; @@ -9225,24 +9218,25 @@ void add_cc_args(CodeGen *g, ZigList &args, const char *out_dep_pa args.append("-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS"); } - // According to Rich Felker libc headers are supposed to go before C language headers. - // However as noted by @dimenus, appending libc headers before c_headers breaks intrinsics - // and other compiler specific items. - args.append("-isystem"); - args.append(buf_ptr(g->zig_c_headers_dir)); - - for (size_t i = 0; i < g->libc_include_dir_len; i += 1) { - const char *include_dir = g->libc_include_dir_list[i]; - args.append("-isystem"); - args.append(include_dir); - } - args.append("-target"); args.append(buf_ptr(&g->llvm_triple_str)); switch (source_kind) { - case CSourceKindC: - case CSourceKindCpp: + case FileExtC: + case FileExtCpp: + case FileExtHeader: + // According to Rich Felker libc headers are supposed to go before C language headers. + // However as noted by @dimenus, appending libc headers before c_headers breaks intrinsics + // and other compiler specific items. + args.append("-isystem"); + args.append(buf_ptr(g->zig_c_headers_dir)); + + for (size_t i = 0; i < g->libc_include_dir_len; i += 1) { + const char *include_dir = g->libc_include_dir_list[i]; + args.append("-isystem"); + args.append(include_dir); + } + if (g->zig_target->llvm_cpu_name != nullptr) { args.append("-Xclang"); args.append("-target-cpu"); @@ -9255,18 +9249,25 @@ void add_cc_args(CodeGen *g, ZigList &args, const char *out_dep_pa args.append("-Xclang"); args.append(g->zig_target->llvm_cpu_features); } + if (translate_c) { + // this gives us access to preprocessing entities, presumably at + // the cost of performance + args.append("-Xclang"); + args.append("-detailed-preprocessing-record"); + } + if (out_dep_path != nullptr) { + args.append("-MD"); + args.append("-MV"); + args.append("-MF"); + args.append(out_dep_path); + } break; - case CSourceKindAsm: + case FileExtAsm: + case FileExtLLVMIr: + case FileExtLLVMBitCode: + case FileExtUnknown: break; } - if (source_kind == CSourceKindCpp) { - if (!g->cpp_rtti) { - args.append("-fno-rtti"); - } - if (!g->cpp_exceptions) { - args.append("-fno-exceptions"); - } - } for (size_t i = 0; i < g->zig_target->llvm_cpu_features_asm_len; i += 1) { args.append(g->zig_target->llvm_cpu_features_asm_ptr[i]); } @@ -9414,7 +9415,7 @@ void codegen_translate_c(CodeGen *g, Buf *full_path) { } ZigList clang_argv = {0}; - add_cc_args(g, clang_argv, out_dep_path_cstr, true, CSourceKindC); + add_cc_args(g, clang_argv, out_dep_path_cstr, true, FileExtC); clang_argv.append(buf_ptr(full_path)); @@ -9714,8 +9715,6 @@ Error create_c_object_cache(CodeGen *g, CacheHash **out_cache_hash, bool verbose cache_bool(cache_hash, g->have_sanitize_c); cache_bool(cache_hash, want_valgrind_support(g)); cache_bool(cache_hash, g->function_sections); - cache_bool(cache_hash, g->cpp_rtti); - cache_bool(cache_hash, g->cpp_exceptions); cache_int(cache_hash, g->code_model); for (size_t arg_i = 0; arg_i < g->clang_argv_len; arg_i += 1) { @@ -9754,15 +9753,6 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { Buf *c_source_basename = buf_alloc(); os_path_split(c_source_file, nullptr, c_source_basename); - CSourceKind c_source_kind; - if (buf_ends_with_str(c_source_basename, ".s") || - buf_ends_with_str(c_source_basename, ".S")) - { - c_source_kind = CSourceKindAsm; - } else { - c_source_kind = CSourceKindC; - } - Stage2ProgressNode *child_prog_node = stage2_progress_start(g->sub_progress_node, buf_ptr(c_source_basename), buf_len(c_source_basename), 0); @@ -9813,7 +9803,7 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { exit(1); } } - bool is_cache_miss = (buf_len(&digest) == 0); + bool is_cache_miss = g->disable_c_depfile || (buf_len(&digest) == 0); if (is_cache_miss) { // we can't know the digest until we do the C compiler invocation, so we // need a tmp filename. @@ -9828,14 +9818,14 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { args.append(buf_ptr(self_exe_path)); args.append("clang"); - if (c_file->preprocessor_only_basename != nullptr) { - args.append("-E"); - } else { + if (c_file->preprocessor_only_basename == nullptr) { args.append("-c"); } - Buf *out_dep_path = buf_sprintf("%s.d", buf_ptr(out_obj_path)); - add_cc_args(g, args, buf_ptr(out_dep_path), false, c_source_kind); + Buf *out_dep_path = g->disable_c_depfile ? nullptr : buf_sprintf("%s.d", buf_ptr(out_obj_path)); + const char *out_dep_path_cstr = (out_dep_path == nullptr) ? nullptr : buf_ptr(out_dep_path); + FileExt ext = classify_file_ext(buf_ptr(c_source_basename), buf_len(c_source_basename)); + add_cc_args(g, args, out_dep_path_cstr, false, ext); args.append("-o"); args.append(buf_ptr(out_obj_path)); @@ -9856,23 +9846,25 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { exit(1); } - // add the files depended on to the cache system - if ((err = cache_add_dep_file(cache_hash, out_dep_path, true))) { - // Don't treat the absence of the .d file as a fatal error, the - // compiler may not produce one eg. when compiling .s files + if (out_dep_path != nullptr) { + // add the files depended on to the cache system + if ((err = cache_add_dep_file(cache_hash, out_dep_path, true))) { + // Don't treat the absence of the .d file as a fatal error, the + // compiler may not produce one eg. when compiling .s files + if (err != ErrorFileNotFound) { + fprintf(stderr, "Failed to add C source dependencies to cache: %s\n", err_str(err)); + exit(1); + } + } if (err != ErrorFileNotFound) { - fprintf(stderr, "Failed to add C source dependencies to cache: %s\n", err_str(err)); + os_delete_file(out_dep_path); + } + + if ((err = cache_final(cache_hash, &digest))) { + fprintf(stderr, "Unable to finalize cache hash: %s\n", err_str(err)); exit(1); } } - if (err != ErrorFileNotFound) { - os_delete_file(out_dep_path); - } - - if ((err = cache_final(cache_hash, &digest))) { - fprintf(stderr, "Unable to finalize cache hash: %s\n", err_str(err)); - exit(1); - } artifact_dir = buf_alloc(); os_path_join(o_dir, &digest, artifact_dir); if ((err = os_make_path(artifact_dir))) { @@ -10550,8 +10542,6 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) { cache_bool(ch, g->emit_bin); cache_bool(ch, g->emit_llvm_ir); cache_bool(ch, g->emit_asm); - cache_bool(ch, g->cpp_rtti); - cache_bool(ch, g->cpp_exceptions); cache_usize(ch, g->version_major); cache_usize(ch, g->version_minor); cache_usize(ch, g->version_patch); @@ -10560,14 +10550,19 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) { cache_list_of_str(ch, g->lib_dirs.items, g->lib_dirs.length); cache_list_of_str(ch, g->framework_dirs.items, g->framework_dirs.length); if (g->libc) { - cache_str(ch, g->libc->include_dir); - cache_str(ch, g->libc->sys_include_dir); - cache_str(ch, g->libc->crt_dir); - cache_str(ch, g->libc->msvc_lib_dir); - cache_str(ch, g->libc->kernel32_lib_dir); + cache_slice(ch, Slice{g->libc->include_dir, g->libc->include_dir_len}); + cache_slice(ch, Slice{g->libc->sys_include_dir, g->libc->sys_include_dir_len}); + cache_slice(ch, Slice{g->libc->crt_dir, g->libc->crt_dir_len}); + cache_slice(ch, Slice{g->libc->msvc_lib_dir, g->libc->msvc_lib_dir_len}); + cache_slice(ch, Slice{g->libc->kernel32_lib_dir, g->libc->kernel32_lib_dir_len}); } cache_buf_opt(ch, g->version_script_path); cache_buf_opt(ch, g->override_soname); + cache_buf_opt(ch, g->linker_optimization); + cache_int(ch, g->linker_gc_sections); + cache_int(ch, g->linker_allow_shlib_undefined); + cache_bool(ch, g->linker_z_nodelete); + cache_bool(ch, g->linker_z_defs); // gen_c_objects appends objects to g->link_objects which we want to include in the hash gen_c_objects(g); @@ -10856,8 +10851,6 @@ CodeGen *create_child_codegen(CodeGen *parent_gen, Buf *root_src_path, OutType o parent_gen->build_mode, parent_gen->zig_lib_dir, libc, get_global_cache_dir(), false, child_progress_node); child_gen->root_out_name = buf_create_from_str(name); child_gen->disable_gen_h = true; - child_gen->cpp_rtti = parent_gen->cpp_rtti; - child_gen->cpp_exceptions = parent_gen->cpp_exceptions; child_gen->want_stack_check = WantStackCheckDisabled; child_gen->want_sanitize_c = WantCSanitizeDisabled; child_gen->verbose_tokenize = parent_gen->verbose_tokenize; diff --git a/src/compiler.cpp b/src/compiler.cpp index cddecc2025..8294fc7871 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -164,3 +164,25 @@ Buf *get_global_cache_dir(void) { buf_deinit(&app_data_dir); return &saved_global_cache_dir; } + +FileExt classify_file_ext(const char *filename_ptr, size_t filename_len) { + if (mem_ends_with_str(filename_ptr, filename_len, ".c")) { + return FileExtC; + } else if (mem_ends_with_str(filename_ptr, filename_len, ".C") || + mem_ends_with_str(filename_ptr, filename_len, ".cc") || + mem_ends_with_str(filename_ptr, filename_len, ".cpp") || + mem_ends_with_str(filename_ptr, filename_len, ".cxx")) + { + return FileExtCpp; + } else if (mem_ends_with_str(filename_ptr, filename_len, ".ll")) { + return FileExtLLVMIr; + } else if (mem_ends_with_str(filename_ptr, filename_len, ".bc")) { + return FileExtLLVMBitCode; + } else if (mem_ends_with_str(filename_ptr, filename_len, ".s") || + mem_ends_with_str(filename_ptr, filename_len, ".S")) + { + return FileExtAsm; + } + // TODO look for .so, .so.X, .so.X.Y, .so.X.Y.Z + return FileExtUnknown; +} diff --git a/src/compiler.hpp b/src/compiler.hpp index 47841af5dc..ae2e6e9c5e 100644 --- a/src/compiler.hpp +++ b/src/compiler.hpp @@ -8,8 +8,7 @@ #ifndef ZIG_COMPILER_HPP #define ZIG_COMPILER_HPP -#include "buffer.hpp" -#include "error.hpp" +#include "all_types.hpp" Error get_compiler_id(Buf **result); @@ -19,4 +18,7 @@ Buf *get_zig_std_dir(Buf *zig_lib_dir); Buf *get_global_cache_dir(void); + +FileExt classify_file_ext(const char *filename_ptr, size_t filename_len); + #endif diff --git a/src/dump_analysis.cpp b/src/dump_analysis.cpp index c31438b658..3522dcf6f4 100644 --- a/src/dump_analysis.cpp +++ b/src/dump_analysis.cpp @@ -80,7 +80,7 @@ static void jw_array_elem(JsonWriter *jw) { zig_unreachable(); case JsonWriterStateArray: fprintf(jw->f, ","); - // fallthrough + ZIG_FALLTHROUGH; case JsonWriterStateArrayStart: jw->state[jw->state_index] = JsonWriterStateArray; jw_push_state(jw, JsonWriterStateValue); @@ -134,7 +134,7 @@ static void jw_object_field(JsonWriter *jw, const char *name) { zig_unreachable(); case JsonWriterStateObject: fprintf(jw->f, ","); - // fallthrough + ZIG_FALLTHROUGH; case JsonWriterStateObjectStart: jw->state[jw->state_index] = JsonWriterStateObject; jw_push_state(jw, JsonWriterStateValue); diff --git a/src/ir.cpp b/src/ir.cpp index 4d5cfccabe..2f9e3638f8 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -231,6 +231,7 @@ static ZigType *ir_resolve_atomic_operand_type(IrAnalyze *ira, IrInstGen *op); static IrInstSrc *ir_lval_wrap(IrBuilderSrc *irb, Scope *scope, IrInstSrc *value, LVal lval, ResultLoc *result_loc); static IrInstSrc *ir_expr_wrap(IrBuilderSrc *irb, Scope *scope, IrInstSrc *inst, ResultLoc *result_loc); static ZigType *adjust_ptr_align(CodeGen *g, ZigType *ptr_type, uint32_t new_align); +static ZigType *adjust_ptr_const(CodeGen *g, ZigType *ptr_type, bool is_const); static ZigType *adjust_slice_align(CodeGen *g, ZigType *slice_type, uint32_t new_align); static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *source_node, uint8_t *buf, ZigValue *val); static void buf_write_value_bytes(CodeGen *codegen, uint8_t *buf, ZigValue *val); @@ -11453,10 +11454,8 @@ static ConstCastOnly types_match_const_cast_only(IrAnalyze *ira, ZigType *wanted bool actual_allows_zero = ptr_allows_addr_zero(actual_type); bool wanted_is_c_ptr = wanted_type->id == ZigTypeIdPointer && wanted_type->data.pointer.ptr_len == PtrLenC; bool actual_is_c_ptr = actual_type->id == ZigTypeIdPointer && actual_type->data.pointer.ptr_len == PtrLenC; - bool wanted_opt_or_ptr = wanted_ptr_type != nullptr && - (wanted_type->id == ZigTypeIdPointer || wanted_type->id == ZigTypeIdOptional); - bool actual_opt_or_ptr = actual_ptr_type != nullptr && - (actual_type->id == ZigTypeIdPointer || actual_type->id == ZigTypeIdOptional); + bool wanted_opt_or_ptr = wanted_ptr_type != nullptr && wanted_ptr_type->id == ZigTypeIdPointer; + bool actual_opt_or_ptr = actual_ptr_type != nullptr && actual_ptr_type->id == ZigTypeIdPointer; if (wanted_opt_or_ptr && actual_opt_or_ptr) { bool ok_null_term_ptrs = wanted_ptr_type->data.pointer.sentinel == nullptr || @@ -11844,6 +11843,7 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT bool any_are_null = (prev_inst->value->type->id == ZigTypeIdNull); bool convert_to_const_slice = false; + bool make_the_slice_const = false; for (; i < instruction_count; i += 1) { IrInstGen *cur_inst = instructions[i]; ZigType *cur_type = cur_inst->value->type; @@ -12357,12 +12357,12 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT ZigType *slice_type = (prev_type->id == ZigTypeIdErrorUnion) ? prev_type->data.error_union.payload_type : prev_type; ZigType *slice_ptr_type = slice_type->data.structure.fields[slice_ptr_index]->type_entry; - if ((slice_ptr_type->data.pointer.is_const || array_type->data.array.len == 0 || - !cur_type->data.pointer.is_const) && - types_match_const_cast_only(ira, - slice_ptr_type->data.pointer.child_type, + if (types_match_const_cast_only(ira, slice_ptr_type->data.pointer.child_type, array_type->data.array.child_type, source_node, false).id == ConstCastResultIdOk) { + bool const_ok = (slice_ptr_type->data.pointer.is_const || array_type->data.array.len == 0 || + !cur_type->data.pointer.is_const); + if (!const_ok) make_the_slice_const = true; convert_to_const_slice = false; continue; } @@ -12391,12 +12391,12 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT break; } ZigType *slice_ptr_type = slice_type->data.structure.fields[slice_ptr_index]->type_entry; - if ((slice_ptr_type->data.pointer.is_const || array_type->data.array.len == 0 || - !prev_type->data.pointer.is_const) && - types_match_const_cast_only(ira, - slice_ptr_type->data.pointer.child_type, + if (types_match_const_cast_only(ira, slice_ptr_type->data.pointer.child_type, array_type->data.array.child_type, source_node, false).id == ConstCastResultIdOk) { + bool const_ok = (slice_ptr_type->data.pointer.is_const || array_type->data.array.len == 0 || + !prev_type->data.pointer.is_const); + if (!const_ok) make_the_slice_const = true; prev_inst = cur_inst; convert_to_const_slice = false; continue; @@ -12408,8 +12408,6 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT cur_type->data.pointer.child_type->id == ZigTypeIdArray && prev_type->id == ZigTypeIdPointer && prev_type->data.pointer.ptr_len == PtrLenSingle && prev_type->data.pointer.child_type->id == ZigTypeIdArray && - (cur_type->data.pointer.is_const || !prev_type->data.pointer.is_const || - prev_type->data.pointer.child_type->data.array.len == 0) && ( prev_type->data.pointer.child_type->data.array.sentinel == nullptr || (cur_type->data.pointer.child_type->data.array.sentinel != nullptr && @@ -12421,6 +12419,9 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT prev_type->data.pointer.child_type->data.array.child_type, source_node, !cur_type->data.pointer.is_const).id == ConstCastResultIdOk) { + bool const_ok = (cur_type->data.pointer.is_const || !prev_type->data.pointer.is_const || + prev_type->data.pointer.child_type->data.array.len == 0); + if (!const_ok) make_the_slice_const = true; prev_inst = cur_inst; convert_to_const_slice = true; continue; @@ -12429,8 +12430,6 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT prev_type->data.pointer.child_type->id == ZigTypeIdArray && cur_type->id == ZigTypeIdPointer && cur_type->data.pointer.ptr_len == PtrLenSingle && cur_type->data.pointer.child_type->id == ZigTypeIdArray && - (prev_type->data.pointer.is_const || !cur_type->data.pointer.is_const || - cur_type->data.pointer.child_type->data.array.len == 0) && ( cur_type->data.pointer.child_type->data.array.sentinel == nullptr || (prev_type->data.pointer.child_type->data.array.sentinel != nullptr && @@ -12442,6 +12441,9 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT cur_type->data.pointer.child_type->data.array.child_type, source_node, !prev_type->data.pointer.is_const).id == ConstCastResultIdOk) { + bool const_ok = (prev_type->data.pointer.is_const || !cur_type->data.pointer.is_const || + cur_type->data.pointer.child_type->data.array.len == 0); + if (!const_ok) make_the_slice_const = true; convert_to_const_slice = true; continue; } @@ -12486,7 +12488,7 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT src_assert(array_type->id == ZigTypeIdArray, source_node); ZigType *ptr_type = get_pointer_to_type_extra2( ira->codegen, array_type->data.array.child_type, - prev_inst->value->type->data.pointer.is_const, false, + prev_inst->value->type->data.pointer.is_const || make_the_slice_const, false, PtrLenUnknown, 0, 0, 0, false, VECTOR_INDEX_NONE, nullptr, array_type->data.array.sentinel); @@ -12537,6 +12539,26 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT return ira->codegen->builtin_types.entry_invalid; return get_optional_type(ira->codegen, prev_inst->value->type); } + } else if (make_the_slice_const) { + ZigType *slice_type; + if (prev_inst->value->type->id == ZigTypeIdErrorUnion) { + slice_type = prev_inst->value->type->data.error_union.payload_type; + } else if (is_slice(prev_inst->value->type)) { + slice_type = prev_inst->value->type; + } else { + zig_unreachable(); + } + ZigType *slice_ptr_type = slice_type->data.structure.fields[slice_ptr_index]->type_entry; + ZigType *adjusted_ptr_type = adjust_ptr_const(ira->codegen, slice_ptr_type, make_the_slice_const); + ZigType *adjusted_slice_type = get_slice_type(ira->codegen, adjusted_ptr_type); + if (prev_inst->value->type->id == ZigTypeIdErrorUnion) { + return get_error_union_type(ira->codegen, prev_inst->value->type->data.error_union.err_set_type, + adjusted_slice_type); + } else if (is_slice(prev_inst->value->type)) { + return adjusted_slice_type; + } else { + zig_unreachable(); + } } else { return prev_inst->value->type; } @@ -15929,7 +15951,7 @@ static IrInstGen *ir_analyze_bin_op_cmp_numeric(IrAnalyze *ira, IrInst *source_i if (op1->value->type->id == ZigTypeIdVector && op2->value->type->id == ZigTypeIdVector) { if (op1->value->type->data.vector.len != op2->value->type->data.vector.len) { ir_add_error(ira, source_instr, - buf_sprintf("vector length mismatch: %" PRIu32 " and %" PRIu32, + buf_sprintf("vector length mismatch: %" PRIu64 " and %" PRIu64, op1->value->type->data.vector.len, op2->value->type->data.vector.len)); return ira->codegen->invalid_inst_gen; } @@ -18958,7 +18980,7 @@ static IrInstGen *ir_analyze_async_call(IrAnalyze *ira, IrInst* source_instr, Zi if (type_is_invalid(result_loc->value->type) || result_loc->value->type->id == ZigTypeIdUnreachable) { return result_loc; } - result_loc = ir_implicit_cast2(ira, &call_result_loc->source_instruction->base, result_loc, + result_loc = ir_implicit_cast2(ira, source_instr, result_loc, get_pointer_to_type(ira->codegen, frame_type, false)); if (type_is_invalid(result_loc->value->type)) return ira->codegen->invalid_inst_gen; @@ -19925,6 +19947,7 @@ static IrInstGen *ir_analyze_call_extra(IrAnalyze *ira, IrInst* source_instr, buf_sprintf("the specified modifier requires a comptime-known function")); return ira->codegen->invalid_inst_gen; } + ZIG_FALLTHROUGH; default: break; } @@ -19943,14 +19966,16 @@ static IrInstGen *ir_analyze_call_extra(IrAnalyze *ira, IrInst* source_instr, return ira->codegen->invalid_inst_gen; IrInstGen *stack = nullptr; + IrInst *stack_src = nullptr; if (stack_is_non_null) { stack = ir_analyze_optional_value_payload_value(ira, source_instr, opt_stack, false); if (type_is_invalid(stack->value->type)) return ira->codegen->invalid_inst_gen; + stack_src = &stack->base; } return ir_analyze_fn_call(ira, source_instr, fn, fn_type, fn_ref, first_arg_ptr, first_arg_ptr_src, - modifier, stack, &stack->base, false, args_ptr, args_len, nullptr, result_loc); + modifier, stack, stack_src, false, args_ptr, args_len, nullptr, result_loc); } static IrInstGen *ir_analyze_instruction_call_extra(IrAnalyze *ira, IrInstSrcCallExtra *instruction) { @@ -20708,24 +20733,44 @@ static ZigType *adjust_slice_align(CodeGen *g, ZigType *slice_type, uint32_t new static ZigType *adjust_ptr_len(CodeGen *g, ZigType *ptr_type, PtrLen ptr_len) { assert(ptr_type->id == ZigTypeIdPointer); - return get_pointer_to_type_extra(g, + return get_pointer_to_type_extra2(g, ptr_type->data.pointer.child_type, ptr_type->data.pointer.is_const, ptr_type->data.pointer.is_volatile, ptr_len, ptr_type->data.pointer.explicit_alignment, ptr_type->data.pointer.bit_offset_in_host, ptr_type->data.pointer.host_int_bytes, - ptr_type->data.pointer.allow_zero); + ptr_type->data.pointer.allow_zero, + ptr_type->data.pointer.vector_index, + ptr_type->data.pointer.inferred_struct_field, + ptr_type->data.pointer.sentinel); } static ZigType *adjust_ptr_allow_zero(CodeGen *g, ZigType *ptr_type, bool allow_zero) { assert(ptr_type->id == ZigTypeIdPointer); - return get_pointer_to_type_extra(g, + return get_pointer_to_type_extra2(g, ptr_type->data.pointer.child_type, ptr_type->data.pointer.is_const, ptr_type->data.pointer.is_volatile, ptr_type->data.pointer.ptr_len, ptr_type->data.pointer.explicit_alignment, ptr_type->data.pointer.bit_offset_in_host, ptr_type->data.pointer.host_int_bytes, - allow_zero); + allow_zero, + ptr_type->data.pointer.vector_index, + ptr_type->data.pointer.inferred_struct_field, + ptr_type->data.pointer.sentinel); +} + +static ZigType *adjust_ptr_const(CodeGen *g, ZigType *ptr_type, bool is_const) { + assert(ptr_type->id == ZigTypeIdPointer); + return get_pointer_to_type_extra2(g, + ptr_type->data.pointer.child_type, + is_const, ptr_type->data.pointer.is_volatile, + ptr_type->data.pointer.ptr_len, + ptr_type->data.pointer.explicit_alignment, + ptr_type->data.pointer.bit_offset_in_host, ptr_type->data.pointer.host_int_bytes, + ptr_type->data.pointer.allow_zero, + ptr_type->data.pointer.vector_index, + ptr_type->data.pointer.inferred_struct_field, + ptr_type->data.pointer.sentinel); } static Error compute_elem_align(IrAnalyze *ira, ZigType *elem_type, uint32_t base_ptr_align, @@ -20880,13 +20925,8 @@ static IrInstGen *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstSrcElemP if (instr_is_comptime(casted_elem_index)) { uint64_t index = bigint_as_u64(&casted_elem_index->value->data.x_bigint); if (array_type->id == ZigTypeIdArray) { - uint64_t array_len = array_type->data.array.len; - if (index == array_len && array_type->data.array.sentinel != nullptr) { - ZigType *elem_type = array_type->data.array.child_type; - IrInstGen *sentinel_elem = ir_const(ira, &elem_ptr_instruction->base.base, elem_type); - copy_const_val(ira->codegen, sentinel_elem->value, array_type->data.array.sentinel); - return ir_get_ref(ira, &elem_ptr_instruction->base.base, sentinel_elem, true, false); - } + uint64_t array_len = array_type->data.array.len + + (array_type->data.array.sentinel != nullptr); if (index >= array_len) { ir_add_error_node(ira, elem_ptr_instruction->base.base.source_node, buf_sprintf("index %" ZIG_PRI_u64 " outside array of size %" ZIG_PRI_u64, @@ -25131,7 +25171,7 @@ static IrInstGen *ir_analyze_instruction_c_import(IrAnalyze *ira, IrInstSrcCImpo ZigList clang_argv = {0}; - add_cc_args(ira->codegen, clang_argv, buf_ptr(tmp_dep_file), true, CSourceKindC); + add_cc_args(ira->codegen, clang_argv, buf_ptr(tmp_dep_file), true, FileExtC); clang_argv.append(buf_ptr(&tmp_c_file_path)); @@ -28128,6 +28168,7 @@ static void buf_write_value_bytes(CodeGen *codegen, uint8_t *buf, ZigValue *val) return; } } + zig_unreachable(); case ZigTypeIdOptional: zig_panic("TODO buf_write_value_bytes maybe type"); case ZigTypeIdFn: diff --git a/src/link.cpp b/src/link.cpp index 1a454531b5..e26a7ea436 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -651,6 +651,7 @@ static const char *build_libunwind(CodeGen *parent, Stage2ProgressNode *progress if (parent->is_single_threaded) { c_file->args.append("-D_LIBUNWIND_HAS_NO_THREADS"); } + c_file->args.append("-Wno-bitwise-conditional-parentheses"); c_source_files.append(c_file); } child_gen->c_source_files = c_source_files; @@ -1594,7 +1595,8 @@ static const char *get_libc_crt_file(CodeGen *parent, const char *file, Stage2Pr } else { assert(parent->libc != nullptr); Buf *out_buf = buf_alloc(); - os_path_join(buf_create_from_str(parent->libc->crt_dir), buf_create_from_str(file), out_buf); + os_path_join(buf_create_from_mem(parent->libc->crt_dir, parent->libc->crt_dir_len), + buf_create_from_str(file), out_buf); return buf_ptr(out_buf); } } @@ -1767,8 +1769,17 @@ static void construct_linker_job_elf(LinkJob *lj) { lj->args.append(g->linker_script); } - if (g->out_type != OutTypeObj) { - lj->args.append("--gc-sections"); + switch (g->linker_gc_sections) { + case OptionalBoolNull: + if (g->out_type != OutTypeObj) { + lj->args.append("--gc-sections"); + } + break; + case OptionalBoolTrue: + lj->args.append("--gc-sections"); + break; + case OptionalBoolFalse: + break; } if (g->link_eh_frame_hdr) { @@ -1779,6 +1790,19 @@ static void construct_linker_job_elf(LinkJob *lj) { lj->args.append("--export-dynamic"); } + if (g->linker_optimization != nullptr) { + lj->args.append(buf_ptr(g->linker_optimization)); + } + + if (g->linker_z_nodelete) { + lj->args.append("-z"); + lj->args.append("nodelete"); + } + if (g->linker_z_defs) { + lj->args.append("-z"); + lj->args.append("defs"); + } + lj->args.append("-m"); lj->args.append(getLDMOption(g->zig_target)); @@ -1859,7 +1883,7 @@ static void construct_linker_job_elf(LinkJob *lj) { if (g->libc_link_lib != nullptr) { if (g->libc != nullptr) { lj->args.append("-L"); - lj->args.append(g->libc->crt_dir); + lj->args.append(buf_ptr(buf_create_from_mem(g->libc->crt_dir, g->libc->crt_dir_len))); } if (g->have_dynamic_link && (is_dyn_lib || g->out_type == OutTypeExe)) { @@ -1903,7 +1927,7 @@ static void construct_linker_job_elf(LinkJob *lj) { // libc is linked specially continue; } - if (buf_eql_str(link_lib->name, "c++") || buf_eql_str(link_lib->name, "c++abi")) { + if (target_is_libcpp_lib_name(g->zig_target, buf_ptr(link_lib->name))) { // libc++ is linked specially continue; } @@ -1947,15 +1971,11 @@ static void construct_linker_job_elf(LinkJob *lj) { lj->args.append("-lpthread"); } } else if (target_is_glibc(g->zig_target)) { - if (target_supports_libunwind(g->zig_target)) { - lj->args.append(build_libunwind(g, lj->build_dep_prog_node)); - } + lj->args.append(build_libunwind(g, lj->build_dep_prog_node)); add_glibc_libs(lj); lj->args.append(get_libc_crt_file(g, "libc_nonshared.a", lj->build_dep_prog_node)); } else if (target_is_musl(g->zig_target)) { - if (target_supports_libunwind(g->zig_target)) { - lj->args.append(build_libunwind(g, lj->build_dep_prog_node)); - } + lj->args.append(build_libunwind(g, lj->build_dep_prog_node)); lj->args.append(build_musl(g, lj->build_dep_prog_node)); } else if (g->libcpp_link_lib != nullptr) { lj->args.append(build_libunwind(g, lj->build_dep_prog_node)); @@ -1973,8 +1993,17 @@ static void construct_linker_job_elf(LinkJob *lj) { } } - if (!g->zig_target->is_native_os) { - lj->args.append("--allow-shlib-undefined"); + switch (g->linker_allow_shlib_undefined) { + case OptionalBoolNull: + if (!g->zig_target->is_native_os) { + lj->args.append("--allow-shlib-undefined"); + } + break; + case OptionalBoolFalse: + break; + case OptionalBoolTrue: + lj->args.append("--allow-shlib-undefined"); + break; } } @@ -2384,14 +2413,26 @@ static void construct_linker_job_coff(LinkJob *lj) { lj->args.append(buf_ptr(buf_sprintf("-OUT:%s", buf_ptr(&g->bin_file_output_path)))); if (g->libc_link_lib != nullptr && g->libc != nullptr) { - lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->crt_dir))); + Buf *buff0 = buf_create_from_str("-LIBPATH:"); + buf_append_mem(buff0, g->libc->crt_dir, g->libc->crt_dir_len); + lj->args.append(buf_ptr(buff0)); if (target_abi_is_gnu(g->zig_target->abi)) { - lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->sys_include_dir))); - lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->include_dir))); + Buf *buff1 = buf_create_from_str("-LIBPATH:"); + buf_append_mem(buff1, g->libc->sys_include_dir, g->libc->sys_include_dir_len); + lj->args.append(buf_ptr(buff1)); + + Buf *buff2 = buf_create_from_str("-LIBPATH:"); + buf_append_mem(buff2, g->libc->include_dir, g->libc->include_dir_len); + lj->args.append(buf_ptr(buff2)); } else { - lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->msvc_lib_dir))); - lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->kernel32_lib_dir))); + Buf *buff1 = buf_create_from_str("-LIBPATH:"); + buf_append_mem(buff1, g->libc->msvc_lib_dir, g->libc->msvc_lib_dir_len); + lj->args.append(buf_ptr(buff1)); + + Buf *buff2 = buf_create_from_str("-LIBPATH:"); + buf_append_mem(buff2, g->libc->kernel32_lib_dir, g->libc->kernel32_lib_dir_len); + lj->args.append(buf_ptr(buff2)); } } @@ -2470,7 +2511,12 @@ static void construct_linker_job_coff(LinkJob *lj) { if (buf_eql_str(link_lib->name, "c")) { continue; } - if (buf_eql_str(link_lib->name, "c++") || buf_eql_str(link_lib->name, "c++abi")) { + if (target_is_libcpp_lib_name(g->zig_target, buf_ptr(link_lib->name))) { + // libc++ is linked specially + continue; + } + if (g->libc == nullptr && target_is_libc_lib_name(g->zig_target, buf_ptr(link_lib->name))) { + // these libraries are always linked below when targeting glibc continue; } bool is_sys_lib = is_mingw_link_lib(link_lib->name); @@ -2521,10 +2567,34 @@ static void construct_linker_job_macho(LinkJob *lj) { //lj->args.append("-error-limit=0"); lj->args.append("-demangle"); + switch (g->linker_gc_sections) { + case OptionalBoolNull: + // TODO why do we not follow the same logic of elf here? + break; + case OptionalBoolTrue: + lj->args.append("--gc-sections"); + break; + case OptionalBoolFalse: + break; + } + if (g->linker_rdynamic) { lj->args.append("-export_dynamic"); } + if (g->linker_optimization != nullptr) { + lj->args.append(buf_ptr(g->linker_optimization)); + } + + if (g->linker_z_nodelete) { + lj->args.append("-z"); + lj->args.append("nodelete"); + } + if (g->linker_z_defs) { + lj->args.append("-z"); + lj->args.append("defs"); + } + bool is_lib = g->out_type == OutTypeLib; bool is_dyn_lib = g->is_dynamic && is_lib; if (is_lib && !g->is_dynamic) { @@ -2639,9 +2709,20 @@ static void construct_linker_job_macho(LinkJob *lj) { // and change between versions. // so we always link against libSystem lj->args.append("-lSystem"); - } else { - lj->args.append("-undefined"); - lj->args.append("dynamic_lookup"); + } + switch (g->linker_allow_shlib_undefined) { + case OptionalBoolNull: + if (!g->zig_target->is_native_os) { + lj->args.append("-undefined"); + lj->args.append("dynamic_lookup"); + } + break; + case OptionalBoolFalse: + break; + case OptionalBoolTrue: + lj->args.append("-undefined"); + lj->args.append("dynamic_lookup"); + break; } for (size_t i = 0; i < g->framework_dirs.length; i += 1) { diff --git a/src/main.cpp b/src/main.cpp index a7a9b41950..cd45d40e5f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -455,11 +455,15 @@ static int main0(int argc, char **argv) { const char *mcpu = nullptr; CodeModel code_model = CodeModelDefault; const char *override_soname = nullptr; - bool only_preprocess = false; + bool only_pp_or_asm = false; bool ensure_libc_on_non_freestanding = false; bool ensure_libcpp_on_non_freestanding = false; - bool cpp_rtti = true; - bool cpp_exceptions = true; + bool disable_c_depfile = false; + Buf *linker_optimization = nullptr; + OptionalBool linker_gc_sections = OptionalBoolNull; + OptionalBool linker_allow_shlib_undefined = OptionalBoolNull; + bool linker_z_nodelete = false; + bool linker_z_defs = false; ZigList llvm_argv = {0}; llvm_argv.append("zig (LLVM option parsing)"); @@ -617,20 +621,22 @@ static int main0(int argc, char **argv) { } break; case Stage2ClangArgPositional: { - Buf *arg_buf = buf_create_from_str(it.only_arg); - if (buf_ends_with_str(arg_buf, ".c") || - buf_ends_with_str(arg_buf, ".C") || - buf_ends_with_str(arg_buf, ".cc") || - buf_ends_with_str(arg_buf, ".cpp") || - buf_ends_with_str(arg_buf, ".cxx") || - buf_ends_with_str(arg_buf, ".s") || - buf_ends_with_str(arg_buf, ".S")) - { - CFile *c_file = heap::c_allocator.create(); - c_file->source_path = it.only_arg; - c_source_files.append(c_file); - } else { - objects.append(it.only_arg); + FileExt file_ext = classify_file_ext(it.only_arg, strlen(it.only_arg)); + switch (file_ext) { + case FileExtAsm: + case FileExtC: + case FileExtCpp: + case FileExtLLVMIr: + case FileExtLLVMBitCode: + case FileExtHeader: { + CFile *c_file = heap::c_allocator.create(); + c_file->source_path = it.only_arg; + c_source_files.append(c_file); + break; + } + case FileExtUnknown: + objects.append(it.only_arg); + break; } break; } @@ -676,8 +682,12 @@ static int main0(int argc, char **argv) { } break; } - case Stage2ClangArgPreprocess: - only_preprocess = true; + case Stage2ClangArgPreprocessOrAsm: + // this handles both -E and -S + only_pp_or_asm = true; + for (size_t i = 0; i < it.other_args_len; i += 1) { + clang_argv.append(it.other_args_ptr[i]); + } break; case Stage2ClangArgOptimize: // alright what release mode do they want? @@ -688,7 +698,9 @@ static int main0(int argc, char **argv) { strcmp(it.only_arg, "O4") == 0) { build_mode = BuildModeFastRelease; - } else if (strcmp(it.only_arg, "Og") == 0) { + } else if (strcmp(it.only_arg, "Og") == 0 || + strcmp(it.only_arg, "O0") == 0) + { build_mode = BuildModeDebug; } else { for (size_t i = 0; i < it.other_args_len; i += 1) { @@ -722,18 +734,6 @@ static int main0(int argc, char **argv) { verbose_cc = true; verbose_link = true; break; - case Stage2ClangArgExceptions: - cpp_exceptions = true; - break; - case Stage2ClangArgNoExceptions: - cpp_exceptions = false; - break; - case Stage2ClangArgRtti: - cpp_rtti = true; - break; - case Stage2ClangArgNoRtti: - cpp_rtti = false; - break; case Stage2ClangArgForLinker: linker_args.append(buf_create_from_str(it.only_arg)); break; @@ -741,6 +741,24 @@ static int main0(int argc, char **argv) { linker_args.append(buf_create_from_str("-z")); linker_args.append(buf_create_from_str(it.only_arg)); break; + case Stage2ClangArgLibDir: + lib_dirs.append(it.only_arg); + break; + case Stage2ClangArgMCpu: + mcpu = it.only_arg; + break; + case Stage2ClangArgDepFile: + disable_c_depfile = true; + for (size_t i = 0; i < it.other_args_len; i += 1) { + clang_argv.append(it.other_args_ptr[i]); + } + break; + case Stage2ClangArgFrameworkDir: + framework_dirs.append(it.only_arg); + break; + case Stage2ClangArgFramework: + frameworks.append(it.only_arg); + break; } } // Parse linker args @@ -802,6 +820,37 @@ static int main0(int argc, char **argv) { buf_eql_str(arg, "-export-dynamic")) { rdynamic = true; + } else if (buf_eql_str(arg, "--version-script")) { + i += 1; + if (i >= linker_args.length) { + fprintf(stderr, "expected linker arg after '%s'\n", buf_ptr(arg)); + return EXIT_FAILURE; + } + version_script = linker_args.at(i); + } else if (buf_starts_with_str(arg, "-O")) { + linker_optimization = arg; + } else if (buf_eql_str(arg, "--gc-sections")) { + linker_gc_sections = OptionalBoolTrue; + } else if (buf_eql_str(arg, "--no-gc-sections")) { + linker_gc_sections = OptionalBoolFalse; + } else if (buf_eql_str(arg, "--allow-shlib-undefined")) { + linker_allow_shlib_undefined = OptionalBoolTrue; + } else if (buf_eql_str(arg, "--no-allow-shlib-undefined")) { + linker_allow_shlib_undefined = OptionalBoolFalse; + } else if (buf_eql_str(arg, "-z")) { + i += 1; + if (i >= linker_args.length) { + fprintf(stderr, "expected linker arg after '%s'\n", buf_ptr(arg)); + return EXIT_FAILURE; + } + Buf *z_arg = linker_args.at(i); + if (buf_eql_str(z_arg, "nodelete")) { + linker_z_nodelete = true; + } else if (buf_eql_str(z_arg, "defs")) { + linker_z_defs = true; + } else { + fprintf(stderr, "warning: unsupported linker arg: -z %s\n", buf_ptr(z_arg)); + } } else { fprintf(stderr, "warning: unsupported linker arg: %s\n", buf_ptr(arg)); } @@ -811,7 +860,7 @@ static int main0(int argc, char **argv) { build_mode = BuildModeSafeRelease; } - if (only_preprocess) { + if (only_pp_or_asm) { cmd = CmdBuild; out_type = OutTypeObj; emit_bin = false; @@ -1329,8 +1378,6 @@ static int main0(int argc, char **argv) { LinkLib *link_lib = codegen_add_link_lib(g, buf_create_from_str(link_libs.at(i))); link_lib->provided_explicitly = true; } - g->cpp_rtti = cpp_rtti; - g->cpp_exceptions = cpp_exceptions; g->subsystem = subsystem; g->valgrind_support = valgrind_support; g->want_pic = want_pic; @@ -1369,15 +1416,17 @@ static int main0(int argc, char **argv) { return print_error_usage(arg0); } - bool any_non_c_link_libs = false; + bool any_system_lib_dependencies = false; for (size_t i = 0; i < link_libs.length; i += 1) { - if (!target_is_libc_lib_name(&target, link_libs.at(i))) { - any_non_c_link_libs = true; + if (!target_is_libc_lib_name(&target, link_libs.at(i)) && + !target_is_libcpp_lib_name(&target, link_libs.at(i))) + { + any_system_lib_dependencies = true; break; } } - if (target.is_native_os && any_non_c_link_libs) { + if (target.is_native_os && any_system_lib_dependencies) { Error err; Stage2NativePaths paths; if ((err = stage2_detect_native_paths(&paths))) { @@ -1477,8 +1526,6 @@ static int main0(int argc, char **argv) { } CodeGen *g = codegen_create(main_pkg_path, zig_root_source_file, &target, out_type, build_mode, override_lib_dir, libc, cache_dir_buf, cmd == CmdTest, root_progress_node); - g->cpp_rtti = cpp_rtti; - g->cpp_exceptions = cpp_exceptions; if (llvm_argv.length >= 2) codegen_set_llvm_argv(g, llvm_argv.items + 1, llvm_argv.length - 2); g->valgrind_support = valgrind_support; g->link_eh_frame_hdr = link_eh_frame_hdr; @@ -1522,6 +1569,13 @@ static int main0(int argc, char **argv) { g->system_linker_hack = system_linker_hack; g->function_sections = function_sections; g->code_model = code_model; + g->disable_c_depfile = disable_c_depfile; + + g->linker_optimization = linker_optimization; + g->linker_gc_sections = linker_gc_sections; + g->linker_allow_shlib_undefined = linker_allow_shlib_undefined; + g->linker_z_nodelete = linker_z_nodelete; + g->linker_z_defs = linker_z_defs; if (override_soname) { g->override_soname = buf_create_from_str(override_soname); @@ -1611,7 +1665,7 @@ static int main0(int argc, char **argv) { #endif Buf *dest_path = buf_create_from_str(emit_bin_override_path); Buf *source_path; - if (only_preprocess) { + if (only_pp_or_asm) { source_path = buf_alloc(); Buf *pp_only_basename = buf_create_from_str( c_source_files.at(0)->preprocessor_only_basename); @@ -1625,7 +1679,7 @@ static int main0(int argc, char **argv) { buf_ptr(dest_path), err_str(err)); return main_exit(root_progress_node, EXIT_FAILURE); } - } else if (only_preprocess) { + } else if (only_pp_or_asm) { #if defined(ZIG_OS_WINDOWS) buf_replace(g->c_artifact_dir, '/', '\\'); #endif diff --git a/src/os.cpp b/src/os.cpp index 872c0270f1..505063f827 100644 --- a/src/os.cpp +++ b/src/os.cpp @@ -1097,8 +1097,8 @@ static Error set_file_times(OsFile file, OsTimeStamp ts) { return ErrorNone; #else struct timespec times[2] = { - { (time_t)ts.sec, (time_t)ts.nsec }, - { (time_t)ts.sec, (time_t)ts.nsec }, + { (time_t)ts.sec, (long)ts.nsec }, + { (time_t)ts.sec, (long)ts.nsec }, }; if (futimens(file, times) == -1) { switch (errno) { @@ -1456,7 +1456,10 @@ static void init_rand() { memcpy(&seed, bytes, sizeof(unsigned)); srand(seed); #elif defined(ZIG_OS_LINUX) - srand(*((unsigned*)getauxval(AT_RANDOM))); + unsigned char *ptr_random = (unsigned char*)getauxval(AT_RANDOM); + unsigned seed; + memcpy(&seed, ptr_random, sizeof(seed)); + srand(seed); #else int fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC); if (fd == -1) { diff --git a/src/stage2.h b/src/stage2.h index b4f04939c3..76b6683ba3 100644 --- a/src/stage2.h +++ b/src/stage2.h @@ -342,18 +342,19 @@ enum Stage2ClangArg { Stage2ClangArgShared, Stage2ClangArgRDynamic, Stage2ClangArgWL, - Stage2ClangArgPreprocess, + Stage2ClangArgPreprocessOrAsm, Stage2ClangArgOptimize, Stage2ClangArgDebug, Stage2ClangArgSanitize, Stage2ClangArgLinkerScript, Stage2ClangArgVerboseCmds, - Stage2ClangArgExceptions, - Stage2ClangArgNoExceptions, - Stage2ClangArgRtti, - Stage2ClangArgNoRtti, Stage2ClangArgForLinker, Stage2ClangArgLinkerInputZ, + Stage2ClangArgLibDir, + Stage2ClangArgMCpu, + Stage2ClangArgDepFile, + Stage2ClangArgFrameworkDir, + Stage2ClangArgFramework, }; // ABI warning diff --git a/src/target.cpp b/src/target.cpp index 59b1addc33..da19f76f45 100644 --- a/src/target.cpp +++ b/src/target.cpp @@ -624,6 +624,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) { case CIntTypeCount: zig_unreachable(); } + zig_unreachable(); default: switch (id) { case CIntTypeShort: @@ -642,6 +643,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) { zig_unreachable(); } } + zig_unreachable(); case OsLinux: case OsMacOSX: case OsFreeBSD: @@ -666,6 +668,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) { case CIntTypeCount: zig_unreachable(); } + zig_unreachable(); case OsUefi: case OsWindows: switch (id) { @@ -683,6 +686,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) { case CIntTypeCount: zig_unreachable(); } + zig_unreachable(); case OsIOS: switch (id) { case CIntTypeShort: @@ -699,6 +703,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) { case CIntTypeCount: zig_unreachable(); } + zig_unreachable(); case OsAnanas: case OsCloudABI: case OsKFreeBSD: @@ -1207,6 +1212,15 @@ bool target_is_libc_lib_name(const ZigTarget *target, const char *name) { if (strcmp(name, "c") == 0) return true; + if (target_abi_is_gnu(target->abi) && target->os == OsWindows) { + // mingw-w64 + + if (strcmp(name, "m") == 0) + return true; + + return false; + } + if (target_abi_is_gnu(target->abi) || target_abi_is_musl(target->abi) || target_os_is_darwin(target->os)) { if (strcmp(name, "m") == 0) return true; @@ -1286,19 +1300,6 @@ const char *target_arch_musl_name(ZigLLVM_ArchType arch) { } } -bool target_supports_libunwind(const ZigTarget *target) { - switch (target->arch) { - case ZigLLVM_arm: - case ZigLLVM_armeb: - case ZigLLVM_riscv32: - case ZigLLVM_riscv64: - return false; - default: - return true; - } - return true; -} - bool target_libc_needs_crti_crtn(const ZigTarget *target) { if (target->arch == ZigLLVM_riscv32 || target->arch == ZigLLVM_riscv64 || target_is_android(target)) { return false; diff --git a/src/target.hpp b/src/target.hpp index c3f8530e02..898fa90203 100644 --- a/src/target.hpp +++ b/src/target.hpp @@ -119,7 +119,6 @@ bool target_supports_stack_probing(const ZigTarget *target); bool target_supports_sanitize_c(const ZigTarget *target); bool target_has_debug_info(const ZigTarget *target); const char *target_arch_musl_name(ZigLLVM_ArchType arch); -bool target_supports_libunwind(const ZigTarget *target); uint32_t target_arch_pointer_bit_width(ZigLLVM_ArchType arch); uint32_t target_arch_largest_atomic_bits(ZigLLVM_ArchType arch); diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 22d63568bf..11432ecac1 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -840,6 +840,7 @@ void tokenize(Buf *buf, Tokenization *out) { t.state = TokenizeStateStart; continue; } + break; case TokenizeStateSawSlash: switch (c) { case '/': @@ -1209,7 +1210,7 @@ void tokenize(Buf *buf, Tokenization *out) { t.is_trailing_underscore = false; t.state = TokenizeStateNumber; } - // fall through + ZIG_FALLTHROUGH; case TokenizeStateNumber: { if (c == '_') { @@ -1291,7 +1292,7 @@ void tokenize(Buf *buf, Tokenization *out) { t.is_trailing_underscore = false; t.state = TokenizeStateFloatFraction; } - // fall through + ZIG_FALLTHROUGH; case TokenizeStateFloatFraction: { if (c == '_') { @@ -1350,7 +1351,7 @@ void tokenize(Buf *buf, Tokenization *out) { t.is_trailing_underscore = false; t.state = TokenizeStateFloatExponentNumber; } - // fall through + ZIG_FALLTHROUGH; case TokenizeStateFloatExponentNumber: { if (c == '_') { @@ -1494,9 +1495,17 @@ void tokenize(Buf *buf, Tokenization *out) { tokenize_error(&t, "unexpected EOF"); break; case TokenizeStateLineComment: + break; case TokenizeStateSawSlash2: + cancel_token(&t); + break; case TokenizeStateSawSlash3: + set_token_id(&t, t.cur_tok, TokenIdDocComment); + end_token(&t); + break; case TokenizeStateSawSlashBang: + set_token_id(&t, t.cur_tok, TokenIdContainerDocComment); + end_token(&t); break; } if (t.state != TokenizeStateError) { diff --git a/src/util.hpp b/src/util.hpp index a119606245..bd1a5b1e4c 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -100,6 +100,15 @@ static inline bool is_power_of_2(uint64_t x) { return x != 0 && ((x & (~x + 1)) == x); } +static inline bool mem_ends_with_mem(const char *mem, size_t mem_len, const char *end, size_t end_len) { + if (mem_len < end_len) return false; + return memcmp(mem + mem_len - end_len, end, end_len) == 0; +} + +static inline bool mem_ends_with_str(const char *mem, size_t mem_len, const char *str) { + return mem_ends_with_mem(mem, mem_len, str, strlen(str)); +} + static inline uint64_t round_to_next_power_of_2(uint64_t x) { --x; x |= x >> 1; diff --git a/src/util_base.hpp b/src/util_base.hpp index f6cea45c20..1c665bf931 100644 --- a/src/util_base.hpp +++ b/src/util_base.hpp @@ -64,4 +64,14 @@ static inline void zig_assert(bool ok, const char *file, int line, const char *f #undef assert #define assert(ok) zig_assert(ok, __FILE__, __LINE__, __func__) +#if defined(_MSC_VER) +#define ZIG_FALLTHROUGH +#elif defined(__clang__) +#define ZIG_FALLTHROUGH [[clang::fallthrough]] +#elif defined(__GNUC__) +#define ZIG_FALLTHROUGH __attribute__((fallthrough)) +#else +#define ZIG_FALLTHROUGH +#endif + #endif diff --git a/src/zig_clang.h b/src/zig_clang.h index 0e0582a08a..f938d8b56e 100644 --- a/src/zig_clang.h +++ b/src/zig_clang.h @@ -52,6 +52,8 @@ struct ZigClangAPValue { // experimentally-derived size of clang::APValue::DataType #if defined(_WIN32) && defined(_MSC_VER) char Data[52]; +#elif defined(__i386__) + char Data[48]; #else char Data[68]; #endif diff --git a/test/cli.zig b/test/cli.zig index 4c067d16ae..3af78e1857 100644 --- a/test/cli.zig +++ b/test/cli.zig @@ -59,7 +59,12 @@ fn printCmd(cwd: []const u8, argv: []const []const u8) void { fn exec(cwd: []const u8, argv: []const []const u8) !ChildProcess.ExecResult { const max_output_size = 100 * 1024; - const result = ChildProcess.exec(a, argv, cwd, null, max_output_size) catch |err| { + const result = ChildProcess.exec(.{ + .allocator = a, + .argv = argv, + .cwd = cwd, + .max_output_bytes = max_output_size, + }) catch |err| { std.debug.warn("The following command failed:\n", .{}); printCmd(cwd, argv); return err; @@ -101,7 +106,7 @@ fn testGodboltApi(zig_exe: []const u8, dir_path: []const u8) anyerror!void { const example_zig_path = try fs.path.join(a, &[_][]const u8{ dir_path, "example.zig" }); const example_s_path = try fs.path.join(a, &[_][]const u8{ dir_path, "example.s" }); - try std.io.writeFile(example_zig_path, + try fs.cwd().writeFile(example_zig_path, \\// Type your code here, or load an example. \\export fn square(num: i32) i32 { \\ return num * num; @@ -124,7 +129,7 @@ fn testGodboltApi(zig_exe: []const u8, dir_path: []const u8) anyerror!void { }; _ = try exec(dir_path, &args); - const out_asm = try std.io.readFileAlloc(a, example_s_path); + const out_asm = try std.fs.cwd().readFileAlloc(a, example_s_path, std.math.maxInt(usize)); testing.expect(std.mem.indexOf(u8, out_asm, "square:") != null); testing.expect(std.mem.indexOf(u8, out_asm, "mov\teax, edi") != null); testing.expect(std.mem.indexOf(u8, out_asm, "imul\teax, edi") != null); diff --git a/test/compile_errors.zig b/test/compile_errors.zig index 6d3506d3a3..e54f6591b5 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -2,6 +2,19 @@ const tests = @import("tests.zig"); const std = @import("std"); pub fn addCases(cases: *tests.CompileErrorContext) void { + cases.addTest("cast between ?T where T is not a pointer", + \\pub const fnty1 = ?fn (i8) void; + \\pub const fnty2 = ?fn (u64) void; + \\export fn entry() void { + \\ var a: fnty1 = undefined; + \\ var b: fnty2 = undefined; + \\ a = b; + \\} + , &[_][]const u8{ + "tmp.zig:6:9: error: expected type '?fn(i8) void', found '?fn(u64) void'", + "tmp.zig:6:9: note: optional type child 'fn(u64) void' cannot cast into optional type child 'fn(i8) void'", + }); + cases.addTest("unused variable error on errdefer", \\fn foo() !void { \\ errdefer |a| unreachable; @@ -1188,7 +1201,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { \\ suspend; \\} , &[_][]const u8{ - "tmp.zig:3:5: error: expected type '*@Frame(bar)', found '*@Frame(foo)'", + "tmp.zig:3:13: error: expected type '*@Frame(bar)', found '*@Frame(foo)'", }); cases.add("@Frame() of generic function", @@ -6806,4 +6819,42 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { , &[_][]const u8{ "tmp.zig:2:27: error: type 'u32' does not support array initialization", }); + + cases.add("issue #2687: coerce from undefined array pointer to slice", + \\export fn foo1() void { + \\ const a: *[1]u8 = undefined; + \\ var b: []u8 = a; + \\} + \\export fn foo2() void { + \\ comptime { + \\ var a: *[1]u8 = undefined; + \\ var b: []u8 = a; + \\ } + \\} + \\export fn foo3() void { + \\ comptime { + \\ const a: *[1]u8 = undefined; + \\ var b: []u8 = a; + \\ } + \\} + , &[_][]const u8{ + "tmp.zig:3:19: error: use of undefined value here causes undefined behavior", + "tmp.zig:8:23: error: use of undefined value here causes undefined behavior", + "tmp.zig:14:23: error: use of undefined value here causes undefined behavior", + }); + + cases.add("issue #3818: bitcast from parray/slice to u16", + \\export fn foo1() void { + \\ var bytes = [_]u8{1, 2}; + \\ const word: u16 = @bitCast(u16, bytes[0..]); + \\} + \\export fn foo2() void { + \\ var bytes: []u8 = &[_]u8{1, 2}; + \\ const word: u16 = @bitCast(u16, bytes); + \\} + , &[_][]const u8{ + "tmp.zig:3:42: error: unable to @bitCast from pointer type '*[2]u8'", + "tmp.zig:7:32: error: destination type 'u16' has size 2 but source type '[]u8' has size 16", + "tmp.zig:7:37: note: referenced here", + }); } diff --git a/test/src/compare_output.zig b/test/src/compare_output.zig index ae994a0697..110eb6068e 100644 --- a/test/src/compare_output.zig +++ b/test/src/compare_output.zig @@ -91,7 +91,7 @@ pub const CompareOutputContext = struct { const b = self.b; const write_src = b.addWriteFiles(); - for (case.sources.toSliceConst()) |src_file| { + for (case.sources.span()) |src_file| { write_src.add(src_file.filename, src_file.source); } @@ -105,7 +105,7 @@ pub const CompareOutputContext = struct { } const exe = b.addExecutable("test", null); - exe.addAssemblyFileFromWriteFileStep(write_src, case.sources.toSliceConst()[0].filename); + exe.addAssemblyFileFromWriteFileStep(write_src, case.sources.span()[0].filename); const run = exe.run(); run.addArgs(case.cli_args); @@ -125,7 +125,7 @@ pub const CompareOutputContext = struct { if (mem.indexOf(u8, annotated_case_name, filter) == null) continue; } - const basename = case.sources.toSliceConst()[0].filename; + const basename = case.sources.span()[0].filename; const exe = b.addExecutableFromWriteFileStep("test", write_src, basename); exe.setBuildMode(mode); if (case.link_libc) { @@ -146,7 +146,7 @@ pub const CompareOutputContext = struct { if (mem.indexOf(u8, annotated_case_name, filter) == null) return; } - const basename = case.sources.toSliceConst()[0].filename; + const basename = case.sources.span()[0].filename; const exe = b.addExecutableFromWriteFileStep("test", write_src, basename); if (case.link_libc) { exe.linkSystemLibrary("c"); diff --git a/test/src/run_translated_c.zig b/test/src/run_translated_c.zig index 14b0ce593c..74c841a1f3 100644 --- a/test/src/run_translated_c.zig +++ b/test/src/run_translated_c.zig @@ -82,13 +82,13 @@ pub const RunTranslatedCContext = struct { } const write_src = b.addWriteFiles(); - for (case.sources.toSliceConst()) |src_file| { + for (case.sources.span()) |src_file| { write_src.add(src_file.filename, src_file.source); } const translate_c = b.addTranslateC(.{ .write_file = .{ .step = write_src, - .basename = case.sources.toSliceConst()[0].filename, + .basename = case.sources.span()[0].filename, }, }); translate_c.step.name = b.fmt("{} translate-c", .{annotated_case_name}); diff --git a/test/src/translate_c.zig b/test/src/translate_c.zig index 9a6bd0d323..7b0a98f845 100644 --- a/test/src/translate_c.zig +++ b/test/src/translate_c.zig @@ -105,20 +105,20 @@ pub const TranslateCContext = struct { } const write_src = b.addWriteFiles(); - for (case.sources.toSliceConst()) |src_file| { + for (case.sources.span()) |src_file| { write_src.add(src_file.filename, src_file.source); } const translate_c = b.addTranslateC(.{ .write_file = .{ .step = write_src, - .basename = case.sources.toSliceConst()[0].filename, + .basename = case.sources.span()[0].filename, }, }); translate_c.step.name = annotated_case_name; translate_c.setTarget(case.target); - const check_file = translate_c.addCheckFile(case.expected_lines.toSliceConst()); + const check_file = translate_c.addCheckFile(case.expected_lines.span()); self.step.dependOn(&check_file.step); } diff --git a/test/stage1/behavior.zig b/test/stage1/behavior.zig index dfc4321500..c3407db3e6 100644 --- a/test/stage1/behavior.zig +++ b/test/stage1/behavior.zig @@ -41,6 +41,9 @@ comptime { _ = @import("behavior/bugs/3586.zig"); _ = @import("behavior/bugs/3742.zig"); _ = @import("behavior/bugs/4560.zig"); + _ = @import("behavior/bugs/4769_a.zig"); + _ = @import("behavior/bugs/4769_b.zig"); + _ = @import("behavior/bugs/4769_c.zig"); _ = @import("behavior/bugs/394.zig"); _ = @import("behavior/bugs/421.zig"); _ = @import("behavior/bugs/529.zig"); diff --git a/test/stage1/behavior/array.zig b/test/stage1/behavior/array.zig index 792c0e70d1..d5ca44f0a2 100644 --- a/test/stage1/behavior/array.zig +++ b/test/stage1/behavior/array.zig @@ -31,14 +31,23 @@ fn getArrayLen(a: []const u32) usize { test "array with sentinels" { const S = struct { fn doTheTest(is_ct: bool) void { - var zero_sized: [0:0xde]u8 = [_:0xde]u8{}; - expectEqual(@as(u8, 0xde), zero_sized[0]); - // Disabled at runtime because of - // https://github.com/ziglang/zig/issues/4372 if (is_ct) { + var zero_sized: [0:0xde]u8 = [_:0xde]u8{}; + // Disabled at runtime because of + // https://github.com/ziglang/zig/issues/4372 + expectEqual(@as(u8, 0xde), zero_sized[0]); var reinterpreted = @ptrCast(*[1]u8, &zero_sized); expectEqual(@as(u8, 0xde), reinterpreted[0]); } + var arr: [3:0x55]u8 = undefined; + // Make sure the sentinel pointer is pointing after the last element + if (!is_ct) { + const sentinel_ptr = @ptrToInt(&arr[3]); + const last_elem_ptr = @ptrToInt(&arr[2]); + expectEqual(@as(usize, 1), sentinel_ptr - last_elem_ptr); + } + // Make sure the sentinel is writeable + arr[3] = 0x55; } }; @@ -372,7 +381,7 @@ test "access the null element of a null terminated array" { const S = struct { fn doTheTest() void { var array: [4:0]u8 = .{ 'a', 'o', 'e', 'u' }; - comptime expect(array[4] == 0); + expect(array[4] == 0); var len: usize = 4; expect(array[len] == 0); } diff --git a/test/stage1/behavior/atomics.zig b/test/stage1/behavior/atomics.zig index 680b1a2797..f9703e7308 100644 --- a/test/stage1/behavior/atomics.zig +++ b/test/stage1/behavior/atomics.zig @@ -190,8 +190,6 @@ fn testAtomicRmwInt() void { _ = @atomicRmw(u8, &x, .Xor, 2, .SeqCst); expect(x == 0xfd); - // TODO https://github.com/ziglang/zig/issues/4724 - if (builtin.arch == .mipsel) return; _ = @atomicRmw(u8, &x, .Max, 1, .SeqCst); expect(x == 0xfd); _ = @atomicRmw(u8, &x, .Min, 1, .SeqCst); diff --git a/test/stage1/behavior/bugs/4769_a.zig b/test/stage1/behavior/bugs/4769_a.zig new file mode 100644 index 0000000000..ab0c01417a --- /dev/null +++ b/test/stage1/behavior/bugs/4769_a.zig @@ -0,0 +1 @@ +// \ No newline at end of file diff --git a/test/stage1/behavior/bugs/4769_b.zig b/test/stage1/behavior/bugs/4769_b.zig new file mode 100644 index 0000000000..23b2513f17 --- /dev/null +++ b/test/stage1/behavior/bugs/4769_b.zig @@ -0,0 +1 @@ +//! \ No newline at end of file diff --git a/test/stage1/behavior/bugs/4769_c.zig b/test/stage1/behavior/bugs/4769_c.zig new file mode 100644 index 0000000000..4894ddf7e8 --- /dev/null +++ b/test/stage1/behavior/bugs/4769_c.zig @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/test/stage1/behavior/cast.zig b/test/stage1/behavior/cast.zig index b7bcb92c44..7b5f0e8fae 100644 --- a/test/stage1/behavior/cast.zig +++ b/test/stage1/behavior/cast.zig @@ -329,7 +329,7 @@ fn testCastPtrOfArrayToSliceAndPtr() void { test "cast *[1][*]const u8 to [*]const ?[*]const u8" { const window_name = [1][*]const u8{"window name"}; const x: [*]const ?[*]const u8 = &window_name; - expect(mem.eql(u8, std.mem.toSliceConst(u8, @ptrCast([*:0]const u8, x[0].?)), "window name")); + expect(mem.eql(u8, std.mem.spanZ(@ptrCast([*:0]const u8, x[0].?)), "window name")); } test "@intCast comptime_int" { @@ -790,3 +790,18 @@ test "assignment to optional pointer result loc" { var foo: struct { ptr: ?*c_void } = .{ .ptr = &global_struct }; expect(foo.ptr.? == @ptrCast(*c_void, &global_struct)); } + +test "peer type resolve string lit with sentinel-terminated mutable slice" { + var array: [4:0]u8 = undefined; + array[4] = 0; // TODO remove this when #4372 is solved + var slice: [:0]u8 = array[0..4 :0]; + comptime expect(@TypeOf(slice, "hi") == [:0]const u8); + comptime expect(@TypeOf("hi", slice) == [:0]const u8); +} + +test "peer type resolve array pointers, one of them const" { + var array1: [4]u8 = undefined; + const array2: [5]u8 = undefined; + comptime expect(@TypeOf(&array1, &array2) == []const u8); + comptime expect(@TypeOf(&array2, &array1) == []const u8); +} diff --git a/test/stage1/behavior/pointers.zig b/test/stage1/behavior/pointers.zig index fbce9731f0..6b86c2f6ac 100644 --- a/test/stage1/behavior/pointers.zig +++ b/test/stage1/behavior/pointers.zig @@ -225,7 +225,7 @@ test "null terminated pointer" { var zero_ptr: [*:0]const u8 = @ptrCast([*:0]const u8, &array_with_zero); var no_zero_ptr: [*]const u8 = zero_ptr; var zero_ptr_again = @ptrCast([*:0]const u8, no_zero_ptr); - expect(std.mem.eql(u8, std.mem.toSliceConst(u8, zero_ptr_again), "hello")); + expect(std.mem.eql(u8, std.mem.spanZ(zero_ptr_again), "hello")); } }; S.doTheTest(); diff --git a/test/standalone/brace_expansion/main.zig b/test/standalone/brace_expansion/main.zig index e1d2ee6673..411f2bfaf6 100644 --- a/test/standalone/brace_expansion/main.zig +++ b/test/standalone/brace_expansion/main.zig @@ -4,7 +4,7 @@ const mem = std.mem; const debug = std.debug; const assert = debug.assert; const testing = std.testing; -const Buffer = std.Buffer; +const ArrayListSentineled = std.ArrayListSentineled; const ArrayList = std.ArrayList; const maxInt = std.math.maxInt; @@ -111,7 +111,7 @@ fn parse(tokens: *const ArrayList(Token), token_index: *usize) ParseError!Node { } } -fn expandString(input: []const u8, output: *Buffer) !void { +fn expandString(input: []const u8, output: *ArrayListSentineled(u8, 0)) !void { const tokens = try tokenize(input); if (tokens.len == 1) { return output.resize(0); @@ -125,52 +125,52 @@ fn expandString(input: []const u8, output: *Buffer) !void { else => return error.InvalidInput, } - var result_list = ArrayList(Buffer).init(global_allocator); + var result_list = ArrayList(ArrayListSentineled(u8, 0)).init(global_allocator); defer result_list.deinit(); try expandNode(root, &result_list); try output.resize(0); - for (result_list.toSliceConst()) |buf, i| { + for (result_list.span()) |buf, i| { if (i != 0) { - try output.appendByte(' '); + try output.append(' '); } - try output.append(buf.toSliceConst()); + try output.appendSlice(buf.span()); } } const ExpandNodeError = error{OutOfMemory}; -fn expandNode(node: Node, output: *ArrayList(Buffer)) ExpandNodeError!void { +fn expandNode(node: Node, output: *ArrayList(ArrayListSentineled(u8, 0))) ExpandNodeError!void { assert(output.len == 0); switch (node) { Node.Scalar => |scalar| { - try output.append(try Buffer.init(global_allocator, scalar)); + try output.append(try ArrayListSentineled(u8, 0).init(global_allocator, scalar)); }, Node.Combine => |pair| { const a_node = pair[0]; const b_node = pair[1]; - var child_list_a = ArrayList(Buffer).init(global_allocator); + var child_list_a = ArrayList(ArrayListSentineled(u8, 0)).init(global_allocator); try expandNode(a_node, &child_list_a); - var child_list_b = ArrayList(Buffer).init(global_allocator); + var child_list_b = ArrayList(ArrayListSentineled(u8, 0)).init(global_allocator); try expandNode(b_node, &child_list_b); - for (child_list_a.toSliceConst()) |buf_a| { - for (child_list_b.toSliceConst()) |buf_b| { - var combined_buf = try Buffer.initFromBuffer(buf_a); - try combined_buf.append(buf_b.toSliceConst()); + for (child_list_a.span()) |buf_a| { + for (child_list_b.span()) |buf_b| { + var combined_buf = try ArrayListSentineled(u8, 0).initFromBuffer(buf_a); + try combined_buf.appendSlice(buf_b.span()); try output.append(combined_buf); } } }, Node.List => |list| { - for (list.toSliceConst()) |child_node| { - var child_list = ArrayList(Buffer).init(global_allocator); + for (list.span()) |child_node| { + var child_list = ArrayList(ArrayListSentineled(u8, 0)).init(global_allocator); try expandNode(child_node, &child_list); - for (child_list.toSliceConst()) |buf| { + for (child_list.span()) |buf| { try output.append(buf); } } @@ -187,17 +187,17 @@ pub fn main() !void { global_allocator = &arena.allocator; - var stdin_buf = try Buffer.initSize(global_allocator, 0); + var stdin_buf = try ArrayListSentineled(u8, 0).initSize(global_allocator, 0); defer stdin_buf.deinit(); var stdin_adapter = stdin_file.inStream(); try stdin_adapter.stream.readAllBuffer(&stdin_buf, maxInt(usize)); - var result_buf = try Buffer.initSize(global_allocator, 0); + var result_buf = try ArrayListSentineled(u8, 0).initSize(global_allocator, 0); defer result_buf.deinit(); - try expandString(stdin_buf.toSlice(), &result_buf); - try stdout_file.write(result_buf.toSliceConst()); + try expandString(stdin_buf.span(), &result_buf); + try stdout_file.write(result_buf.span()); } test "invalid inputs" { @@ -218,7 +218,7 @@ test "invalid inputs" { } fn expectError(test_input: []const u8, expected_err: anyerror) void { - var output_buf = Buffer.initSize(global_allocator, 0) catch unreachable; + var output_buf = ArrayListSentineled(u8, 0).initSize(global_allocator, 0) catch unreachable; defer output_buf.deinit(); testing.expectError(expected_err, expandString(test_input, &output_buf)); @@ -251,10 +251,10 @@ test "valid inputs" { } fn expectExpansion(test_input: []const u8, expected_result: []const u8) void { - var result = Buffer.initSize(global_allocator, 0) catch unreachable; + var result = ArrayListSentineled(u8, 0).initSize(global_allocator, 0) catch unreachable; defer result.deinit(); expandString(test_input, &result) catch unreachable; - testing.expectEqualSlices(u8, expected_result, result.toSlice()); + testing.expectEqualSlices(u8, expected_result, result.span()); } diff --git a/test/standalone/guess_number/main.zig b/test/standalone/guess_number/main.zig index 14babcd145..5a82ec81ee 100644 --- a/test/standalone/guess_number/main.zig +++ b/test/standalone/guess_number/main.zig @@ -17,7 +17,7 @@ pub fn main() !void { const seed = std.mem.readIntNative(u64, &seed_bytes); var prng = std.rand.DefaultPrng.init(seed); - const answer = prng.random.range(u8, 0, 100) + 1; + const answer = prng.random.intRangeLessThan(u8, 0, 100) + 1; while (true) { try stdout.print("\nGuess a number between 1 and 100: ", .{}); diff --git a/test/tests.zig b/test/tests.zig index 567df58387..7f3e55ec7a 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -4,7 +4,6 @@ const debug = std.debug; const warn = debug.warn; const build = std.build; const CrossTarget = std.zig.CrossTarget; -const Buffer = std.Buffer; const io = std.io; const fs = std.fs; const mem = std.mem; @@ -583,7 +582,7 @@ pub const StackTracesContext = struct { warn("Test {}/{} {}...", .{ self.test_index + 1, self.context.test_index, self.name }); - const child = std.ChildProcess.init(args.toSliceConst(), b.allocator) catch unreachable; + const child = std.ChildProcess.init(args.span(), b.allocator) catch unreachable; defer child.deinit(); child.stdin_behavior = .Ignore; @@ -592,7 +591,7 @@ pub const StackTracesContext = struct { child.env_map = b.env_map; if (b.verbose) { - printInvocation(args.toSliceConst()); + printInvocation(args.span()); } child.spawn() catch |err| debug.panic("Unable to spawn {}: {}\n", .{ full_exe_path, @errorName(err) }); @@ -614,23 +613,23 @@ pub const StackTracesContext = struct { code, expect_code, }); - printInvocation(args.toSliceConst()); + printInvocation(args.span()); return error.TestFailed; } }, .Signal => |signum| { warn("Process {} terminated on signal {}\n", .{ full_exe_path, signum }); - printInvocation(args.toSliceConst()); + printInvocation(args.span()); return error.TestFailed; }, .Stopped => |signum| { warn("Process {} stopped on signal {}\n", .{ full_exe_path, signum }); - printInvocation(args.toSliceConst()); + printInvocation(args.span()); return error.TestFailed; }, .Unknown => |code| { warn("Process {} terminated unexpectedly with error code {}\n", .{ full_exe_path, code }); - printInvocation(args.toSliceConst()); + printInvocation(args.span()); return error.TestFailed; }, } @@ -640,7 +639,7 @@ pub const StackTracesContext = struct { // - replace address with symbolic string // - skip empty lines const got: []const u8 = got_result: { - var buf = try Buffer.initSize(b.allocator, 0); + var buf = ArrayList(u8).init(b.allocator); defer buf.deinit(); if (stderr.len != 0 and stderr[stderr.len - 1] == '\n') stderr = stderr[0 .. stderr.len - 1]; var it = mem.separate(stderr, "\n"); @@ -652,21 +651,21 @@ pub const StackTracesContext = struct { var pos: usize = if (std.Target.current.os.tag == .windows) 2 else 0; for (delims) |delim, i| { marks[i] = mem.indexOfPos(u8, line, pos, delim) orelse { - try buf.append(line); - try buf.append("\n"); + try buf.appendSlice(line); + try buf.appendSlice("\n"); continue :process_lines; }; pos = marks[i] + delim.len; } pos = mem.lastIndexOfScalar(u8, line[0..marks[0]], fs.path.sep) orelse { - try buf.append(line); - try buf.append("\n"); + try buf.appendSlice(line); + try buf.appendSlice("\n"); continue :process_lines; }; - try buf.append(line[pos + 1 .. marks[2] + delims[2].len]); - try buf.append(" [address]"); - try buf.append(line[marks[3]..]); - try buf.append("\n"); + try buf.appendSlice(line[pos + 1 .. marks[2] + delims[2].len]); + try buf.appendSlice(" [address]"); + try buf.appendSlice(line[marks[3]..]); + try buf.appendSlice("\n"); } break :got_result buf.toOwnedSlice(); }; @@ -785,7 +784,7 @@ pub const CompileErrorContext = struct { } else { try zig_args.append("build-obj"); } - const root_src_basename = self.case.sources.toSliceConst()[0].filename; + const root_src_basename = self.case.sources.span()[0].filename; try zig_args.append(self.write_src.getOutputPath(root_src_basename)); zig_args.append("--name") catch unreachable; @@ -809,10 +808,10 @@ pub const CompileErrorContext = struct { warn("Test {}/{} {}...", .{ self.test_index + 1, self.context.test_index, self.name }); if (b.verbose) { - printInvocation(zig_args.toSliceConst()); + printInvocation(zig_args.span()); } - const child = std.ChildProcess.init(zig_args.toSliceConst(), b.allocator) catch unreachable; + const child = std.ChildProcess.init(zig_args.span(), b.allocator) catch unreachable; defer child.deinit(); child.env_map = b.env_map; @@ -822,11 +821,11 @@ pub const CompileErrorContext = struct { child.spawn() catch |err| debug.panic("Unable to spawn {}: {}\n", .{ zig_args.items[0], @errorName(err) }); - var stdout_buf = Buffer.initNull(b.allocator); - var stderr_buf = Buffer.initNull(b.allocator); + var stdout_buf = ArrayList(u8).init(b.allocator); + var stderr_buf = ArrayList(u8).init(b.allocator); - child.stdout.?.inStream().readAllBuffer(&stdout_buf, max_stdout_size) catch unreachable; - child.stderr.?.inStream().readAllBuffer(&stderr_buf, max_stdout_size) catch unreachable; + child.stdout.?.inStream().readAllArrayList(&stdout_buf, max_stdout_size) catch unreachable; + child.stderr.?.inStream().readAllArrayList(&stderr_buf, max_stdout_size) catch unreachable; const term = child.wait() catch |err| { debug.panic("Unable to spawn {}: {}\n", .{ zig_args.items[0], @errorName(err) }); @@ -834,19 +833,19 @@ pub const CompileErrorContext = struct { switch (term) { .Exited => |code| { if (code == 0) { - printInvocation(zig_args.toSliceConst()); + printInvocation(zig_args.span()); return error.CompilationIncorrectlySucceeded; } }, else => { warn("Process {} terminated unexpectedly\n", .{b.zig_exe}); - printInvocation(zig_args.toSliceConst()); + printInvocation(zig_args.span()); return error.TestFailed; }, } - const stdout = stdout_buf.toSliceConst(); - const stderr = stderr_buf.toSliceConst(); + const stdout = stdout_buf.span(); + const stderr = stderr_buf.span(); if (stdout.len != 0) { warn( @@ -875,12 +874,12 @@ pub const CompileErrorContext = struct { if (!ok) { warn("\n======== Expected these compile errors: ========\n", .{}); - for (self.case.expected_errors.toSliceConst()) |expected| { + for (self.case.expected_errors.span()) |expected| { warn("{}\n", .{expected}); } } } else { - for (self.case.expected_errors.toSliceConst()) |expected| { + for (self.case.expected_errors.span()) |expected| { if (mem.indexOf(u8, stderr, expected) == null) { warn( \\ @@ -980,7 +979,7 @@ pub const CompileErrorContext = struct { if (mem.indexOf(u8, annotated_case_name, filter) == null) return; } const write_src = b.addWriteFiles(); - for (case.sources.toSliceConst()) |src_file| { + for (case.sources.span()) |src_file| { write_src.add(src_file.filename, src_file.source); } @@ -1027,7 +1026,7 @@ pub const StandaloneContext = struct { zig_args.append("--verbose") catch unreachable; } - const run_cmd = b.addSystemCommand(zig_args.toSliceConst()); + const run_cmd = b.addSystemCommand(zig_args.span()); const log_step = b.addLog("PASS {}\n", .{annotated_case_name}); log_step.step.dependOn(&run_cmd.step); @@ -1127,7 +1126,7 @@ pub const GenHContext = struct { const full_h_path = self.obj.getOutputHPath(); const actual_h = try io.readFileAlloc(b.allocator, full_h_path); - for (self.case.expected_lines.toSliceConst()) |expected_line| { + for (self.case.expected_lines.span()) |expected_line| { if (mem.indexOf(u8, actual_h, expected_line) == null) { warn( \\ @@ -1188,7 +1187,7 @@ pub const GenHContext = struct { } const write_src = b.addWriteFiles(); - for (case.sources.toSliceConst()) |src_file| { + for (case.sources.span()) |src_file| { write_src.add(src_file.filename, src_file.source); } diff --git a/test/translate_c.zig b/test/translate_c.zig index 9890c4034e..8c84526a49 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -2808,4 +2808,43 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\ return if (x > y) x else y; \\} }); + + cases.add("string concatenation in macros", + \\#define FOO "hello" + \\#define BAR FOO " world" + \\#define BAZ "oh, " FOO + , &[_][]const u8{ + \\pub const FOO = "hello"; + , + \\pub const BAR = FOO ++ " world"; + , + \\pub const BAZ = "oh, " ++ FOO; + }); + + cases.add("string concatenation in macros: two defines", + \\#define FOO "hello" + \\#define BAZ " world" + \\#define BAR FOO BAZ + , &[_][]const u8{ + \\pub const FOO = "hello"; + , + \\pub const BAZ = " world"; + , + \\pub const BAR = FOO ++ BAZ; + }); + + cases.add("string concatenation in macros: two strings", + \\#define FOO "a" "b" + \\#define BAR FOO "c" + , &[_][]const u8{ + \\pub const FOO = "a" ++ "b"; + , + \\pub const BAR = FOO ++ "c"; + }); + + cases.add("string concatenation in macros: three strings", + \\#define FOO "a" "b" "c" + , &[_][]const u8{ + \\pub const FOO = "a" ++ ("b" ++ "c"); + }); } diff --git a/tools/merge_anal_dumps.zig b/tools/merge_anal_dumps.zig index e0e71696d6..3399c15fd7 100644 --- a/tools/merge_anal_dumps.zig +++ b/tools/merge_anal_dumps.zig @@ -183,13 +183,13 @@ const Dump = struct { try mergeSameStrings(&self.zig_version, zig_version); try mergeSameStrings(&self.root_name, root_name); - for (params.get("builds").?.value.Array.toSliceConst()) |json_build| { + for (params.get("builds").?.value.Array.span()) |json_build| { const target = json_build.Object.get("target").?.value.String; try self.targets.append(target); } // Merge files. If the string matches, it's the same file. - const other_files = root.Object.get("files").?.value.Array.toSliceConst(); + const other_files = root.Object.get("files").?.value.Array.span(); var other_file_to_mine = std.AutoHashMap(usize, usize).init(self.a()); for (other_files) |other_file, i| { const gop = try self.file_map.getOrPut(other_file.String); @@ -201,7 +201,7 @@ const Dump = struct { } // Merge AST nodes. If the file id, line, and column all match, it's the same AST node. - const other_ast_nodes = root.Object.get("astNodes").?.value.Array.toSliceConst(); + const other_ast_nodes = root.Object.get("astNodes").?.value.Array.span(); var other_ast_node_to_mine = std.AutoHashMap(usize, usize).init(self.a()); for (other_ast_nodes) |other_ast_node_json, i| { const other_file_id = jsonObjInt(other_ast_node_json, "file"); @@ -221,9 +221,9 @@ const Dump = struct { // convert fields lists for (other_ast_nodes) |other_ast_node_json, i| { const my_node_index = other_ast_node_to_mine.get(i).?.value; - const my_node = &self.node_list.toSlice()[my_node_index]; + const my_node = &self.node_list.span()[my_node_index]; if (other_ast_node_json.Object.get("fields")) |fields_json_kv| { - const other_fields = fields_json_kv.value.Array.toSliceConst(); + const other_fields = fields_json_kv.value.Array.span(); my_node.fields = try self.a().alloc(usize, other_fields.len); for (other_fields) |other_field_index, field_i| { const other_index = @intCast(usize, other_field_index.Integer); @@ -233,7 +233,7 @@ const Dump = struct { } // Merge errors. If the AST Node matches, it's the same error value. - const other_errors = root.Object.get("errors").?.value.Array.toSliceConst(); + const other_errors = root.Object.get("errors").?.value.Array.span(); var other_error_to_mine = std.AutoHashMap(usize, usize).init(self.a()); for (other_errors) |other_error_json, i| { const other_src_id = jsonObjInt(other_error_json, "src"); @@ -253,7 +253,7 @@ const Dump = struct { // First we identify all the simple types and merge those. // Example: void, type, noreturn // We can also do integers and floats. - const other_types = root.Object.get("types").?.value.Array.toSliceConst(); + const other_types = root.Object.get("types").?.value.Array.span(); var other_types_to_mine = std.AutoHashMap(usize, usize).init(self.a()); for (other_types) |other_type_json, i| { const type_kind = jsonObjInt(other_type_json, "kind"); @@ -336,7 +336,7 @@ const Dump = struct { try jw.objectField("builds"); try jw.beginArray(); - for (self.targets.toSliceConst()) |target| { + for (self.targets.span()) |target| { try jw.arrayElem(); try jw.beginObject(); try jw.objectField("target"); @@ -349,7 +349,7 @@ const Dump = struct { try jw.objectField("types"); try jw.beginArray(); - for (self.type_list.toSliceConst()) |t| { + for (self.type_list.span()) |t| { try jw.arrayElem(); try jw.beginObject(); @@ -379,7 +379,7 @@ const Dump = struct { try jw.objectField("errors"); try jw.beginArray(); - for (self.error_list.toSliceConst()) |zig_error| { + for (self.error_list.span()) |zig_error| { try jw.arrayElem(); try jw.beginObject(); @@ -395,7 +395,7 @@ const Dump = struct { try jw.objectField("astNodes"); try jw.beginArray(); - for (self.node_list.toSliceConst()) |node| { + for (self.node_list.span()) |node| { try jw.arrayElem(); try jw.beginObject(); @@ -425,7 +425,7 @@ const Dump = struct { try jw.objectField("files"); try jw.beginArray(); - for (self.file_list.toSliceConst()) |file| { + for (self.file_list.span()) |file| { try jw.arrayElem(); try jw.emitString(file); } diff --git a/tools/process_headers.zig b/tools/process_headers.zig index 7c9befcffa..65c5701106 100644 --- a/tools/process_headers.zig +++ b/tools/process_headers.zig @@ -324,7 +324,7 @@ pub fn main() !void { }, .os = .linux, }; - search: for (search_paths.toSliceConst()) |search_path| { + search: for (search_paths.span()) |search_path| { var sub_path: []const []const u8 = undefined; switch (vendor) { .musl => { @@ -414,13 +414,13 @@ pub fn main() !void { try contents_list.append(contents); } } - std.sort.sort(*Contents, contents_list.toSlice(), Contents.hitCountLessThan); + std.sort.sort(*Contents, contents_list.span(), Contents.hitCountLessThan); var best_contents = contents_list.popOrNull().?; if (best_contents.hit_count > 1) { // worth it to make it generic const full_path = try std.fs.path.join(allocator, &[_][]const u8{ out_dir, generic_name, path_kv.key }); try std.fs.cwd().makePath(std.fs.path.dirname(full_path).?); - try std.io.writeFile(full_path, best_contents.bytes); + try std.fs.cwd().writeFile(full_path, best_contents.bytes); best_contents.is_generic = true; while (contents_list.popOrNull()) |contender| { if (contender.hit_count > 1) { @@ -447,7 +447,7 @@ pub fn main() !void { }); const full_path = try std.fs.path.join(allocator, &[_][]const u8{ out_dir, out_subpath, path_kv.key }); try std.fs.cwd().makePath(std.fs.path.dirname(full_path).?); - try std.io.writeFile(full_path, contents.bytes); + try std.fs.cwd().writeFile(full_path, contents.bytes); } } } diff --git a/tools/update_clang_options.zig b/tools/update_clang_options.zig index b673fa0503..dd46f72d4c 100644 --- a/tools/update_clang_options.zig +++ b/tools/update_clang_options.zig @@ -96,19 +96,19 @@ const known_options = [_]KnownOpt{ }, .{ .name = "E", - .ident = "preprocess", + .ident = "pp_or_asm", }, .{ .name = "preprocess", - .ident = "preprocess", + .ident = "pp_or_asm", }, .{ .name = "S", - .ident = "driver_punt", + .ident = "pp_or_asm", }, .{ .name = "assemble", - .ident = "driver_punt", + .ident = "pp_or_asm", }, .{ .name = "O1", @@ -175,20 +175,44 @@ const known_options = [_]KnownOpt{ .ident = "verbose_cmds", }, .{ - .name = "fexceptions", - .ident = "exceptions", + .name = "L", + .ident = "lib_dir", }, .{ - .name = "fno-exceptions", - .ident = "no_exceptions", + .name = "library-directory", + .ident = "lib_dir", }, .{ - .name = "frtti", - .ident = "rtti", + .name = "mcpu", + .ident = "mcpu", }, .{ - .name = "fno-rtti", - .ident = "no_rtti", + .name = "march", + .ident = "mcpu", + }, + .{ + .name = "mtune", + .ident = "mcpu", + }, + .{ + .name = "MD", + .ident = "dep_file", + }, + .{ + .name = "MV", + .ident = "dep_file", + }, + .{ + .name = "MF", + .ident = "dep_file", + }, + .{ + .name = "F", + .ident = "framework_dir", + }, + .{ + .name = "framework", + .ident = "framework", }, }; @@ -239,7 +263,7 @@ pub fn main() anyerror!void { try std.fmt.allocPrint(allocator, "-I={}/clang/include/clang/Driver", .{llvm_src_root}), }; - const child_result = try std.ChildProcess.exec2(.{ + const child_result = try std.ChildProcess.exec(.{ .allocator = allocator, .argv = &child_args, .max_output_bytes = 100 * 1024 * 1024, diff --git a/tools/update_glibc.zig b/tools/update_glibc.zig index 4a5b1751a2..d118b1482e 100644 --- a/tools/update_glibc.zig +++ b/tools/update_glibc.zig @@ -223,15 +223,15 @@ pub fn main() !void { var list = std.ArrayList([]const u8).init(allocator); var it = global_fn_set.iterator(); while (it.next()) |kv| try list.append(kv.key); - std.sort.sort([]const u8, list.toSlice(), strCmpLessThan); - break :blk list.toSliceConst(); + std.sort.sort([]const u8, list.span(), strCmpLessThan); + break :blk list.span(); }; const global_ver_list = blk: { var list = std.ArrayList([]const u8).init(allocator); var it = global_ver_set.iterator(); while (it.next()) |kv| try list.append(kv.key); - std.sort.sort([]const u8, list.toSlice(), versionLessThan); - break :blk list.toSliceConst(); + std.sort.sort([]const u8, list.span(), versionLessThan); + break :blk list.span(); }; { const vers_txt_path = try fs.path.join(allocator, &[_][]const u8{ glibc_out_dir, "vers.txt" }); @@ -264,13 +264,13 @@ pub fn main() !void { for (abi_lists) |*abi_list, abi_index| { const kv = target_functions.get(@ptrToInt(abi_list)).?; const fn_vers_list = &kv.value.fn_vers_list; - for (kv.value.list.toSliceConst()) |*ver_fn| { + for (kv.value.list.span()) |*ver_fn| { const gop = try fn_vers_list.getOrPut(ver_fn.name); if (!gop.found_existing) { gop.kv.value = std.ArrayList(usize).init(allocator); } const ver_index = global_ver_set.get(ver_fn.ver).?.value; - if (std.mem.indexOfScalar(usize, gop.kv.value.toSliceConst(), ver_index) == null) { + if (std.mem.indexOfScalar(usize, gop.kv.value.span(), ver_index) == null) { try gop.kv.value.append(ver_index); } } @@ -297,7 +297,7 @@ pub fn main() !void { try abilist_txt.writeByte('\n'); continue; }; - for (kv.value.toSliceConst()) |ver_index, it_i| { + for (kv.value.span()) |ver_index, it_i| { if (it_i != 0) try abilist_txt.writeByte(' '); try abilist_txt.print("{d}", .{ver_index}); }