diff options
| author | mlugg <mlugg@mlugg.co.uk> | 2023-05-29 05:07:17 +0100 |
|---|---|---|
| committer | mlugg <mlugg@mlugg.co.uk> | 2023-05-29 23:06:08 +0100 |
| commit | 4976b58ab16069f8d3267b69ed030f29685c1abe (patch) | |
| tree | 400f632d11eec4f3c330bee15d59f8fd6219c20f /src/Compilation.zig | |
| parent | b5fad3a40a86eb379903d6a803bdbe66dcaa5487 (diff) | |
| download | zig-4976b58ab16069f8d3267b69ed030f29685c1abe.tar.gz zig-4976b58ab16069f8d3267b69ed030f29685c1abe.zip | |
Prevent analysis of functions only referenced at comptime
The idea here is that there are two ways we can reference a function at runtime:
* Through a direct call, i.e. where the function is comptime-known
* Through a function pointer
This means we can easily perform a form of rudimentary escape analysis
on functions. If we ever see a `decl_ref` or `ref` of a function, we
have a function pointer, which could "leak" into runtime code, so we
emit the function; but for a plain `decl_val`, there's no need to.
This change means that `comptime { _ = f; }` no longer forces a function
to be emitted, which was used for some things (mainly tests). These use
sites have been replaced with `_ = &f;`, which still triggers analysis
of the function body, since you're taking a pointer to the function.
Resolves: #6256
Resolves: #15353
Diffstat (limited to 'src/Compilation.zig')
| -rw-r--r-- | src/Compilation.zig | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig index cc2e2a916b..956948dd86 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -3193,6 +3193,13 @@ fn processOneJob(comp: *Compilation, job: Job, prog_node: *std.Progress.Node) !v error.OutOfMemory => return error.OutOfMemory, error.AnalysisFail => return, }; + const decl = module.declPtr(decl_index); + if (decl.kind == .@"test" and comp.bin_file.options.is_test) { + // Tests are always emitted in test binaries. The decl_refs are created by + // Module.populateTestFunctions, but this will not queue body analysis, so do + // that now. + try module.ensureFuncBodyAnalysisQueued(decl.val.castTag(.function).?.data); + } }, .update_embed_file => |embed_file| { const named_frame = tracy.namedFrame("update_embed_file"); |
