aboutsummaryrefslogtreecommitdiff
path: root/src/arch
AgeCommit message (Collapse)Author
2023-09-21compiler: fix compilation for 32-bit targetsAndrew Kelley
2023-09-21compiler: move struct types into InternPool properAndrew Kelley
Structs were previously using `SegmentedList` to be given indexes, but were not actually backed by the InternPool arrays. After this, the only remaining uses of `SegmentedList` in the compiler are `Module.Decl` and `Module.Namespace`. Once those last two are migrated to become backed by InternPool arrays as well, we can introduce state serialization via writing these arrays to disk all at once. Unfortunately there are a lot of source code locations that touch the struct type API, so this commit is still work-in-progress. Once I get it compiling and passing the test suite, I can provide some interesting data points such as how it affected the InternPool memory size and performance comparison against master branch. I also couldn't resist migrating over a bunch of alignment API over to use the log2 Alignment type rather than a mismash of u32 and u64 byte units with 0 meaning something implicitly different and special at every location. Turns out you can do all the math you need directly on the log2 representation of alignments.
2023-09-19llvm: update riscv floating-point c abi for LLVM 17Jacob Young
2023-09-19x86 backend: don't read bogus safety flagAndrew Kelley
Safety is not a global flag that should be enabled or disabled for all stores - it's lowered by the frontend directly into AIR instruction semantics. The flag for this is communicated via the `store` vs `store_safe` AIR instructions, and whether to write 0xaa bytes or not should be decided in `airStore` and passed down via function parameters. This commit is a step backwards since it removes functionality but it aims our feet towards a better mountain to climb.
2023-09-13elf: correctly handle overflows on non-64bit hostsJakub Konka
2023-09-13elf: do not store Symbol's index in SymbolJakub Konka
2023-09-13x86_64: add simple disassembler interface to the encoderJakub Konka
2023-09-13Merge pull request #17113 from ziglang/elf-linkerJakub Konka
elf: upstream zld/ELF functionality, part 1
2023-09-12elf: resolve and write objects to fileJakub Konka
2023-09-12elf: add simplistic reloc scanning mechanismJakub Konka
2023-09-11elf: emit relocation to an extern functionJakub Konka
2023-09-10wasm: implement more math operations on 128 bit integersTechatrix
these operations are required to be able to print floats
2023-09-10wasm: implement common conversions between integers/floats with bitsize ↵Techatrix
larger than 64 bits
2023-09-10wasm: implement comparison on f80 and f128Techatrix
2023-09-10wasm: implement negation on f80 and f128Techatrix
2023-09-08elf: store GOT index in symbol extra array; use GotSection for GOTJakub Konka
2023-09-06wasm: fix finishAir when combining arg into single stack valueTechatrix
2023-09-06elf: make everything upside down - track by Symbol.Index rather than Atom.IndexJakub Konka
2023-09-04elf: simplify accessors to symbols, atoms, etcJakub Konka
2023-08-29macho: unify concept of SymbolWithLoc across driversJakub Konka
2023-08-23Replace `@panic` with `unreachable`, add testriverbl
Replace `@panic` with `unreachable` in stage2 wasm `@divFloor` implementation Add test for division and remainder operations for stage2 wasm
2023-08-23Implement `@mod` and fix bugs with `divFloor` for wasmriverbl
Implement lowering code for `@mod` on integers in the stage2 wasm backend Fix invalid wasm being produced for `@divFloor` on signed integers by the stage2 wasm backend
2023-08-22wasm backend: delete dead code in lowerConstantAndrew Kelley
2023-08-22compiler: move unions into InternPoolAndrew Kelley
There are a couple concepts here worth understanding: Key.UnionType - This type is available *before* resolving the union's fields. The enum tag type, number of fields, and field names, field types, and field alignments are not available with this. InternPool.UnionType - This one can be obtained from the above type with `InternPool.loadUnionType` which asserts that the union's enum tag type has been resolved. This one has all the information available. Additionally: * ZIR: Turn an unused bit into `any_aligned_fields` flag to help semantic analysis know whether a union has explicit alignment on any fields (usually not). * Sema: delete `resolveTypeRequiresComptime` which had the same type signature and near-duplicate logic to `typeRequiresComptime`. - Make opaque types not report comptime-only (this was inconsistent between the two implementations of this function). * Implement accepted proposal #12556 which is a breaking change.
2023-08-02Plan9: support linking to external 'special' symbolsJacob G-W
2023-07-31std: finish cleanup up asmJacob Young
This also required implementing the necessary syntax in the x86_64 backend.
2023-07-29codegen: fix access to byte-aligned nested packed struct elemsXavier Bouchoux
When acessing a packed struct member via a byte aligned ptr (from the optimisation in Sema.structFieldPtrByIndex()) the codegen must apply the parent ptr packed_offset in addition to the field offset itself. resolves https://github.com/ziglang/zig/issues/16609
2023-07-22wasm: correctly intcast signed integersLuuk de Gram
When a signed integer's bitsize is not 32 or 64, but the given bitsize and wanted bitsize are either both represented by Wasm's i32 or i64, we must either sign extend or wrap the integer.
2023-07-18rework generic function callsAndrew Kelley
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-06-27Air: store interned values in Air.Inst.Refmlugg
Previously, interned values were represented as AIR instructions using the `interned` tag. Now, the AIR ref directly encodes the InternPool index. The encoding works as follows: * If the ref matches one of the static values, it corresponds to the same InternPool index. * Otherwise, if the MSB is 0, the ref corresponds to an InternPool index. * Otherwise, if the MSB is 1, the ref corresponds to an AIR instruction index (after removing the MSB). Note that since most static InternPool indices are low values (the exceptions being `.none` and `.var_args_param_type`), the first rule is almost a nop.
2023-06-26std.sort.block: add safety check for lessThan return valueAli Chraghi
2023-06-25x86_64: cleanup `@as` invasionJacob Young
2023-06-25x86_64: fix test failureJacob Young
2023-06-25x86_64: fix incorrect encoding table entriesJacob Young
This was found by downstream tests.
2023-06-25x86_64: truncate packed field valueJacob Young
2023-06-25x86_64: add error for saturating arithmeticJacob Young
2023-06-25x86_64: add unimplemented error for float `@rem`/`@mod`Jacob Young
2023-06-25x86_64: turn `f80` operation crashes into errorsJacob Young
2023-06-25x86_64: fix crash emitting a packed undefined u128Jacob Young
2023-06-25x86_64: fix unimplemented type crashesJacob Young
2023-06-25x86_64: fix packed store crashJacob Young
2023-06-25compiler: start moving safety-checks into backendsAndrew Kelley
This actually used to be how it worked in stage1, and there was this issue to change it: #2649 So this commit is a reversal to that idea. One motivation for that issue was avoiding emitting the panic handler in compilations that do not have any calls to panic. This commit only resolves the panic handler in the event of a safety check function being emitted, so it does not have that flaw. The other reason given in that issue was for optimizations that elide safety checks. It's yet to be determined whether that was a good idea or not; this can get re-explored when we start adding optimization passes to AIR. This commit adds these AIR instructions, which are only emitted if `backendSupportsFeature(.safety_checked_arithmetic)` is true: * add_safe * sub_safe * mul_safe It removes these nonsensical AIR instructions: * addwrap_optimized * subwrap_optimized * mulwrap_optimized The safety-checked arithmetic functions push the burden of invoking the panic handler into the backend. This makes for a messier compiler implementation, but it reduces the amount of AIR instructions emitted by Sema, which reduces time spent in the secondary bottleneck of the compiler. It also generates more compact LLVM IR, reducing time spent in the primary bottleneck of the compiler. Finally, it eliminates 1 stack allocation per safety-check which was being used to store the resulting tuple. These allocations were going to be annoying when combined with suspension points.
2023-06-24all: migrate code to new cast builtin syntaxmlugg
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-20Type: delete legacy allocation functionsJacob Young
2023-06-19all: zig fmt and rename "@XToY" to "@YFromX"Eric Joldasov
Signed-off-by: Eric Joldasov <bratishkaerik@getgoogleoff.me>
2023-06-19compiler: rename "@XToY" to "@YFromX", zig fmt: rewrite themEric Joldasov
Signed-off-by: Eric Joldasov <bratishkaerik@getgoogleoff.me>
2023-06-17mem: rename align*Generic to mem.align*Motiejus Jakštys
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-16Merge pull request #16064 from Luukdegram/wasm-linkerAndrew Kelley
wasm/linker: symbol resolution improvements
2023-06-16Merge pull request #16003 from g-w1/plan9-lazy-symsAndrew Kelley
Plan9: lots of fixes
2023-06-16migration: std.math.{min, min3, max, max3} -> `@min` & `@max`r00ster91