Commit Graph
34717 Commits
Author SHA1 Message Date
Jan200101 d02c2c76fc link/Elf.zig: set stack size and build-id for dynamic libraries. 2024-12-31 17:09:20 +01:00
Matthew Lugg 0df1f3df2f Merge pull request #22352 from mlugg/zir-comptime-reason
Zir: attach reason to `block_comptime` and improve corresponding error reporting
2024-12-31 14:35:28 +00:00
mlugg 106df881d3 Sema: add doc comments for comptime reason types 2024-12-31 09:56:21 +00:00
mlugg 9ff80d7950 cases: update to new compile error wordings 2024-12-31 09:55:04 +00:00
mlugg 07b936c95f cases: add cases for runtime code in comptime scopes 2024-12-31 09:55:04 +00:00
mlugg 7e82398cfe Sema: remove some incorrect calls to requireRuntimeBlock
Most calls to `requireRuntimeBlock` in Sema are not correct. This
function doesn't deal with all of them, but it does deal with ones which
have, in combination with the past few commits, introduced real-world
regressions.

Related: #22353
2024-12-31 09:55:03 +00:00
mlugg d6120cf6a9 AstGen: better block_comptime elision 2024-12-31 09:55:03 +00:00
mlugg 71bcbd5993 AstGen: add missing comptimeExpr calls
Some sub-expressions should always be evaluated at comptime -- in
particular, type expressions, e.g. `E` in `E!T`. However, bugs in this
logic are easy to miss, because the parent scope is usually comptime
anyway!
2024-12-31 09:55:03 +00:00
mlugg 9a70eeeac5 compiler: ensure local consts in comptime scope are comptime-known
This fixes a bug which exposed a compiler implementation detail (ZIR
alloc elision). Previously, `const` declarations with a runtime-known
value in a comptime scope were permitted only if AstGen was able to
elide the alloc in ZIR, since the error was reported by storing to the
comptime alloc.

This just adds a new instruction to also emit this error when the alloc
is elided.
2024-12-31 09:55:03 +00:00
mlugg 6026a5f217 compiler: ensure result of block_comptime is comptime-known
To avoid this PR regressing error messages, most of the work here has
gone towards improving error notes for why code was comptime-evaluated.
ZIR `block_comptime` now stores a "comptime reason", the enum for which
is also used by Sema. There are two types in Sema:

* `ComptimeReason` represents the reason we started evaluating something
  at comptime.
* `BlockComptimeReason` represents the reason a given block is evaluated
  at comptime; it's either a `ComptimeReason` with an attached source
  location, or it's because we're in a function which was called at
  comptime (and that function's `Block` should be consulted for the
  "parent" reason).

Every `Block` stores a `?BlockComptimeReason`. The old `is_comptime`
field is replaced with a trivial `isComptime()` method which returns
whether that reason is non-`null`.

Lastly, the handling for `block_comptime` has been simplified. It was
previously going through an unnecessary runtime-handling path; now, it
is a trivial sub block exited through a `break_inline` instruction.

Resolves: #22296
2024-12-31 09:55:03 +00:00
Andrew Kelley 6d67658965 langref: move pointer casting section out of volatile subsection 2024-12-30 22:05:30 -08:00
Misaki Kasumi 021289a653 linux: make ptid and ctid in clone() optional 2024-12-31 05:24:10 +01:00
Jacob Young ec60156f18 InternPool: fix leak when the last namespace bucket is full 2024-12-29 15:28:40 -05:00
Andrew Kelley 271452d225 Merge pull request #22344 from Techatrix/slice-of-slice
fix incorrect slicing by length detection cases
2024-12-29 13:41:17 -05:00
Travis Staloch 45e4b16caf add @Type behavior tests from #19985 2024-12-29 13:37:39 -05:00
David Rubin b99dbb6fb5 Value: implement orderAgainstZeroInner for errors 2024-12-29 13:36:52 -05:00
Techatrix 5b6326ec65 fix slice of slice with sentinel on the lhs slice
example:
```zig
test {
    var foo: [2:0]u8 = .{ 1, 2 };
    _ = foo[0.. :1][0..2];
}
```

A `.slice_open` ast node will not have a end index nor sentinel.
2024-12-29 07:00:39 +01:00
Techatrix 5d51d4474a fix slice of slice with sentinel but no end index
example:
```zig
test {
	var foo = "";
	_ = foo[0..][0.. :0];
}
```

