From 0d841e827ac120725eef1100b79f1807a2bc04bd Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 29 Sep 2023 16:02:00 -0700 Subject: [PATCH] C backend: remove unneeded ordering mechanism This logic to lower snippets of C code in a dependency order is no longer needed. Simplify the logic by deleting the mechanism. --- src/link/C.zig | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/src/link/C.zig b/src/link/C.zig index 8ffe33bb09..5f4d767f90 100644 --- a/src/link/C.zig +++ b/src/link/C.zig @@ -322,29 +322,19 @@ pub fn flushModule(self: *C, _: *Compilation, prog_node: *std.Progress.Node) !vo self.lazy_code_buf.clearRetainingCapacity(); try self.flushErrDecls(&f.lazy_ctypes); + // Unlike other backends, the .c code we are emitting has order-dependent decls. // `CType`s, forward decls, and non-functions first. - // Unlike other backends, the .c code we are emitting is order-dependent. Therefore - // we must traverse the set of Decls that we are emitting according to their dependencies. - // Our strategy is to populate a set of remaining decls, pop Decls one by one, - // recursively chasing their dependencies. - try f.remaining_decls.ensureUnusedCapacity(gpa, self.decl_table.count()); - - const decl_keys = self.decl_table.keys(); - const decl_values = self.decl_table.values(); - for (decl_keys) |decl_index| { - assert(module.declPtr(decl_index).has_tv); - f.remaining_decls.putAssumeCapacityNoClobber(decl_index, {}); - } { var export_names: std.AutoHashMapUnmanaged(InternPool.NullTerminatedString, void) = .{}; defer export_names.deinit(gpa); - try export_names.ensureTotalCapacity(gpa, @as(u32, @intCast(module.decl_exports.entries.len))); + try export_names.ensureTotalCapacity(gpa, @intCast(module.decl_exports.entries.len)); for (module.decl_exports.values()) |exports| for (exports.items) |@"export"| try export_names.put(gpa, @"export".opts.name, {}); - while (f.remaining_decls.popOrNull()) |kv| { - const decl_index = kv.key; + const decl_keys = self.decl_table.keys(); + for (decl_keys) |decl_index| { + assert(module.declPtr(decl_index).has_tv); try self.flushDecl(&f, decl_index, export_names); } } @@ -374,6 +364,7 @@ pub fn flushModule(self: *C, _: *Compilation, prog_node: *std.Progress.Node) !vo f.file_size += lazy_fwd_decl_len; // Now the code. + const decl_values = self.decl_table.values(); try f.all_buffers.ensureUnusedCapacity(gpa, 1 + decl_values.len); f.appendBufAssumeCapacity(self.lazy_code_buf.items); for (decl_values) |decl| f.appendBufAssumeCapacity(self.getString(decl.code)); @@ -384,8 +375,6 @@ pub fn flushModule(self: *C, _: *Compilation, prog_node: *std.Progress.Node) !vo } const Flush = struct { - remaining_decls: std.AutoArrayHashMapUnmanaged(Module.Decl.Index, void) = .{}, - ctypes: codegen.CType.Store = .{}, ctypes_map: std.ArrayListUnmanaged(codegen.CType.Index) = .{}, ctypes_buf: std.ArrayListUnmanaged(u8) = .{}, @@ -416,7 +405,6 @@ const Flush = struct { f.ctypes_buf.deinit(gpa); f.ctypes_map.deinit(gpa); f.ctypes.deinit(gpa); - f.remaining_decls.deinit(gpa); } }; @@ -591,7 +579,6 @@ fn flushLazyFns(self: *C, f: *Flush, lazy_fns: codegen.LazyFnMap) FlushDeclError } } -/// Assumes `decl` was in the `remaining_decls` set, and has already been removed. fn flushDecl( self: *C, f: *Flush, @@ -601,14 +588,6 @@ fn flushDecl( const gpa = self.base.allocator; const mod = self.base.options.module.?; const decl = mod.declPtr(decl_index); - // Before flushing any particular Decl we must ensure its - // dependencies are already flushed, so that the order in the .c - // file comes out correctly. - for (decl.dependencies.keys()) |dep| { - if (f.remaining_decls.swapRemove(dep)) { - try flushDecl(self, f, dep, export_names); - } - } const decl_block = self.decl_table.getPtr(decl_index).?;