From 9f3165540ed0e2b1fec0ab2eb16d4c06d899c86a Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 6 Feb 2024 21:12:11 -0700 Subject: [PATCH 1/2] std.os.linux.MAP: use a packed struct Introduces type safety to this constant. Eliminates one use of `usingnamespace`. --- lib/std/Thread.zig | 2 +- lib/std/crypto/tlcsprng.zig | 2 +- lib/std/debug.zig | 2 +- lib/std/dynamic_library.zig | 8 +- lib/std/heap/PageAllocator.zig | 2 +- lib/std/os.zig | 6 +- lib/std/os/linux.zig | 158 +++++++++++++++++++++++++++------ lib/std/os/linux/arm-eabi.zig | 13 --- lib/std/os/linux/arm64.zig | 13 --- lib/std/os/linux/io_uring.zig | 4 +- lib/std/os/linux/mips.zig | 9 -- lib/std/os/linux/mips64.zig | 9 -- lib/std/os/linux/powerpc.zig | 13 --- lib/std/os/linux/powerpc64.zig | 13 --- lib/std/os/linux/riscv64.zig | 1 - lib/std/os/linux/sparc64.zig | 13 --- lib/std/os/linux/tls.zig | 2 +- lib/std/os/linux/x86.zig | 9 -- lib/std/os/linux/x86_64.zig | 15 ---- lib/std/os/test.zig | 6 +- 20 files changed, 146 insertions(+), 154 deletions(-) diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index a90d7751524a316bc61aa45057a10f3407e3ed30..c3f628da799f17f7dbc113c10ed761bc7dfae164 100644 --- a/lib/std/Thread.zig +++ b/lib/std/Thread.zig @@ -1237,7 +1237,7 @@ const LinuxThreadImpl = struct { null, map_bytes, os.PROT.NONE, - os.MAP.PRIVATE | os.MAP.ANONYMOUS, + .{ .TYPE = .PRIVATE, .ANONYMOUS = true }, -1, 0, ) catch |err| switch (err) { diff --git a/lib/std/crypto/tlcsprng.zig b/lib/std/crypto/tlcsprng.zig index cdb3494fc6cf7395b64a8dfdcbeb3dbcfb4f6b52..bbca32024eccfdd9b85c6a6a7fa26c5b5c821835 100644 --- a/lib/std/crypto/tlcsprng.zig +++ b/lib/std/crypto/tlcsprng.zig @@ -83,7 +83,7 @@ fn tlsCsprngFill(_: *anyopaque, buffer: []u8) void { null, @sizeOf(Context), os.PROT.READ | os.PROT.WRITE, - os.MAP.PRIVATE | os.MAP.ANONYMOUS, + .{ .TYPE = .PRIVATE, .ANONYMOUS = true }, -1, 0, ) catch { diff --git a/lib/std/debug.zig b/lib/std/debug.zig index 5976e52684e6d21161d0f294bf96469d0bbc909a..7f44cfa77090f4154261ddb8d59fd7f2652b4ffb 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -1652,7 +1652,7 @@ fn mapWholeFile(file: File) ![]align(mem.page_size) const u8 { null, file_len, os.PROT.READ, - os.MAP.SHARED, + .{ .TYPE = .SHARED }, file.handle, 0, ); diff --git a/lib/std/dynamic_library.zig b/lib/std/dynamic_library.zig index 42a2c6ddbd6d657d88d1271d7de04150cb780de2..ee2b905aeb6b0fa03daf745dea4eeb3ee655cb83 100644 --- a/lib/std/dynamic_library.zig +++ b/lib/std/dynamic_library.zig @@ -127,7 +127,7 @@ pub const ElfDynLib = struct { null, mem.alignForward(usize, size, mem.page_size), os.PROT.READ, - os.MAP.PRIVATE, + .{ .TYPE = .PRIVATE }, fd, 0, ); @@ -165,7 +165,7 @@ pub const ElfDynLib = struct { null, virt_addr_end, os.PROT.NONE, - os.MAP.PRIVATE | os.MAP.ANONYMOUS, + .{ .TYPE = .PRIVATE, .ANONYMOUS = true }, -1, 0, ); @@ -197,7 +197,7 @@ pub const ElfDynLib = struct { ptr, extended_memsz, prot, - os.MAP.PRIVATE | os.MAP.FIXED, + .{ .TYPE = .PRIVATE, .FIXED = true }, fd, ph.p_offset - extra_bytes, ); @@ -206,7 +206,7 @@ pub const ElfDynLib = struct { ptr, extended_memsz, prot, - os.MAP.PRIVATE | os.MAP.FIXED | os.MAP.ANONYMOUS, + .{ .TYPE = .PRIVATE, .FIXED = true, .ANONYMOUS = true }, -1, 0, ); diff --git a/lib/std/heap/PageAllocator.zig b/lib/std/heap/PageAllocator.zig index 3e92aa5eec33dc855a43ea4ee0d7257d839b3261..822a4c2c3411c09d3942fc6323493283be180169 100644 --- a/lib/std/heap/PageAllocator.zig +++ b/lib/std/heap/PageAllocator.zig @@ -35,7 +35,7 @@ fn alloc(_: *anyopaque, n: usize, log2_align: u8, ra: usize) ?[*]u8 { hint, aligned_len, os.PROT.READ | os.PROT.WRITE, - os.MAP.PRIVATE | os.MAP.ANONYMOUS, + .{ .TYPE = .PRIVATE, .ANONYMOUS = true }, -1, 0, ) catch return null; diff --git a/lib/std/os.zig b/lib/std/os.zig index e12753ab3eefffc597fced1900305ad1cb9b7e1e..dca923e6badc34b1a97b18c274e32a2b97176813 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -4657,14 +4657,14 @@ pub fn mmap( ptr: ?[*]align(mem.page_size) u8, length: usize, prot: u32, - flags: u32, + flags: system.MAP, fd: fd_t, offset: u64, ) MMapError![]align(mem.page_size) u8 { const mmap_sym = if (lfs64_abi) system.mmap64 else system.mmap; - const ioffset = @as(i64, @bitCast(offset)); // the OS treats this as unsigned - const rc = mmap_sym(ptr, length, prot, flags, fd, ioffset); + const ioffset: i64 = @bitCast(offset); // the OS treats this as unsigned + const rc = mmap_sym(ptr, length, prot, @bitCast(flags), fd, ioffset); const err = if (builtin.link_libc) blk: { if (rc != std.c.MAP.FAILED) return @as([*]align(mem.page_size) u8, @ptrCast(@alignCast(rc)))[0..length]; break :blk @as(E, @enumFromInt(system._errno().*)); diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index ee5fe0f186bdeee161736195ff1c3c1d9f2208d2..0a6e4fee1d2aef57437d6aa812e3bd9636af063d 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -109,36 +109,136 @@ pub const SYS = switch (@import("builtin").cpu.arch) { else => @compileError("The Zig Standard Library is missing syscall definitions for the target CPU architecture"), }; -pub const MAP = struct { - pub usingnamespace arch_bits.MAP; +pub const MAP_TYPE = enum(u4) { + SHARED = 0x01, + PRIVATE = 0x02, + SHARED_VALIDATE = 0x03, +}; - /// Share changes - pub const SHARED = 0x01; - /// Changes are private - pub const PRIVATE = 0x02; - /// share + validate extension flags - pub const SHARED_VALIDATE = 0x03; - /// Mask for type of mapping - pub const TYPE = 0x0f; - /// Interpret addr exactly - pub const FIXED = 0x10; - /// don't use a file - pub const ANONYMOUS = if (is_mips) 0x800 else 0x20; - // MAP_ 0x0100 - 0x4000 flags are per architecture - /// populate (prefault) pagetables - pub const POPULATE = if (is_mips) 0x10000 else 0x8000; - /// do not block on IO - pub const NONBLOCK = if (is_mips) 0x20000 else 0x10000; - /// give out an address that is best suited for process/thread stacks - pub const STACK = if (is_mips) 0x40000 else 0x20000; - /// create a huge page mapping - pub const HUGETLB = if (is_mips) 0x80000 else 0x40000; - /// perform synchronous page faults for the mapping - pub const SYNC = 0x80000; - /// MAP_FIXED which doesn't unmap underlying mapping - pub const FIXED_NOREPLACE = 0x100000; - /// For anonymous mmap, memory could be uninitialized - pub const UNINITIALIZED = 0x4000000; +pub const MAP = switch (native_arch) { + .x86_64, .x86 => packed struct(u32) { + TYPE: MAP_TYPE, + FIXED: bool = false, + ANONYMOUS: bool = false, + @"32BIT": bool = false, + _7: u1 = 0, + GROWSDOWN: bool = false, + _9: u2 = 0, + DENYWRITE: bool = false, + EXECUTABLE: bool = false, + LOCKED: bool = false, + NORESERVE: bool = false, + POPULATE: bool = false, + NONBLOCK: bool = false, + STACK: bool = false, + HUGETLB: bool = false, + SYNC: bool = false, + FIXED_NOREPLACE: bool = false, + _21: u5 = 0, + UNINITIALIZED: bool = false, + _: u5 = 0, + }, + .aarch64, .aarch64_be, .arm, .thumb => packed struct(u32) { + TYPE: MAP_TYPE, + FIXED: bool = false, + ANONYMOUS: bool = false, + _6: u2 = 0, + GROWSDOWN: bool = false, + _9: u2 = 0, + DENYWRITE: bool = false, + EXECUTABLE: bool = false, + LOCKED: bool = false, + NORESERVE: bool = false, + POPULATE: bool = false, + NONBLOCK: bool = false, + STACK: bool = false, + HUGETLB: bool = false, + SYNC: bool = false, + FIXED_NOREPLACE: bool = false, + _21: u5 = 0, + UNINITIALIZED: bool = false, + _: u5 = 0, + }, + .riscv64 => packed struct(u32) { + TYPE: MAP_TYPE, + FIXED: bool = false, + ANONYMOUS: bool = false, + _6: u9 = 0, + POPULATE: bool = false, + NONBLOCK: bool = false, + STACK: bool = false, + HUGETLB: bool = false, + SYNC: bool = false, + FIXED_NOREPLACE: bool = false, + _21: u5 = 0, + UNINITIALIZED: bool = false, + _: u5 = 0, + }, + .sparc64 => packed struct(u32) { + TYPE: MAP_TYPE, + FIXED: bool = false, + ANONYMOUS: bool = false, + NORESERVE: bool = false, + _7: u1 = 0, + LOCKED: bool = false, + GROWSDOWN: bool = false, + _10: u1 = 0, + DENYWRITE: bool = false, + EXECUTABLE: bool = false, + _13: u2 = 0, + POPULATE: bool = false, + NONBLOCK: bool = false, + STACK: bool = false, + HUGETLB: bool = false, + SYNC: bool = false, + FIXED_NOREPLACE: bool = false, + _21: u5 = 0, + UNINITIALIZED: bool = false, + _: u5 = 0, + }, + .mips, .mipsel, .mips64, .mips64el => packed struct(u32) { + TYPE: MAP_TYPE, + FIXED: bool = false, + _5: u1 = 0, + @"32BIT": bool = false, + _7: u3 = 0, + NORESERVE: bool = false, + ANONYMOUS: bool = false, + GROWSDOWN: bool = false, + DENYWRITE: bool = false, + EXECUTABLE: bool = false, + LOCKED: bool = false, + POPULATE: bool = false, + NONBLOCK: bool = false, + STACK: bool = false, + HUGETLB: bool = false, + FIXED_NOREPLACE: bool = false, + _21: u5 = 0, + UNINITIALIZED: bool = false, + _: u5 = 0, + }, + .powerpc, .powerpcle, .powerpc64, .powerpc64le => packed struct(u32) { + TYPE: MAP_TYPE, + FIXED: bool = false, + ANONYMOUS: bool = false, + NORESERVE: bool = false, + LOCKED: bool = false, + GROWSDOWN: bool = false, + _9: u2 = 0, + DENYWRITE: bool = false, + EXECUTABLE: bool = false, + _13: u2 = 0, + POPULATE: bool = false, + NONBLOCK: bool = false, + STACK: bool = false, + HUGETLB: bool = false, + SYNC: bool = false, + FIXED_NOREPLACE: bool = false, + _21: u5 = 0, + UNINITIALIZED: bool = false, + _: u5 = 0, + }, + else => @compileError("missing std.os.linux.MAP constants for this architecture"), }; pub const O = struct { diff --git a/lib/std/os/linux/arm-eabi.zig b/lib/std/os/linux/arm-eabi.zig index f4870dccbb9e1a7fcc81decbaf0e6bfc2a73d803..74c381f4967741f2ca417e7777c5a7283a2afb69 100644 --- a/lib/std/os/linux/arm-eabi.zig +++ b/lib/std/os/linux/arm-eabi.zig @@ -197,19 +197,6 @@ pub const LOCK = struct { pub const NB = 4; }; -pub const MAP = struct { - /// stack-like segment - pub const GROWSDOWN = 0x0100; - /// ETXTBSY - pub const DENYWRITE = 0x0800; - /// mark it as an executable - pub const EXECUTABLE = 0x1000; - /// pages are locked - pub const LOCKED = 0x2000; - /// don't check for reservations - pub const NORESERVE = 0x4000; -}; - pub const VDSO = struct { pub const CGT_SYM = "__vdso_clock_gettime"; pub const CGT_VER = "LINUX_2.6"; diff --git a/lib/std/os/linux/arm64.zig b/lib/std/os/linux/arm64.zig index b87e774306076fa10807736176d5bbd15bf5ac52..40dad5656e33b89162c26cee2beab5bf26316b09 100644 --- a/lib/std/os/linux/arm64.zig +++ b/lib/std/os/linux/arm64.zig @@ -179,19 +179,6 @@ pub const LOCK = struct { pub const NB = 4; }; -pub const MAP = struct { - /// stack-like segment - pub const GROWSDOWN = 0x0100; - /// ETXTBSY - pub const DENYWRITE = 0x0800; - /// mark it as an executable - pub const EXECUTABLE = 0x1000; - /// pages are locked - pub const LOCKED = 0x2000; - /// don't check for reservations - pub const NORESERVE = 0x4000; -}; - pub const VDSO = struct { pub const CGT_SYM = "__kernel_clock_gettime"; pub const CGT_VER = "LINUX_2.6.39"; diff --git a/lib/std/os/linux/io_uring.zig b/lib/std/os/linux/io_uring.zig index 17c589574dccd13afeba0b782a48e231be4e3547..77e134feec2d9f951e2b97aff190466cad190bca 100644 --- a/lib/std/os/linux/io_uring.zig +++ b/lib/std/os/linux/io_uring.zig @@ -1344,7 +1344,7 @@ pub const SubmissionQueue = struct { null, size, os.PROT.READ | os.PROT.WRITE, - os.MAP.SHARED | os.MAP.POPULATE, + .{ .TYPE = .SHARED, .POPULATE = true }, fd, linux.IORING_OFF_SQ_RING, ); @@ -1358,7 +1358,7 @@ pub const SubmissionQueue = struct { null, size_sqes, os.PROT.READ | os.PROT.WRITE, - os.MAP.SHARED | os.MAP.POPULATE, + .{ .TYPE = .SHARED, .POPULATE = true }, fd, linux.IORING_OFF_SQES, ); diff --git a/lib/std/os/linux/mips.zig b/lib/std/os/linux/mips.zig index cfb2d73bfd2339a39398237308e318970ac0c5b9..17c6c8a150695cb8d20cd536fd6c7aab7b36609b 100644 --- a/lib/std/os/linux/mips.zig +++ b/lib/std/os/linux/mips.zig @@ -271,15 +271,6 @@ pub const LOCK = struct { pub const MMAP2_UNIT = 4096; -pub const MAP = struct { - pub const NORESERVE = 0x0400; - pub const GROWSDOWN = 0x1000; - pub const DENYWRITE = 0x2000; - pub const EXECUTABLE = 0x4000; - pub const LOCKED = 0x8000; - pub const @"32BIT" = 0x40; -}; - pub const VDSO = struct { pub const CGT_SYM = "__kernel_clock_gettime"; pub const CGT_VER = "LINUX_2.6.39"; diff --git a/lib/std/os/linux/mips64.zig b/lib/std/os/linux/mips64.zig index d9861109796438c49d1abc685f4cd2c7e3426ccf..09499cbf9fcbe1e96089e8a03e719268707e3671 100644 --- a/lib/std/os/linux/mips64.zig +++ b/lib/std/os/linux/mips64.zig @@ -256,15 +256,6 @@ pub const LOCK = struct { pub const MMAP2_UNIT = 4096; -pub const MAP = struct { - pub const NORESERVE = 0x0400; - pub const GROWSDOWN = 0x1000; - pub const DENYWRITE = 0x2000; - pub const EXECUTABLE = 0x4000; - pub const LOCKED = 0x8000; - pub const @"32BIT" = 0x40; -}; - pub const VDSO = struct { pub const CGT_SYM = "__kernel_clock_gettime"; pub const CGT_VER = "LINUX_2.6.39"; diff --git a/lib/std/os/linux/powerpc.zig b/lib/std/os/linux/powerpc.zig index 87feba3f0ab0ae4d70c852be22c89343e3d03c1e..5f073704891ade990ec140baac1184a2dd1dfcbe 100644 --- a/lib/std/os/linux/powerpc.zig +++ b/lib/std/os/linux/powerpc.zig @@ -198,19 +198,6 @@ pub const LOCK = struct { pub const NB = 4; }; -pub const MAP = struct { - /// stack-like segment - pub const GROWSDOWN = 0x0100; - /// ETXTBSY - pub const DENYWRITE = 0x0800; - /// mark it as an executable - pub const EXECUTABLE = 0x1000; - /// pages are locked - pub const LOCKED = 0x0080; - /// don't check for reservations - pub const NORESERVE = 0x0040; -}; - pub const VDSO = struct { pub const CGT_SYM = "__kernel_clock_gettime"; pub const CGT_VER = "LINUX_2.6.15"; diff --git a/lib/std/os/linux/powerpc64.zig b/lib/std/os/linux/powerpc64.zig index dc142abc4f12fc2d36d3d1b0ce3ad2c7fc2585c7..99e52fb5ad64bc5cbdda91a93e36db1fcbd20180 100644 --- a/lib/std/os/linux/powerpc64.zig +++ b/lib/std/os/linux/powerpc64.zig @@ -198,19 +198,6 @@ pub const LOCK = struct { pub const NB = 4; }; -pub const MAP = struct { - /// stack-like segment - pub const GROWSDOWN = 0x0100; - /// ETXTBSY - pub const DENYWRITE = 0x0800; - /// mark it as an executable - pub const EXECUTABLE = 0x1000; - /// pages are locked - pub const LOCKED = 0x0080; - /// don't check for reservations - pub const NORESERVE = 0x0040; -}; - pub const VDSO = struct { pub const CGT_SYM = "__kernel_clock_gettime"; pub const CGT_VER = "LINUX_2.6.15"; diff --git a/lib/std/os/linux/riscv64.zig b/lib/std/os/linux/riscv64.zig index 473cab7b317e13e9e3fec7703d15e80e1c315116..45821ddefae76a8fc768b621859a528eda62c052 100644 --- a/lib/std/os/linux/riscv64.zig +++ b/lib/std/os/linux/riscv64.zig @@ -246,4 +246,3 @@ pub const Stat = extern struct { pub const Elf_Symndx = u32; pub const VDSO = struct {}; -pub const MAP = struct {}; diff --git a/lib/std/os/linux/sparc64.zig b/lib/std/os/linux/sparc64.zig index 293f8b6ce29f6d3a1804251aaf2be1ebb86da1ea..ef4e1281b52d106b247304cdaf2eb9985de7ad5e 100644 --- a/lib/std/os/linux/sparc64.zig +++ b/lib/std/os/linux/sparc64.zig @@ -248,19 +248,6 @@ pub const LOCK = struct { pub const UN = 8; }; -pub const MAP = struct { - /// stack-like segment - pub const GROWSDOWN = 0x0200; - /// ETXTBSY - pub const DENYWRITE = 0x0800; - /// mark it as an executable - pub const EXECUTABLE = 0x1000; - /// pages are locked - pub const LOCKED = 0x0100; - /// don't check for reservations - pub const NORESERVE = 0x0040; -}; - pub const VDSO = struct { pub const CGT_SYM = "__vdso_clock_gettime"; pub const CGT_VER = "LINUX_2.6"; diff --git a/lib/std/os/linux/tls.zig b/lib/std/os/linux/tls.zig index dfd5200d458b906a3f110b75f69aeb48f8dc1d7f..6973d1ea2e0efc824a34dffd2d6b9cba5e1021a2 100644 --- a/lib/std/os/linux/tls.zig +++ b/lib/std/os/linux/tls.zig @@ -324,7 +324,7 @@ pub fn initStaticTLS(phdrs: []elf.Phdr) void { null, tls_image.alloc_size + tls_image.alloc_align - 1, os.PROT.READ | os.PROT.WRITE, - os.MAP.PRIVATE | os.MAP.ANONYMOUS, + .{ .TYPE = .PRIVATE, .ANONYMOUS = true }, -1, 0, ) catch os.abort(); diff --git a/lib/std/os/linux/x86.zig b/lib/std/os/linux/x86.zig index 721fdecb828b8fd1670ade33a0634c117215a74c..a6be4ac380ff55346380728a9f477c32aab59ce5 100644 --- a/lib/std/os/linux/x86.zig +++ b/lib/std/os/linux/x86.zig @@ -211,15 +211,6 @@ pub const LOCK = struct { pub const UN = 8; }; -pub const MAP = struct { - pub const NORESERVE = 0x4000; - pub const GROWSDOWN = 0x0100; - pub const DENYWRITE = 0x0800; - pub const EXECUTABLE = 0x1000; - pub const LOCKED = 0x2000; - pub const @"32BIT" = 0x40; -}; - pub const MMAP2_UNIT = 4096; pub const VDSO = struct { diff --git a/lib/std/os/linux/x86_64.zig b/lib/std/os/linux/x86_64.zig index ce8e1133ae913c302afa610a19f80c31af891349..6d4ab11abb3739d39694a3701b93c5e3eb881dd2 100644 --- a/lib/std/os/linux/x86_64.zig +++ b/lib/std/os/linux/x86_64.zig @@ -177,21 +177,6 @@ pub const F = struct { pub const UNLCK = 2; }; -pub const MAP = struct { - /// only give out 32bit addresses - pub const @"32BIT" = 0x40; - /// stack-like segment - pub const GROWSDOWN = 0x0100; - /// ETXTBSY - pub const DENYWRITE = 0x0800; - /// mark it as an executable - pub const EXECUTABLE = 0x1000; - /// pages are locked - pub const LOCKED = 0x2000; - /// don't check for reservations - pub const NORESERVE = 0x4000; -}; - pub const VDSO = struct { pub const CGT_SYM = "__vdso_clock_gettime"; pub const CGT_VER = "LINUX_2.6"; diff --git a/lib/std/os/test.zig b/lib/std/os/test.zig index c74c0aefc46c20c5344438b8c407cd0250b85f4a..3a170d6aec129d37f6d43d9272941e556d735d54 100644 --- a/lib/std/os/test.zig +++ b/lib/std/os/test.zig @@ -576,7 +576,7 @@ test "mmap" { null, 1234, os.PROT.READ | os.PROT.WRITE, - os.MAP.ANONYMOUS | os.MAP.PRIVATE, + .{ .TYPE = .PRIVATE, .ANONYMOUS = true }, -1, 0, ); @@ -618,7 +618,7 @@ test "mmap" { null, alloc_size, os.PROT.READ, - os.MAP.PRIVATE, + .{ .TYPE = .PRIVATE }, file.handle, 0, ); @@ -642,7 +642,7 @@ test "mmap" { null, alloc_size / 2, os.PROT.READ, - os.MAP.PRIVATE, + .{ .TYPE = .PRIVATE }, file.handle, alloc_size / 2, ); -- 2.54.0 From a60f219660c5973c12987149c48ce9febf3c2b24 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 6 Feb 2024 22:06:01 -0700 Subject: [PATCH 2/2] std.c.MAP: use a packed struct Same as previous commit, but for the libc interface. --- lib/std/c.zig | 142 ++++++++++++++++++++++++++++++++++++++ lib/std/c/darwin.zig | 20 ------ lib/std/c/dragonfly.zig | 22 ------ lib/std/c/emscripten.zig | 5 -- lib/std/c/freebsd.zig | 23 ------ lib/std/c/haiku.zig | 16 ----- lib/std/c/linux.zig | 6 -- lib/std/c/netbsd.zig | 20 ------ lib/std/c/openbsd.zig | 18 ----- lib/std/c/solaris.zig | 21 ------ lib/std/os.zig | 2 +- lib/std/os/emscripten.zig | 21 ------ 12 files changed, 143 insertions(+), 173 deletions(-) diff --git a/lib/std/c.zig b/lib/std/c.zig index e49493111431c8cd900fcdcde7c200efc00abf66..e03a16314faad0f1f6732cab19dfbccd30d465fc 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -45,6 +45,148 @@ pub usingnamespace switch (builtin.os.tag) { else => struct {}, }; +pub const MAP = switch (builtin.os.tag) { + .linux => std.os.linux.MAP, + .emscripten => packed struct(u32) { + TYPE: enum(u4) { + SHARED = 0x01, + PRIVATE = 0x02, + SHARED_VALIDATE = 0x03, + }, + FIXED: bool = false, + ANONYMOUS: bool = false, + _6: u2 = 0, + GROWSDOWN: bool = false, + _9: u2 = 0, + DENYWRITE: bool = false, + EXECUTABLE: bool = false, + LOCKED: bool = false, + NORESERVE: bool = false, + POPULATE: bool = false, + NONBLOCK: bool = false, + STACK: bool = false, + HUGETLB: bool = false, + SYNC: bool = false, + FIXED_NOREPLACE: bool = false, + _: u11 = 0, + }, + .solaris, .illumos => packed struct(u32) { + TYPE: enum(u4) { + SHARED = 0x01, + PRIVATE = 0x02, + }, + FIXED: bool = false, + RENAME: bool = false, + NORESERVE: bool = false, + @"32BIT": bool = false, + ANONYMOUS: bool = false, + ALIGN: bool = false, + TEXT: bool = false, + INITDATA: bool = false, + _: u20 = 0, + }, + .netbsd => packed struct(u32) { + TYPE: enum(u2) { + SHARED = 0x01, + PRIVATE = 0x02, + }, + REMAPDUP: bool = false, + _3: u1 = 0, + FIXED: bool = false, + RENAME: bool = false, + NORESERVE: bool = false, + INHERIT: bool = false, + _8: u1 = 0, + HASSEMAPHORE: bool = false, + TRYFIXED: bool = false, + WIRED: bool = false, + ANONYMOUS: bool = false, + STACK: bool = false, + _: u18 = 0, + }, + .openbsd => packed struct(u32) { + TYPE: enum(u4) { + SHARED = 0x01, + PRIVATE = 0x02, + }, + FIXED: bool = false, + _5: u7 = 0, + ANONYMOUS: bool = false, + _13: u1 = 0, + STACK: bool = false, + CONCEAL: bool = false, + _: u16 = 0, + }, + .haiku => packed struct(u32) { + TYPE: enum(u2) { + SHARED = 0x01, + PRIVATE = 0x02, + }, + FIXED: bool = false, + ANONYMOUS: bool = false, + NORESERVE: bool = false, + _: u27 = 0, + }, + .macos, .ios, .tvos, .watchos => packed struct(u32) { + TYPE: enum(u4) { + SHARED = 0x01, + PRIVATE = 0x02, + }, + FIXED: bool = false, + _5: u1 = 0, + NORESERVE: bool = false, + _7: u2 = 0, + HASSEMAPHORE: bool = false, + NOCACHE: bool = false, + _11: u1 = 0, + ANONYMOUS: bool = false, + _: u19 = 0, + }, + .dragonfly => packed struct(u32) { + TYPE: enum(u4) { + SHARED = 0x01, + PRIVATE = 0x02, + }, + FIXED: bool = false, + RENAME: bool = false, + NORESERVE: bool = false, + INHERIT: bool = false, + NOEXTEND: bool = false, + HASSEMAPHORE: bool = false, + STACK: bool = false, + NOSYNC: bool = false, + ANONYMOUS: bool = false, + VPAGETABLE: bool = false, + _14: u2 = 0, + TRYFIXED: bool = false, + NOCORE: bool = false, + SIZEALIGN: bool = false, + _: u13 = 0, + }, + .freebsd => packed struct(u32) { + TYPE: enum(u4) { + SHARED = 0x01, + PRIVATE = 0x02, + }, + FIXED: bool = false, + _5: u5 = 0, + STACK: bool = false, + NOSYNC: bool = false, + ANONYMOUS: bool = false, + GUARD: bool = false, + EXCL: bool = false, + _15: u2 = 0, + NOCORE: bool = false, + PREFAULT_READ: bool = false, + @"32BIT": bool = false, + _: u12 = 0, + }, + else => @compileError("target libc does not have MAP"), +}; + +/// Used by libc to communicate failure. Not actually part of the underlying syscall. +pub const MAP_FAILED: *anyopaque = @ptrFromInt(std.math.maxInt(usize)); + pub const whence_t = if (builtin.os.tag == .wasi) std.os.wasi.whence_t else c_int; // Unix-like systems diff --git a/lib/std/c/darwin.zig b/lib/std/c/darwin.zig index cc195f2bf0cf3fdf7e1c20fc1e42361ff0d2dd1c..a80c65f76cc10bb8fcc0d8344d507a660169fd54 100644 --- a/lib/std/c/darwin.zig +++ b/lib/std/c/darwin.zig @@ -1310,26 +1310,6 @@ pub const PROT = struct { pub const COPY: vm_prot_t = 0x10; }; -pub const MAP = struct { - /// allocated from memory, swap space - pub const ANONYMOUS = 0x1000; - /// map from file (default) - pub const FILE = 0x0000; - /// interpret addr exactly - pub const FIXED = 0x0010; - /// region may contain semaphores - pub const HASSEMAPHORE = 0x0200; - /// changes are private - pub const PRIVATE = 0x0002; - /// share changes - pub const SHARED = 0x0001; - /// don't cache pages for this mapping - pub const NOCACHE = 0x0400; - /// don't reserve needed swap area - pub const NORESERVE = 0x0040; - pub const FAILED = @as(*anyopaque, @ptrFromInt(maxInt(usize))); -}; - pub const MSF = struct { pub const ASYNC = 0x1; pub const INVALIDATE = 0x2; diff --git a/lib/std/c/dragonfly.zig b/lib/std/c/dragonfly.zig index 15a5f7ef0482f048c792d34326e48a8dfcbe14da..5474d79d38e05b93d948dab80b20b6c86c2ae2d5 100644 --- a/lib/std/c/dragonfly.zig +++ b/lib/std/c/dragonfly.zig @@ -223,28 +223,6 @@ pub const PROT = struct { pub const EXEC = 4; }; -pub const MAP = struct { - pub const FILE = 0; - pub const FAILED = @as(*anyopaque, @ptrFromInt(maxInt(usize))); - pub const ANONYMOUS = ANON; - pub const COPY = PRIVATE; - pub const SHARED = 1; - pub const PRIVATE = 2; - pub const FIXED = 16; - pub const RENAME = 32; - pub const NORESERVE = 64; - pub const INHERIT = 128; - pub const NOEXTEND = 256; - pub const HASSEMAPHORE = 512; - pub const STACK = 1024; - pub const NOSYNC = 2048; - pub const ANON = 4096; - pub const VPAGETABLE = 8192; - pub const TRYFIXED = 65536; - pub const NOCORE = 131072; - pub const SIZEALIGN = 262144; -}; - pub const MSF = struct { pub const ASYNC = 1; pub const INVALIDATE = 2; diff --git a/lib/std/c/emscripten.zig b/lib/std/c/emscripten.zig index e213b816632d387ec2f5f3b2ee682cbf1de7b096..ca644730161cc5ba8a35b531e86080c90614c279 100644 --- a/lib/std/c/emscripten.zig +++ b/lib/std/c/emscripten.zig @@ -16,11 +16,6 @@ pub const IOV_MAX = emscripten.IOV_MAX; pub const IPPROTO = emscripten.IPPROTO; pub const LOCK = emscripten.LOCK; pub const MADV = emscripten.MADV; -pub const MAP = struct { - pub usingnamespace emscripten.MAP; - /// Only used by libc to communicate failure. - pub const FAILED = @as(*anyopaque, @ptrFromInt(maxInt(usize))); -}; pub const MSF = emscripten.MSF; pub const MSG = emscripten.MSG; pub const NAME_MAX = emscripten.NAME_MAX; diff --git a/lib/std/c/freebsd.zig b/lib/std/c/freebsd.zig index 6a8997bedf99687ec43266f1a63fd31dc2fb513f..a1b64893b8ff460c205c03fe353300eafd46c4f7 100644 --- a/lib/std/c/freebsd.zig +++ b/lib/std/c/freebsd.zig @@ -606,29 +606,6 @@ pub const CLOCK = struct { pub const PROCESS_CPUTIME_ID = 15; }; -pub const MAP = struct { - pub const FAILED = @as(*anyopaque, @ptrFromInt(maxInt(usize))); - pub const SHARED = 0x0001; - pub const PRIVATE = 0x0002; - pub const FIXED = 0x0010; - pub const STACK = 0x0400; - pub const NOSYNC = 0x0800; - pub const ANON = 0x1000; - pub const ANONYMOUS = ANON; - pub const FILE = 0; - - pub const GUARD = 0x00002000; - pub const EXCL = 0x00004000; - pub const NOCORE = 0x00020000; - pub const PREFAULT_READ = 0x00040000; - pub const @"32BIT" = 0x00080000; - - pub fn ALIGNED(alignment: u32) u32 { - return alignment << 24; - } - pub const ALIGNED_SUPER = ALIGNED(1); -}; - pub const MADV = struct { pub const NORMAL = 0; pub const RANDOM = 1; diff --git a/lib/std/c/haiku.zig b/lib/std/c/haiku.zig index a64eb03b419ff7c3152cc8e995eca322bb89f26d..c8cc16563a10dcd8f01af095dc91f45e1f016d75 100644 --- a/lib/std/c/haiku.zig +++ b/lib/std/c/haiku.zig @@ -408,22 +408,6 @@ pub const CLOCK = struct { pub const THREAD_CPUTIME_ID = -3; }; -pub const MAP = struct { - /// mmap() error return code - pub const FAILED = @as(*anyopaque, @ptrFromInt(maxInt(usize))); - /// changes are seen by others - pub const SHARED = 0x01; - /// changes are only seen by caller - pub const PRIVATE = 0x02; - /// require mapping to specified addr - pub const FIXED = 0x04; - /// no underlying object - pub const ANONYMOUS = 0x0008; - pub const ANON = ANONYMOUS; - /// don't commit memory - pub const NORESERVE = 0x10; -}; - pub const MSF = struct { pub const ASYNC = 1; pub const INVALIDATE = 2; diff --git a/lib/std/c/linux.zig b/lib/std/c/linux.zig index c9efd69dcd6fdd4117ca88c220d17ab6d30c23f0..c847d58bef009bdd82d7c3742ac25ab741d11a57 100644 --- a/lib/std/c/linux.zig +++ b/lib/std/c/linux.zig @@ -1,6 +1,5 @@ const std = @import("../std.zig"); const builtin = @import("builtin"); -const maxInt = std.math.maxInt; const native_abi = builtin.abi; const native_arch = builtin.cpu.arch; const linux = std.os.linux; @@ -25,11 +24,6 @@ pub const IOV_MAX = linux.IOV_MAX; pub const IPPROTO = linux.IPPROTO; pub const LOCK = linux.LOCK; pub const MADV = linux.MADV; -pub const MAP = struct { - pub usingnamespace linux.MAP; - /// Only used by libc to communicate failure. - pub const FAILED = @as(*anyopaque, @ptrFromInt(maxInt(usize))); -}; pub const MSF = linux.MSF; pub const MMAP2_UNIT = linux.MMAP2_UNIT; pub const MSG = linux.MSG; diff --git a/lib/std/c/netbsd.zig b/lib/std/c/netbsd.zig index 23803144296aa01541ccc360f7d3e0716946ee1d..2c100e2c3797ccdc190d26a67600800099591829 100644 --- a/lib/std/c/netbsd.zig +++ b/lib/std/c/netbsd.zig @@ -573,26 +573,6 @@ pub const CLOCK = struct { pub const PROCESS_CPUTIME_ID = 0x40000000; }; -pub const MAP = struct { - pub const FAILED = @as(*anyopaque, @ptrFromInt(maxInt(usize))); - pub const SHARED = 0x0001; - pub const PRIVATE = 0x0002; - pub const REMAPDUP = 0x0004; - pub const FIXED = 0x0010; - pub const RENAME = 0x0020; - pub const NORESERVE = 0x0040; - pub const INHERIT = 0x0080; - pub const HASSEMAPHORE = 0x0200; - pub const TRYFIXED = 0x0400; - pub const WIRED = 0x0800; - - pub const FILE = 0x0000; - pub const NOSYNC = 0x0800; - pub const ANON = 0x1000; - pub const ANONYMOUS = ANON; - pub const STACK = 0x2000; -}; - pub const MSF = struct { pub const ASYNC = 1; pub const INVALIDATE = 2; diff --git a/lib/std/c/openbsd.zig b/lib/std/c/openbsd.zig index 33a60df95428248100d38ab20786a6bce504adff..a5e275913b364b04c2cef04beb1efcc4e42ade8a 100644 --- a/lib/std/c/openbsd.zig +++ b/lib/std/c/openbsd.zig @@ -436,24 +436,6 @@ pub const CLOCK = struct { pub const THREAD_CPUTIME_ID = 4; }; -pub const MAP = struct { - pub const FAILED = @as(*anyopaque, @ptrFromInt(maxInt(usize))); - pub const SHARED = 0x0001; - pub const PRIVATE = 0x0002; - pub const FIXED = 0x0010; - pub const RENAME = 0; - pub const NORESERVE = 0; - pub const INHERIT = 0; - pub const HASSEMAPHORE = 0; - pub const TRYFIXED = 0; - - pub const FILE = 0; - pub const ANON = 0x1000; - pub const ANONYMOUS = ANON; - pub const STACK = 0x4000; - pub const CONCEAL = 0x8000; -}; - pub const MSF = struct { pub const ASYNC = 1; pub const INVALIDATE = 2; diff --git a/lib/std/c/solaris.zig b/lib/std/c/solaris.zig index 3ec8c3aa97bc29936631cd7ba153351c5e180e71..c533ef2ca565fe8b9e6e530adaaeb906e5b4a10a 100644 --- a/lib/std/c/solaris.zig +++ b/lib/std/c/solaris.zig @@ -523,27 +523,6 @@ pub const CLOCK = struct { pub const PROF = THREAD_CPUTIME_ID; }; -pub const MAP = struct { - pub const FAILED = @as(*anyopaque, @ptrFromInt(maxInt(usize))); - pub const SHARED = 0x0001; - pub const PRIVATE = 0x0002; - pub const TYPE = 0x000f; - - pub const FILE = 0x0000; - pub const FIXED = 0x0010; - // Unimplemented - pub const RENAME = 0x0020; - pub const NORESERVE = 0x0040; - /// Force mapping in lower 4G address space - pub const @"32BIT" = 0x0080; - - pub const ANON = 0x0100; - pub const ANONYMOUS = ANON; - pub const ALIGN = 0x0200; - pub const TEXT = 0x0400; - pub const INITDATA = 0x0800; -}; - pub const MSF = struct { pub const ASYNC = 1; pub const INVALIDATE = 2; diff --git a/lib/std/os.zig b/lib/std/os.zig index dca923e6badc34b1a97b18c274e32a2b97176813..de414338f49e41901b99f75b47931a874fdf7648 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -4666,7 +4666,7 @@ pub fn mmap( const ioffset: i64 = @bitCast(offset); // the OS treats this as unsigned const rc = mmap_sym(ptr, length, prot, @bitCast(flags), fd, ioffset); const err = if (builtin.link_libc) blk: { - if (rc != std.c.MAP.FAILED) return @as([*]align(mem.page_size) u8, @ptrCast(@alignCast(rc)))[0..length]; + if (rc != std.c.MAP_FAILED) return @as([*]align(mem.page_size) u8, @ptrCast(@alignCast(rc)))[0..length]; break :blk @as(E, @enumFromInt(system._errno().*)); } else blk: { const err = errno(rc); diff --git a/lib/std/os/emscripten.zig b/lib/std/os/emscripten.zig index 5bfa33766aac5dfa0a04b5be5684e135f387de2c..883136b39a5426714ae182efdbf845928b0f84f1 100644 --- a/lib/std/os/emscripten.zig +++ b/lib/std/os/emscripten.zig @@ -449,27 +449,6 @@ pub const MADV = struct { pub const SOFT_OFFLINE = 101; }; -pub const MAP = struct { - pub const SHARED = 0x01; - pub const PRIVATE = 0x02; - pub const SHARED_VALIDATE = 0x03; - pub const TYPE = 0x0f; - pub const FIXED = 0x10; - pub const ANON = 0x20; - pub const ANONYMOUS = ANON; - pub const NORESERVE = 0x4000; - pub const GROWSDOWN = 0x0100; - pub const DENYWRITE = 0x0800; - pub const EXECUTABLE = 0x1000; - pub const LOCKED = 0x2000; - pub const POPULATE = 0x8000; - pub const NONBLOCK = 0x10000; - pub const STACK = 0x20000; - pub const HUGETLB = 0x40000; - pub const SYNC = 0x80000; - pub const FIXED_NOREPLACE = 0x100000; -}; - pub const MSF = struct { pub const ASYNC = 1; pub const INVALIDATE = 2; -- 2.54.0