A `.slice_sentinel` ast node may not have an end index.
2024-12-29 07:00:35 +01:00
Techatrix 2e40a1d22e simplify AstGen handling of slicing syntax 2024-12-29 00:47:24 +01:00
mlugg 01081cc8e8 AstGen: lower function addrspace expression correctly
Also, add some basic behavior tests for addrspace and linksection which
would have caught this bug in CI.
2024-12-28 02:15:00 +00:00
David Rubin 5ee2816f62 llvm: fix UB in metadata printer 2024-12-27 15:38:41 -05:00
saccharin 30169d1d2e std.math.tanh: fix special cases comment 2024-12-27 03:12:03 +01:00
mlugg 42dac40b3f InternPool: fix segfault in rehashTrackedInsts
The `.empty` map in a shard is weird: it claims to have capacity 1, but
you're not actually allowed to actually use that capacity. That's fine
for the normal insertion algorithm, because it always resizes to a
higher capacity when inserting the initial element. However,
`rehashTrackedInsts` was not aware of this caveat, so sometimes tried to
store to the single element of the `empty` map.

This system exists to avoid an extra branch in the main resizing logic
(since `new_cap = old_cap * 2` only works if the capacity is never
non-zero). However, it's fine for `rehashTrackedInsts` to have an extra
branch to handle this case, since it's literally called once per update.
2024-12-26 02:19:02 +00:00
Matthew Lugg 497592c9b4 Merge pull request #22303 from mlugg/131-new
compiler: analyze type and value of global declarations separately
2024-12-25 02:58:27 +00:00
mlugg 3afda4322c compiler: analyze type and value of global declaration separately
This commit separates semantic analysis of the annotated type vs value
of a global declaration, therefore allowing recursive and mutually
recursive values to be declared.

Every `Nav` which undergoes analysis now has *two* corresponding
`AnalUnit`s: `.{ .nav_val = n }` and `.{ .nav_ty = n }`. The `nav_val`
unit is responsible for *fully resolving* the `Nav`: determining its
value, linksection, addrspace, etc. The `nav_ty` unit, on the other
hand, resolves only the information necessary to construct a *pointer*
to the `Nav`: its type, addrspace, etc. (It does also analyze its
linksection, but that could be moved to `nav_val` I think; it doesn't
make any difference).

Analyzing a `nav_ty` for a declaration with no type annotation will just
mark a dependency on the `nav_val`, analyze it, and finish. Conversely,
analyzing a `nav_val` for a declaration *with* a type annotation will
first mark a dependency on the `nav_ty` and analyze it, using this as
the result type when evaluating the value body.

The `nav_val` and `nav_ty` units always have references to one another:
so, if a `Nav`'s type is referenced, its value implicitly is too, and
vice versa. However, these dependencies are trivial, so, to save memory,
are only known implicitly by logic in `resolveReferences`.

In general, analyzing ZIR `decl_val` will only analyze `nav_ty` of the
corresponding `Nav`. There are two exceptions to this. If the
declaration is an `extern` declaration, then we immediately ensure the
`Nav` value is resolved (which doesn't actually require any more
analysis, since such a declaration has no value body anyway).
Additionally, if the resolved type has type tag `.@"fn"`, we again
immediately resolve the `Nav` value. The latter restriction is in place
for two reasons:

* Functions are special, in that their externs are allowed to trivially
  alias; i.e. with a declaration `extern fn foo(...)`, you can write
  `const bar = foo;`. This is not allowed for non-function externs, and
  it means that function types are the only place where it is possible
  for a declaration `Nav` to have a `.@"extern"` value without actually
  being declared `extern`. We need to identify this situation
  immediately so that the `decl_ref` can create a pointer to the *real*
  extern `Nav`, not this alias.
* In certain situations, such as taking a pointer to a `Nav`, Sema needs
  to queue analysis of a runtime function if the value is a function. To
  do this, the function value needs to be known, so we need to resolve
  the value immediately upon `&foo` where `foo` is a function.

This restriction is simple to codify into the eventual language
specification, and doesn't limit the utility of this feature in
practice.

A consequence of this commit is that codegen and linking logic needs to
be more careful when looking at `Nav`s. In general:

* When `updateNav` or `updateFunc` is called, it is safe to assume that
  the `Nav` being updated (the owner `Nav` for `updateFunc`) is fully
  resolved.
* Any `Nav` whose value is/will be an `@"extern"` or a function is fully
  resolved; see `Nav.getExtern` for a helper for a common case here.
* Any other `Nav` may only have its type resolved.

This didn't seem to be too tricky to satisfy in any of the existing
codegen/linker backends.

Resolves: #131
2024-12-24 02:18:41 +00:00
mlugg 40aafcd6a8 compiler: remove Cau
The `Cau` abstraction originated from noting that one of the two primary
roles of the legacy `Decl` type was to be the subject of comptime
semantic analysis. However, the data stored in `Cau` has always had some
level of redundancy. While preparing for #131, I went to remove that
redundany, and realised that `Cau` now had exactly one field: `owner`.

