aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Build/Step/UpdateSourceFiles.zig
diff options
context:
space:
mode:
authorStephen Gregoratto <dev@sgregoratto.me>2025-10-19 22:48:54 +1100
committerAlex Rønne Petersen <alex@alexrp.com>2025-12-14 01:41:47 +0100
commit6216922a9d63982f11ff8ee551a6688bc873e51c (patch)
tree14a9946c3269a9b0c0b754f8a8a4eb859ca667f2 /lib/std/Build/Step/UpdateSourceFiles.zig
parentff3fd950a74ab8ea8907a62dbf880eae08232417 (diff)
downloadzig-6216922a9d63982f11ff8ee551a6688bc873e51c.tar.gz
zig-6216922a9d63982f11ff8ee551a6688bc873e51c.zip
Linux: Nuke `Stat` bits in favour of statx
Maintaining the POSIX `stat` bits for Zig is a pain. The order and bit-length of members differ between all architectures, and int types can be signed or unsigned. The libcs deal with this by introducing the own version of `struct stat` and copying the kernel structure members to it. In the case of glibc, they did it twice thanks to the largefile transition! In practice, the project needs to maintain three versions of `struct stat`: - What the kernel defines. - What musl wants for `struct stat`. - What glibc wants for `struct stat64`. Make sure to use `fstatat64`! This isn't as simple as running `zig translate-c`. In #21440 I had to: - Compile toolchains for each arch+glibc/musl combo. - Create a test `fstat` program with/without `FILE_OFFSET_BITS=64`. - Dump the value for `struct stat`. - Stare at `std.os.linux`/`std.c` and cry. - Add some missing padding. The fact that so many target checks in the `linux` and `posix` tests exist is most likely due to writing to padding bits and failing later. The solution to this madness is `statx(2)`: - It takes a single structure that is the same for all arches AND libcs. - It uses a custom timestamp format, but it is 64-bit ready. - It gives the same info as `fstatat(2)` and more! - Unlike `fstatat(2)`, you can request a subset of the info required based on passing a mask. It's so good that modern Linux arches (e.g. riscv) don't even implement `stat`, with the libcs using a generic `struct stat` and copying from `struct statx`. Therefore, this commit rips out all the `stat` bits from `std.os.linux` and `std.c`. `std.posix.Stat` is now `void`, and calling `std.posix.*stat` is an compile-time error. A wrapper around `statx` has been added to `std.os.linux`, and callers have been upgraded to use it. Tests have also been updated to use `statx` where possible. While I was here, I converted the mask and file attributes to be packed struct bitfields. A nice side effect is checking that you actually recieved the members you asked for via `Statx.mask`, which I have used by adding `assert`s at specific callsites.
Diffstat (limited to 'lib/std/Build/Step/UpdateSourceFiles.zig')
0 files changed, 0 insertions, 0 deletions