authorgravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2026-06-15 12:48:00+03:30
committergravatar for alichraghi@noreply.codeberg.orgAli Cheraghi <alichraghi@noreply.codeberg.org> 2026-06-18 13:38:58+02:00
log93cd157da13b7c89fc809d326555cd56457b6c0b
tree30e970e1a55282f0f96fce84f4ba0440f0e518fd
parentca57b33ddd308dd98c81a49a1734c549a5fb3dbe

spirv: fix endianness in object read/write


1 files changed, 16 insertions(+), 14 deletions(-)

src/link/SpirV.zig+16-14
...@@ -137,6 +137,11 @@ pub fn loadInput(linker: *Linker, input: link.Input) !void {...@@ -137,6 +137,11 @@ pub fn loadInput(linker: *Linker, input: link.Input) !void {
137 if (n_read != bytes.len)137 if (n_read != bytes.len)
138 return diags.fail("SPIR-V object '{f}': incomplete read", .{obj.path});138 return diags.fail("SPIR-V object '{f}': incomplete read", .{obj.path});
139139
140 const needs_swap = all_words[0] == @byteSwap(spec.magic_number);
141 if (needs_swap) {
142 for (all_words) |*w| w.* = @byteSwap(w.*);
143 }
144
140 if (all_words[0] != spec.magic_number)145 if (all_words[0] != spec.magic_number)
141 return diags.fail("SPIR-V object '{f}': invalid magic number", .{obj.path});146 return diags.fail("SPIR-V object '{f}': invalid magic number", .{obj.path});
142147
...@@ -266,16 +271,6 @@ pub fn flush(...@@ -266,16 +271,6 @@ pub fn flush(
266 var binary = linkModule(arena, merged.words, merged.id_bound, sub_prog_node) catch |err| switch (err) {271 var binary = linkModule(arena, merged.words, merged.id_bound, sub_prog_node) catch |err| switch (err) {
267 error.OutOfMemory => |e| return e,272 error.OutOfMemory => |e| return e,
268 else => |other| {273 else => |other| {
269 // Uncomment to write the pre-link merged module for debugging
270 // const dbg_header = [_]Word{
271 // spec.magic_number,
272 // merged.version.toWord(),
273 // merged.generator_id,
274 // merged.id_bound,
275 // 0,
276 // };
277 // linker.base.file.?.writeStreamingAll(io, @ptrCast(&dbg_header)) catch {};
278 // linker.base.file.?.writeStreamingAll(io, @ptrCast(merged.words)) catch {};
279 return diags.fail("error while linking: {s}", .{@errorName(other)});274 return diags.fail("error while linking: {s}", .{@errorName(other)});
280 },275 },
281 };276 };
...@@ -289,10 +284,17 @@ pub fn flush(...@@ -289,10 +284,17 @@ pub fn flush(
289 0,284 0,
290 };285 };
291286
292 linker.base.file.?.writeStreamingAll(io, @ptrCast(&header)) catch |err|287 var file_writer = linker.base.file.?.writer(io, &.{});
293 return diags.fail("failed to write: {t}", .{err});288 file_writer.interface.writeSliceEndian(Word, &header, .little) catch |err| switch (err) {
294 linker.base.file.?.writeStreamingAll(io, @ptrCast(binary.instructions)) catch |err|289 error.WriteFailed => return diags.fail("failed to write: {t}", .{file_writer.err.?}),
295 return diags.fail("failed to write: {t}", .{err});290 };
291 file_writer.interface.writeSliceEndian(Word, binary.instructions, .little) catch |err| switch (err) {
292 error.WriteFailed => return diags.fail("failed to write: {t}", .{file_writer.err.?}),
293 };
294 file_writer.end() catch |err| switch (err) {
295 error.WriteFailed => return diags.fail("failed to write: {t}", .{file_writer.err.?}),
296 else => |e| return diags.fail("failed to write: {t}", .{e}),
297 };
296}298}
297299
298fn linkModule(arena: Allocator, words: []const Word, id_bound: u32, progress: std.Progress.Node) !BinaryModule {300fn linkModule(arena: Allocator, words: []const Word, id_bound: u32, progress: std.Progress.Node) !BinaryModule {