This led me to conclude that `Cau` is, in fact, an unnecessary level of
abstraction over what are in reality *fundamentally different* kinds of
analysis unit (`AnalUnit`). Types, `Nav` vals, and `comptime`
declarations are all analyzed in different ways, and trying to treat
them as the same thing is counterproductive!

So, these 3 cases are now different alternatives in `AnalUnit`. To avoid
stealing bits from `InternPool`-based IDs, which are already a little
starved for bits due to the sharding datastructures, `AnalUnit` is
expanded to 64 bits (30 of which are currently unused). This doesn't
impact memory usage too much by default, because we don't store
`AnalUnit`s all too often; however, we do store them a lot under
`-fincremental`, so a non-trivial bump to peak RSS can be observed
there. This will be improved in the future when I made
`InternPool.DepEntry` less memory-inefficient.

`Zcu.PerThread.ensureCauAnalyzed` is split into 3 functions, for each of
the 3 new types of `AnalUnit`. The new logic is much easier to
understand, because it avoids conflating the logic of these
fundamentally different cases.
2024-12-24 02:18:41 +00:00
mlugg 18362ebe13 Zir: refactor declaration instruction representation
The new representation is often more compact. It is also more
straightforward to understand: for instance, `extern` is represented on
the `declaration` instruction itself rather than using a special
instruction. The same applies to `var`, making both of these far more
compact.

This commit also separates the type and value bodies of a `declaration`
instruction. This is a prerequisite for #131.

In general, `declaration` now directly encodes details of the syntax
form used, and the embedded ZIR bodies are for actual expressions. The
only exception to this is functions, where ZIR is effectively designed
as if we had #1717. `extern fn` declarations are modeled as
`extern const` with a function type, and normal `fn` definitions are
modeled as `const` with a `func{,_fancy,_inferred}` instruction. This
may change in the future, but improving on this was out of scope for
this commit.
2024-12-23 21:09:17 +00:00
Andrew Kelley af5e731729 Merge pull request #22280 from jacobly0/stage2-pp
lldb: add more stage2 pretty printers
2024-12-23 15:55:03 -05:00
Liam Swayne b976e89c16 Add branch hint to unlikely branch of rem_pio2_large
Adds a `@branchHint` to a 1 in 12 branch of the pi/2 remainder calculation.
2024-12-23 14:41:43 -05:00
Jacob Young 5837147461 cmake: fix warnings 2024-12-23 14:40:28 -05:00
Alex Rønne Petersen f06ca14cb5 Merge pull request #22225 from alexrp/libc-linux-os-version
Attach minimum Linux versions to provided libcs + incorporate ABI in `VersionRange.default()`
2024-12-23 19:42:53 +01:00
Alex Rønne Petersen d41052b6dc Merge pull request #22293 from alexrp/macos-header-tool
Some cleanups and fixes for `fetch_them_macos_headers.zig`
2024-12-23 04:44:19 +01:00
Alex Rønne Petersen 1cb798256f fetch_them_macos_headers: Simplify, remove unused code. 2024-12-23 00:09:52 +01:00
Alex Rønne Petersen 1f5315e774 fetch_them_macos_headers: Fix some file names. 2024-12-22 23:39:45 +01:00
Alex Rønne Petersen 9dea0459c1 fetch_them_macos_headers: Remove a TODO we're probably never addressing. 2024-12-22 23:39:45 +01:00
Alex Rønne Petersen 130310972d compiler: Print more information when failing to provide libc. 2024-12-22 22:06:00 +01:00
Meili C 0f17cbfc6a fix: allow std.linux.getgroups to accept null
looking at `man getgroups` and `info getgroups` this is given as an
example:

  ```c
       // Here's how to use ‘getgroups’ to read all the supplementary group
       // IDs:

            gid_t *
            read_all_groups (void)
            {
              int ngroups = getgroups (0, NULL);
              gid_t *groups
                = (gid_t *) xmalloc (ngroups * sizeof (gid_t));
              int val = getgroups (ngroups, groups);
              if (val < 0)
                {
                  free (groups);
                  return NULL;
                }
              return groups;
            }
  ```

getgroups(0, NULL) is used to get the count of groups so that the
correct count can be used to allocate a list of gid_t. This small changes makes this
possible.

