| ... | @@ -1376,70 +1376,24 @@ pub const DeclGen = struct { | ... | @@ -1376,70 +1376,24 @@ pub const DeclGen = struct { |
| 1376 | } | 1376 | } |
| 1377 | try writer.writeByte('}'); | 1377 | try writer.writeByte('}'); |
| 1378 | }, | 1378 | }, |
| 1379 | .struct_type => |struct_type| switch (struct_type.layout) { | 1379 | .struct_type => { |
| 1380 | .Auto, .Extern => { | 1380 | const struct_type = ip.loadStructType(ty.toIntern()); |
| 1381 | if (!location.isInitializer()) { | 1381 | switch (struct_type.layout) { |
| 1382 | try writer.writeByte('('); | 1382 | .Auto, .Extern => { |
| 1383 | try dg.renderType(writer, ty); | 1383 | if (!location.isInitializer()) { |
| 1384 | try writer.writeByte(')'); | | |
| 1385 | } | | |
| 1386 | | | |
| 1387 | try writer.writeByte('{'); | | |
| 1388 | var empty = true; | | |
| 1389 | for (0..struct_type.field_types.len) |field_index| { | | |
| 1390 | const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); | | |
| 1391 | if (struct_type.fieldIsComptime(ip, field_index)) continue; | | |
| 1392 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; | | |
| 1393 | | | |
| 1394 | if (!empty) try writer.writeByte(','); | | |
| 1395 | const field_val = switch (ip.indexToKey(val.ip_index).aggregate.storage) { | | |
| 1396 | .bytes => |bytes| try ip.get(mod.gpa, .{ .int = .{ | | |
| 1397 | .ty = field_ty.toIntern(), | | |
| 1398 | .storage = .{ .u64 = bytes[field_index] }, | | |
| 1399 | } }), | | |
| 1400 | .elems => |elems| elems[field_index], | | |
| 1401 | .repeated_elem => |elem| elem, | | |
| 1402 | }; | | |
| 1403 | try dg.renderValue(writer, field_ty, Value.fromInterned(field_val), initializer_type); | | |
| 1404 | | | |
| 1405 | empty = false; | | |
| 1406 | } | | |
| 1407 | try writer.writeByte('}'); | | |
| 1408 | }, | | |
| 1409 | .Packed => { | | |
| 1410 | const int_info = ty.intInfo(mod); | | |
| 1411 | | | |
| 1412 | const bits = Type.smallestUnsignedBits(int_info.bits - 1); | | |
| 1413 | const bit_offset_ty = try mod.intType(.unsigned, bits); | | |
| 1414 | | | |
| 1415 | var bit_offset: u64 = 0; | | |
| 1416 | var eff_num_fields: usize = 0; | | |
| 1417 | | | |
| 1418 | for (0..struct_type.field_types.len) |field_index| { | | |
| 1419 | const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); | | |
| 1420 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; | | |
| 1421 | eff_num_fields += 1; | | |
| 1422 | } | | |
| 1423 | | | |
| 1424 | if (eff_num_fields == 0) { | | |
| 1425 | try writer.writeByte('('); | | |
| 1426 | try dg.renderValue(writer, ty, Value.undef, initializer_type); | | |
| 1427 | try writer.writeByte(')'); | | |
| 1428 | } else if (ty.bitSize(mod) > 64) { | | |
| 1429 | // zig_or_u128(zig_or_u128(zig_shl_u128(a, a_off), zig_shl_u128(b, b_off)), zig_shl_u128(c, c_off)) | | |
| 1430 | var num_or = eff_num_fields - 1; | | |
| 1431 | while (num_or > 0) : (num_or -= 1) { | | |
| 1432 | try writer.writeAll("zig_or_"); | | |
| 1433 | try dg.renderTypeForBuiltinFnName(writer, ty); | | |
| 1434 | try writer.writeByte('('); | 1384 | try writer.writeByte('('); |
| | 1385 | try dg.renderType(writer, ty); |
| | 1386 | try writer.writeByte(')'); |
| 1435 | } | 1387 | } |
| 1436 | | 1388 | |
| 1437 | var eff_index: usize = 0; | 1389 | try writer.writeByte('{'); |
| 1438 | var needs_closing_paren = false; | 1390 | var empty = true; |
| 1439 | for (0..struct_type.field_types.len) |field_index| { | 1391 | for (0..struct_type.field_types.len) |field_index| { |
| 1440 | const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); | 1392 | const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); |
| | 1393 | if (struct_type.fieldIsComptime(ip, field_index)) continue; |
| 1441 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; | 1394 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; |
| 1442 | | 1395 | |
| | 1396 | if (!empty) try writer.writeByte(','); |
| 1443 | const field_val = switch (ip.indexToKey(val.ip_index).aggregate.storage) { | 1397 | const field_val = switch (ip.indexToKey(val.ip_index).aggregate.storage) { |
| 1444 | .bytes => |bytes| try ip.get(mod.gpa, .{ .int = .{ | 1398 | .bytes => |bytes| try ip.get(mod.gpa, .{ .int = .{ |
| 1445 | .ty = field_ty.toIntern(), | 1399 | .ty = field_ty.toIntern(), |
| ... | @@ -1448,62 +1402,113 @@ pub const DeclGen = struct { | ... | @@ -1448,62 +1402,113 @@ pub const DeclGen = struct { |
| 1448 | .elems => |elems| elems[field_index], | 1402 | .elems => |elems| elems[field_index], |
| 1449 | .repeated_elem => |elem| elem, | 1403 | .repeated_elem => |elem| elem, |
| 1450 | }; | 1404 | }; |
| 1451 | const cast_context = IntCastContext{ .value = .{ .value = Value.fromInterned(field_val) } }; | 1405 | try dg.renderValue(writer, field_ty, Value.fromInterned(field_val), initializer_type); |
| 1452 | if (bit_offset != 0) { | | |
| 1453 | try writer.writeAll("zig_shl_"); | | |
| 1454 | try dg.renderTypeForBuiltinFnName(writer, ty); | | |
| 1455 | try writer.writeByte('('); | | |
| 1456 | try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument); | | |
| 1457 | try writer.writeAll(", "); | | |
| 1458 | const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset); | | |
| 1459 | try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); | | |
| 1460 | try writer.writeByte(')'); | | |
| 1461 | } else { | | |
| 1462 | try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument); | | |
| 1463 | } | | |
| 1464 | | | |
| 1465 | if (needs_closing_paren) try writer.writeByte(')'); | | |
| 1466 | if (eff_index != eff_num_fields - 1) try writer.writeAll(", "); | | |
| 1467 | | 1406 | |
| 1468 | bit_offset += field_ty.bitSize(mod); | 1407 | empty = false; |
| 1469 | needs_closing_paren = true; | | |
| 1470 | eff_index += 1; | | |
| 1471 | } | 1408 | } |
| 1472 | } else { | 1409 | try writer.writeByte('}'); |
| 1473 | try writer.writeByte('('); | 1410 | }, |
| 1474 | // a << a_off | b << b_off | c << c_off | 1411 | .Packed => { |
| 1475 | var empty = true; | 1412 | const int_info = ty.intInfo(mod); |
| | 1413 | |
| | 1414 | const bits = Type.smallestUnsignedBits(int_info.bits - 1); |
| | 1415 | const bit_offset_ty = try mod.intType(.unsigned, bits); |
| | 1416 | |
| | 1417 | var bit_offset: u64 = 0; |
| | 1418 | var eff_num_fields: usize = 0; |
| | 1419 | |
| 1476 | for (0..struct_type.field_types.len) |field_index| { | 1420 | for (0..struct_type.field_types.len) |field_index| { |
| 1477 | const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); | 1421 | const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); |
| 1478 | if (struct_type.fieldIsComptime(ip, field_index)) continue; | | |
| 1479 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; | 1422 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; |
| | 1423 | eff_num_fields += 1; |
| | 1424 | } |
| 1480 | | 1425 | |
| 1481 | if (!empty) try writer.writeByte(','); | 1426 | if (eff_num_fields == 0) { |
| 1482 | const field_val = switch (ip.indexToKey(val.ip_index).aggregate.storage) { | 1427 | try writer.writeByte('('); |
| 1483 | .bytes => |bytes| try ip.get(mod.gpa, .{ .int = .{ | 1428 | try dg.renderValue(writer, ty, Value.undef, initializer_type); |
| 1484 | .ty = field_ty.toIntern(), | 1429 | try writer.writeByte(')'); |
| 1485 | .storage = .{ .u64 = bytes[field_index] }, | 1430 | } else if (ty.bitSize(mod) > 64) { |
| 1486 | } }), | 1431 | // zig_or_u128(zig_or_u128(zig_shl_u128(a, a_off), zig_shl_u128(b, b_off)), zig_shl_u128(c, c_off)) |
| 1487 | .elems => |elems| elems[field_index], | 1432 | var num_or = eff_num_fields - 1; |
| 1488 | .repeated_elem => |elem| elem, | 1433 | while (num_or > 0) : (num_or -= 1) { |
| 1489 | }; | 1434 | try writer.writeAll("zig_or_"); |
| 1490 | try dg.renderValue(writer, field_ty, Value.fromInterned(field_val), initializer_type); | 1435 | try dg.renderTypeForBuiltinFnName(writer, ty); |
| | 1436 | try writer.writeByte('('); |
| | 1437 | } |
| 1491 | | 1438 | |
| 1492 | if (bit_offset != 0) { | 1439 | var eff_index: usize = 0; |
| 1493 | try dg.renderValue(writer, field_ty, Value.fromInterned(field_val), .Other); | 1440 | var needs_closing_paren = false; |
| 1494 | try writer.writeAll(" << "); | 1441 | for (0..struct_type.field_types.len) |field_index| { |
| 1495 | const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset); | 1442 | const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); |
| 1496 | try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); | 1443 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; |
| 1497 | } else { | 1444 | |
| 1498 | try dg.renderValue(writer, field_ty, Value.fromInterned(field_val), .Other); | 1445 | const field_val = switch (ip.indexToKey(val.ip_index).aggregate.storage) { |
| | 1446 | .bytes => |bytes| try ip.get(mod.gpa, .{ .int = .{ |
| | 1447 | .ty = field_ty.toIntern(), |
| | 1448 | .storage = .{ .u64 = bytes[field_index] }, |
| | 1449 | } }), |
| | 1450 | .elems => |elems| elems[field_index], |
| | 1451 | .repeated_elem => |elem| elem, |
| | 1452 | }; |
| | 1453 | const cast_context = IntCastContext{ .value = .{ .value = Value.fromInterned(field_val) } }; |
| | 1454 | if (bit_offset != 0) { |
| | 1455 | try writer.writeAll("zig_shl_"); |
| | 1456 | try dg.renderTypeForBuiltinFnName(writer, ty); |
| | 1457 | try writer.writeByte('('); |
| | 1458 | try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument); |
| | 1459 | try writer.writeAll(", "); |
| | 1460 | const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset); |
| | 1461 | try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); |
| | 1462 | try writer.writeByte(')'); |
| | 1463 | } else { |
| | 1464 | try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument); |
| | 1465 | } |
| | 1466 | |
| | 1467 | if (needs_closing_paren) try writer.writeByte(')'); |
| | 1468 | if (eff_index != eff_num_fields - 1) try writer.writeAll(", "); |
| | 1469 | |
| | 1470 | bit_offset += field_ty.bitSize(mod); |
| | 1471 | needs_closing_paren = true; |
| | 1472 | eff_index += 1; |
| 1499 | } | 1473 | } |
| | 1474 | } else { |
| | 1475 | try writer.writeByte('('); |
| | 1476 | // a << a_off | b << b_off | c << c_off |
| | 1477 | var empty = true; |
| | 1478 | for (0..struct_type.field_types.len) |field_index| { |
| | 1479 | const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]); |
| | 1480 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; |
| 1500 | | 1481 | |
| 1501 | bit_offset += field_ty.bitSize(mod); | 1482 | if (!empty) try writer.writeAll(" | "); |
| 1502 | empty = false; | 1483 | try writer.writeByte('('); |
| | 1484 | try dg.renderType(writer, ty); |
| | 1485 | try writer.writeByte(')'); |
| | 1486 | |
| | 1487 | const field_val = switch (ip.indexToKey(val.ip_index).aggregate.storage) { |
| | 1488 | .bytes => |bytes| try ip.get(mod.gpa, .{ .int = .{ |
| | 1489 | .ty = field_ty.toIntern(), |
| | 1490 | .storage = .{ .u64 = bytes[field_index] }, |
| | 1491 | } }), |
| | 1492 | .elems => |elems| elems[field_index], |
| | 1493 | .repeated_elem => |elem| elem, |
| | 1494 | }; |
| | 1495 | |
| | 1496 | if (bit_offset != 0) { |
| | 1497 | try dg.renderValue(writer, field_ty, Value.fromInterned(field_val), .Other); |
| | 1498 | try writer.writeAll(" << "); |
| | 1499 | const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset); |
| | 1500 | try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); |
| | 1501 | } else { |
| | 1502 | try dg.renderValue(writer, field_ty, Value.fromInterned(field_val), .Other); |
| | 1503 | } |
| | 1504 | |
| | 1505 | bit_offset += field_ty.bitSize(mod); |
| | 1506 | empty = false; |
| | 1507 | } |
| | 1508 | try writer.writeByte(')'); |
| 1503 | } | 1509 | } |
| 1504 | try writer.writeByte('}'); | 1510 | }, |
| 1505 | } | 1511 | } |
| 1506 | }, | | |
| 1507 | }, | 1512 | }, |
| 1508 | else => unreachable, | 1513 | else => unreachable, |
| 1509 | }, | 1514 | }, |