aboutsummaryrefslogtreecommitdiff
path: root/src/Compilation.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-07-27 14:06:42 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-07-27 14:19:53 -0700
commita8e964eadd3496330043985cacaaee7db92886c6 (patch)
tree57768a2f87b76b9f80231ab924d2bdb481a22d2a /src/Compilation.zig
parentba71b96fe6c0e01b8445a2f7bd49541a07c360db (diff)
downloadzig-a8e964eadd3496330043985cacaaee7db92886c6.tar.gz
zig-a8e964eadd3496330043985cacaaee7db92886c6.zip
stage2: `zig test` now works with the LLVM backend
Frontend improvements: * When compiling in `zig test` mode, put a task on the work queue to analyze the main package root file. Normally, start code does `_ = import("root");` to make Zig analyze the user's code, however in the case of `zig test`, the root source file is the test runner. Without this change, no tests are picked up. * In the main pipeline, once semantic analysis is finished, if there are no compile errors, populate the `test_functions` Decl with the set of test functions picked up from semantic analysis. * Value: add `array` and `slice` Tags. LLVM backend improvements: * Fix incremental updates of globals. Previously the value of a global would not get replaced with a new value. * Fix LLVM type of arrays. They were incorrectly sending the ABI size as the element count. * Remove the FuncGen parameter from genTypedValue. This function is for generating global constants and there is no function available when it is being called. - The `ref_val` case is now commented out. I'd like to eliminate `ref_val` as one of the possible Value Tags. Instead it should always be done via `decl_ref`. * Implement constant value generation for slices, arrays, and structs. * Constant value generation for functions supports the `decl_ref` tag.
Diffstat (limited to 'src/Compilation.zig')
-rw-r--r--src/Compilation.zig34
1 files changed, 15 insertions, 19 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig
index a34d0cd198..00cdba85a4 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -1709,7 +1709,9 @@ pub fn update(self: *Compilation) !void {
// in the start code, but when using the stage1 backend that won't happen,
// so in order to run AstGen on the root source file we put it into the
// import_table here.
- if (use_stage1) {
+ // Likewise, in the case of `zig test`, the test runner is the root source file,
+ // and so there is nothing to import the main file.
+ if (use_stage1 or self.bin_file.options.is_test) {
_ = try module.importPkg(module.main_pkg);
}
@@ -1725,6 +1727,9 @@ pub fn update(self: *Compilation) !void {
if (!use_stage1) {
try self.work_queue.writeItem(.{ .analyze_pkg = std_pkg });
+ if (self.bin_file.options.is_test) {
+ try self.work_queue.writeItem(.{ .analyze_pkg = module.main_pkg });
+ }
}
}
@@ -2053,24 +2058,7 @@ pub fn performAllTheWork(self: *Compilation) error{ TimerUnsupported, OutOfMemor
assert(decl.has_tv);
assert(decl.ty.hasCodeGenBits());
- self.bin_file.updateDecl(module, decl) catch |err| switch (err) {
- error.OutOfMemory => return error.OutOfMemory,
- error.AnalysisFail => {
- decl.analysis = .codegen_failure;
- continue;
- },
- else => {
- try module.failed_decls.ensureUnusedCapacity(gpa, 1);
- module.failed_decls.putAssumeCapacityNoClobber(decl, try Module.ErrorMsg.create(
- gpa,
- decl.srcLoc(),
- "unable to codegen: {s}",
- .{@errorName(err)},
- ));
- decl.analysis = .codegen_failure_retryable;
- continue;
- },
- };
+ try module.linkerUpdateDecl(decl);
},
},
.codegen_func => |func| switch (func.owner_decl.analysis) {
@@ -2396,6 +2384,14 @@ pub fn performAllTheWork(self: *Compilation) error{ TimerUnsupported, OutOfMemor
};
},
};
+
+ if (self.bin_file.options.is_test and self.totalErrorCount() == 0) {
+ // The `test_functions` decl has been intentionally postponed until now,
+ // at which point we must populate it with the list of test functions that
+ // have been discovered and not filtered out.
+ const mod = self.bin_file.options.module.?;
+ try mod.populateTestFunctions();
+ }
}
const AstGenSrc = union(enum) {