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;...@@ -57,7 +57,6 @@ pub const expected_fields_len = 32;
57pub const expected_gep_indices_len = 8;57pub const expected_gep_indices_len = 8;
58pub const expected_cases_len = 8;58pub const expected_cases_len = 8;
59pub const expected_incoming_len = 8;59pub const expected_incoming_len = 8;
60pub const expected_intrinsic_name_len = 64;
6160
62pub const Options = struct {61pub const Options = struct {
63 allocator: Allocator,62 allocator: Allocator,
...@@ -2180,7 +2179,7 @@ pub const Global = struct {...@@ -2180,7 +2179,7 @@ pub const Global = struct {
21802179
2181 return .{2180 return .{
2182 .offset = builder.string_indices.items[name_index],2181 .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],
2184 };2183 };
2185 }2184 }
21862185
...@@ -8430,10 +8429,19 @@ pub fn fmt(self: *Builder, comptime fmt_str: []const u8, fmt_args: anytype) Allo...@@ -8430,10 +8429,19 @@ pub fn fmt(self: *Builder, comptime fmt_str: []const u8, fmt_args: anytype) Allo
8430}8429}
84318430
8432pub fn fmtAssumeCapacity(self: *Builder, comptime fmt_str: []const u8, fmt_args: anytype) String {8431pub fn fmtAssumeCapacity(self: *Builder, comptime fmt_str: []const u8, fmt_args: anytype) String {
8433 const start = self.string_bytes.items.len;
8434 self.string_bytes.writer(undefined).print(fmt_str, fmt_args) catch unreachable;8432 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..];
8437 const gop = self.string_map.getOrPutAssumeCapacityAdapted(bytes, String.Adapter{ .builder = self });8445 const gop = self.string_map.getOrPutAssumeCapacityAdapted(bytes, String.Adapter{ .builder = self });
8438 if (gop.found_existing) {8446 if (gop.found_existing) {
8439 self.string_bytes.shrinkRetainingCapacity(start);8447 self.string_bytes.shrinkRetainingCapacity(start);
...@@ -8678,7 +8686,6 @@ pub fn getIntrinsic(...@@ -8678,7 +8686,6 @@ pub fn getIntrinsic(
8678 overload: []const Type,8686 overload: []const Type,
8679) Allocator.Error!Function.Index {8687) Allocator.Error!Function.Index {
8680 const ExpectedContents = extern union {8688 const ExpectedContents = extern union {
8681 name: [expected_intrinsic_name_len]u8,
8682 attrs: extern struct {8689 attrs: extern struct {
8683 params: [expected_args_len]Type,8690 params: [expected_args_len]Type,
8684 fn_attrs: [FunctionAttributes.params_index + expected_args_len]Attributes,8691 fn_attrs: [FunctionAttributes.params_index + expected_args_len]Attributes,
...@@ -8691,12 +8698,10 @@ pub fn getIntrinsic(...@@ -8691,12 +8698,10 @@ pub fn getIntrinsic(
8691 const allocator = stack.get();8698 const allocator = stack.get();
86928699
8693 const name = name: {8700 const name = name: {
8694 var buffer = std.ArrayList(u8).init(allocator);8701 const writer = self.string_bytes.writer(self.gpa);
8695 defer buffer.deinit();8702 try writer.print("llvm.{s}", .{@tagName(id)});
86968703 for (overload) |ty| try writer.print(".{m}", .{ty.fmt(self)});
8697 try buffer.writer().print("llvm.{s}", .{@tagName(id)});8704 break :name try self.trailingString();
8698 for (overload) |ty| try buffer.writer().print(".{m}", .{ty.fmt(self)});
8699 break :name try self.string(buffer.items);
8700 };8705 };
8701 if (self.getGlobal(name)) |global| return global.ptrConst(self).kind.function;8706 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...@@ -11750,9 +11755,7 @@ pub fn metadataString(self: *Builder, bytes: []const u8) Allocator.Error!Metadat
1175011755
11751pub fn metadataStringFromString(self: *Builder, str: String) Allocator.Error!MetadataString {11756pub fn metadataStringFromString(self: *Builder, str: String) Allocator.Error!MetadataString {
11752 if (str == .none or str == .empty) return MetadataString.none;11757 if (str == .none or str == .empty) return MetadataString.none;
1175311758 return try self.metadataString(str.slice(self).?);
11754 const slice = str.slice(self) orelse unreachable;
11755 return try self.metadataString(slice);
11756}11759}
1175711760
11758pub fn metadataStringFmt(self: *Builder, comptime fmt_str: []const u8, fmt_args: anytype) Allocator.Error!MetadataString {11761pub 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:...@@ -11763,10 +11766,19 @@ pub fn metadataStringFmt(self: *Builder, comptime fmt_str: []const u8, fmt_args:
11763}11766}
1176411767
11765pub fn metadataStringFmtAssumeCapacity(self: *Builder, comptime fmt_str: []const u8, fmt_args: anytype) MetadataString {11768pub fn metadataStringFmtAssumeCapacity(self: *Builder, comptime fmt_str: []const u8, fmt_args: anytype) MetadataString {
11766 const start = self.metadata_string_bytes.items.len;
11767 self.metadata_string_bytes.writer(undefined).print(fmt_str, fmt_args) catch unreachable;11769 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..];
11770 const gop = self.metadata_string_map.getOrPutAssumeCapacityAdapted(bytes, String.Adapter{ .builder = self });11782 const gop = self.metadata_string_map.getOrPutAssumeCapacityAdapted(bytes, String.Adapter{ .builder = self });
11771 if (gop.found_existing) {11783 if (gop.found_existing) {
11772 self.metadata_string_bytes.shrinkRetainingCapacity(start);11784 self.metadata_string_bytes.shrinkRetainingCapacity(start);