Commit Graph

36606 Commits

Author SHA1 Message Date
Andrew Kelley 2391c460b1 fix build failure when llvm not available 2025-01-20 20:59:52 -08:00
Andrew Kelley 77af309cb6 Compilation: take advantage of @splat 2025-01-20 20:59:52 -08:00
Andrew Kelley 28da530271 Compilation pipeline: linker input producing Job representation
Move all the remaining Jobs that produce linker inputs to be spawned
earlier in the pipeline and registered with link_task_wait_group.
2025-01-20 20:59:52 -08:00
Andrew Kelley 966169fa68 compilation pipeline: do glibc jobs earlier 2025-01-20 20:59:52 -08:00
Andrew Kelley ce00e91aa5 Compilation pipeline: do musl jobs earlier
This means doing more work in parallel which is already good, but it's
also a correctnes fix because we need link_task_wait_group.wait() to
ensure that no more linker inputs will be generated.
2025-01-20 20:59:52 -08:00
Andrew Kelley 160445ef31 Merge pull request #22522 from squeek502/resinator-sync
resinator: Sync with upstream
2025-01-20 23:16:47 -05:00
Andrew Kelley 0d6b17b6a5 Merge pull request #22511 from apwadkar/master
Fix compiler errors in std.process and std.Build.Step.Compile
2025-01-20 22:02:38 -05:00
mlugg 0ec6b2dd88 compiler: simplify generic functions, fix issues with inline calls
The original motivation here was to fix regressions caused by #22414.
However, while working on this, I ended up discussing a language
simplification with Andrew, which changes things a little from how they
worked before #22414.

The main user-facing change here is that any reference to a prior
function parameter, even if potentially comptime-known at the usage
site or even not analyzed, now makes a function generic. This applies
even if the parameter being referenced is not a `comptime` parameter,
since it could still be populated when performing an inline call. This
is a breaking language change.

The detection of this is done in AstGen; when evaluating a parameter
type or return type, we track whether it referenced any prior parameter,
and if so, we mark this type as being "generic" in ZIR. This will cause
Sema to not evaluate it until the time of instantiation or inline call.

A lovely consequence of this from an implementation perspective is that
it eliminates the need for most of the "generic poison" system. In
particular, `error.GenericPoison` is now completely unnecessary, because
we identify generic expressions earlier in the pipeline; this simplifies
the compiler and avoids redundant work. This also entirely eliminates
the concept of the "generic poison value". The only remnant of this
system is the "generic poison type" (`Type.generic_poison` and
`InternPool.Index.generic_poison_type`). This type is used in two
places:

* During semantic analysis, to represent an unknown result type.
* When storing generic function types, to represent a generic parameter/return type.

It's possible that these use cases should instead use `.none`, but I
leave that investigation to a future adventurer.

One last thing. Prior to #22414, inline calls were a little inefficient,
because they re-evaluated even non-generic parameter types whenever they
were called. Changing this behavior is what ultimately led to #22538.
Well, because the new logic will mark a type expression as generic if
there is any change its resolved type could differ in an inline call,
this redundant work is unnecessary! So, this is another way in which the
new design reduces redundant work and complexity.

Resolves: #22494
Resolves: #22532
Resolves: #22538
2025-01-21 02:41:42 +00:00
Andrew Kelley 216e0f3730 Merge pull request #22548 from mlugg/fix-broken-pipe
Wait for reported spawn success or failure before trying to write to the stdio pipe in the build runner.

Hopefully fixes `error.BrokenPipe` failures
2025-01-20 21:40:04 -05:00
mlugg 8bcb578507 Sema: fix is_non_null_ptr handling for runtime-known pointers
We can still often determine a comptime result based on the type, even
if the pointer is runtime-known.

Also, we previously used load -> is non null instead of AIR
`is_non_null_ptr` if the pointer is comptime-known, but that's a bad
heuristic. Instead, we should check for the pointer to be
comptime-known, *and* for the load to be comptime-known, and only in
that case should we call `Sema.analyzeIsNonNull`.

Resolves: #22556
2025-01-21 00:33:32 +00:00
Adheesh Wadkar 23facb6a16 Fix dependsOnSystemLibrary compile error 2025-01-20 15:37:57 -06:00
Adheesh Wadkar b5a2487f7a Fix chdirC compile error 2025-01-20 15:37:57 -06:00
Jacob Young b9198b708f x86_64: rewrite @abs 2025-01-20 14:47:07 -05:00
Eric Joldasov a79e421e59 std.zig.system: use both PATH and hardcoded locations to find env
Should help systems that have main `env` binary in different location
than hardcoded `/usr/bin/env` **during build** (not neccessarily always),
like Nix/Guix, Termux, Gentoo Prefix etc.

Related:
https://www.github.com/ziglang/zig/issues/12156
https://www.github.com/ziglang/zig/issues/14146
https://www.github.com/ziglang/zig/issues/14577
https://www.github.com/ziglang/zig/issues/15898

