aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/c.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-05-20 17:55:40 -0700
committerAndrew Kelley <andrew@ziglang.org>2023-06-10 20:47:54 -0700
commit7e19c9566860e78ad536aaa678af8c32531fade9 (patch)
treed6e90d6c1cf0d13bee52b8107804837658486927 /src/codegen/c.zig
parent65d65f5dda144d76ea9bbd82b2b5aacb09d7ae34 (diff)
downloadzig-7e19c9566860e78ad536aaa678af8c32531fade9.tar.gz
zig-7e19c9566860e78ad536aaa678af8c32531fade9.zip
Sema: move `inferred_alloc_const/mut_type` to InternPool
Now, all types are migrated to use `InternPool`. The `Type.Tag` enum is deleted in this commit.
Diffstat (limited to 'src/codegen/c.zig')
-rw-r--r--src/codegen/c.zig193
1 files changed, 94 insertions, 99 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index a98b77c964..d3b8e06e5d 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -5367,116 +5367,111 @@ fn airStructFieldVal(f: *Function, inst: Air.Inst.Index) !CValue {
// Ensure complete type definition is visible before accessing fields.
_ = try f.typeToIndex(struct_ty, .complete);
- const field_name: CValue = switch (struct_ty.ip_index) {
- .none => switch (struct_ty.tag()) {
- else => unreachable,
- },
- else => switch (mod.intern_pool.indexToKey(struct_ty.ip_index)) {
- .struct_type => switch (struct_ty.containerLayout(mod)) {
- .Auto, .Extern => if (struct_ty.isSimpleTuple(mod))
- .{ .field = extra.field_index }
- else
- .{ .identifier = struct_ty.structFieldName(extra.field_index, mod) },
- .Packed => {
- const struct_obj = mod.typeToStruct(struct_ty).?;
- const int_info = struct_ty.intInfo(mod);
-
- const bit_offset_ty = try mod.intType(.unsigned, Type.smallestUnsignedBits(int_info.bits - 1));
+ const field_name: CValue = switch (mod.intern_pool.indexToKey(struct_ty.ip_index)) {
+ .struct_type => switch (struct_ty.containerLayout(mod)) {
+ .Auto, .Extern => if (struct_ty.isSimpleTuple(mod))
+ .{ .field = extra.field_index }
+ else
+ .{ .identifier = struct_ty.structFieldName(extra.field_index, mod) },
+ .Packed => {
+ const struct_obj = mod.typeToStruct(struct_ty).?;
+ const int_info = struct_ty.intInfo(mod);
- const bit_offset = struct_obj.packedFieldBitOffset(mod, extra.field_index);
- const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset);
+ const bit_offset_ty = try mod.intType(.unsigned, Type.smallestUnsignedBits(int_info.bits - 1));
- const field_int_signedness = if (inst_ty.isAbiInt(mod))
- inst_ty.intInfo(mod).signedness
- else
- .unsigned;
- const field_int_ty = try mod.intType(field_int_signedness, @intCast(u16, inst_ty.bitSize(mod)));
+ const bit_offset = struct_obj.packedFieldBitOffset(mod, extra.field_index);
+ const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset);
- const temp_local = try f.allocLocal(inst, field_int_ty);
- try f.writeCValue(writer, temp_local, .Other);
- try writer.writeAll(" = zig_wrap_");
- try f.object.dg.renderTypeForBuiltinFnName(writer, field_int_ty);
- try writer.writeAll("((");
- try f.renderType(writer, field_int_ty);
+ const field_int_signedness = if (inst_ty.isAbiInt(mod))
+ inst_ty.intInfo(mod).signedness
+ else
+ .unsigned;
+ const field_int_ty = try mod.intType(field_int_signedness, @intCast(u16, inst_ty.bitSize(mod)));
+
+ const temp_local = try f.allocLocal(inst, field_int_ty);
+ try f.writeCValue(writer, temp_local, .Other);
+ try writer.writeAll(" = zig_wrap_");
+ try f.object.dg.renderTypeForBuiltinFnName(writer, field_int_ty);
+ try writer.writeAll("((");
+ try f.renderType(writer, field_int_ty);
+ try writer.writeByte(')');
+ const cant_cast = int_info.bits > 64;
+ if (cant_cast) {
+ if (field_int_ty.bitSize(mod) > 64) return f.fail("TODO: C backend: implement casting between types > 64 bits", .{});
+ try writer.writeAll("zig_lo_");
+ try f.object.dg.renderTypeForBuiltinFnName(writer, struct_ty);
+ try writer.writeByte('(');
+ }
+ if (bit_offset > 0) {
+ try writer.writeAll("zig_shr_");
+ try f.object.dg.renderTypeForBuiltinFnName(writer, struct_ty);
+ try writer.writeByte('(');
+ }
+ try f.writeCValue(writer, struct_byval, .Other);
+ if (bit_offset > 0) {
+ try writer.writeAll(", ");
+ try f.object.dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument);
try writer.writeByte(')');
- const cant_cast = int_info.bits > 64;
- if (cant_cast) {
- if (field_int_ty.bitSize(mod) > 64) return f.fail("TODO: C backend: implement casting between types > 64 bits", .{});
- try writer.writeAll("zig_lo_");
- try f.object.dg.renderTypeForBuiltinFnName(writer, struct_ty);
- try writer.writeByte('(');
- }
- if (bit_offset > 0) {
- try writer.writeAll("zig_shr_");
- try f.object.dg.renderTypeForBuiltinFnName(writer, struct_ty);
- try writer.writeByte('(');
- }
- try f.writeCValue(writer, struct_byval, .Other);
- if (bit_offset > 0) {
- try writer.writeAll(", ");
- try f.object.dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument);
- try writer.writeByte(')');
- }
- if (cant_cast) try writer.writeByte(')');
- try f.object.dg.renderBuiltinInfo(writer, field_int_ty, .bits);
- try writer.writeAll(");\n");
- if (inst_ty.eql(field_int_ty, f.object.dg.module)) return temp_local;
+ }
+ if (cant_cast) try writer.writeByte(')');
+ try f.object.dg.renderBuiltinInfo(writer, field_int_ty, .bits);
+ try writer.writeAll(");\n");
+ if (inst_ty.eql(field_int_ty, f.object.dg.module)) return temp_local;
- const local = try f.allocLocal(inst, inst_ty);
- try writer.writeAll("memcpy(");
- try f.writeCValue(writer, .{ .local_ref = local.new_local }, .FunctionArgument);
- try writer.writeAll(", ");
- try f.writeCValue(writer, .{ .local_ref = temp_local.new_local }, .FunctionArgument);
- try writer.writeAll(", sizeof(");
- try f.renderType(writer, inst_ty);
- try writer.writeAll("));\n");
- try freeLocal(f, inst, temp_local.new_local, 0);
- return local;
- },
+ const local = try f.allocLocal(inst, inst_ty);
+ try writer.writeAll("memcpy(");
+ try f.writeCValue(writer, .{ .local_ref = local.new_local }, .FunctionArgument);
+ try writer.writeAll(", ");
+ try f.writeCValue(writer, .{ .local_ref = temp_local.new_local }, .FunctionArgument);
+ try writer.writeAll(", sizeof(");
+ try f.renderType(writer, inst_ty);
+ try writer.writeAll("));\n");
+ try freeLocal(f, inst, temp_local.new_local, 0);
+ return local;
},
+ },
- .anon_struct_type => |anon_struct_type| if (anon_struct_type.names.len == 0)
- .{ .field = extra.field_index }
- else
- .{ .identifier = struct_ty.structFieldName(extra.field_index, mod) },
+ .anon_struct_type => |anon_struct_type| if (anon_struct_type.names.len == 0)
+ .{ .field = extra.field_index }
+ else
+ .{ .identifier = struct_ty.structFieldName(extra.field_index, mod) },
+
+ .union_type => |union_type| field_name: {
+ const union_obj = mod.unionPtr(union_type.index);
+ if (union_obj.layout == .Packed) {
+ const operand_lval = if (struct_byval == .constant) blk: {
+ const operand_local = try f.allocLocal(inst, struct_ty);
+ try f.writeCValue(writer, operand_local, .Other);
+ try writer.writeAll(" = ");
+ try f.writeCValue(writer, struct_byval, .Initializer);
+ try writer.writeAll(";\n");
+ break :blk operand_local;
+ } else struct_byval;
- .union_type => |union_type| field_name: {
- const union_obj = mod.unionPtr(union_type.index);
- if (union_obj.layout == .Packed) {
- const operand_lval = if (struct_byval == .constant) blk: {
- const operand_local = try f.allocLocal(inst, struct_ty);
- try f.writeCValue(writer, operand_local, .Other);
- try writer.writeAll(" = ");
- try f.writeCValue(writer, struct_byval, .Initializer);
- try writer.writeAll(";\n");
- break :blk operand_local;
- } else struct_byval;
-
- const local = try f.allocLocal(inst, inst_ty);
- try writer.writeAll("memcpy(&");
- try f.writeCValue(writer, local, .Other);
- try writer.writeAll(", &");
- try f.writeCValue(writer, operand_lval, .Other);
- try writer.writeAll(", sizeof(");
- try f.renderType(writer, inst_ty);
- try writer.writeAll("));\n");
-
- if (struct_byval == .constant) {
- try freeLocal(f, inst, operand_lval.new_local, 0);
- }
+ const local = try f.allocLocal(inst, inst_ty);
+ try writer.writeAll("memcpy(&");
+ try f.writeCValue(writer, local, .Other);
+ try writer.writeAll(", &");
+ try f.writeCValue(writer, operand_lval, .Other);
+ try writer.writeAll(", sizeof(");
+ try f.renderType(writer, inst_ty);
+ try writer.writeAll("));\n");
- return local;
- } else {
- const name = union_obj.fields.keys()[extra.field_index];
- break :field_name if (union_type.hasTag()) .{
- .payload_identifier = name,
- } else .{
- .identifier = name,
- };
+ if (struct_byval == .constant) {
+ try freeLocal(f, inst, operand_lval.new_local, 0);
}
- },
- else => unreachable,
+
+ return local;
+ } else {
+ const name = union_obj.fields.keys()[extra.field_index];
+ break :field_name if (union_type.hasTag()) .{
+ .payload_identifier = name,
+ } else .{
+ .identifier = name,
+ };
+ }
},
+ else => unreachable,
};
const local = try f.allocLocal(inst, inst_ty);