aboutsummaryrefslogtreecommitdiff
path: root/src/link.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-07-12 19:51:31 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-07-20 12:19:16 -0700
commit0f38f686964664f68e013ec3c63cfe655001f165 (patch)
treee8ed5924afcce0b9783c664e8e0c4c7d04e34d6f /src/link.zig
parent0ffc6b5cc300e750029c9ff22f6a1ed0596496d6 (diff)
downloadzig-0f38f686964664f68e013ec3c63cfe655001f165.tar.gz
zig-0f38f686964664f68e013ec3c63cfe655001f165.zip
stage2: Air and Liveness are passed ephemerally
to the link infrastructure, instead of being stored with Module.Fn. This moves towards a strategy to make more efficient use of memory by not storing Air or Liveness data in the Fn struct, but computing it on demand, immediately sending it to the backend, and then immediately freeing it. Backends which want to defer codegen until flush() such as SPIR-V must move the Air/Liveness data upon `updateFunc` being called and keep track of that data in the backend implementation itself.
Diffstat (limited to 'src/link.zig')
-rw-r--r--src/link.zig34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/link.zig b/src/link.zig
index 02d9afaf07..2403180ec8 100644
--- a/src/link.zig
+++ b/src/link.zig
@@ -1,4 +1,5 @@
const std = @import("std");
+const builtin = @import("builtin");
const mem = std.mem;
const Allocator = std.mem.Allocator;
const fs = std.fs;
@@ -14,8 +15,10 @@ const Cache = @import("Cache.zig");
const build_options = @import("build_options");
const LibCInstallation = @import("libc_installation.zig").LibCInstallation;
const wasi_libc = @import("wasi_libc.zig");
+const Air = @import("Air.zig");
+const Liveness = @import("Liveness.zig");
-pub const producer_string = if (std.builtin.is_test) "zig test" else "zig " ++ build_options.version;
+pub const producer_string = if (builtin.is_test) "zig test" else "zig " ++ build_options.version;
pub const Emit = struct {
/// Where the output will go.
@@ -313,13 +316,34 @@ pub const File = struct {
log.debug("updateDecl {*} ({s}), type={}", .{ decl, decl.name, decl.ty });
assert(decl.has_tv);
switch (base.tag) {
- .coff => return @fieldParentPtr(Coff, "base", base).updateDecl(module, decl),
- .elf => return @fieldParentPtr(Elf, "base", base).updateDecl(module, decl),
+ // zig fmt: off
+ .coff => return @fieldParentPtr(Coff, "base", base).updateDecl(module, decl),
+ .elf => return @fieldParentPtr(Elf, "base", base).updateDecl(module, decl),
.macho => return @fieldParentPtr(MachO, "base", base).updateDecl(module, decl),
- .c => return @fieldParentPtr(C, "base", base).updateDecl(module, decl),
- .wasm => return @fieldParentPtr(Wasm, "base", base).updateDecl(module, decl),
+ .c => return @fieldParentPtr(C, "base", base).updateDecl(module, decl),
+ .wasm => return @fieldParentPtr(Wasm, "base", base).updateDecl(module, decl),
.spirv => return @fieldParentPtr(SpirV, "base", base).updateDecl(module, decl),
.plan9 => return @fieldParentPtr(Plan9, "base", base).updateDecl(module, decl),
+ // zig fmt: on
+ }
+ }
+
+ /// May be called before or after updateDeclExports but must be called
+ /// after allocateDeclIndexes for any given Decl.
+ pub fn updateFunc(base: *File, module: *Module, func: *Module.Fn, air: Air, liveness: Liveness) !void {
+ log.debug("updateFunc {*} ({s}), type={}", .{
+ func.owner_decl, func.owner_decl.name, func.owner_decl.ty,
+ });
+ switch (base.tag) {
+ // zig fmt: off
+ .coff => return @fieldParentPtr(Coff, "base", base).updateFunc(module, func, air, liveness),
+ .elf => return @fieldParentPtr(Elf, "base", base).updateFunc(module, func, air, liveness),
+ .macho => return @fieldParentPtr(MachO, "base", base).updateFunc(module, func, air, liveness),
+ .c => return @fieldParentPtr(C, "base", base).updateFunc(module, func, air, liveness),
+ .wasm => return @fieldParentPtr(Wasm, "base", base).updateFunc(module, func, air, liveness),
+ .spirv => return @fieldParentPtr(SpirV, "base", base).updateFunc(module, func, air, liveness),
+ .plan9 => return @fieldParentPtr(Plan9, "base", base).updateFunc(module, func, air, liveness),
+ // zig fmt: on
}
}