Source for logic: https://www.github.com/ziglang/zig/issues/14146#issuecomment-2308984936

Signed-off-by: Eric Joldasov <bratishkaerik@landless-city.net>
2025-01-20 14:29:04 +05:00
Eric Joldasov 5bbf3f5561 std.fs.path.joinSepMaybeZ: replace while-loops with for-loops
Signed-off-by: Eric Joldasov <bratishkaerik@landless-city.net>
2025-01-20 14:29:01 +05:00
dweiller b7a887f0fb compiler-rt: optimize memcpy
The new memcpy function aims to be more generic than the previous
implementation which was adapted from an implementation optimized for
x86_64 avx2 machines. Even on x86_64 avx2 machines this implementation
should be generally be faster due to fewer branches in the small length
cases and generating less machine code.

Note that the new memcpy function no longer acts as a memmove.
2025-01-20 18:29:15 +11:00
dweiller d6e1166f1a compiler-rt: reduce memmove and memcpy size for ReleaseSmall 2025-01-20 18:29:15 +11:00
Alex Rønne Petersen d5db02728c Merge pull request #22530 from alexrp/omit-unwind-tables
Fix building the standard library without CFI directives
2025-01-20 07:24:12 +01:00
dweiller bf89482f23 compiler-rt: move memmove back to memmove.zig 2025-01-20 17:16:24 +11:00
Jacob Young 5cfcb01503 llvm: convert @divFloor and @mod to forms llvm will recognize
On x86_64, the `@divFloor` change is a strict improvement, and the
`@mod` change adds one zero latency instruction.  In return, once we
upgrade to LLVM 20, when the optimizer discovers one of these operations
has a power-of-two constant rhs, it will be able to optimize the entire
operation into an `ashr` or `and`, respectively.

                      #I   CPL   CPT
    old `@divFloor` |  8 | 15 | .143 |
    new `@divFloor` |  7 | 15 | .148 |
    old `@mod`      |  9 | 17 | .134 | (rip llvm
    new `@mod`      | 10 | 17 | .138 |  scheduler)
2025-01-19 22:10:39 -05:00
mlugg 048e85f27e std.process.Child: add waitForSpawn
`std.Build.Step.Run` makes the very reasonable assumption that
`error.InvalidExe` will be reported on `spawn` if it will happen.
However, this property does not currently hold on POSIX targets. This
is, through a slightly convoluted series of events, partially
responsible for the sporadic `BrokenPipe` errors we've been seeing more
and more in CI runs.

Making `spawn` wait for the child to exec in the POSIX path introduces
a block of up to 400us. So, instead of doing that, we add a new API for
this particular case: `waitForSpawn`. This function is a nop on Windows,
but on POSIX it blocks until the child successfully (or otherwise) calls
`execvpe`, and reports the error if necessary. `std.Build.Step.Run`
calls this function, so that it can get `error.InvalidExe` when it wants
it.

