authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-02-22 19:50:33+01:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-02-22 19:50:41+01:00
log83e66d301eede71800a9b5d72010ce63dbbac3fc
tree00a571efa5465eed147010cdb25df245f84a3978
parent2ab982eb13c5852dda277ac7b4290c15f420c2d7

Builder: fix bitcode strtab


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

src/codegen/llvm/Builder.zig+28-16
......@@ -57,7 +57,6 @@ pub const expected_fields_len = 32;
5757pub const expected_gep_indices_len = 8;
5858pub const expected_cases_len = 8;
5959pub const expected_incoming_len = 8;
60pub const expected_intrinsic_name_len = 64;
6160
6261pub const Options = struct {
6362 allocator: Allocator,
......@@ -2180,7 +2179,7 @@ pub const Global = struct {
21802179
21812180 return .{
21822181 .offset = builder.string_indices.items[name_index],
2183 .size = builder.string_indices.items[name_index + 1] - builder.string_indices.items[name_index] - 1,
2182 .size = builder.string_indices.items[name_index + 1] - builder.string_indices.items[name_index],
21842183 };
21852184 }
21862185
......@@ -8430,10 +8429,19 @@ pub fn fmt(self: *Builder, comptime fmt_str: []const u8, fmt_args: anytype) Allo
84308429}
84318430
84328431pub fn fmtAssumeCapacity(self: *Builder, comptime fmt_str: []const u8, fmt_args: anytype) String {
8433 const start = self.string_bytes.items.len;
84348432 self.string_bytes.writer(undefined).print(fmt_str, fmt_args) catch unreachable;
8435 const bytes: []const u8 = self.string_bytes.items[start..];
8433 return self.trailingStringAssumeCapacity();
8434}
8435
8436pub fn trailingString(self: *Builder) Allocator.Error!String {
8437 try self.string_indices.ensureUnusedCapacity(self.gpa, 1);
8438 try self.string_map.ensureUnusedCapacity(self.gpa, 1);
8439 return self.trailingStringAssumeCapacity();
8440}
84368441
8442pub fn trailingStringAssumeCapacity(self: *Builder) String {
8443 const start = self.string_indices.getLast();
8444 const bytes: []const u8 = self.string_bytes.items[start..];
84378445 const gop = self.string_map.getOrPutAssumeCapacityAdapted(bytes, String.Adapter{ .builder = self });
84388446 if (gop.found_existing) {
84398447 self.string_bytes.shrinkRetainingCapacity(start);
......@@ -8678,7 +8686,6 @@ pub fn getIntrinsic(
86788686 overload: []const Type,
86798687) Allocator.Error!Function.Index {
86808688 const ExpectedContents = extern union {
8681 name: [expected_intrinsic_name_len]u8,
86828689 attrs: extern struct {
86838690 params: [expected_args_len]Type,
86848691 fn_attrs: [FunctionAttributes.params_index + expected_args_len]Attributes,
......@@ -8691,12 +8698,10 @@ pub fn getIntrinsic(
86918698 const allocator = stack.get();
86928699
86938700 const name = name: {
8694 var buffer = std.ArrayList(u8).init(allocator);
8695 defer buffer.deinit();
8696
8697 try buffer.writer().print("llvm.{s}", .{@tagName(id)});
8698 for (overload) |ty| try buffer.writer().print(".{m}", .{ty.fmt(self)});
8699 break :name try self.string(buffer.items);
8701 const writer = self.string_bytes.writer(self.gpa);
8702 try writer.print("llvm.{s}", .{@tagName(id)});
8703 for (overload) |ty| try writer.print(".{m}", .{ty.fmt(self)});
8704 break :name try self.trailingString();
87008705 };
87018706 if (self.getGlobal(name)) |global| return global.ptrConst(self).kind.function;
87028707
......@@ -11750,9 +11755,7 @@ pub fn metadataString(self: *Builder, bytes: []const u8) Allocator.Error!Metadat
1175011755
1175111756pub fn metadataStringFromString(self: *Builder, str: String) Allocator.Error!MetadataString {
1175211757 if (str == .none or str == .empty) return MetadataString.none;
11753
11754 const slice = str.slice(self) orelse unreachable;
11755 return try self.metadataString(slice);
11758 return try self.metadataString(str.slice(self).?);
1175611759}
1175711760
1175811761pub fn metadataStringFmt(self: *Builder, comptime fmt_str: []const u8, fmt_args: anytype) Allocator.Error!MetadataString {
......@@ -11763,10 +11766,19 @@ pub fn metadataStringFmt(self: *Builder, comptime fmt_str: []const u8, fmt_args:
1176311766}
1176411767
1176511768pub fn metadataStringFmtAssumeCapacity(self: *Builder, comptime fmt_str: []const u8, fmt_args: anytype) MetadataString {
11766 const start = self.metadata_string_bytes.items.len;
1176711769 self.metadata_string_bytes.writer(undefined).print(fmt_str, fmt_args) catch unreachable;
11768 const bytes: []const u8 = self.metadata_string_bytes.items[start..];
11770 return self.trailingMetadataStringAssumeCapacity();
11771}
11772
11773pub fn trailingMetadataString(self: *Builder) Allocator.Error!MetadataString {
11774 try self.metadata_string_indices.ensureUnusedCapacity(self.gpa, 1);
11775 try self.metadata_string_map.ensureUnusedCapacity(self.gpa, 1);
11776 return self.trailingMetadataStringAssumeCapacity();
11777}
1176911778
11779pub fn trailingMetadataStringAssumeCapacity(self: *Builder) MetadataString {
11780 const start = self.metadata_string_indices.getLast();
11781 const bytes: []const u8 = self.metadata_string_bytes.items[start..];
1177011782 const gop = self.metadata_string_map.getOrPutAssumeCapacityAdapted(bytes, String.Adapter{ .builder = self });
1177111783 if (gop.found_existing) {
1177211784 self.metadata_string_bytes.shrinkRetainingCapacity(start);