diff options
| author | Robin Voetter <robin@voetter.nl> | 2023-04-09 01:29:39 +0200 |
|---|---|---|
| committer | Robin Voetter <robin@voetter.nl> | 2023-04-09 01:51:53 +0200 |
| commit | 8bbfbfc956af163434c734e196d5c2a77e77ff07 (patch) | |
| tree | 8ed95f240d2736a4d82e915ecc9269f15ba834e2 /src/link/SpirV.zig | |
| parent | 80b84355692606ac840584baa62aaafdd8ecd425 (diff) | |
| download | zig-8bbfbfc956af163434c734e196d5c2a77e77ff07.tar.gz zig-8bbfbfc956af163434c734e196d5c2a77e77ff07.zip | |
spirv: improve linking globals
SPIR-V globals must be emitted in order, so that any
declaration precedes usage. Zig, however, generates globals in
random order. To this end we keep for each global a list of
dependencies and perform a topological sort when flushing the
module.
Diffstat (limited to 'src/link/SpirV.zig')
| -rw-r--r-- | src/link/SpirV.zig | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/link/SpirV.zig b/src/link/SpirV.zig index c63e4a20af..7ec4c2cac6 100644 --- a/src/link/SpirV.zig +++ b/src/link/SpirV.zig @@ -46,7 +46,7 @@ base: link.File, spv: SpvModule, spv_arena: ArenaAllocator, -decl_ids: codegen.DeclMap, +decl_link: codegen.DeclLinkMap, pub fn createEmpty(gpa: Allocator, options: link.Options) !*SpirV { const self = try gpa.create(SpirV); @@ -59,7 +59,7 @@ pub fn createEmpty(gpa: Allocator, options: link.Options) !*SpirV { }, .spv = undefined, .spv_arena = ArenaAllocator.init(gpa), - .decl_ids = codegen.DeclMap.init(self.base.allocator), + .decl_link = codegen.DeclLinkMap.init(self.base.allocator), }; self.spv = SpvModule.init(gpa, self.spv_arena.allocator()); errdefer self.deinit(); @@ -100,7 +100,7 @@ pub fn openPath(allocator: Allocator, sub_path: []const u8, options: link.Option pub fn deinit(self: *SpirV) void { self.spv.deinit(); self.spv_arena.deinit(); - self.decl_ids.deinit(); + self.decl_link.deinit(); } pub fn updateFunc(self: *SpirV, module: *Module, func: *Module.Fn, air: Air, liveness: Liveness) !void { @@ -108,7 +108,7 @@ pub fn updateFunc(self: *SpirV, module: *Module, func: *Module.Fn, air: Air, liv @panic("Attempted to compile for architecture that was disabled by build configuration"); } - var decl_gen = codegen.DeclGen.init(self.base.allocator, module, &self.spv, &self.decl_ids); + var decl_gen = codegen.DeclGen.init(self.base.allocator, module, &self.spv, &self.decl_link); defer decl_gen.deinit(); if (try decl_gen.gen(func.owner_decl, air, liveness)) |msg| { @@ -121,7 +121,7 @@ pub fn updateDecl(self: *SpirV, module: *Module, decl_index: Module.Decl.Index) @panic("Attempted to compile for architecture that was disabled by build configuration"); } - var decl_gen = codegen.DeclGen.init(self.base.allocator, module, &self.spv, &self.decl_ids); + var decl_gen = codegen.DeclGen.init(self.base.allocator, module, &self.spv, &self.decl_link); defer decl_gen.deinit(); if (try decl_gen.gen(decl_index, undefined, undefined)) |msg| { |
