| ... | ... | @@ -1431,6 +1431,8 @@ fn airLoad(f: *Function, inst: Air.Inst.Index) !CValue { |
| 1431 | 1431 | if (!is_volatile and f.liveness.isUnused(inst)) |
| 1432 | 1432 | return CValue.none; |
| 1433 | 1433 | const inst_ty = f.air.typeOfIndex(inst); |
| 1434 | if (inst_ty.zigTypeTag() == .Array) |
| 1435 | return f.fail("TODO: C backend: implement airLoad for arrays", .{}); |
| 1434 | 1436 | const operand = try f.resolveInst(ty_op.operand); |
| 1435 | 1437 | const writer = f.object.writer(); |
| 1436 | 1438 | const local = try f.allocLocal(inst_ty, .Const); |
| ... | ... | @@ -1557,7 +1559,7 @@ fn airBoolToInt(f: *Function, inst: Air.Inst.Index) !CValue { |
| 1557 | 1559 | return local; |
| 1558 | 1560 | } |
| 1559 | 1561 | |
| 1560 | | fn airStoreUndefined(f: *Function, dest_ptr: CValue) !CValue { |
| 1562 | fn airStoreUndefined(f: *Function, dest_ptr: CValue, dest_type: Type) !CValue { |
| 1561 | 1563 | const is_debug_build = f.object.dg.module.optimizeMode() == .Debug; |
| 1562 | 1564 | if (!is_debug_build) |
| 1563 | 1565 | return CValue.none; |
| ... | ... | @@ -1581,9 +1583,11 @@ fn airStoreUndefined(f: *Function, dest_ptr: CValue) !CValue { |
| 1581 | 1583 | try writer.writeAll("));\n"); |
| 1582 | 1584 | }, |
| 1583 | 1585 | else => { |
| 1586 | const indirection = if (dest_type.zigTypeTag() == .Array) "" else "*"; |
| 1587 | |
| 1584 | 1588 | try writer.writeAll("memset("); |
| 1585 | 1589 | try f.writeCValue(writer, dest_ptr); |
| 1586 | | try writer.writeAll(", 0xaa, sizeof(*"); |
| 1590 | try writer.print(", 0xaa, sizeof({s}", .{indirection}); |
| 1587 | 1591 | try f.writeCValue(writer, dest_ptr); |
| 1588 | 1592 | try writer.writeAll("));\n"); |
| 1589 | 1593 | }, |
| ... | ... | @@ -1596,11 +1600,16 @@ fn airStore(f: *Function, inst: Air.Inst.Index) !CValue { |
| 1596 | 1600 | const bin_op = f.air.instructions.items(.data)[inst].bin_op; |
| 1597 | 1601 | const dest_ptr = try f.resolveInst(bin_op.lhs); |
| 1598 | 1602 | const src_val = try f.resolveInst(bin_op.rhs); |
| 1603 | const lhs_type = f.air.typeOf(bin_op.lhs); |
| 1599 | 1604 | |
| 1600 | 1605 | const src_val_is_undefined = |
| 1601 | 1606 | if (f.air.value(bin_op.rhs)) |v| v.isUndef() else false; |
| 1602 | 1607 | if (src_val_is_undefined) |
| 1603 | | return try airStoreUndefined(f, dest_ptr); |
| 1608 | return try airStoreUndefined(f, dest_ptr, lhs_type); |
| 1609 | |
| 1610 | // Don't check this for airStoreUndefined as that will work for arrays already |
| 1611 | if (lhs_type.zigTypeTag() == .Array) |
| 1612 | return f.fail("TODO: C backend: implement airStore for arrays", .{}); |
| 1604 | 1613 | |
| 1605 | 1614 | const writer = f.object.writer(); |
| 1606 | 1615 | switch (dest_ptr) { |
| ... | ... | @@ -2420,15 +2429,17 @@ fn structFieldPtr(f: *Function, inst: Air.Inst.Index, struct_ptr_ty: Type, struc |
| 2420 | 2429 | const writer = f.object.writer(); |
| 2421 | 2430 | const struct_obj = struct_ptr_ty.elemType().castTag(.@"struct").?.data; |
| 2422 | 2431 | const field_name = struct_obj.fields.keys()[index]; |
| 2432 | const field_val = struct_obj.fields.values()[index]; |
| 2433 | const addrof = if (field_val.ty.zigTypeTag() == .Array) "" else "&"; |
| 2423 | 2434 | |
| 2424 | 2435 | const inst_ty = f.air.typeOfIndex(inst); |
| 2425 | 2436 | const local = try f.allocLocal(inst_ty, .Const); |
| 2426 | 2437 | switch (struct_ptr) { |
| 2427 | 2438 | .local_ref => |i| { |
| 2428 | | try writer.print(" = &t{d}.{};\n", .{ i, fmtIdent(field_name) }); |
| 2439 | try writer.print(" = {s}t{d}.{};\n", .{ addrof, i, fmtIdent(field_name) }); |
| 2429 | 2440 | }, |
| 2430 | 2441 | else => { |
| 2431 | | try writer.writeAll(" = &"); |
| 2442 | try writer.print(" = {s}", .{addrof}); |
| 2432 | 2443 | try f.writeCValue(writer, struct_ptr); |
| 2433 | 2444 | try writer.print("->{};\n", .{fmtIdent(field_name)}); |
| 2434 | 2445 | }, |