Commit Graph

1846 Commits

Author SHA1 Message Date
Jakub Konka
96441bd829 macho: update codegen and linker to distributed jump table approach 2024-08-17 08:14:38 +02:00
Jacob Young
0ecf0cf867 x86_64: fix debug arg spills clobbering other args 2024-08-16 15:22:56 -04:00
Jacob Young
ad634537ce x86_64: move end of prologue to after function arguments are spilled
This prevents the first step in to a function from displaying bogus
argument values.
2024-08-16 15:22:56 -04:00
Jacob Young
ef11bc9899 Dwarf: rework self-hosted debug info from scratch
This is in preparation for incremental and actually being able to debug
executables built by the x86_64 backend.
2024-08-16 15:22:55 -04:00
Jakub Konka
90989be0e3 Merge pull request #21065 from ziglang/elf-zig-got
elf: replace .got.zig with a zig jump table
2024-08-16 21:19:44 +02:00
Jakub Konka
73f385eec5 Update src/arch/x86_64/CodeGen.zig
Co-authored-by: Jacob Young <jacobly0@users.noreply.github.com>
2024-08-16 11:49:23 +02:00
Jacob Young
624016e8f3 riscv64: fix incorrect branch target 2024-08-16 05:44:55 -04:00
Jakub Konka
4d5bf0f09a x86_64: deref GOT pointer when requesting var value 2024-08-15 14:23:36 +02:00
Jakub Konka
79418fa0ab riscv: remove redundant by-symbol-name check; just check for PIC and extern ptr 2024-08-15 10:52:06 +02:00
Jakub Konka
f0df0acd70 x86_64: fix handling on externs in lower/emit 2024-08-15 10:33:30 +02:00
Jakub Konka
0fd0b11bc4 riscv: do not emit GOT relocations for special linker symbols 2024-08-15 10:21:20 +02:00
Jakub Konka
8a0cb7002e elf: introduce Symbol.flags.is_extern_ptr for refs potentially needing GOT 2024-08-15 10:05:41 +02:00
David Rubin
2e8351cc9e elf: fix up riscv for .got.zig rewrite 2024-08-15 08:53:41 +02:00
Jakub Konka
1bd54a55fa fix compile errors in other codegen backends 2024-08-13 21:52:40 +02:00
Jakub Konka
afaec5c3e4 x86_64: fix generating lazy symbol refs 2024-08-13 13:30:24 +02:00
Jakub Konka
57f7209508 elf: replace use of linker_extern_fn with more generic Immediate.reloc 2024-08-13 13:30:24 +02:00
Jakub Konka
d25c93a868 x86_64: emit call rel32 for near calls with linker reloc 2024-08-13 13:30:24 +02:00
Jakub Konka
ffcf0478fe x86_64: remove handling of .call since it's unused for now 2024-08-13 13:30:24 +02:00
Jakub Konka
e3f6ebaea9 x86_64+elf: fix jump table indirection for functions 2024-08-13 13:30:24 +02:00
Jakub Konka
16abf51cee x86_64: handle lea_symbol returned by genNavRef 2024-08-13 13:30:24 +02:00
Jakub Konka
5fd53dc36f x86_64: start converting away from .got.zig knowledge 2024-08-13 13:30:24 +02:00
Jakub Konka
d328140858 elf: nuke ZigGotSection from existence 2024-08-13 13:30:24 +02:00
Linus Groh
4ef956ef14 std.Target: Rename c_type_* functions to camel case
From https://ziglang.org/documentation/master/#Names:

> If `x` is otherwise callable, then `x` should be `camelCase`.
2024-08-12 00:36:51 +01:00
mlugg
548a087faf compiler: split Decl into Nav and Cau
The type `Zcu.Decl` in the compiler is problematic: over time it has
gained many responsibilities. Every source declaration, container type,
generic instantiation, and `@extern` has a `Decl`. The functions of
these `Decl`s are in some cases entirely disjoint.

After careful analysis, I determined that the two main responsibilities
of `Decl` are as follows:
* A `Decl` acts as the "subject" of semantic analysis at comptime. A
  single unit of analysis is either a runtime function body, or a
  `Decl`. It registers incremental dependencies, tracks analysis errors,
  etc.
* A `Decl` acts as a "global variable": a pointer to it is consistent,
  and it may be lowered to a specific symbol by the codegen backend.

This commit eliminates `Decl` and introduces new types to model these
responsibilities: `Cau` (Comptime Analysis Unit) and `Nav` (Named
Addressable Value).

Every source declaration, and every container type requiring resolution
(so *not* including `opaque`), has a `Cau`. For a source declaration,
this `Cau` performs the resolution of its value. (When #131 is
implemented, it is unsolved whether type and value resolution will share
a `Cau` or have two distinct `Cau`s.) For a type, this `Cau` is the
context in which type resolution occurs.

