aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
AgeCommit message (Collapse)Author
2021-05-12Merge remote-tracking branch 'origin/master' into stage2-whole-file-astgenAndrew Kelley
Conflicts: * lib/std/os/linux.zig * lib/std/os/windows/bits.zig * src/Module.zig * src/Sema.zig * test/stage2/test.zig Mainly I wanted Jakub's new macOS code for respecting stack size, since we now depend on it for debug builds able to pass one of the test cases for recursive comptime function calls with `@setEvalBranchQuota`. The conflicts were all trivial.
2021-05-09stage2 ARM: Overhaul of genArmBinOpjoachimschmidt557
2021-05-09Merge pull request #8474 from gracefuu/grace/encode-instructionAndrew Kelley
stage2 x86_64: encoding helpers, fix bugs
2021-05-01stage2: dbg_stmt ZIR instructions have line/colAndrew Kelley
instead of node indexes. * AstGen: dbg_stmt instructions now have line and column indexes, relative to the parent declaration. This allows codegen to emit debug info without having the source bytes, tokens, or AST nodes loaded in memory. * ZIR: each decl has the absolute line number. This allows computing line numbers from offsets without consulting source code bytes. Memory management: creating a function definition does not prematurely set the Decl arena. Instead the function is allocated with the general purpose allocator. Codegen no longer looks at source code bytes for any reason. They can remain unloaded from disk.
2021-04-28stage2: implement semantic analysis for functions and global varsAndrew Kelley
* AstGen: add missing `break_inline` for comptime blocks. * Module: call getTree() in byteOffset(). This generates the AST when using cached ZIR and compile errors need to be reported. * Scope.File: distinguish between successful ZIR generation and AIR generation (when Decls in scope have been scanned). - `semaFile` correctly avoids doing work twice. * Implement first pass at `lookupInNamespace`. It has various TODOs left, such as `usingnamespace`, and setting up Decl dependencies.
2021-04-28stage2: semaDecl properly analyzes the decl blockAndrew Kelley
Also flattened out Decl TypedValue fields into ty, val, has_tv and add relevant fields to Decl for alignment and link section.
2021-04-28Merge remote-tracking branch 'origin/master' into stage2-whole-file-astgenAndrew Kelley
In particular I wanted to take advantage of the new hex float parsing code.
2021-04-25stage2 register manager: Use an array instead of a hashmap for trackingjoachimschmidt557
allocated registers
2021-04-24Merge remote-tracking branch 'origin/master' into stage2-whole-file-astgenAndrew Kelley
In particular I wanted the change that makes `suspend;` illegal in the parser.
2021-04-20stage2: fix compile error in codegenjacob gw
2021-04-19AstGen: implement inline asm outputAndrew Kelley
2021-04-17stage2 codegen: Fix silent bug in reuseOperandjoachimschmidt557
2021-04-16stage2 x86_64: fix incorrect comment in genX8664BinMathgracefu
Co-authored-by: joachimschmidt557 <joachim.schmidt557@outlook.com>
2021-04-16stage2 x86_64: force 64 bit mode when loading address of GOTgracefu
Co-authored-by: joachimschmidt557 <joachim.schmidt557@outlook.com>
2021-04-16stage2 x86_64: fix codegen ensureCapacity bug for function callsgracefu
Co-authored-by: joachimschmidt557 <joachim.schmidt557@outlook.com>
2021-04-16stage2 x86_64: bugfix abi_size == 64 should be abi_size == 8gracefu
2021-04-16stage2 x86_64: try to fix RIP-relative offset to GOT for machogracefu
2021-04-16stage2 x86_64: simplify inst encoder to a set of dumb helper fnsgracefu
2021-04-16stage2 x86_64: implement integer mulgracefu
This was also an experiment to see if it were easier to implement a new feature when using the instruction encoder. Verdict: It's not that much easier, but I think it's certainly much more readable, because the description of the Instruction annotates what each field means. Right now, precise knowledge of x86_64 instructions is still required because things like when to set the 64-bit flag, how to read x86_64 instruction references, etc. are still not automatically done for you. In the future, this interface might make it sligtly easier to write an assembler for x86_64, by abstracting the bit-fiddling aspects of instruction encoding.
2021-04-16stage2 x86_64: use abi size to determine 64-bit operationgracefu
From my very cursory reading, it seems that the register manager doesn't distinguish between registers that are physically the same but have different sizes. In that case, this means that during codegen, we can't rely on `reg.size()` when determining the width of the operations we have to perform. Instead, we must use some form of `ty.abiSize(self.target.*)` to determine the size of the type we're operating with. If this size is 64 bits, then we should enable 64-bit operation. This fixed a bug in the codegen for spilling instructions, which was overwriting the previous stack entry with zeroes. See the modified test case in this commit.
2021-04-16stage2 x86_64: refactor codegen to use inst encodergracefu
There are parts of it that I didn't modify because the byte representation was important (e.g. we need to know what the exact byte position where we store the address into the offset table is)
2021-04-15stage2: entry point via std lib and proper updated file detectionAndrew Kelley
Instead of Module setting up the root_scope with the root source file, instead, Module relies on the package table graph being set up properly, and inside `update()`, it does the equivalent of `_ = @import("std");`. This, in term, imports start.zig, which has the logic to call main (or not). `Module` no longer has `root_scope` - the root source file is no longer special, it's just in the package table mapped to "root". I also went ahead and implemented proper detection of updated files. mtime, inode, size, and source hash are kept in `Scope.File`. During an update, iterate over `import_table` and stat each file to find out which ones are updated. The source hash is redundant with the source hash used by the struct decl that corresponds to the file, so it should be removed in a future commit before merging the branch. * AstGen: add "previously declared here" notes for variables shadowing decls. * Parse imports as structs. Module now calls `AstGen.structDeclInner`, which is called by `AstGen.containerDecl`. - `importFile` is a bit kludgy with how it handles the top level Decl that kinda gets merged into the struct decl at the end of the function. Be on the look out for bugs related to that as well as possibly cleaner ways to implement this. * Module: factor out lookupDeclName into lookupIdentifier and lookupNa * Rename `Scope.Container` to `Scope.Namespace`. * Delete some dead code. This branch won't work until `usingnamespace` is implemented because it relies on `@import("builtin").OutputMode` and `OutputMode` comes from a `usingnamespace`.
2021-04-11stage2 ARM: Add fibonacci testjoachimschmidt557
2021-04-11stage2 codegen: Set MCValue of register arguments to their stack copyjoachimschmidt557
2021-04-09Merge pull request #8470 from ziglang/stage2-startAndrew Kelley
stage2: blaze the trail for std lib integration
2021-04-08stage2: simplify Decl src_node fieldAndrew Kelley
Also fix "previous definition here" error notes to be correct.
2021-04-08Merge pull request #8464 from gracefuu/grace/wasm-opsAndrew Kelley
stage2 wasm: Add division and bitwise/boolean ops &, |, ^, and, or
2021-04-08stage2: Add .div to ir.ziggracefu
2021-04-07stage2 regalloc: Add unit test for getRegjoachimschmidt557
2021-04-06stage2 regalloc: Add getReg and getRegWithoutTrackingjoachimschmidt557
2021-04-02stage2 AArch64: Add ldrh and ldrb instructionsjoachimschmidt557
2021-04-02stage2 register_manager: Add unit tests for tryAllocReg and allocRegjoachimschmidt557
2021-04-02stage2 codegen: Extract register management code into separate filejoachimschmidt557
2021-04-01stage2: implement structs in the frontendAndrew Kelley
New ZIR instructions: * struct_decl_packed * struct_decl_extern New TZIR instruction: struct_field_ptr Introduce `Module.Struct`. It uses `Value` to store default values and abi alignments. Implemented Sema.analyzeStructFieldPtr and zirStructDecl. Some stuff I changed from `@panic("TODO")` to `log.warn("TODO")`. It's becoming more clear that we need the lazy value mechanism soon; Type is becoming unruly, and some of these functions have too much logic given that they don't have any context for memory management or error reporting.
2021-03-31Merge pull request #8266 from ziglang/zir-memory-layoutAndrew Kelley
rework ZIR memory layout; overhaul source locations
2021-03-31Sema: implement switch validation for rangesAndrew Kelley
2021-03-31stage2 codegen: Make sure function return value is in a calleejoachimschmidt557
preserved register
2021-03-31stage2 AArch64: implement strb and strhjoachimschmidt557
2021-03-28stage2: implement sema for @errorToInt and @intToErrorjacob gw
2021-03-18stage2: codegen: update asm IR to new namesAndrew Kelley
2021-03-18stage2: the code is compiling againAndrew Kelley
(with a lot of things commented out)
2021-03-18stage2: get Module and Sema compiling againAndrew Kelley
There are some `@panic("TODO")` in there but I'm trying to get the branch to the point where collaborators can jump in. Next is to repair the seam between LazySrcLoc and codegen's expected absolute file offsets.
2021-03-18Merge remote-tracking branch 'origin/master' into zir-memory-layoutAndrew Kelley
I need the enum arrays that were just merged into master.
2021-03-17stage2: Module and Sema are compiling againAndrew Kelley
Next up is reworking the seam between the LazySrcLoc emitted by Sema and the byte offsets currently expected by codegen. And then the big one: updating astgen.zig to use the new memory layout.
2021-03-17macho: offset table part of GOTJakub Konka
2021-03-17macho: apply some renames to bring closer to zldJakub Konka
2021-03-11Merge pull request #7934 from Vexu/stage2-cbeAndrew Kelley
Stage2 cbe: optionals and errors
2021-03-11stage2 tzir: Add wrapping integer arithmetic instructionsjoachimschmidt557
2021-03-08cbe: add error comparison supportjacob gw
2021-03-02stage2 ARM: Implement basic integer multiplicationjoachimschmidt557