From 6f08e172299320a3b243998878b38b0b3f43d8d5 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Fri, 16 Feb 2024 03:13:25 +0100 Subject: InternPool: make more use of `NullTerminatedString.Slice` This should avoid the random pointer invalidation crashes. Closes #18954 --- src/codegen/c.zig | 24 +++++++++++++----------- src/codegen/llvm.zig | 5 +++-- 2 files changed, 16 insertions(+), 13 deletions(-) (limited to 'src/codegen') diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 4adabea7bb..405d97bbd3 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -2595,6 +2595,7 @@ pub fn genGlobalAsm(mod: *Module, writer: anytype) !void { pub fn genErrDecls(o: *Object) !void { const mod = o.dg.module; + const ip = &mod.intern_pool; const writer = o.writer(); var max_name_len: usize = 0; @@ -2603,7 +2604,7 @@ pub fn genErrDecls(o: *Object) !void { try writer.writeAll("enum {\n"); o.indent_writer.pushIndent(); for (mod.global_error_set.keys()[1..], 1..) |name_nts, value| { - const name = mod.intern_pool.stringToSlice(name_nts); + const name = ip.stringToSlice(name_nts); max_name_len = @max(name.len, max_name_len); const err_val = try mod.intern(.{ .err = .{ .ty = .anyerror_type, @@ -2621,8 +2622,8 @@ pub fn genErrDecls(o: *Object) !void { defer o.dg.gpa.free(name_buf); @memcpy(name_buf[0..name_prefix.len], name_prefix); - for (mod.global_error_set.keys()) |name_nts| { - const name = mod.intern_pool.stringToSlice(name_nts); + for (mod.global_error_set.keys()) |name_ip| { + const name = ip.stringToSlice(name_ip); @memcpy(name_buf[name_prefix.len..][0..name.len], name); const identifier = name_buf[0 .. name_prefix.len + name.len]; @@ -2652,7 +2653,7 @@ pub fn genErrDecls(o: *Object) !void { try o.dg.renderTypeAndName(writer, name_array_ty, .{ .identifier = array_identifier }, Const, .none, .complete); try writer.writeAll(" = {"); for (mod.global_error_set.keys(), 0..) |name_nts, value| { - const name = mod.intern_pool.stringToSlice(name_nts); + const name = ip.stringToSlice(name_nts); if (value != 0) try writer.writeByte(','); const len_val = try mod.intValue(Type.usize, name.len); @@ -2730,6 +2731,7 @@ fn genExports(o: *Object) !void { pub fn genLazyFn(o: *Object, lazy_fn: LazyFnMap.Entry) !void { const mod = o.dg.module; + const ip = &mod.intern_pool; const w = o.writer(); const key = lazy_fn.key_ptr.*; const val = lazy_fn.value_ptr; @@ -2747,23 +2749,23 @@ pub fn genLazyFn(o: *Object, lazy_fn: LazyFnMap.Entry) !void { try w.writeByte('('); try o.dg.renderTypeAndName(w, enum_ty, .{ .identifier = "tag" }, Const, .none, .complete); try w.writeAll(") {\n switch (tag) {\n"); - for (enum_ty.enumFields(mod), 0..) |name_ip, index_usize| { - const index = @as(u32, @intCast(index_usize)); - const name = mod.intern_pool.stringToSlice(name_ip); - const tag_val = try mod.enumValueFieldIndex(enum_ty, index); + const tag_names = enum_ty.enumFields(mod); + for (0..tag_names.len) |tag_index| { + const tag_name = ip.stringToSlice(tag_names.get(ip)[tag_index]); + const tag_val = try mod.enumValueFieldIndex(enum_ty, @intCast(tag_index)); const int_val = try tag_val.intFromEnum(enum_ty, mod); const name_ty = try mod.arrayType(.{ - .len = name.len, + .len = tag_name.len, .child = .u8_type, .sentinel = .zero_u8, }); const name_val = try mod.intern(.{ .aggregate = .{ .ty = name_ty.toIntern(), - .storage = .{ .bytes = name }, + .storage = .{ .bytes = tag_name }, } }); - const len_val = try mod.intValue(Type.usize, name.len); + const len_val = try mod.intValue(Type.usize, tag_name.len); try w.print(" case {}: {{\n static ", .{ try o.dg.fmtIntLiteral(enum_ty, int_val, .Other), diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index f5b4aa540f..017abf8eaf 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -9574,6 +9574,7 @@ pub const FuncGen = struct { fn airErrorSetHasValue(self: *FuncGen, inst: Air.Inst.Index) !Builder.Value { const o = self.dg.object; const mod = o.module; + const ip = &mod.intern_pool; const ty_op = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_op; const operand = try self.resolveInst(ty_op.operand); const error_set_ty = ty_op.ty.toType(); @@ -9585,8 +9586,8 @@ pub const FuncGen = struct { var wip_switch = try self.wip.@"switch"(operand, invalid_block, @intCast(names.len)); defer wip_switch.finish(&self.wip); - for (names) |name| { - const err_int = mod.global_error_set.getIndex(name).?; + for (0..names.len) |name_index| { + const err_int = mod.global_error_set.getIndex(names.get(ip)[name_index]).?; const this_tag_int_value = try o.builder.intConst(try o.errorIntType(), err_int); try wip_switch.addCase(this_tag_int_value, valid_block, &self.wip); } -- cgit v1.2.3