From 97290e0bfc38e75fb0e19f382a2187801bf4a458 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Mon, 19 Feb 2024 22:28:23 +0100 Subject: [PATCH] cbe: make more use of `InternPool.Index.Slice` Attempts to fix the current CI failures introduced by #18983. --- src/codegen/c.zig | 123 +++++++++++++++++++++++----------------------- 1 file changed, 62 insertions(+), 61 deletions(-) diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 405d97bbd3..cf372ff5ef 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -900,9 +900,9 @@ pub const DeclGen = struct { try writer.writeByte('{'); var empty = true; - for (0..ty.structFieldCount(mod)) |field_i| { - if (ty.structFieldIsComptime(field_i, mod)) continue; - const field_ty = ty.structFieldType(field_i, mod); + for (0..ty.structFieldCount(mod)) |field_index| { + if (ty.structFieldIsComptime(field_index, mod)) continue; + const field_ty = ty.structFieldType(field_index, mod); if (!field_ty.hasRuntimeBits(mod)) continue; if (!empty) try writer.writeByte(','); @@ -934,9 +934,10 @@ pub const DeclGen = struct { try writer.writeAll(" .payload = {"); } const union_obj = mod.typeToUnion(ty).?; - for (union_obj.field_types.get(ip)) |field_ty| { - if (!Type.fromInterned(field_ty).hasRuntimeBits(mod)) continue; - try dg.renderValue(writer, Type.fromInterned(field_ty), val, initializer_type); + for (0..union_obj.field_types.len) |field_index| { + const field_ty = Type.fromInterned(union_obj.field_types.get(ip)[field_index]); + if (!field_ty.hasRuntimeBits(mod)) continue; + try dg.renderValue(writer, field_ty, val, initializer_type); break; } if (ty.unionTagTypeSafety(mod)) |_| try writer.writeByte('}'); @@ -1354,25 +1355,23 @@ pub const DeclGen = struct { try writer.writeByte('{'); var empty = true; - for ( - tuple.types.get(ip), - tuple.values.get(ip), - 0.., - ) |field_ty, comptime_ty, field_i| { - if (comptime_ty != .none) continue; - if (!Type.fromInterned(field_ty).hasRuntimeBitsIgnoreComptime(mod)) continue; + for (0..tuple.types.len) |field_index| { + const comptime_val = tuple.values.get(ip)[field_index]; + if (comptime_val != .none) continue; + const field_ty = Type.fromInterned(tuple.types.get(ip)[field_index]); + if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; if (!empty) try writer.writeByte(','); - const field_val = switch (ip.indexToKey(val.ip_index).aggregate.storage) { + const field_val = Value.fromInterned(switch (ip.indexToKey(val.ip_index).aggregate.storage) { .bytes => |bytes| try ip.get(mod.gpa, .{ .int = .{ - .ty = field_ty, - .storage = .{ .u64 = bytes[field_i] }, + .ty = field_ty.toIntern(), + .storage = .{ .u64 = bytes[field_index] }, } }), - .elems => |elems| elems[field_i], + .elems => |elems| elems[field_index], .repeated_elem => |elem| elem, - }; - try dg.renderValue(writer, Type.fromInterned(field_ty), Value.fromInterned(field_val), initializer_type); + }); + try dg.renderValue(writer, field_ty, field_val, initializer_type); empty = false; } @@ -1388,18 +1387,18 @@ pub const DeclGen = struct { try writer.writeByte('{'); var empty = true; - for (0..struct_type.field_types.len) |field_i| { - const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_i]); - if (struct_type.fieldIsComptime(ip, field_i)) continue; + for (0..struct_type.field_types.len) |field_index| { + const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); + if (struct_type.fieldIsComptime(ip, field_index)) continue; if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; if (!empty) try writer.writeByte(','); const field_val = switch (ip.indexToKey(val.ip_index).aggregate.storage) { .bytes => |bytes| try ip.get(mod.gpa, .{ .int = .{ .ty = field_ty.toIntern(), - .storage = .{ .u64 = bytes[field_i] }, + .storage = .{ .u64 = bytes[field_index] }, } }), - .elems => |elems| elems[field_i], + .elems => |elems| elems[field_index], .repeated_elem => |elem| elem, }; try dg.renderValue(writer, field_ty, Value.fromInterned(field_val), initializer_type); @@ -1413,13 +1412,13 @@ pub const DeclGen = struct { const bits = Type.smallestUnsignedBits(int_info.bits - 1); const bit_offset_ty = try mod.intType(.unsigned, bits); - const field_types = struct_type.field_types.get(ip); var bit_offset: u64 = 0; var eff_num_fields: usize = 0; - for (field_types) |field_ty| { - if (!Type.fromInterned(field_ty).hasRuntimeBitsIgnoreComptime(mod)) continue; + for (0..struct_type.field_types.len) |field_index| { + const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); + if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; eff_num_fields += 1; } @@ -1438,15 +1437,16 @@ pub const DeclGen = struct { var eff_index: usize = 0; var needs_closing_paren = false; - for (field_types, 0..) |field_ty, field_i| { - if (!Type.fromInterned(field_ty).hasRuntimeBitsIgnoreComptime(mod)) continue; + for (0..struct_type.field_types.len) |field_index| { + const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); + if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; const field_val = switch (ip.indexToKey(val.ip_index).aggregate.storage) { .bytes => |bytes| try ip.get(mod.gpa, .{ .int = .{ - .ty = field_ty, - .storage = .{ .u64 = bytes[field_i] }, + .ty = field_ty.toIntern(), + .storage = .{ .u64 = bytes[field_index] }, } }), - .elems => |elems| elems[field_i], + .elems => |elems| elems[field_index], .repeated_elem => |elem| elem, }; const cast_context = IntCastContext{ .value = .{ .value = Value.fromInterned(field_val) } }; @@ -1454,19 +1454,19 @@ pub const DeclGen = struct { try writer.writeAll("zig_shl_"); try dg.renderTypeForBuiltinFnName(writer, ty); try writer.writeByte('('); - try dg.renderIntCast(writer, ty, cast_context, Type.fromInterned(field_ty), .FunctionArgument); + try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument); try writer.writeAll(", "); const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset); try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); try writer.writeByte(')'); } else { - try dg.renderIntCast(writer, ty, cast_context, Type.fromInterned(field_ty), .FunctionArgument); + try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument); } if (needs_closing_paren) try writer.writeByte(')'); if (eff_index != eff_num_fields - 1) try writer.writeAll(", "); - bit_offset += Type.fromInterned(field_ty).bitSize(mod); + bit_offset += field_ty.bitSize(mod); needs_closing_paren = true; eff_index += 1; } @@ -1474,8 +1474,9 @@ pub const DeclGen = struct { try writer.writeByte('('); // a << a_off | b << b_off | c << c_off var empty = true; - for (field_types, 0..) |field_ty, field_i| { - if (!Type.fromInterned(field_ty).hasRuntimeBitsIgnoreComptime(mod)) continue; + for (0..struct_type.field_types.len) |field_index| { + const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); + if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; if (!empty) try writer.writeAll(" | "); try writer.writeByte('('); @@ -1484,23 +1485,23 @@ pub const DeclGen = struct { const field_val = switch (ip.indexToKey(val.ip_index).aggregate.storage) { .bytes => |bytes| try ip.get(mod.gpa, .{ .int = .{ - .ty = field_ty, - .storage = .{ .u64 = bytes[field_i] }, + .ty = field_ty.toIntern(), + .storage = .{ .u64 = bytes[field_index] }, } }), - .elems => |elems| elems[field_i], + .elems => |elems| elems[field_index], .repeated_elem => |elem| elem, }; if (bit_offset != 0) { - try dg.renderValue(writer, Type.fromInterned(field_ty), Value.fromInterned(field_val), .Other); + try dg.renderValue(writer, field_ty, Value.fromInterned(field_val), .Other); try writer.writeAll(" << "); const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset); try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); } else { - try dg.renderValue(writer, Type.fromInterned(field_ty), Value.fromInterned(field_val), .Other); + try dg.renderValue(writer, field_ty, Value.fromInterned(field_val), .Other); } - bit_offset += Type.fromInterned(field_ty).bitSize(mod); + bit_offset += field_ty.bitSize(mod); empty = false; } try writer.writeByte(')'); @@ -1545,9 +1546,9 @@ pub const DeclGen = struct { try writer.writeByte(')'); } - const field_i = mod.unionTagFieldIndex(union_obj, Value.fromInterned(un.tag)).?; - const field_ty = Type.fromInterned(union_obj.field_types.get(ip)[field_i]); - const field_name = union_obj.field_names.get(ip)[field_i]; + const field_index = mod.unionTagFieldIndex(union_obj, Value.fromInterned(un.tag)).?; + const field_ty = Type.fromInterned(union_obj.field_types.get(ip)[field_index]); + const field_name = union_obj.field_names.get(ip)[field_index]; if (union_obj.getLayout(ip) == .Packed) { if (field_ty.hasRuntimeBits(mod)) { if (field_ty.isPtrAtRuntime(mod)) { @@ -1581,9 +1582,10 @@ pub const DeclGen = struct { try writer.print(" .{ } = ", .{fmtIdent(ip.stringToSlice(field_name))}); try dg.renderValue(writer, field_ty, Value.fromInterned(un.val), initializer_type); try writer.writeByte(' '); - } else for (union_obj.field_types.get(ip)) |this_field_ty| { - if (!Type.fromInterned(this_field_ty).hasRuntimeBits(mod)) continue; - try dg.renderValue(writer, Type.fromInterned(this_field_ty), Value.undef, initializer_type); + } else for (0..union_obj.field_types.len) |this_field_index| { + const this_field_ty = Type.fromInterned(union_obj.field_types.get(ip)[this_field_index]); + if (!this_field_ty.hasRuntimeBits(mod)) continue; + try dg.renderValue(writer, this_field_ty, Value.undef, initializer_type); break; } if (ty.unionTagTypeSafety(mod)) |_| try writer.writeByte('}'); @@ -7090,17 +7092,16 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue { } }, .Struct => switch (inst_ty.containerLayout(mod)) { - .Auto, .Extern => for (resolved_elements, 0..) |element, field_i_usize| { - const field_i: u32 = @intCast(field_i_usize); - if (inst_ty.structFieldIsComptime(field_i, mod)) continue; - const field_ty = inst_ty.structFieldType(field_i, mod); + .Auto, .Extern => for (resolved_elements, 0..) |element, field_index| { + if (inst_ty.structFieldIsComptime(field_index, mod)) continue; + const field_ty = inst_ty.structFieldType(field_index, mod); if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; const a = try Assignment.start(f, writer, field_ty); try f.writeCValueMember(writer, local, if (inst_ty.isSimpleTuple(mod)) - .{ .field = field_i } + .{ .field = field_index } else - .{ .identifier = ip.stringToSlice(inst_ty.legacyStructFieldName(field_i, mod)) }); + .{ .identifier = ip.stringToSlice(inst_ty.legacyStructFieldName(@intCast(field_index), mod)) }); try a.assign(f, writer); try f.writeCValue(writer, element, .Other); try a.end(f, writer); @@ -7115,9 +7116,9 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue { var bit_offset: u64 = 0; var empty = true; - for (0..elements.len) |field_i| { - if (inst_ty.structFieldIsComptime(field_i, mod)) continue; - const field_ty = inst_ty.structFieldType(field_i, mod); + for (0..elements.len) |field_index| { + if (inst_ty.structFieldIsComptime(field_index, mod)) continue; + const field_ty = inst_ty.structFieldType(field_index, mod); if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; if (!empty) { @@ -7128,9 +7129,9 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue { empty = false; } empty = true; - for (resolved_elements, 0..) |element, field_i| { - if (inst_ty.structFieldIsComptime(field_i, mod)) continue; - const field_ty = inst_ty.structFieldType(field_i, mod); + for (resolved_elements, 0..) |element, field_index| { + if (inst_ty.structFieldIsComptime(field_index, mod)) continue; + const field_ty = inst_ty.structFieldType(field_index, mod); if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; if (!empty) try writer.writeAll(", ");