equivalent example in Zig after the change:

  ```zig
    // get the group count
    const ngroups: usize = std.os.linux.getgroups(0, null);
    if (ngroups <= 0) {
        return error.GetGroupsError;
    }

    std.debug.print("number of groups: {d}\n", .{ngroups});
    const groups_gids: []u32 = try alloc.alloc(u32, ngroups);

    // populate an array of gid_t
    _ = std.os.linux.getgroups(ngroups, @ptrCast(groups_gids));
  ```
2024-12-22 21:48:47 +01:00
Jonathan Marler 77c63ac360 doc: mention zig can't use URLs if their content changes
There's been some proliferation of dependency URLs that reference
mutable data such as links to git branches that can change.  This has
resulted in broken projects, i.e.

* https://github.com/RohanVashisht1234/raylib_rain_train/blob/9eef9de94c511f2eb4fe5db1d6abd574ee245c9b/build.zig.zon
* https://github.com/rcmagic/ZigFightingGame/commit/4b64353e9c69de0fa2eb87fa9c3a3da76a8a3e7b

There's also disagreement about whether it's fine for URL's to point to
git branches, i.e.

https://github.com/Not-Nik/raylib-zig/pull/130

This updates the docs to mention that zig won't be able to use URLs if
their content changes.
2024-12-21 18:23:01 -05:00
Jacob Young 5776d8f270 lldb: add pretty printer for cau and nav indices 2024-12-20 22:51:20 -05:00
Jacob Young 5c76e08f49 lldb: add pretty printer for intern pool indices 2024-12-20 22:51:20 -05:00
Jacob Young 06206479a9 Dwarf: remove redundant debug info 2024-12-19 17:10:03 -05:00
wooster0 0ff0bdb4a7 Module: keep frame pointer in ReleaseSmall on x86
On x86 and x86_64 keeping the frame pointer usually reduces binary size, even for simple programs:

```
~$ cat x.zig
pub fn main() void {
    @import("std").debug.print("hello", .{});
}
~$ zig build-exe x.zig -target x86_64-linux -OReleaseSmall -fno-omit-frame-pointer && wc -c x
5168 x
~$ zig build-exe x.zig -target x86_64-linux -OReleaseSmall -fomit-frame-pointer && wc -c x
5216 x
```
```
~$ cat x.zig
pub fn main() void {
    @import("std").debug.print("hello", .{});
}
~$ zig build-exe x.zig -target x86-linux -OReleaseSmall -fno-omit-frame-pointer && wc -c x
3400 x
~$ zig build-exe x.zig -target x86-linux -OReleaseSmall -fomit-frame-pointer && wc -c x
3556 x
```

A bigger benchmark is the Zig compiler:

With no changes to anything on master branch:
```
$ zig build -Dno-lib -Dno-langref --zig-lib-dir lib -Doptimize=ReleaseSmall
$ wc -c zig-out/bin/zig
10698792 zig-out/bin/zig
```
Adding `.omit_frame_pointer = false` in `addCompilerStep` in `build.zig`:
```
$ zig build -Dno-lib -Dno-langref --zig-lib-dir lib -Doptimize=ReleaseSmall
$ wc -c zig-out/bin/zig
10155744 zig-out/bin/zig
```
2024-12-19 20:12:34 +01:00
Matthew Lugg e2e3633612 Merge pull request #22264 from mlugg/no-generic-callconv
compiler: disallow `callconv` etc from depending on function parameters

Also, disallow `align`/`linksection`/`addrspace` annotations on container-level declarations with comptime-only types.
2024-12-19 07:57:16 +00:00
mlugg 58b8b1ac2a Zcu: allow node_offset_var_decl_* source location for function declarations 2024-12-19 03:21:56 +00:00
mlugg eac87ea8d6 compiler: disallow align etc annotations on comptime-only globals
This includes function aliases, but not function declarations.

Also, re-introduce a target check for function alignment which was
inadvertently removed in the prior commit.
2024-12-19 03:21:56 +00:00
mlugg 7408679234 compiler: disallow callconv etc from depending on function parameters
Resolves: #22261
2024-12-18 23:06:35 +00:00
mlugg 242bb44695 compiler: move RuntimeIndex to Sema
Just a small refactor.
2024-12-18 20:34:10 +00:00
Liam Swayne f857bf72e2 Add branchHint to std.math.pow
NaN is an unlikely case, and a branchHint `.unlikely` could be appropriate.
2024-12-18 05:30:08 -05:00
Andrew Kelley 4ae101ca85 Merge pull request #22260 from jacobly0/dwarf-cleanup
Dwarf: cleanup
2024-12-18 00:41:44 -05:00
Matthew Lugg 12d64c456b Merge pull request #20388 from BratishkaErik/std.Build/accept-root-module-2
std.Build: add new functions to create artifacts/Step.Compile from existing module
2024-12-18 03:34:43 +00:00