Every non-`comptime` source declaration, every generic instantiation,
and every distinct `extern` has a `Nav`. These are sent to codegen/link:
the backends by definition do not care about `Cau`s.

This commit has some minor technically-breaking changes surrounding
`usingnamespace`. I don't think they'll impact anyone, since the changes
are fixes around semantics which were previously inconsistent (the
behavior changed depending on hashmap iteration order!).

Aside from that, this changeset has no significant user-facing changes.
Instead, it is an internal refactor which makes it easier to correctly
model the responsibilities of different objects, particularly regarding
incremental compilation. The performance impact should be negligible,
but I will take measurements before merging this work into `master`.

Co-authored-by: Jacob Young <jacobly0@users.noreply.github.com>
Co-authored-by: Jakub Konka <kubkon@jakubkonka.com>
2024-08-11 07:29:41 +01:00
Jakub Konka
02f38d7749 codegen: fix Elf symbol refs 2024-08-07 10:21:03 +02:00
Jakub Konka
41e9b8b6c8 elf: fix compile errors 2024-08-07 10:21:02 +02:00
Jakub Konka
8ea323822b Merge pull request #20884 from Rexicon226/riscv 2024-08-01 07:17:40 +02:00
David Rubin
c08effc20a riscv: implement non-pow2 indirect loads 2024-07-31 16:57:30 -07:00
David Rubin
9c7aade488 riscv: fix .got symbol loading 2024-07-31 13:39:57 -07:00
David Rubin
0008934745 riscv: implement @divExact 2024-07-31 11:44:16 -07:00
David Rubin
b20007daf7 riscv: correct airAsm to generate correct jalr call 2024-07-27 08:14:09 -07:00
David Rubin
846bd40361 riscv: implement @cmpxchg* and remove fixes 2024-07-26 12:43:47 -07:00
David Rubin
9752bbfeb3 riscv: implement basic tlv loads and stores 2024-07-26 08:49:34 -07:00
David Rubin
8da212c11b riscv: update tests and fix reuse bug 2024-07-26 04:19:58 -07:00
David Rubin
046001a34a riscv implement @popCount 2024-07-26 04:19:57 -07:00
David Rubin
7ff5709e1b riscv: implement lr/sr loop logic for non-native atomics 2024-07-26 04:19:57 -07:00
David Rubin
a1f6a8ef90 riscv: airAsm rewrite
with this rewrite we can call functions inside of
inline assembly, enabling us to use the default start.zig logic

all that's left is to implement lr/sc loops for atomically manipulating
1 and 2 byte values, after which we can use the segfault handler logic.
2024-07-26 04:19:55 -07:00
David Rubin
c00a5ff792 riscv: implement @floatFromInt 2024-07-26 04:19:16 -07:00
David Rubin
1a7d89a84d riscv: clean up and unify encoding logic 2024-07-26 04:19:13 -07:00
David Rubin
574028ed5e riscv: boilerplate for creating lazy functions 2024-07-26 04:05:44 -07:00
David Rubin
64c6473443 riscv: implement add_sat and ptr_slice_len_ptr
this is enough to use the basic functions of an ArrayList!
2024-07-26 04:05:43 -07:00
David Rubin
6ac1b2d82a riscv: add 32-bit support to integer @abs 2024-07-26 04:05:42 -07:00
David Rubin
1820f44104 riscv: implement sub-byte addition 2024-07-26 04:05:42 -07:00
David Rubin
81ca3a1d59 riscv: fix logic bug in ptr_elem_ptr
I was doing duplicate work with `elemOffset` multiplying by the abi size and then the `ptr_add` `genBinOp` also multiplying.

This led to having writes happening in the wrong place.
2024-07-26 04:05:41 -07:00
David Rubin
cde6956b21 riscv: remove redundant assert in genBinOp 2024-07-26 04:05:41 -07:00
David Rubin
d3f75522d7 lower: fix logic bug in cmp_gt 2024-07-26 04:05:40 -07:00
David Rubin
c78ebeb44c riscv: implement ptr_slice_ptr_ptr
just one step closer to allocation
2024-07-26 04:05:40 -07:00
David Rubin
93e9c7a963 riscv: implement @clz 2024-07-26 04:05:39 -07:00
David Rubin
8d30fc45c4 riscv: implement more operators
we can run `std.debug.print` now, with both run-time strings and integers!
2024-07-26 04:05:39 -07:00
David Rubin
9766b68c47 riscv: un-cache the avl and vtype when returning from a function call
the csrs `avl` and `vtype` are considered caller-saved so it could have changed while inside of the function.
the easiest way to handle this is to just set the cached `vtype` and `avl` to null, so that the next time something
needs to set it, it'll emit an instruction instead of relying on a potentially invalid setting.
2024-07-26 04:05:38 -07:00