Commit Graph

672 Commits

Author SHA1 Message Date
Andrew Kelley
db33ee45b7 rework generic function calls
Abridged summary:

 * Move `Module.Fn` into `InternPool`.
 * Delete a lot of confusing and problematic `Sema` logic related to
   generic function calls.

This commit removes `Module.Fn` and replaces it with two new
`InternPool.Tag` values:

 * `func_decl` - corresponding to a function declared in the source
   code. This one contains line/column numbers, zir_body_inst, etc.

 * `func_instance` - one for each monomorphization of a generic
   function. Contains a reference to the `func_decl` from whence the
   instantiation came, along with the `comptime` parameter values (or
   types in the case of `anytype`)

Since `InternPool` provides deduplication on these values, these fields
are now deleted from `Module`:

 * `monomorphed_func_keys`
 * `monomorphed_funcs`
 * `align_stack_fns`

Instead of these, Sema logic for generic function instantiation now
unconditionally evaluates the function prototype expression for every
generic callsite. This is technically required in order for type
coercions to work. The previous code had some dubious, probably wrong
hacks to make things work, such as `hashUncoerced`. I'm not 100% sure
how we were able to eliminate that function and still pass all the
behavior tests, but I'm pretty sure things were still broken without
doing type coercion for every generic function call argument.

After the function prototype is evaluated, it produces a deduplicated
`func_instance` `InternPool.Index` which can then be used for the
generic function call.

Some other nice things made by this simplification are the removal of
`comptime_args_fn_inst` and `preallocated_new_func` from `Sema`, and the
messy logic associated with them.

I have not yet been able to measure the perf of this against master
branch. On one hand, it reduces memory usage and pointer chasing of the
most heavily used `InternPool` Tag - function bodies - but on the other
hand, it does evaluate function prototype expressions more than before.
We will soon find out.
2023-07-18 19:02:05 -07:00
mlugg
f26dda2117 all: migrate code to new cast builtin syntax
Most of this migration was performed automatically with `zig fmt`. There
were a few exceptions which I had to manually fix:

* `@alignCast` and `@addrSpaceCast` cannot be automatically rewritten
* `@truncate`'s fixup is incorrect for vectors
* Test cases are not formatted, and their error locations change
2023-06-24 16:56:39 -07:00
Jakub Konka
22540e5402 macho: exclude code signature padding from uuid calculation 2023-06-19 22:50:08 +02:00
Jakub Konka
10aaf2983d macho: hash the entire file contents for UUID but calc in parallel 2023-06-19 11:26:56 +02:00
Motiejus Jakštys
d41111d7ef mem: rename align*Generic to mem.align*
Anecdote 1: The generic version is way more popular than the non-generic
one in Zig codebase:

     git grep -w alignForward | wc -l
    56
     git grep -w alignForwardGeneric | wc -l
    149

     git grep -w alignBackward | wc -l
    6
     git grep -w alignBackwardGeneric | wc -l
    15

Anecdote 2: In my project (turbonss) that does much arithmetic and
alignment I exclusively use the Generic functions.

Anecdote 3: we used only the Generic versions in the Macho Man's linker
workshop.
2023-06-17 12:49:13 -07:00
Jacob Young
d37ebfcf23 InternPool: avoid as many slices pointing to string_bytes as possible
These are frequently invalidated whenever a string is interned, so avoid
creating pointers to `string_bytes` wherever possible.  This is an
attempt to fix random CI failures.
2023-06-11 23:45:09 -07:00
Andrew Kelley
69b7b91092 compiler: eliminate Decl.value_arena and Sema.perm_arena
The main motivation for this commit is eliminating Decl.value_arena.
Everything else is dominoes.

Decl.name used to be stored in the GPA, now it is stored in InternPool.
It ended up being simpler to migrate other strings to be interned as
well, such as struct field names, union field names, and a few others.
This ended up requiring a big diff, sorry about that. But the changes
are pretty nice, we finally start to take advantage of InternPool's
existence.

global_error_set and error_name_list are simplified. Now it is a single
ArrayHashMap(NullTerminatedString, void) and the index is the error tag
value.

Module.tmp_hack_arena is re-introduced (it was removed in
eeff407941560ce8eb5b737b2436dfa93cfd3a0c) in order to deal with
comptime_args, optimized_order, and struct and union fields. After
structs and unions get moved into InternPool properly, tmp_hack_arena
can be deleted again.
2023-06-10 20:47:58 -07:00
Jacob Young
9cd0ca9f48 Module: rename functions to make ownership checks explicit
This makes the difference between `decl.getOwnedFunction` and
`decl.val.getFunction` more clear when reading the code.
2023-06-10 20:47:55 -07:00
Jacob Young
6e0de1d116 InternPool: port most of value tags 2023-06-10 20:47:54 -07:00
Andrew Kelley
88dbd62bcb stage2: move enum tag values into the InternPool
I'm seeing a new assertion trip: the call to `enumTagFieldIndex` in the
implementation of `@Type` is attempting to query the field index of an
union's enum tag, but the type of the enum tag value provided is not the
same as the union's tag type. Most likely this is a problem with type
coercion, since values are now typed.

Another problem is that I added some hacks in std.builtin because I
didn't see any convenient way to access them from Sema. That should
definitely be cleaned up before merging this branch.
2023-06-10 20:46:17 -07:00
Andrew Kelley
275652f620 stage2: move opaque types to InternPool 2023-06-10 20:42:30 -07:00
Andrew Kelley
9aec2758cc stage2: start the InternPool transition
Instead of doing everything at once which is a hopelessly large task,
this introduces a piecemeal transition that can be done in small
increments at a time.

This is a minimal changeset that keeps the compiler compiling. It only
uses the InternPool for a small set of types.

