Commit efe94a9a12

Andrew Kelley <andrew@ziglang.org>
2021-01-07 00:47:09
stage2: C backend: support unused Decls
1 parent 91e3431
Changed files (3)
src
test
stage2
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,
         }
     }
 
src/Compilation.zig
@@ -527,6 +527,10 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
             if (options.root_pkg == null)
                 break :blk false;
 
+            // If we are outputting .c code we must use Zig backend.
+            if (ofmt == .c)
+                break :blk false;
+
             // If we are the stage1 compiler, we depend on the stage1 c++ llvm backend
             // to compile zig code.
             if (build_options.is_stage1)
test/stage2/cbe.zig
@@ -29,6 +29,16 @@ pub fn addCases(ctx: *TestContext) !void {
             \\    return 0;
             \\}
         , "yo" ++ std.cstr.line_sep);
+
+        // Add an unused Decl
+        case.addCompareOutput(
+            \\extern fn puts(s: [*:0]const u8) c_int;
+            \\export fn main() c_int {
+            \\    _ = puts("yo!");
+            \\    return 0;
+            \\}
+            \\fn unused() void {}
+        , "yo!" ++ std.cstr.line_sep);
     }
 
     {