aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.zig
AgeCommit message (Collapse)Author
2024-10-19compiler: introduce new `CallingConvention`mlugg
This commit begins implementing accepted proposal #21209 by making `std.builtin.CallingConvention` a tagged union. The stage1 dance here is a little convoluted. This commit introduces the new type as `NewCallingConvention`, keeping the old `CallingConvention` around. The compiler uses `std.builtin.NewCallingConvention` exclusively, but when fetching the type from `std` when running the compiler (e.g. with `getBuiltinType`), the name `CallingConvention` is used. This allows a prior build of Zig to be used to build this commit. The next commit will update `zig1.wasm`, and then the compiler and standard library can be updated to completely replace `CallingConvention` with `NewCallingConvention`. The second half of #21209 is to remove `@setAlignStack`, which will be implemented in another commit after updating `zig1.wasm`.
2024-10-17Merge pull request #21610 from alexrp/riscv-abisAndrew Kelley
Fix some RISC-V ABI issues and add ILP32/LP64 (soft float) to module tests
2024-10-16llvm: Disable f16 lowering for loongarch.Alex Rønne Petersen
This should be reverted with LLVM 20.
2024-10-16llvm: Fix natural int width specifications for loongarch in DataLayoutBuilder.Alex Rønne Petersen
2024-10-15llvm: Enable native f16 lowering for riscv32.Alex Rønne Petersen
2024-10-15llvm: Fix compiler crash when lowering f16 for riscv32 ilp32.Alex Rønne Petersen
2024-10-12implement packed struct equality (#21679)David Rubin
2024-10-06Merge pull request #21605 from alexrp/ohos-stuffAlex Rønne Petersen
`std.Target`: Introduce `Abi.ohoseabi` to distinguish the soft float case.
2024-10-06Merge pull request #21587 from alexrp/hexagon-portingAlex Rønne Petersen
Some initial `hexagon-linux` port work
2024-10-05std.Target: Introduce Abi.ohoseabi to distinguish the soft float case.Alex Rønne Petersen
For the same reason as #21504.
2024-10-05Merge pull request #21574 from alexrp/llvm-sub-archAlex Rønne Petersen
`llvm`: Implement sub-architecture translation in `targetTriple()`.
2024-10-04remove `@fence` (#21585)David Rubin
closes #11650
2024-10-04Adds new cpu architectures propeller1 and propeller2. (#21563)Felix Queißner
* Adds new cpu architectures propeller1 and propeller2. These cpu architectures allow targeting the Parallax Propeller 1 and Propeller 2, which are both very special microcontrollers with 512 registers and 8 cpu cores. Resolves #21559 * Adds std.elf.EM.PROPELLER and std.elf.EM.PROPELLER2 * Fixes missing switch prongs in src/codegen/llvm.zig * Fixes order in std.Target.Arch --------- Co-authored-by: Felix "xq" Queißner <git@random-projects.net>
2024-10-04Merge pull request #21572 from alexrp/tests-llvm-targetsAlex Rønne Petersen
`test`: Rewrite the target triple list for `llvm_targets`.
2024-10-03llvm: Disable f16 lowering for hexagon.Alex Rønne Petersen
In theory, this should work for v68+. In practice, it runs into an LLVM assertion when using a `freeze` instruction on `f16` values, similar to the issue we had for LoongArch.
2024-10-03llvm: Fix C ABI integer promotion for s390x.Alex Rønne Petersen
2024-10-03std.Target: Remove Os.Tag.shadermodel.Alex Rønne Petersen
This was a leftover from the Cpu.Arch.dxil removal.
2024-10-03llvm: Implement sub-architecture translation in targetTriple().Alex Rønne Petersen
2024-10-03Merge pull request #21504 from alexrp/android-softfpAlex Rønne Petersen
`std.Target`: Introduce `Abi.androideabi` to distinguish the soft float case.
2024-09-26fixes and make sema report errors when std.builtin wrongAndrew Kelley
instead of panicking
2024-09-26reimplement integer overflow safety panic function callsAndrew Kelley
in the llvm backend.
2024-09-26fixes for this branchAndrew Kelley
I had to bring back some of the old API so that I could compile the new compiler with an old compiler.
2024-09-24std.Target: Introduce Abi.androideabi to distinguish the soft float case.Alex Rønne Petersen
Abi.android on its own is not enough to know whether soft float or hard float should be used. In the C world, androideabi is typically used for the soft float case, so let's go with that. Note that Android doesn't have a hard float ABI, so no androideabihf. Closes #21488.
2024-09-23std.Target: Remove Cpu.Arch.dxil and ObjectFormat.dxcontainer.Alex Rønne Petersen
See: https://devblogs.microsoft.com/directx/directx-adopting-spir-v Since we never hooked up the (experimental) DirectX LLVM backend, we've never actually supported targeting DXIL in Zig. With Microsoft moving away from DXIL, that seems very unlikely to change.
2024-09-19Partially revert "LLVM: work around `@floatFromInt` bug"Alex Rønne Petersen
This partially reverts commit ab4d6bf468bd8cba4ffd2d700d83e9707f5307b1.
2024-09-19std.Target: Add bridgeos tag to Os.Alex Rønne Petersen
2024-09-19llvm: Stop emitting shl/xor ops for constant packed structs.Alex Rønne Petersen
This is no longer supported in LLVM 19; fall back to the generic code path.
2024-09-12Replace deprecated default initializations with decl literalsLinus Groh
2024-09-11Merge pull request #21269 from alexrp/soft-floatAndrew Kelley
Fix soft float support, split musl triples by float ABI, and enable CI
2024-09-10llvm: Don't use the optimized jump table construction logic for wasm.Alex Rønne Petersen
2024-09-10llvm: Limit f16/f128 lowering on arm to fp_armv8 and soft float.Alex Rønne Petersen
2024-09-10llvm: Set use-soft-float and noimplicitfloat on functions for soft float.Alex Rønne Petersen
Closes #10961.
2024-09-07mips: fix C ABI compatibilityMaciej 'vesim' Kuliński
2024-09-06Merge pull request #21261 from alexrp/riscv32Andrew Kelley
More `riscv32-linux` port work
2024-09-06llvm: Set float ABI based on std.Target.floatAbi().Alex Rønne Petersen
2024-09-06llvm: Don't lower to f16 for riscv32.Alex Rønne Petersen
This causes so many test failures that I doubt this has been tested at all.
2024-09-04Merge pull request #21257 from mlugg/computed-goto-3Andrew Kelley
compiler: implement labeled switch/continue
2024-09-01compiler: implement labeled switch/continuemlugg
2024-09-01Air: add explicit `repeat` instruction to repeat loopsmlugg
This commit introduces a new AIR instruction, `repeat`, which causes control flow to move back to the start of a given AIR loop. `loop` instructions will no longer automatically perform this operation after control flow reaches the end of the body. The motivation for making this change now was really just consistency with the upcoming implementation of #8220: it wouldn't make sense to have this feature work significantly differently. However, there were already some TODOs kicking around which wanted this feature. It's useful for two key reasons: * It allows loops over AIR instruction bodies to loop precisely until they reach a `noreturn` instruction. This allows for tail calling a few things, and avoiding a range check on each iteration of a hot path, plus gives a nice assertion that validates AIR structure a little. This is a very minor benefit, which this commit does apply to the LLVM and C backends. * It should allow for more compact ZIR and AIR to be emitted by having AstGen emit `repeat` instructions more often rather than having `continue` statements `break` to a `block` which is *followed* by a `repeat`. This is done in status quo because `repeat` instructions only ever cause the direct parent block to repeat. Now that AIR is more flexible, this flexibility can be pretty trivially extended to ZIR, and we can then emit better ZIR. This commit does not implement this. Support for this feature is currently regressed on all self-hosted native backends, including x86_64. This support will be added where necessary before this branch is merged.
2024-09-01Air: direct representation of ranges in switch casesmlugg
This commit modifies the representation of the AIR `switch_br` instruction to represent ranges in cases. Previously, Sema emitted different AIR in the case of a range, where the `else` branch of the `switch_br` contained a simple `cond_br` for each such case which did a simple range check (`x > a and x < b`). Not only does this add complexity to Sema, which we would like to minimize, but it also gets in the way of the implementation of #8220. That proposal turns certain `switch` statements into a looping construct, and for optimization purposes, we want to lower this to AIR fairly directly (i.e. without involving a `loop` instruction). That means we would ideally like a single instruction to represent the entire `switch` statement, so that we can dispatch back to it with a different operand as in #8220. This is not really possible to do correctly under the status quo system. This commit implements lowering of this new `switch_br` usage in the LLVM and C backends. The C backend just turns any case containing ranges entirely into conditionals, as before. The LLVM backend is a little smarter, and puts scalar items into the `switch` instruction, only using conditionals for the range cases (which direct to the same bb). All remaining self-hosted backends are temporarily regressed in the presence of switch range cases. This functionality will be restored for at least the x86_64 backend before merge.
2024-09-01Rename usesLargePIC to picLevel and return the PIC levelantlilja
2024-09-01LLVM: Set module flag behaviors to match what LLVM and clang doesantlilja
2024-09-01LLVM: Emit module flags through Builder instead of LLVM APIantlilja
2024-08-30Merge pull request #21224 from alexrp/mips-gnu-fixesAndrew Kelley
Fix MIPS PIC level and work around an LLVM bug for `mips(el)-linux-gnueabi(hf)`
2024-08-30llvm: Pass EmitOptions to libzigcpp by pointer.Alex Rønne Petersen
Passing it by value means that bringup on new architectures is harder for no real benefit. Passing it by pointer allows to get the compiler running without needing to figure out the C calling convention details first. This manifested in practice on LoongArch, for example.
2024-08-28LLVM: use `@llvm.used` instead of `@llvm.compiler.used`Andrew Kelley
because it marks the linker section, preventing garbage collection. Also, name the members because that is required by this intrinsic. Also, enable the StackDepth option in the sancov pass as a workaround for https://github.com/llvm/llvm-project/pull/106464, otherwise, LLVM enables TracePCGuard even though we explicitly disable it.
2024-08-28LLVM: put sancov globals into llvm.compiler.usedAndrew Kelley
This matches what LLVM's sancov pass does and is required so that optimization passes do not delete the instrumentation. However, this is currently triggering an error: "members of llvm.compiler.used must be named" so the next commit will add names to those globals.
2024-08-28LLVM: disable inline 8-bit counters when using trace pc guardAndrew Kelley
2024-08-28LLVM: enable sancov pass partiallyAndrew Kelley
It's useful to have TraceCmp based on the results of LLVM optimizations, while the code coverage bits were emitted by Zig manually, allowing more careful correlation to points of interest in the source code. This re-enables the sancov pass in `-ffuzz` mode, but only TraceCmp. Notably, IndirectCalls is off, which needs to be implemented manually in the LLVM backend, and StackDepth remains off, because it is not used by libfuzzer or AFL either. If stack depth is re-introduced, it can be done with better performance characteristics by being function call graph aware, and only lowered in call graph cycles, where its heuristic properties come in useful. Fixes the fuzzing regression.
2024-08-28implement code coverage instrumentation manuallyAndrew Kelley
instead of relying on the LLVM sancov pass. The LLVM pass is still executed if trace_pc_guard is requested, disabled otherwise. The LLVM backend emits the instrumentation directly. It uses `__sancov_pcs1` symbol name instead of `__sancov_pcs` because each element is 1 usize instead of 2. AIR: add CoveragePoint to branch hints which indicates whether those branches are interesting for code coverage purposes. Update libfuzzer to use the new instrumentation. It's simplified since we no longer need the constructor and the pcs are now in a continguous list. This is a regression in the fuzzing functionality because the instrumentation for comparisons is no longer emitted, resulting in worse fuzzer inputs generated. A future commit will add that instrumentation back.