zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 826c6c0ec6847f3b2b217ea7738fd8bda757ef04 (tree)
parent 6e078883eebd0532928dba0c70e86a2eee0f246b
Author: antlilja <liljaanton2001@gmail.com>
Date:   Tue, 27 Feb 2024 13:19:09 +0100

LLVM: Implement more efficient blob writing

Diffstat:
Msrc/codegen/llvm/Builder.zig | 12+-----------
Msrc/codegen/llvm/bitcode_writer.zig | 17++++++++++++-----
2 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/src/codegen/llvm/Builder.zig b/src/codegen/llvm/Builder.zig @@ -14045,17 +14045,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co try bitcode.writeVBR(@as(u32, @intCast(slice.len)), 6); } - try bitcode.alignTo32(); - - for (1..self.metadata_string_map.count()) |metadata_string_index| { - const metadata_string: MetadataString = @enumFromInt(metadata_string_index); - const slice = metadata_string.slice(self); - for (slice) |c| { - try bitcode.writeBits(c, 8); - } - } - - try bitcode.alignTo32(); + try bitcode.writeBlob(self.metadata_string_bytes.items); } for ( diff --git 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);