aboutsummaryrefslogtreecommitdiff
path: root/src/link/SpirV.zig
diff options
context:
space:
mode:
authorRobin Voetter <robin@voetter.nl>2023-04-09 01:29:39 +0200
committerRobin Voetter <robin@voetter.nl>2023-04-09 01:51:53 +0200
commit8bbfbfc956af163434c734e196d5c2a77e77ff07 (patch)
tree8ed95f240d2736a4d82e915ecc9269f15ba834e2 /src/link/SpirV.zig
parent80b84355692606ac840584baa62aaafdd8ecd425 (diff)
downloadzig-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.zig10
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| {