diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-01-06 16:47:09 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-01-06 16:47:09 -0700 |
| commit | efe94a9a1289db274be326d6d66a19caeee86d33 (patch) | |
| tree | 95dd2f96a79284df771dad7746790daa4bc810be /src/link | |
| parent | 91e3431d4a55aa46884b267be5aa586f3ed94f74 (diff) | |
| download | zig-efe94a9a1289db274be326d6d66a19caeee86d33.tar.gz zig-efe94a9a1289db274be326d6d66a19caeee86d33.zip | |
stage2: C backend: support unused Decls
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/C.zig | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/src/link/C.zig b/src/link/C.zig index 32d859f43e..0ebfe288fc 100644 --- a/src/link/C.zig +++ b/src/link/C.zig @@ -151,36 +151,46 @@ pub fn flushModule(self: *C, comp: *Compilation) !void { var fn_count: usize = 0; // Forward decls and non-functions first. + // TODO: performance investigation: would keeping a list of Decls that we should + // generate, rather than querying here, be faster? for (module.decl_table.items()) |kv| { const decl = kv.value; - const decl_tv = decl.typed_value.most_recent.typed_value; - const buf = buf: { - if (decl_tv.val.castTag(.function)) |_| { - fn_count += 1; - break :buf decl.fn_link.c.fwd_decl.items; - } else { - break :buf decl.link.c.code.items; - } - }; - all_buffers.appendAssumeCapacity(.{ - .iov_base = buf.ptr, - .iov_len = buf.len, - }); - file_size += buf.len; + switch (decl.typed_value) { + .most_recent => |tvm| { + const buf = buf: { + if (tvm.typed_value.val.castTag(.function)) |_| { + fn_count += 1; + break :buf decl.fn_link.c.fwd_decl.items; + } else { + break :buf decl.link.c.code.items; + } + }; + all_buffers.appendAssumeCapacity(.{ + .iov_base = buf.ptr, + .iov_len = buf.len, + }); + file_size += buf.len; + }, + .never_succeeded => continue, + } } // Now the function bodies. try all_buffers.ensureCapacity(all_buffers.items.len + fn_count); for (module.decl_table.items()) |kv| { const decl = kv.value; - const decl_tv = decl.typed_value.most_recent.typed_value; - if (decl_tv.val.castTag(.function)) |_| { - const buf = decl.link.c.code.items; - all_buffers.appendAssumeCapacity(.{ - .iov_base = buf.ptr, - .iov_len = buf.len, - }); - file_size += buf.len; + switch (decl.typed_value) { + .most_recent => |tvm| { + if (tvm.typed_value.val.castTag(.function)) |_| { + const buf = decl.link.c.code.items; + all_buffers.appendAssumeCapacity(.{ + .iov_base = buf.ptr, + .iov_len = buf.len, + }); + file_size += buf.len; + } + }, + .never_succeeded => continue, } } |
