From 826c6c0ec6847f3b2b217ea7738fd8bda757ef04 Mon Sep 17 00:00:00 2001 From: antlilja Date: Tue, 27 Feb 2024 13:19:09 +0100 Subject: LLVM: Implement more efficient blob writing --- src/codegen/llvm/bitcode_writer.zig | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/codegen/llvm/bitcode_writer.zig') diff --git a/src/codegen/llvm/bitcode_writer.zig b/src/codegen/llvm/bitcode_writer.zig index 7140c87929..414cdea682 100644 --- a/src/codegen/llvm/bitcode_writer.zig +++ b/src/codegen/llvm/bitcode_writer.zig @@ -139,6 +139,17 @@ pub fn BitcodeWriter(comptime types: []const type) type { try self.writeBits(charTo6Bit(c), 6); } + pub fn writeBlob(self: *BcWriter, blob: []const u8) Error!void { + const blob_word_size = std.mem.alignForward(usize, blob.len, 4); + try self.buffer.ensureUnusedCapacity(blob_word_size + 1); + self.alignTo32() catch unreachable; + + const slice = self.buffer.addManyAsSliceAssumeCapacity(blob_word_size / 4); + const slice_bytes = std.mem.sliceAsBytes(slice); + @memcpy(slice_bytes[0..blob.len], blob); + @memset(slice_bytes[blob.len..], 0); + } + pub fn alignTo32(self: *BcWriter) Error!void { if (self.bit_count == 0) return; @@ -256,11 +267,7 @@ pub fn BitcodeWriter(comptime types: []const type) type { .char6 => try self.bitcode.write6BitChar(adapter.get(param, field_name)), .blob => { try self.bitcode.writeVBR(param.len, 6); - try self.bitcode.alignTo32(); - for (param) |x| { - try self.bitcode.writeBits(x, 8); - } - try self.bitcode.alignTo32(); + try self.bitcode.writeBlob(param); }, .array_fixed => |len| { try self.bitcode.writeVBR(param.len, 6); -- cgit v1.2.3