authorgravatar for daniele.cocca@gmail.comDaniele Cocca <daniele.cocca@gmail.com> 2021-11-13 02:44:16+00:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-11-14 22:49:50-05:00
log29f531bec9fd8cedc0e0da0981d1a71bb3348641
tree4206ee60cdc1be5a58d4fd38d3a70567e050a174
parentc61fbe77c8689709aac4adfa78b27ed7ea53ee5f

CBE: memset(..., 0xaa, ...) undefined values

This commit makes airStore() handle undefined values directly instead of delegating to renderValue(): the call to renderValue() happens too late, when "dest = " has already been written to the stream, at which point there's no sane way to initialize e.g. struct values by assignment. Instead, we make airStore() use memset(dest, 0xaa, sizeof(dest)), which should transparently handle all types. Also moves the newly-passing tests to the top of test/behavior.zig.

2 files changed, 45 insertions(+), 6 deletions(-)

src/codegen/c.zig+39
......@@ -1470,12 +1470,51 @@ fn airBoolToInt(f: *Function, inst: Air.Inst.Index) !CValue {
14701470 return local;
14711471}
14721472
1473fn airStoreUndefined(f: *Function, dest_ptr: CValue) !CValue {
1474 const is_debug_build = f.object.dg.module.optimizeMode() == .Debug;
1475 if (!is_debug_build)
1476 return CValue.none;
1477
1478 const writer = f.object.writer();
1479 switch (dest_ptr) {
1480 .local_ref => |i| {
1481 const dest: CValue = .{ .local = i };
1482 try writer.writeAll("memset(&");
1483 try f.writeCValue(writer, dest);
1484 try writer.writeAll(", 0xaa, sizeof(");
1485 try f.writeCValue(writer, dest);
1486 try writer.writeAll("));\n");
1487 },
1488 .decl_ref => |decl| {
1489 const dest: CValue = .{ .decl = decl };
1490 try writer.writeAll("memset(&");
1491 try f.writeCValue(writer, dest);
1492 try writer.writeAll(", 0xaa, sizeof(");
1493 try f.writeCValue(writer, dest);
1494 try writer.writeAll("));\n");
1495 },
1496 else => {
1497 try writer.writeAll("memset(");
1498 try f.writeCValue(writer, dest_ptr);
1499 try writer.writeAll(", 0xaa, sizeof(*");
1500 try f.writeCValue(writer, dest_ptr);
1501 try writer.writeAll("));\n");
1502 },
1503 }
1504 return CValue.none;
1505}
1506
14731507fn airStore(f: *Function, inst: Air.Inst.Index) !CValue {
14741508 // *a = b;
14751509 const bin_op = f.air.instructions.items(.data)[inst].bin_op;
14761510 const dest_ptr = try f.resolveInst(bin_op.lhs);
14771511 const src_val = try f.resolveInst(bin_op.rhs);
14781512
1513 const src_val_is_undefined =
1514 if (f.air.value(bin_op.rhs)) |v| v.isUndef() else false;
1515 if (src_val_is_undefined)
1516 return try airStoreUndefined(f, dest_ptr);
1517
14791518 const writer = f.object.writer();
14801519 switch (dest_ptr) {
14811520 .local_ref => |i| {
test/behavior.zig+6-6
......@@ -5,12 +5,15 @@ test {
55 _ = @import("behavior/basic.zig");
66 _ = @import("behavior/bitcast.zig");
77 _ = @import("behavior/bool.zig");
8 _ = @import("behavior/bugs/624.zig");
89 _ = @import("behavior/bugs/655.zig");
910 _ = @import("behavior/bugs/679.zig");
1011 _ = @import("behavior/bugs/704.zig");
1112 _ = @import("behavior/bugs/1486.zig");
1213 _ = @import("behavior/bugs/2346.zig");
14 _ = @import("behavior/bugs/2692.zig");
1315 _ = @import("behavior/bugs/2889.zig");
16 _ = @import("behavior/bugs/3586.zig");
1417 _ = @import("behavior/bugs/4560.zig");
1518 _ = @import("behavior/bugs/4769_a.zig");
1619 _ = @import("behavior/bugs/4769_b.zig");
......@@ -30,6 +33,9 @@ test {
3033 _ = @import("behavior/underscore.zig");
3134 _ = @import("behavior/usingnamespace.zig");
3235 _ = @import("behavior/while.zig");
36 _ = @import("behavior/this.zig");
37 _ = @import("behavior/member_func.zig");
38 _ = @import("behavior/translate_c_macros.zig");
3339
3440 if (builtin.object_format != .c) {
3541 // Tests that pass for stage1 and stage2 but not the C backend.
......@@ -38,14 +44,11 @@ test {
3844 _ = @import("behavior/atomics.zig");
3945 _ = @import("behavior/basic_llvm.zig");
4046 _ = @import("behavior/bugs/394.zig");
41 _ = @import("behavior/bugs/624.zig");
4247 _ = @import("behavior/bugs/1277.zig");
4348 _ = @import("behavior/bugs/1500.zig");
4449 _ = @import("behavior/bugs/1741.zig");
4550 _ = @import("behavior/bugs/2006.zig");
46 _ = @import("behavior/bugs/2692.zig");
4751 _ = @import("behavior/bugs/3112.zig");
48 _ = @import("behavior/bugs/3586.zig");
4952 _ = @import("behavior/cast.zig");
5053 _ = @import("behavior/error.zig");
5154 _ = @import("behavior/eval.zig");
......@@ -55,7 +58,6 @@ test {
5558 _ = @import("behavior/generics.zig");
5659 _ = @import("behavior/math.zig");
5760 _ = @import("behavior/maximum_minimum.zig");
58 _ = @import("behavior/member_func.zig");
5961 _ = @import("behavior/null_llvm.zig");
6062 _ = @import("behavior/optional.zig");
6163 _ = @import("behavior/pointers.zig");
......@@ -65,8 +67,6 @@ test {
6567 _ = @import("behavior/slice.zig");
6668 _ = @import("behavior/struct_llvm.zig");
6769 _ = @import("behavior/switch.zig");
68 _ = @import("behavior/this.zig");
69 _ = @import("behavior/translate_c_macros.zig");
7070 _ = @import("behavior/union.zig");
7171 _ = @import("behavior/widening.zig");
7272