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 {
137137 if (n_read != bytes.len)
138138 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
140145 if (all_words[0] != spec.magic_number)
141146 return diags.fail("SPIR-V object '{f}': invalid magic number", .{obj.path});
142147
......@@ -266,16 +271,6 @@ pub fn flush(
266271 var binary = linkModule(arena, merged.words, merged.id_bound, sub_prog_node) catch |err| switch (err) {
267272 error.OutOfMemory => |e| return e,
268273 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 {};
279274 return diags.fail("error while linking: {s}", .{@errorName(other)});
280275 },
281276 };
......@@ -289,10 +284,17 @@ pub fn flush(
289284 0,
290285 };
291286
292 linker.base.file.?.writeStreamingAll(io, @ptrCast(&header)) catch |err|
293 return diags.fail("failed to write: {t}", .{err});
294 linker.base.file.?.writeStreamingAll(io, @ptrCast(binary.instructions)) catch |err|
295 return diags.fail("failed to write: {t}", .{err});
287 var file_writer = linker.base.file.?.writer(io, &.{});
288 file_writer.interface.writeSliceEndian(Word, &header, .little) catch |err| switch (err) {
289 error.WriteFailed => return diags.fail("failed to write: {t}", .{file_writer.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 };
296298}
297299
298300fn linkModule(arena: Allocator, words: []const Word, id_bound: u32, progress: std.Progress.Node) !BinaryModule {