aboutsummaryrefslogtreecommitdiff
path: root/src/Module.zig
AgeCommit message (Collapse)Author
2021-05-18stage2: fix deletion of Decls that get re-referencedAndrew Kelley
When scanDecls happens, we create stub Decl objects that have not been semantically analyzed. When they get referenced, they get semantically analyzed. Before this commit, when they got unreferenced, they were completely deleted, including deleted from the containing Namespace. However, if the update did not cause the containing Namespace to get deleted, for example, if `std.builtin.ExportOptions` is no longer referenced, but `std.builtin` is still referenced, and then `ExportOptions` gets referenced again, the Namespace would be incorrectly missing the Decl, so we get an incorrect "no such member" error. The solution is to, when dealing with a no longer referenced Decl objects during an update, clear them to the state they would be in on a fresh scanDecl, rather than completely deleting them.
2021-05-17Merge remote-tracking branch 'origin/master' into stage2-whole-file-astgenAndrew Kelley
Conflicts: * src/codegen/spirv.zig * src/link/SpirV.zig We're going to want to improve the stage2 test harness to print the source file name when a compile error occurs otherwise std lib contributors are going to see some confusing CI failures when they cause stage2 AstGen compile errors.
2021-05-17stage2: fix crash in switch compile errorAndrew Kelley
when the AST for the switch has never been loaded
2021-05-17Sema: use a hash map for ZIR->AIR mappingAndrew Kelley
Previously, ZIR was per-function so we could simply allocate a slice for all ZIR instructions. However now ZIR is whole-file, so we need a sparse mapping of ZIR to AIR instructions in order to not waste memory.
2021-05-17stage2: get rid of NameHashAndrew Kelley
Previously, stage2 used a global decl_table for all Decl objects, keyed by a 16-byte name hash that was hopefully unique. Now, there is a tree of Namespace objects that own their named Decl objects.
2021-05-17stage2: get rid of DeclRefAndrew Kelley
2021-05-17stage2: get rid of failed_root_src_fileAndrew Kelley
2021-05-17stage2: avoid calling freeDecl when hasCodeGenBits == falseAndrew Kelley
Previously the frontend incorrectly called freeDecl for structs, which never got allocateDecl called for them. There was simply a missing check for hasCodeGenBits().
2021-05-15stage2: omit Decl compile errors from failed AstGen filesAndrew Kelley
Just like when new parse errors occur during an update, when new AstGen errors occur during an update, we do not reveal compile errors for Decl objects which are inside of a newly failed File. Once the File passes AstGen successfully, it will be compared with the previously succeeded ZIR and the saved Decl compile errors will be handled properly.
2021-05-14stage2: compile log stores node offsetAndrew Kelley
Previously, compile log stored full SrcLoc info, which included absolute AST node index. This becomes invalid after an incremental compilation. To make it survive incremental compilation, store an offset from parent Decl instead.
2021-05-14stage2: improve Decl dependency managementAndrew Kelley
* Do not report export collision errors until the very end, because it is possible, during an update, for a new export to be added before an old one is semantically analyzed to be deleted. In such a case there should be no compile error. - Likewise we defer emitting exports until the end when we know for sure what will happen. * Sema: Fix not adding a Decl dependency on imported files. * Sema: Properly add Decl dependencies for all identifier and namespace lookups. * After semantic analysis for a Decl, if it is still marked as `in_progress`, change it to `dependency_failure` because if the Decl itself failed, it would have already been changed during the call to add the compile error.
2021-05-12stage2: fix source location of Decl compile errorsAndrew Kelley
In `Module.semaDecl`, the source location being used was double-relative to the `Decl`, causing a crash when trying to compute byte offset for the compile error. Change the source location to node_offset = 0 since the scope being used makes the source location relative to the Decl, which already has the source node index populated.
2021-05-12stage2: fix handling of "prev successful ZIR"Andrew Kelley
Before this change, the attempt to save the most recent successful ZIR code only worked in some cases; this reworks the code to be more robust, thereby fixing a crash when running the stage2 "enums" CBE test cases.
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-11stage2: more Decl lifetime fixesAndrew Kelley
* File stores `root_decl: Decl` instead of `namespace: *Namespace`. This maps more cleanly to the actual ownership, since the `File` does own the root decl, but it does not directly own the `Namespace`. * `semaFile` completes the creation of the `Decl` even when semantic analysis fails. The `analysis` field of the `Decl` will contain the results of semantic analysis. This prevents cleaning up of memory still referenced by other Decl objects. * `semaDecl` sets `Struct.zir_index` of the root struct decl, which fixes use of undefined value in case the first update contained a ZIR compile error.
2021-05-11stage2: improve Decl lifetime managementAndrew Kelley
* Compilation: iteration over the deletion_set only tries to delete the first one, relying on Decl destroy to remove itself from the deletion set. * link: `freeDecl` now has to handle the possibility of freeing a Decl that was never called with `allocateDeclIndexes`. * `deleteDecl` recursively iterates over a Decl's Namespace sub-Decl objects and calls `deleteDecl` on them. - Prevents Decl objects from being destroyed when they are still in `deletion_set`. * Sema: fix cleanup of anonymous Decl objects when an error occurs during semantic analysis. * tests: update test cases for fully qualified names
2021-05-11stage2: lookupIdentifier can return error.AnalysisFailedAndrew Kelley
This avoids causing false positive compile errors when, for example, a file had ZIR errors, and then code tried to look up a public decl from the failed file.
2021-05-11stage2: better handling of file-level compile errors across updatesAndrew Kelley
* `Module.File` now retains the most recent successful ZIR in the event that an update causes a ZIR compile error. This way Zig does not throw out useful semantic analysis results when an update temporarily introduces a ZIR compile error. * Semantic analysis of a File now unconditionally creates a Decl object for the File. The Decl object is marked as `file_failed` in case of File-level compile errors. This allows detecting of the File being outdated, and dependency tracking just like any other Decl.
2021-05-11stage2: add `owns_tv` flag to `Module.Decl`Andrew Kelley
Decl objects need to know whether they are the owner of the Type/Value associated with them, in order to decide whether to destroy the associated Namespace, Fn, or Var when cleaning up.
2021-05-10stage2: struct, union, enum, opaque, error sets get better namesAndrew Kelley
This commit takes advantage of the new "NameStrategy" that is exposed in the ZIR in order to name Decls after their parent when asked to. This makes the next failing test case pass.
2021-05-10stage2: type declarations ZIR encode AnonNameStrategyAndrew Kelley
which can be either parent, func, or anon. Here's the enum reproduced in the commit message for convenience: ```zig pub const NameStrategy = enum(u2) { /// Use the same name as the parent declaration name. /// e.g. `const Foo = struct {...};`. parent, /// Use the name of the currently executing comptime function call, /// with the current parameters. e.g. `ArrayList(i32)`. func, /// Create an anonymous name for this declaration. /// Like this: "ParentDeclName_struct_69" anon, }; ``` With this information in the ZIR, a future commit can improve the names of structs, unions, enums, and opaques. In order to accomplish this, the following ZIR instruction forms were removed and replaced with Extended op codes: * struct_decl * struct_decl_packed * struct_decl_extern * union_decl * union_decl_packed * union_decl_extern * enum_decl * enum_decl_nonexhaustive By being extended opcodes, one more u32 is needed, however we more than make up for it by repurposing the 16 "small" bits to provide shorter encodings for when decls_len == 0, fields_len == 0, a source node is not provided, etc. There tends to be no downside, and in fact sometimes upsides, to using an extended op code when there is a need for flag bits, which is the case for all three of these. Likewise, the container layout can be encoded in these bits rather than into the opcode. The following 4 ZIR instructions were added, netting a total of 4 freed up ZIR enum tags for future use: * opaque_decl_anon * opaque_decl_func * error_set_decl_anon * error_set_decl_func This is so that opaques and error sets can have the same name hint as structs, enums, and unions. `std.builtin.ContainerLayout` gets an explicit integer tag type so that it can be used inside packed structs. This commit also makes `Module.Namespace` use a separate set for anonymous decls, thus allowing anonymous decls to share the same `Decl.name` as their owner `Decl` objects.
2021-05-08stage2: fully qualified names and better anonymous namesAndrew Kelley
* no more global atomic variable for anonymous decl indexes. Instead the Namespace decl table is used to figure out anonymous decl names. - This prepares for better multi-threaded semantic analysis in the future, with no contention on this global atomic integer. * implement fully qualified names for namespaces.
2021-05-07stage2: fix struct inits not getting fields resolvedAndrew Kelley
2021-05-07stage2: fix stack overflow in `@setEvalBranchQuota` test caseAndrew Kelley
Some of the reworkings in this branch put us over the limit, on Linux, where the kernel disregards the fact that we ask for 16 MiB in the ELF file. So we ask for more stack space in `main`.
2021-05-07stage2: implement global variablesAndrew Kelley
* Sema: implement global variables - Improved global constants to stop needlessly creating a Var structure; they can just store the value directly. - This required making memory management a bit more sophisticated to detect when a Decl owns the Namespace associated with it, for the purposes of deinitialization. * Decl.name and Namespace decl table keys no longer directly reference ZIR; instead they have heap-duped names, so that deleted decls, which no longer have any ZIR to reference for their names, can be removed from the parent Namespace table. - In the future I would like to explore going a different direction with this, where the strings would still point to the ZIR however they would be removed from their owner Namespace objects during the update detection. The design principle here is that the existence of incremental compilation as a feature should not incur any cost for the use case when it is not used. In this example Decl names could simply point to ZIR string table memory, and it is only because of incremental compilation that we duplicate their names. * AstGen: implement threadlocal variables * CLI: call cleanExit after building a compilation so that in release modes we don't bother freeing memory or closing file descriptors, allowing the OS to do it more efficiently. * Avoid calling `freeDecl` in the linker for unreferenced Decl objects. * Fix CBE test case expecting the compile error to point to the wrong column.
2021-05-07stage2: no '$' in anonymous decl namesAndrew Kelley
This way it will not cause a compile error for the C backend.
2021-05-07stage2: implement extern functionsAndrew Kelley
2021-05-07Sema: support enough to check main calling convention via `@typeInfo`Andrew Kelley
After this commit, `pub export fn main() c_int { ... }` will be correctly detected as the intended entry point, and therefore start code will not try to export its own conflicting `main` function. * Implement basic union support - lots of stuff is still TODO, including runtime field access - also TODO: resolving the union tag type - comptime field access is implemented * DRY up some code by using the `Zir.DeclIterator` for skipping over decls in structs and unions. * Start to clean up Sema with regards to calling `.value()` to find out a const value. Instead, Sema code should call one of these two: - `resolvePossiblyUndefinedValue` (followed by logic dealing with undefined values) - `resolveDefinedValue` (a compile error will be emitted if the value is undefined) * An exported function with an unspecified calling convention gets the C calling convention. * Implement comptime field access for structs. * Add another implementation of "type has one possible value" in Sema. This is a bit unfortunate since the logic is duplicated, but the one in Type asserts that the types are resolved already, and is appropriate to call from codegen, while the one in Sema performs type resolution if necessary, reporting any compile errors that occur in the process.
2021-05-06stage2: wire up outdated/deleted decl detectionAndrew Kelley
we're back to incremental compilation working smoothly
2021-05-05stage2: fix contents hash computationAndrew Kelley
during an incremental update change detection, the function call to get the old contents hash took place after mangling the old ZIR index, making it access the wrong array index.
2021-05-05stage2: mapping old to new ZIR recursivelyAndrew Kelley
now it walks into functions and blocks to find decls.
2021-05-05stage2: add `zig changelist` debug commandAndrew Kelley
and implement the first pass at mechanism to map old ZIR to new ZIR.
2021-05-04Sema: restore the extern lib name functionalityAndrew Kelley
2021-05-04Sema: implement error setsAndrew Kelley
2021-05-04stage2: fix "other symbol here" error noteAndrew Kelley
It wasn't setting the source location properly.
2021-05-04stage2: fix structs and enums setting wrong owner_declAndrew Kelley
No more memory leaks.
2021-05-03Sema: implement ExportOptions support in `@export`Andrew Kelley
Also fix switch blocks not emitting their AIR code.
2021-05-03Sema: implement struct_decl instructionAndrew Kelley
2021-05-03stage2: hook up semantic analysis of struct fieldsAndrew Kelley
Now that they are lazy, they need to get analyzed in the correct context, when requested. This commit also hooks up std.builtin type values being resolved properly. This is needed, for example, with the `@export` builtin function, which occurs in start.zig, for `std.builtin.ExportOptions`. The ZIR code uses the special `Ref.export_options` value, and semantic analysis has to map this to the corresponding type from `std.builtin`.
2021-05-02stage2: make struct field analysis lazyAndrew Kelley
This commit breaks struct field analysis; will be fixed in a future commit.
2021-05-02AstGen: decouple from Module/CompilationAndrew Kelley
AstGen is now completely independent from the rest of the compiler. It ingests an AST tree and produces ZIR code as the output, without depending on any of the glue code of the compiler.
2021-05-02stage2: fix error reporting not loading ASTAndrew Kelley
In the byteOffset function, compile errors may need to compute the AST from source bytes in order to resolve source locations. Previously there were a few lines trying to access the AST before it was loaded. Trivial fix, just move load the tree at the beginning.
2021-05-02stage2: test decls encode that they are tests in ZIRAndrew Kelley
This allows Sema to namespace them separately from function decls with the same name. Ran into this in std.math.order conflicting with a test with the same name.
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-30stage2: implement function body analysisAndrew Kelley
now with whole-file-astgen
2021-04-30stage2: introduce new ZIR instruction: argAndrew Kelley
* AstGen: LocalVal and LocalPtr use string table indexes for their names. This is more efficient because local variable declarations do need to include the variable names so that semantic analysis can emit a compile error if a declaration is shadowed. So we take advantage of this fact by comparing string table indexes when resolving names. * The arg ZIR instructions are needed for the above reasoning, as well as to emit equivalent AIR instructions for debug info. Now that we have these arg instructions, get rid of the special `Zir.Inst.Ref` range for parameters. ZIR instructions now refer to the arg instructions for parameters. * Move identAsString and strLitAsString from Module.GenZir to AstGen where they belong.
2021-04-30Sema: implement function declarationsAndrew Kelley
2021-04-30stage2: un-tangle memory management of Decl and NamespaceAndrew Kelley
Before there was this "top_decl" and "tmp_namespace" stack values that were kludgy and buggy. Now Sema is slightly reworked so that files which are structs are analyzed with their own Decl and Namespace already set up. After this commit there are no memory leaks for a successful build-obj.
2021-04-29stage2: fix File incorrectly freeing its NamespaceAndrew Kelley
2021-04-29stage2: properly free Decl nameAndrew Kelley
Two problems solved: * The Decl name may be allocated with gpa or it may be a reference to the ZIR string table. * The main update() function was freeing the ZIR when we still had Decl objects referencing it.