aboutsummaryrefslogtreecommitdiff
path: root/src
AgeCommit message (Collapse)Author
13 dayscompiler: make all Zig-provided libraries use -ffunction-sections ↵Alex Rønne Petersen
-fdata-sections We already did this for some of them; this just makes us consistent. Doing this gives the linker more flexibility to rearrange code/data, but more importantly, allows --gc-sections to get rid of all the unused code, which is a real concern for these libraries in particular.
2025-12-14Linux: Nuke `Stat` bits in favour of statxStephen Gregoratto
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.
2025-12-12windows: type safety improvements and more ntdll functionsJacob Young
2025-12-10llvm: fix aliases not having linkage, visibility, etc setAlex Rønne Petersen
2025-12-08Merge pull request 'add FreeBSD 15 libc support' (#30135) from ↵Alex Rønne Petersen
alexrp/zig:freebsd-15 into master Reviewed-on: https://codeberg.org/ziglang/zig/pulls/30135
2025-12-08sema: remove special case check in `is_non_err`pentuppup
2025-12-07libc: update startup code from freebsd 15Alex Rønne Petersen
2025-12-07libc: deal with freebsd 15 changes (new libsys, libutil sover)Alex Rønne Petersen
2025-12-07stage2_wasm: revival, enabling testsPavel Verigo
2025-12-07sema: fix error_return_trace_index handling in zirCondBrPavel Verigo
2025-12-06Compilation: fix appendFileSystemInput race between main thread and C object ↵Alex Rønne Petersen
workers Co-authored-by: Matthew Lugg <mlugg@mlugg.co.uk>
2025-12-06detect `comptime var` references in asm input/output and improve errorspentuppup
2025-12-06Merge pull request 'link: support `--dependency-file` linker option' ↵Alex Rønne Petersen
(#30073) from alexrp/zig:elf-depfile into master Reviewed-on: https://codeberg.org/ziglang/zig/pulls/30073 Reviewed-by: mlugg <mlugg@noreply.codeberg.org>
2025-12-06std.heap: rework `c_allocator`Matthew Lugg
The main goal here was to avoid allocating padding and header space if `malloc` already guarantees the alignment we need via `max_align_t`. Previously, the compiler was using `std.heap.raw_c_allocator` as its GPA in some cases depending on `std.c.max_align_t`, but that's pretty fragile (it meant we had to encode our alignment requirements into `src/main.zig`!). Perhaps more importantly, that solution is unnecessarily restrictive: since Zig's `Allocator` API passes the `Alignment` not only to `alloc`, but also to `free` etc, we are able to use a different strategy depending on its value. So `c_allocator` can simply compare the requested align to `Alignment.of(std.c.max_align_t)`, and use a raw `malloc` call (no header needed!) if it will guarantee a suitable alignment (which, in practice, will be true the vast majority of the time). So in short, this makes `std.heap.c_allocator` more memory efficient, and probably removes any incentive to use `std.heap.raw_c_allocator`. I also refactored the `c_allocator` implementation while doing this, just to neaten things up a little.
2025-12-05Compilation: track indirect file system inputs from clang's depfileAlex Rønne Petersen
Co-authored-by: Matthew Lugg <mlugg@mlugg.co.uk>
2025-12-05compiler: handle -Xlinker args similarly to -Wl argsAlex Rønne Petersen
2025-12-05compiler: support --dependency-file linker optionAlex Rønne Petersen
closes https://github.com/ziglang/zig/issues/22213
2025-12-01link.Elf: implement aarch64 relocationDavid Rubin
2025-11-29Return a `usize` from `@abs` if given an `isize`fn ⌃ ⌥
Also: - `c_ushort` for `c_short` - `c_uint` for `c_int` - `c_ulong` for `c_long` - `c_ulonglong` for `c_longlong`
2025-11-29Sema: initialize OPV comptime allocs correctlyMatthew Lugg
This was caused a `[0]std.builtin.Type.StructField.Attributes` to be considered `undefined`, even though that type is OPV so should prefer its OPV `.{}` over `undefined`. Resolves: #30039
2025-11-29print_zir: fix typoMatthew Lugg
2025-11-27x86_64: fix abi of a struct that partially fits in registersJacob Young
Closes #26035
2025-11-25fetch: update from std.Thread.Pool to std.IoAndrew Kelley
2025-11-25Merge pull request #26037 from ziglang/build-runner-std.IoAndrew Kelley
build runner: update from std.Thread.Pool to std.Io
2025-11-24Merge pull request #25993 from squeek502/windows-pathsRyan Liptak
Teach `std.fs.path` about the wonderful world of Windows paths
2025-11-24frontend: introduce error.CanceledAndrew Kelley
2025-11-23std.Target: remove Abi.code16Alex Rønne Petersen
This functionality -- if it's actually needed -- can be reintroduced through some other mechanism. An ABI is clearly not the right way to represent it. closes #25918
2025-11-23Merge pull request #23733 from alichraghi/bpMatthew Lugg
replace @Type with individual type-creating builtins
2025-11-23cbe: translate sparc ccr/icc/xcc registers to iccAlex Rønne Petersen
C compilers do not distinguish between these.
2025-11-22all: replace all `@Type` usagesAli Cheraghi
Co-authored-by: Matthew Lugg <mlugg@mlugg.co.uk>
2025-11-22compiler: replace `@Type` with individual type-creating builtinsMatthew Lugg
The new builtins are: * `@EnumLiteral` * `@Int` * `@Fn` * `@Pointer` * `@Tuple` * `@Enum` * `@Union` * `@Struct` Their usage is documented in the language reference. There is no `@Array` because arrays can be created like this: if (sentinel) |s| [n:s]T else [n]T There is also no `@Float`. Instead, `std.meta.Float` can serve this use case if necessary. There is no `@ErrorSet` and intentionally no way to achieve this. Likewise, there is intentionally no way to reify tuples with comptime fields, or function types with comptime parameters. These decisions simplify the Zig language specification, and moreover make Zig code more readable by discouraging overly complex metaprogramming. Co-authored-by: Ali Cheraghi <alichraghi@proton.me> Resolves: #10710
2025-11-21Teach fs.path about the wonderful world of Windows pathsRyan Liptak
Previously, fs.path handled a few of the Windows path types, but not all of them, and only a few of them correctly/consistently. This commit aims to make `std.fs.path` correct and consistent in handling all possible Win32 path types. This commit also slightly nudges the codebase towards a separation of Win32 paths and NT paths, as NT paths are not actually distinguishable from Win32 paths from looking at their contents alone (i.e. `\Device\Foo` could be an NT path or a Win32 rooted path, no way to tell without external context). This commit formalizes `std.fs.path` being fully concerned with Win32 paths, and having no special detection/handling of NT paths. Resources on Windows path types, and Win32 vs NT paths: - https://googleprojectzero.blogspot.com/2016/02/the-definitive-guide-on-win32-to-nt.html - https://chrisdenton.github.io/omnipath/Overview.html - https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file API additions/changes/deprecations - `std.os.windows.getWin32PathType` was added (it is analogous to `RtlDetermineDosPathNameType_U`), while `std.os.windows.getNamespacePrefix` and `std.os.windows.getUnprefixedPathType` were deleted. `getWin32PathType` forms the basis on which the updated `std.fs.path` functions operate. - `std.fs.path.parsePath`, `std.fs.path.parsePathPosix`, and `std.fs.path.parsePathWindows` were added, while `std.fs.path.windowsParsePath` was deprecated. The new `parsePath` functions provide the "root" and the "kind" of a path, which is platform-specific. The now-deprecated `windowsParsePath` did not handle all possible path types, while the new `parsePathWindows` does. - `std.fs.path.diskDesignator` has been deprecated in favor of `std.fs.path.parsePath`, and same deal with `diskDesignatorWindows` -> `parsePathWindows` - `relativeWindows` is now a compile error when *not* targeting Windows, while `relativePosix` is now a compile error when targeting Windows. This is because those functions read/use the CWD path which will behave improperly when used from a system with different path semantics (e.g. calling `relativePosix` from a Windows system with a CWD like `C:\foo\bar` will give you a bogus result since that'd be treated as a single relative component when using POSIX semantics). This also allows `relativeWindows` to use Windows-specific APIs for getting the CWD and environment variables to cut down on allocations. - `componentIterator`/`ComponentIterator.init` have been made infallible. These functions used to be able to error on UNC paths with an empty server component, and on paths that were assumed to be NT paths, but now: + We follow the lead of `RtlDetermineDosPathNameType_U`/`RtlGetFullPathName_U` in how it treats a UNC path with an empty server name (e.g. `\\\share`) and allow it, even if it'll be invalid at the time of usage + Now that `std.fs.path` assumes paths are Win32 paths and not NT paths, we don't have to worry about NT paths Behavior changes - `std.fs.path` generally: any combinations of mixed path separators for UNC paths are universally supported, e.g. `\/server/share`, `/\server\share`, `/\server/\\//share` are all seen as equivalent UNC paths - `resolveWindows` handles all path types more appropriately/consistently. + `//` and `//foo` used to be treated as a relative path, but are now seen as UNC paths + If a rooted/drive-relative path cannot be resolved against anything more definite, the result will remain a rooted/drive-relative path. + I've created [a script to generate the results of a huge number of permutations of different path types](https://gist.github.com/squeek502/9eba7f19cad0d0d970ccafbc30f463bf) (the result of running the script is also included for anyone that'd like to vet the behavior). - `dirnameWindows` now treats the drive-relative root as the dirname of a drive-relative path with a component, e.g. `dirname("C:foo")` is now `C:`, whereas before it would return null. `dirnameWindows` also handles local device paths appropriately now. - `basenameWindows` now handles all path types more appropriately. The most notable change here is `//a` being treated as a partial UNC path now and therefore `basename` will return `""` for it, whereas before it would return `"a"` - `relativeWindows` will now do its best to resolve against the most appropriate CWD for each path, e.g. relative for `D:foo` will look at the CWD to check if the drive letter matches, and if not, look at the special environment variable `=D:` to get the shell-defined CWD for that drive, and if that doesn't exist, then it'll resolve against `D:\`. Implementation details - `resolveWindows` previously looped through the paths twice to build up the relevant info before doing the actual resolution. Now, `resolveWindows` iterates backwards once and keeps track of which paths are actually relevant using a bit set, which also allows it to break from the loop when it's no longer possible for earlier paths to matter. - A standalone test was added to test parts of `relativeWindows` since the CWD resolution logic depends on CWD information from the PEB and environment variables Edge cases worth noting - A strange piece of trivia that I found out while working on this is that it's technically possible to have a drive letter that it outside the intended A-Z range, or even outside the ASCII range entirely. Since we deal with both WTF-8 and WTF-16 paths, `path[0]`/`path[1]`/`path[2]` will not always refer to the same bits of information, so to get consistent behavior, some decision about how to deal with this edge case had to be made. I've made the choice to conform with how `RtlDetermineDosPathNameType_U` works, i.e. treat the first WTF-16 code unit as the drive letter. This means that when working with WTF-8, checking for drive-relative/drive-absolute paths is a bit more complicated. For more details, see the lengthy comment in `std.os.windows.getWin32PathType` - `relativeWindows` will now almost always be able to return either a fully-qualified absolute path or a relative path, but there's one scenario where it may return a rooted path: when the CWD gotten from the PEB is not a drive-absolute or UNC path (if that's actually feasible/possible?). An alternative approach to this scenario might be to resolve against the `HOMEDRIVE` env var if available, and/or default to `C:\` as a last resort in order to guarantee the result of `relative` is never a rooted path. - Partial UNC paths (e.g. `\\server` instead of `\\server\share`) are a bit awkward to handle, generally. Not entirely sure how best to handle them, so there may need to be another pass in the future to iron out any issues that arise. As of now the behavior is: + For `relative`, any part of a UNC disk designator is treated as the "root" and therefore isn't applicable for relative paths, e.g. calling `relative` with `\\server` and `\\server\share` will result in `\\server\share` rather than just `share` and if `relative` is called with `\\server\foo` and `\\server\bar` the result will be `\\server\bar` rather than `..\bar` + For `resolve`, any part of a UNC disk designator is also treated as the "root", but relative and rooted paths are still elligable for filling in missing portions of the disk designator, e.g. `resolve` with `\\server` and `foo` or `\foo` will result in `\\server\foo` Fixes #25703 Closes #25702
2025-11-20system specific errnorpkak
2025-11-20update deprecated ArrayListUnmanaged usage (#25958)Benjamin Jurk
2025-11-20Merge pull request #25780 from Vexu/translate-cAndrew Kelley
Update Aro and translate-c to latest
2025-11-20Merge pull request #25981 from mlugg/macos-fuzz-2Matthew Lugg
make the fuzzer vaguely work on macOS
2025-11-20Merge pull request #25898 from jacobly0/elfv2-progressAndrew Kelley
Elf2: more progress
2025-11-20update Aro and translate-c to latestVeikka Tuominen
2025-11-20std.debug: split up Mach-O debug info handlingMatthew Lugg
Like ELF, we now have `std.debug.MachOFile` for the host-independent parts, and `std.debug.SelfInfo.MachO` for logic requiring the file to correspond to the running program.
2025-11-19Elf2: revert incorrect endian fixJacob Young
2025-11-19Merge pull request #25965 from alexrp/s390xAlex Rønne Petersen
`s390x-linux` and general big-endian stuff
2025-11-19compiler: fix crash if file contents change during updateMatthew Lugg
When reporting a compile error, we would load the new file, but assume we could apply old AST/token indices (etc) to it, potentially causing crashes. Instead, if the file stat has changed since it was loaded, just emit an error that the file was modified mid-update.
2025-11-19compiler: don't use self-hosted backends on big-endian hostsAlex Rønne Petersen
https://github.com/ziglang/zig/issues/25961
2025-11-19llvm: fix lowering of packed struct constantsMatthew Lugg
The big-endian logic here was simply incorrect. Luckily, it was also overcomplicated; after calling `Value.writeToPackedMemory`, there is a method on `std.math.big.int.Mutable` which just does the correct endianness load for us.
2025-11-18cbe: fix big-endian unnatural integer bitcastMatthew Lugg
Integers with padding bits on big-endian targets cannot quite be bitcast with a trivial memcpy, because the padding bits (which are zext or sext) are the most-significant, so are at the *lowest* addresses. So to bitcast to something which doesn't have padding bits, we need to offset past the padding. The logic I've added here definitely doesn't handle all possibilities correctly; I think that would actually be quite complicated. However, it handles a common case, and so prevents the Zig compiler itself from being miscompiled on big-endian targets (hence fixing a bootstrapping problem on big-endian).
2025-11-17sema: fix UAF in type mismatch errorxdBronch
2025-11-16sema: improve codegen of for loop safety checksxdBronch
2025-11-16Merge pull request #25929 from alexrp/maccatalystAlex Rønne Petersen
`std.zig.target`: support `aarch64-maccatalyst` and `x86_64-maccatalyst` cross libc
2025-11-16Dedupe types when printing error messagesProkop Randáček
2025-11-16improve assembly error test coveragexdBronch