Behavior tests are not passing.

Air.Inst.Ref and Zir.Inst.Ref are separated into different enums but
compile-time verified to have the same fields in the same order.

The large set of changes is mainly to deal with the fact that most Type
and Value methods now require a Module to be passed in, so that the
InternPool object can be accessed.
2023-06-10 20:40:03 -07:00
Jacob Young
3b1ea390a3 x86_64: cleanup lazy symbols
In theory fixes updating lazy symbols during incremental compilation.
2023-05-01 19:22:53 -04:00
Jakub Konka
565f8979cc link: fix accessing source atom's symbol index in codegen
Since the owner can either be a `Decl` or a `LazySymbol` we need
to preserve this information at the codegen generate function level
so that we can then correctly work out the corresponding `Atom`
in the linker.
2023-05-01 19:22:52 -04:00
Jacob Young
47a34d038d x86_64: implement tagName 2023-05-01 19:22:52 -04:00
Jacob Young
372bc960b8 link: update decl-specific lazy symbols 2023-05-01 19:22:52 -04:00
Jacob Young
f37ca3fa73 link: cleanup lazy alignment
This gets the alignment from the code that creates a lazy symbol instead
of guessing it at every use.
2023-05-01 19:22:52 -04:00
Andrew Kelley
42973d73e6 compiler: use @memcpy instead of std.mem.copy 2023-04-28 13:24:43 -07:00
Andrew Kelley
6261c13731 update codebase to use @memset and @memcpy 2023-04-28 13:24:43 -07:00
Jakub Konka
bc69d5a00f macho: invalidate GOT/stub relocs after segment shift in memory 2023-04-26 19:08:38 -04:00
Jakub Konka
14dfbbc213 macho: rebase lazy pointers and apply corrected base offset 2023-04-21 22:44:28 +02:00
Jakub Konka
9a181f367d macho: mark relocs dirty by target when updating GOT/stubs 2023-04-21 22:44:28 +02:00
Jakub Konka
d6e66cff12 macho: fix dirtying of GOT entries 2023-04-21 22:44:28 +02:00
Jakub Konka
f9e9974c8f macho: skip GOT for TLVs; handle them separately when lowering 2023-04-21 22:44:27 +02:00
Jakub Konka
9530b95afe macho: refactor common codepath for collecting bindings from TableSection 2023-04-21 22:44:27 +02:00
Jakub Konka
cec4755310 macho: do not allocate atom for __stub_helper preamble 2023-04-21 22:44:27 +02:00
Jakub Konka
fa40267b04 macho: do not allocate atoms for stub entries 2023-04-21 22:44:27 +02:00
Jakub Konka
c55e821df6 macho: resolve relocs before writing to memory (fixes HCS) 2023-04-21 22:44:27 +02:00
Jakub Konka
91bb9302e5 macho: correctly dirty the GOT table after memory realloc 2023-04-21 22:44:27 +02:00
Jakub Konka
c6e916d7fe macho: fix runtime panics 2023-04-21 22:44:27 +02:00
Jakub Konka
711bc2cf39 macho: use generic TableSection for GOT mgmt 2023-04-21 22:44:27 +02:00
Jakub Konka
1f6165f621 macho: reference TLV thunks via GOT table 2023-04-13 11:47:51 +02:00
Jakub Konka
094ff60252 macho: emit TLV pointers and variables 2023-04-13 11:47:51 +02:00
Jakub Konka
09b6bd86de macho: cleanup dirtying and writing GOT atoms 2023-04-13 11:47:51 +02:00
Jakub Konka
57f9304275 macho: improve reporting of missing symbols
Fix a typo in TLV bootstrap symbol: __tlv_bootstrap.
2023-04-13 11:47:51 +02:00
Jakub Konka
ef645ab175 macho: refactor common logic between synthetic tables 2023-04-13 11:47:51 +02:00
Jakub Konka
38ecaf3ab6 macho: add machinery for emitting TLV refs 2023-04-13 11:47:51 +02:00
Jakub Konka
eba280ce20 macho: refactor relocation type in incremental linker 2023-04-13 11:47:51 +02:00
Jakub Konka
1795b8eb4e macho: emit TLS sections 2023-04-13 11:47:51 +02:00
Jakub Konka
5154ece8b9 macho: fix incorrect DWARF subprogram generation 2023-04-13 11:47:50 +02:00
Jakub Konka
a503724801 macho: reapply relocation dirtying logic from coff linker 2023-04-05 05:57:09 +02:00
Jakub Konka
f372995e1e macho: refactor adding GOT and stub entries
Don't special-case resolving of `dyld_stub_binder`.
2023-04-05 05:57:09 +02:00
Jacob Young
562170681a link: cleanup lazy symbols
We now only update one lazy symbol in flushModule.
Updating the rest from updateDecl is TBD.
2023-04-03 18:02:53 +02:00
Jakub Konka
72137824e5 macho: clean up code responsible for growing sections in file 2023-04-03 10:07:49 +02:00
Jakub Konka
ad8dfd3673 macho+coff: remove alignment from Atom as it is unused 2023-04-03 09:14:36 +02:00
Jacob Young
677427bc3a x86_64: implement error name 2023-04-02 04:49:53 -04:00
Jakub Konka
f2587de4e9 macho: look for entry in archives/dylibs too 2023-04-01 14:22:44 +02:00
Jakub Konka
17ec2cea64 macho: remove error_union return from resolveRelocations() 2023-03-28 21:52:44 +02:00
Jakub Konka
0dc210f950 link: pass expected lib name as hint in getGlobalSymbol() 2023-03-28 12:28:48 +02:00
Jakub Konka
8bffe87e9e macho: collect all exports into the export trie 2023-03-21 21:31:24 +01:00