authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-02-17 05:33:47-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-02-20 23:48:36-05:00
logd513792afa4893c21d5a9635c61d8e41689d9541
tree86b95dff5cb51514f671f961c40c8e610307e73b
parent7768d2024bfbb4aad143fb8a4143e324445bfd93

CBE: fix comptime checks


1 files changed, 41 insertions(+), 39 deletions(-)

src/codegen/c/type.zig+41-39
......@@ -817,8 +817,10 @@ pub const CType = extern union {
817817 .Struct, .Union => |zig_tag| if (ty.isTupleOrAnonStruct()) {
818818 if (lookup.isMutable()) {
819819 for (0..ty.structFieldCount()) |field_i| {
820 if (ty.structFieldIsComptime(field_i)) continue;
821 _ = try lookup.typeToIndex(ty.structFieldType(field_i), switch (kind) {
820 const field_ty = ty.structFieldType(field_i);
821 if (ty.structFieldIsComptime(field_i) or
822 !field_ty.hasRuntimeBitsIgnoreComptime()) continue;
823 _ = try lookup.typeToIndex(field_ty, switch (kind) {
822824 .forward, .complete, .parameter => .complete,
823825 .global => .global,
824826 });
......@@ -842,16 +844,13 @@ pub const CType = extern union {
842844 .Union => ty.cast(Type.Payload.Union).?.data.fields.count(),
843845 else => unreachable,
844846 }) |field_i| {
845 if (zig_tag == .Struct and ty.structFieldIsComptime(field_i))
846 continue;
847 _ = try lookup.typeToIndex(
848 ty.structFieldType(field_i),
849 switch (kind) {
850 .forward => unreachable,
851 .complete, .parameter => .complete,
852 .global => .global,
853 },
854 );
847 const field_ty = ty.structFieldType(field_i);
848 if (!field_ty.hasRuntimeBitsIgnoreComptime()) continue;
849 _ = try lookup.typeToIndex(field_ty, switch (kind) {
850 .forward => unreachable,
851 .complete, .parameter => .complete,
852 .global => .global,
853 });
855854 }
856855 _ = try lookup.typeToIndex(ty, .forward);
857856 }
......@@ -953,9 +952,9 @@ pub const CType = extern union {
953952 .forward => .forward,
954953 .complete, .parameter, .global => .complete,
955954 });
956 for (info.param_types, 0..) |param_ty, param_i| {
957 if (info.paramIsComptime(param_i)) continue;
958 _ = try lookup.typeToIndex(param_ty, switch (kind) {
955 for (info.param_types) |param_type| {
956 if (!param_type.hasRuntimeBitsIgnoreComptime()) continue;
957 _ = try lookup.typeToIndex(param_type, switch (kind) {
959958 .forward => .forward,
960959 .complete, .parameter, .global => unreachable,
961960 });
......@@ -1118,28 +1117,28 @@ pub const CType = extern union {
11181117
11191118 var c_fields_len: usize = 0;
11201119 for (0..fields_len) |field_i| {
1121 if (ty.structFieldIsComptime(field_i)) continue;
1120 const field_ty = ty.structFieldType(field_i);
1121 if (ty.structFieldIsComptime(field_i) or
1122 !field_ty.hasRuntimeBitsIgnoreComptime()) continue;
11221123 c_fields_len += 1;
11231124 }
11241125
11251126 const fields_pl = try arena.alloc(Payload.Fields.Field, c_fields_len);
11261127 var c_field_i: usize = 0;
11271128 for (0..fields_len) |field_i| {
1128 if (ty.structFieldIsComptime(field_i)) continue;
1129 const field_ty = ty.structFieldType(field_i);
1130 if (ty.structFieldIsComptime(field_i) or
1131 !field_ty.hasRuntimeBitsIgnoreComptime()) continue;
11291132
11301133 fields_pl[c_field_i] = .{
11311134 .name = try if (ty.isSimpleTuple())
11321135 std.fmt.allocPrintZ(arena, "f{}", .{field_i})
11331136 else
11341137 arena.dupeZ(u8, ty.structFieldName(field_i)),
1135 .type = store.set.typeToIndex(
1136 ty.structFieldType(field_i),
1137 target,
1138 switch (kind) {
1139 .forward, .complete, .parameter => .complete,
1140 .global => .global,
1141 },
1142 ).?,
1138 .type = store.set.typeToIndex(field_ty, target, switch (kind) {
1139 .forward, .complete, .parameter => .complete,
1140 .global => .global,
1141 }).?,
11431142 .alignas = ty.structFieldAlign(field_i, target),
11441143 };
11451144 c_field_i += 1;
......@@ -1211,16 +1210,16 @@ pub const CType = extern union {
12111210 };
12121211
12131212 var c_params_len: usize = 0;
1214 for (0..info.param_types.len) |param_i| {
1215 if (info.paramIsComptime(param_i)) continue;
1213 for (info.param_types) |param_type| {
1214 if (!param_type.hasRuntimeBitsIgnoreComptime()) continue;
12161215 c_params_len += 1;
12171216 }
12181217
12191218 const params_pl = try arena.alloc(Index, c_params_len);
12201219 var c_param_i: usize = 0;
1221 for (info.param_types, 0..) |param_ty, param_i| {
1222 if (info.paramIsComptime(param_i)) continue;
1223 params_pl[c_param_i] = store.set.typeToIndex(param_ty, target, recurse_kind).?;
1220 for (info.param_types) |param_type| {
1221 if (!param_type.hasRuntimeBitsIgnoreComptime()) continue;
1222 params_pl[c_param_i] = store.set.typeToIndex(param_type, target, recurse_kind).?;
12241223 c_param_i += 1;
12251224 }
12261225
......@@ -1294,7 +1293,9 @@ pub const CType = extern union {
12941293
12951294 var c_field_i: usize = 0;
12961295 for (0..ty.structFieldCount()) |field_i| {
1297 if (ty.structFieldIsComptime(field_i)) continue;
1296 const field_ty = ty.structFieldType(field_i);
1297 if (ty.structFieldIsComptime(field_i) or
1298 !field_ty.hasRuntimeBitsIgnoreComptime()) continue;
12981299
12991300 const c_field = &c_fields[c_field_i];
13001301 c_field_i += 1;
......@@ -1344,10 +1345,9 @@ pub const CType = extern union {
13441345 if (info.param_types.len != data.param_types.len or
13451346 !self.eqlRecurse(info.return_type, data.return_type, recurse_kind))
13461347 return false;
1347 for (info.param_types, data.param_types, 0..) |param_ty, param_cty, param_i| {
1348 if (info.paramIsComptime(param_i)) continue;
1349 if (!self.eqlRecurse(param_ty, param_cty, recurse_kind))
1350 return false;
1348 for (info.param_types, data.param_types) |param_ty, param_cty| {
1349 if (!param_ty.hasRuntimeBitsIgnoreComptime()) continue;
1350 if (!self.eqlRecurse(param_ty, param_cty, recurse_kind)) return false;
13511351 }
13521352 return true;
13531353 },
......@@ -1389,7 +1389,9 @@ pub const CType = extern union {
13891389 std.fmt.count("f{}", .{std.math.maxInt(usize)})
13901390 ]u8 = undefined;
13911391 for (0..ty.structFieldCount()) |field_i| {
1392 if (ty.structFieldIsComptime(field_i)) continue;
1392 const field_ty = ty.structFieldType(field_i);
1393 if (ty.structFieldIsComptime(field_i) or
1394 !field_ty.hasRuntimeBitsIgnoreComptime()) continue;
13931395
13941396 self.updateHasherRecurse(
13951397 hasher,
......@@ -1423,9 +1425,9 @@ pub const CType = extern union {
14231425 };
14241426
14251427 self.updateHasherRecurse(hasher, info.return_type, recurse_kind);
1426 for (info.param_types, 0..) |param_ty, param_i| {
1427 if (info.paramIsComptime(param_i)) continue;
1428 self.updateHasherRecurse(hasher, param_ty, recurse_kind);
1428 for (info.param_types) |param_type| {
1429 if (!param_type.hasRuntimeBitsIgnoreComptime()) continue;
1430 self.updateHasherRecurse(hasher, param_type, recurse_kind);
14291431 }
14301432 },
14311433