I'm not convinced that this API is optimal. However, I think this entire
API needs to be either heavily refactored or straight-up redesigned
(related: #22504), so I'm not too worried about hitting the perfect API:
I'd rather just fix this bug for now, and figure out the long-term goal
a bit later.
2025-01-20 00:27:19 +00:00
mlugg b8e568504e std.Build: extend test_runner option to specify whether runner uses std.zig.Server
The previous logic here was trying to assume that custom test runners
never used `std.zig.Server` to communicate with the build runner;
however, it was flawed, because modifying the `test_runner` field on
`Step.Compile` would not update this flag. That might have been
intentional (allowing a way for the user to specify a custom test runner
which *does* use the compiler server protocol), but if so, it was a
flawed API, since it was too easy to update one field without updating
the other.

Instead, bundle these two pieces of state into a new type
`std.Build.Step.Compile.TestRunner`. When passing a custom test runner,
you are now *provided* to specify whether it is a "simple" runner, or
whether it uses the compiler server protocol.

This is a breaking change, but is unlikely to affect many people, since
custom test runners are seldom used in the wild.
2025-01-20 00:14:58 +00:00
Alex Rønne Petersen b074fb7dda std.zig.system.x86: Update Intel/AMD model detection. 2025-01-19 23:42:39 +01:00
Alex Rønne Petersen 0ead0beb83 Merge pull request #22524 from alexrp/libunwind-exceptions
`libunwind`: Build C files with `-fexceptions`.
2025-01-19 06:46:24 +01:00
Jacob Young 8ee80d61f6 x86_64: add a bunch of instruction encodings
Closes #19773
2025-01-18 23:30:45 -05:00
Alex Rønne Petersen db8ed730e7 std.Thread: Fix wasi_thread_start() export to use a pointer.
Closes #22518.
2025-01-19 03:23:00 +01:00
Alex Rønne Petersen 45bb4f955c test: Add a standalone test for omitting CFI directives. 2025-01-19 02:15:30 +01:00
Alex Rønne Petersen 8a78d875cc std.os.linux: Don't emit CFI directives if unwind tables are disabled. 2025-01-19 02:15:30 +01:00
Alex Rønne Petersen 4de661ef18 start: Don't emit CFI directives if unwind tables are disabled. 2025-01-19 02:15:30 +01:00
Matthew Lugg ebf782e944 Merge pull request #22531 from mlugg/various-fixes
incremental, Sema: minor fixes
2025-01-19 00:16:26 +00:00
Andrew Kelley a5d2aaa936 Merge pull request #22526 from alexrp/cpu-feature-hacks
`std.zig.system`: Move CPU feature hacks after ABI detection.
2025-01-18 18:22:11 -05:00
Jacob Young 128658038d debug: fix std.debug.NoPanic compile errors 2025-01-18 17:33:10 -05:00
Jacob Young a446101677 x86_64: enable struct field reordering
The blocker for enabling this feature was my need to debug the emitted
assembly without debug info and having to manually inspect memory to
determine struct contents.  However, we now have debug info!

    (lldb) v -L foo bar
    0x00007fffffffda20: (repro.repro.Foo) foo = {
    0x00007fffffffda24:   .x = 12
    0x00007fffffffda20:   .y = 34
    }
    0x00007fffffffda28: (repro.repro.Bar) bar = {
    0x00007fffffffda28:   .x = 56
    0x00007fffffffda2c:   .y = 78
    }

Updates #21530
2025-01-18 16:14:51 -05:00
andrewkraevskii 3dadb8c4c9 autodocs: reflow comment to prevent it from been put in blockquote 2025-01-18 15:45:03 +01:00
mlugg 3b6e5ba490 Sema: don't try to initialize global union pointer at comptime
Resolves: #19832
2025-01-18 14:30:06 +00:00
mlugg f7b9f84df2 incremental: fix enum resolution bugs 2025-01-18 14:30:06 +00:00
Alex Rønne Petersen 566cc4f99d compiler: Fix @import("builtin").unwind_tables logic. 2025-01-18 14:57:41 +01:00
Alex Rønne Petersen 332add7a65 libunwind: Build C files with -fexceptions.
See: https://github.com/llvm/llvm-project/pull/121819

This fixes LTO for libunwind, so also re-enable support for that.

Closes #12828.
2025-01-18 13:15:58 +01:00
Alex Rønne Petersen 515c97065a Revert "work around llvm failing to lower memcpy"
This reverts commit acf7043955.

Fixed as of ec768b7fa2f9c7dea6b92651bef59a7eea3299f2.
2025-01-18 12:59:41 +01:00
Alex Rønne Petersen 9758371419 std.zig.system: Move CPU feature hacks after ABI detection.
This was accidentally broken in #22434.
2025-01-18 12:59:38 +01:00
Ryan Liptak 289e9c3507 resinator: Sync with upstream
Note: This mostly matches resinator v0.1.0 rather than the latest master version, since the latest master version focuses on adding support for .res -> .obj conversion which is not necessary for the future planned relationship of zig and resinator (resinator will likely be moved out of the compiler and into the build system, a la translate-c).

So, ultimately the changes here consist mostly of bug fixes for obscure edge cases.
2025-01-17 23:10:41 -08:00
Ryan Liptak 4baa448335 resinator: Fix incorrect args being printed in cli diagnostics 2025-01-17 23:04:26 -08:00
Andrew Kelley f38d7a92cc Merge pull request #22513 from ziglang/memcpy
enhance memcpy and remove redundant implementations
2025-01-17 22:52:03 -05:00
Andrew Kelley f7f6217df9 macho linker: adjust symbol priority
strong symbols always take precedence over weak symbols.
2025-01-17 15:12:01 -08:00
axel escalada f9a43770c8 std.zip: Add ZIP64 support for local file header extra field
This PR adds support for handling ZIP64 format in local file headers,
when a zip file contains entries where the compressed or uncompressed
size fields are set to 0xFFFFFFFF, and the extra field contains ZIP64
extended information tag (0x0001)

The code now:

Reads the actual sizes from the ZIP64 extra field data
Validates these sizes against the entry's compressed and uncompressed sizes

Zip file format spec.: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT

This change allows proper extraction of ZIP files that use ZIP64 format in their
local file headers.

Fixes: #22329
2025-01-17 22:55:55 +01:00
Andrew Kelley acf7043955 work around llvm failing to lower memcpy
triggers an assertion in LegalizeDAG otherwise
2025-01-17 13:21:30 -08:00
Andrew Kelley 59acfb1263 compiler_rt: don't rely on weak aliases 2025-01-17 12:53:25 -08:00
David Rubin f278038923 replace compiler_rt memcpy with a better version 2025-01-17 12:34:15 -08:00
Andrew Kelley b07958e6b7 delete asm files from wasi libc
why the hell are there asm files in wasi libc to begin with?
2025-01-17 12:34:15 -08:00
Andrew Kelley e6dc85f1b4 remove memcpy and memmove from bundled libcs
These are provided instead by compiler_rt.

Part of #2879
2025-01-17 12:34:15 -08:00