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