authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-10-19 02:10:30-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-10-25 05:11:29-04:00
log912b84bbad698d18a6b844f9c05c074d2880e35b
tree9432636c0915dfdbb3bd23e26aa725debad56d2b
parent6921b0a850771fa7729930a9ec64b27b4e57e79b

cbe: fix atomics


14 files changed, 122 insertions(+), 87 deletions(-)

lib/include/zig.h+34-31
......@@ -101,19 +101,20 @@
101101
102102#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__)
103103#include <stdatomic.h>
104#define zig_atomic(type) _Atomic(type)
104105#define zig_cmpxchg_strong(obj, expected, desired, succ, fail) atomic_compare_exchange_strong_explicit(obj, &(expected), desired, succ, fail)
105#define zig_cmpxchg_weak (obj, expected, desired, succ, fail) atomic_compare_exchange_weak_explicit (obj, &(expected), desired, succ, fail)
106#define zig_cmpxchg_weak(obj, expected, desired, succ, fail) atomic_compare_exchange_weak_explicit (obj, &(expected), desired, succ, fail)
106107#define zig_atomicrmw_xchg(obj, arg, order) atomic_exchange_explicit (obj, arg, order)
107#define zig_atomicrmw_add (obj, arg, order) atomic_fetch_add_explicit (obj, arg, order)
108#define zig_atomicrmw_sub (obj, arg, order) atomic_fetch_sub_explicit (obj, arg, order)
109#define zig_atomicrmw_or (obj, arg, order) atomic_fetch_or_explicit (obj, arg, order)
110#define zig_atomicrmw_xor (obj, arg, order) atomic_fetch_xor_explicit (obj, arg, order)
111#define zig_atomicrmw_and (obj, arg, order) atomic_fetch_and_explicit (obj, arg, order)
112#define zig_atomicrmw_nand(obj, arg, order) atomic_fetch_nand_explicit(obj, arg, order)
113#define zig_atomicrmw_min (obj, arg, order) atomic_fetch_min_explicit (obj, arg, order)
114#define zig_atomicrmw_max (obj, arg, order) atomic_fetch_max_explicit (obj, arg, order)
115#define zig_atomic_store (obj, arg, order) atomic_store_explicit (obj, arg, order)
116#define zig_atomic_load (obj, order) atomic_load_explicit (obj, order)
108#define zig_atomicrmw_add(obj, arg, order) atomic_fetch_add_explicit (obj, arg, order)
109#define zig_atomicrmw_sub(obj, arg, order) atomic_fetch_sub_explicit (obj, arg, order)
110#define zig_atomicrmw_or(obj, arg, order) atomic_fetch_or_explicit (obj, arg, order)
111#define zig_atomicrmw_xor(obj, arg, order) atomic_fetch_xor_explicit (obj, arg, order)
112#define zig_atomicrmw_and(obj, arg, order) atomic_fetch_and_explicit (obj, arg, order)
113#define zig_atomicrmw_nand(obj, arg, order) __atomic_fetch_nand (obj, arg, order)
114#define zig_atomicrmw_min(obj, arg, order) __atomic_fetch_min (obj, arg, order)
115#define zig_atomicrmw_max(obj, arg, order) __atomic_fetch_max (obj, arg, order)
116#define zig_atomic_store(obj, arg, order) atomic_store_explicit (obj, arg, order)
117#define zig_atomic_load(obj, order) atomic_load_explicit (obj, order)
117118#define zig_fence(order) atomic_thread_fence(order)
118119#elif __GNUC__
119120#define memory_order_relaxed __ATOMIC_RELAXED
......@@ -122,19 +123,20 @@
122123#define memory_order_release __ATOMIC_RELEASE
123124#define memory_order_acq_rel __ATOMIC_ACQ_REL
124125#define memory_order_seq_cst __ATOMIC_SEQ_CST
126#define zig_atomic(type) type
125127#define zig_cmpxchg_strong(obj, expected, desired, succ, fail) __atomic_compare_exchange_n(obj, &(expected), desired, false, succ, fail)
126#define zig_cmpxchg_weak (obj, expected, desired, succ, fail) __atomic_compare_exchange_n(obj, &(expected), desired, true , succ, fail)
128#define zig_cmpxchg_weak(obj, expected, desired, succ, fail) __atomic_compare_exchange_n(obj, &(expected), desired, true , succ, fail)
127129#define zig_atomicrmw_xchg(obj, arg, order) __atomic_exchange_n(obj, arg, order)
128#define zig_atomicrmw_add (obj, arg, order) __atomic_fetch_add (obj, arg, order)
129#define zig_atomicrmw_sub (obj, arg, order) __atomic_fetch_sub (obj, arg, order)
130#define zig_atomicrmw_or (obj, arg, order) __atomic_fetch_or (obj, arg, order)
131#define zig_atomicrmw_xor (obj, arg, order) __atomic_fetch_xor (obj, arg, order)
132#define zig_atomicrmw_and (obj, arg, order) __atomic_fetch_and (obj, arg, order)
130#define zig_atomicrmw_add(obj, arg, order) __atomic_fetch_add (obj, arg, order)
131#define zig_atomicrmw_sub(obj, arg, order) __atomic_fetch_sub (obj, arg, order)
132#define zig_atomicrmw_or(obj, arg, order) __atomic_fetch_or (obj, arg, order)
133#define zig_atomicrmw_xor(obj, arg, order) __atomic_fetch_xor (obj, arg, order)
134#define zig_atomicrmw_and(obj, arg, order) __atomic_fetch_and (obj, arg, order)
133135#define zig_atomicrmw_nand(obj, arg, order) __atomic_fetch_nand(obj, arg, order)
134#define zig_atomicrmw_min (obj, arg, order) __atomic_fetch_min (obj, arg, order)
135#define zig_atomicrmw_max (obj, arg, order) __atomic_fetch_max (obj, arg, order)
136#define zig_atomic_store (obj, arg, order) __atomic_store (obj, arg, order)
137#define zig_atomic_load (obj, order) __atomic_load (obj, order)
136#define zig_atomicrmw_min(obj, arg, order) __atomic_fetch_min (obj, arg, order)
137#define zig_atomicrmw_max(obj, arg, order) __atomic_fetch_max (obj, arg, order)
138#define zig_atomic_store(obj, arg, order) __atomic_store_n (obj, arg, order)
139#define zig_atomic_load(obj, order) __atomic_load_n (obj, order)
138140#define zig_fence(order) __atomic_thread_fence(order)
139141#else
140142#define memory_order_relaxed 0
......@@ -143,19 +145,20 @@
143145#define memory_order_release 3
144146#define memory_order_acq_rel 4
145147#define memory_order_seq_cst 5
148#define zig_atomic(type) type
146149#define zig_cmpxchg_strong(obj, expected, desired, succ, fail) zig_unimplemented()
147#define zig_cmpxchg_weak (obj, expected, desired, succ, fail) zig_unimplemented()
150#define zig_cmpxchg_weak(obj, expected, desired, succ, fail) zig_unimplemented()
148151#define zig_atomicrmw_xchg(obj, arg, order) zig_unimplemented()
149#define zig_atomicrmw_add (obj, arg, order) zig_unimplemented()
150#define zig_atomicrmw_sub (obj, arg, order) zig_unimplemented()
151#define zig_atomicrmw_or (obj, arg, order) zig_unimplemented()
152#define zig_atomicrmw_xor (obj, arg, order) zig_unimplemented()
153#define zig_atomicrmw_and (obj, arg, order) zig_unimplemented()
152#define zig_atomicrmw_add(obj, arg, order) zig_unimplemented()
153#define zig_atomicrmw_sub(obj, arg, order) zig_unimplemented()
154#define zig_atomicrmw_or(obj, arg, order) zig_unimplemented()
155#define zig_atomicrmw_xor(obj, arg, order) zig_unimplemented()
156#define zig_atomicrmw_and(obj, arg, order) zig_unimplemented()
154157#define zig_atomicrmw_nand(obj, arg, order) zig_unimplemented()
155#define zig_atomicrmw_min (obj, arg, order) zig_unimplemented()
156#define zig_atomicrmw_max (obj, arg, order) zig_unimplemented()
157#define zig_atomic_store (obj, arg, order) zig_unimplemented()
158#define zig_atomic_load (obj, order) zig_unimplemented()
158#define zig_atomicrmw_min(obj, arg, order) zig_unimplemented()
159#define zig_atomicrmw_max(obj, arg, order) zig_unimplemented()
160#define zig_atomic_store(obj, arg, order) zig_unimplemented()
161#define zig_atomic_load(obj, order) zig_unimplemented()
159162#define zig_fence(order) zig_unimplemented()
160163#endif
161164
src/codegen/c.zig+88-21
......@@ -587,9 +587,9 @@ pub const DeclGen = struct {
587587
588588 try writer.writeByte('(');
589589 try dg.renderTypecast(writer, ty);
590 try writer.writeAll("){ .is_null = ");
590 try writer.writeAll("){ .payload = ");
591591 try dg.renderValue(writer, Type.bool, val, location);
592 try writer.writeAll(", .payload = ");
592 try writer.writeAll(", .is_null = ");
593593 try dg.renderValue(writer, payload_ty, val, location);
594594 return writer.writeAll(" }");
595595 },
......@@ -820,11 +820,13 @@ pub const DeclGen = struct {
820820 try writer.writeAll("){");
821821 if (val.castTag(.opt_payload)) |pl| {
822822 const payload_val = pl.data;
823 try writer.writeAll(" .is_null = false, .payload = ");
823 try writer.writeAll(" .payload = ");
824824 try dg.renderValue(writer, payload_ty, payload_val, location);
825 try writer.writeAll(" }");
825 try writer.writeAll(", .is_null = false }");
826826 } else {
827 try writer.writeAll(" .is_null = true }");
827 try writer.writeAll(" .payload = ");
828 try dg.renderValue(writer, payload_ty, Value.undef, location);
829 try writer.writeAll(", .is_null = true }");
828830 }
829831 },
830832 .ErrorSet => {
......@@ -3870,10 +3872,23 @@ fn airStructFieldVal(f: *Function, inst: Air.Inst.Index) !CValue {
38703872 const payload = if (struct_ty.tag() == .union_tagged or struct_ty.tag() == .union_safety_tagged) "payload." else "";
38713873
38723874 const inst_ty = f.air.typeOfIndex(inst);
3873 const local = try f.allocLocal(inst_ty, .Const);
3874 try writer.writeAll(" = ");
3875 try f.writeCValue(writer, struct_byval);
3876 try writer.print(".{s}{ };\n", .{ payload, fmtIdent(field_name) });
3875 const is_array = inst_ty.zigTypeTag() == .Array;
3876 const local = try f.allocLocal(inst_ty, if (is_array) .Mut else .Const);
3877
3878 if (is_array) {
3879 try writer.writeAll(";\n");
3880 try writer.writeAll("memcpy(");
3881 try f.writeCValue(writer, local);
3882 try writer.writeAll(", ");
3883 try f.writeCValue(writer, struct_byval);
3884 try writer.print(".{s}{ }, sizeof(", .{ payload, fmtIdent(field_name) });
3885 try f.writeCValue(writer, local);
3886 try writer.writeAll("));\n");
3887 } else {
3888 try writer.writeAll(" = ");
3889 try f.writeCValue(writer, struct_byval);
3890 try writer.print(".{s}{ };\n", .{ payload, fmtIdent(field_name) });
3891 }
38773892 return local;
38783893}
38793894
......@@ -3962,9 +3977,9 @@ fn airWrapOptional(f: *Function, inst: Air.Inst.Index) !CValue {
39623977
39633978 // .wrap_optional is used to convert non-optionals into optionals so it can never be null.
39643979 const local = try f.allocLocal(inst_ty, .Const);
3965 try writer.writeAll(" = { .is_null = false, .payload =");
3980 try writer.writeAll(" = { .payload = ");
39663981 try f.writeCValue(writer, operand);
3967 try writer.writeAll("};\n");
3982 try writer.writeAll(", .is_null = false };\n");
39683983 return local;
39693984}
39703985
......@@ -4203,23 +4218,54 @@ fn airCmpxchg(f: *Function, inst: Air.Inst.Index, flavor: [*:0]const u8) !CValue
42034218 const ty_pl = f.air.instructions.items(.data)[inst].ty_pl;
42044219 const extra = f.air.extraData(Air.Cmpxchg, ty_pl.payload).data;
42054220 const inst_ty = f.air.typeOfIndex(inst);
4221 const is_struct = !inst_ty.isPtrLikeOptional();
4222 const ptr_ty = f.air.typeOf(extra.ptr);
42064223 const ptr = try f.resolveInst(extra.ptr);
42074224 const expected_value = try f.resolveInst(extra.expected_value);
42084225 const new_value = try f.resolveInst(extra.new_value);
4209 const local = try f.allocLocal(inst_ty, .Const);
42104226 const writer = f.object.writer();
42114227
4212 try writer.print(" = zig_cmpxchg_{s}(", .{flavor});
4228 const local = try f.allocLocal(inst_ty, .Mut);
4229 try writer.writeAll(" = ");
4230 if (is_struct) try writer.writeAll("{ .payload = ");
4231 try f.writeCValue(writer, expected_value);
4232 if (is_struct) try writer.writeAll(", .is_null = false }");
4233 try writer.writeAll(";\n");
4234
4235 if (is_struct) {
4236 try f.writeCValue(writer, local);
4237 try writer.writeAll(".is_null = ");
4238 } else {
4239 try writer.writeAll("if (");
4240 }
4241 try writer.print("zig_cmpxchg_{s}((zig_atomic(", .{flavor});
4242 try f.object.dg.renderTypecast(writer, ptr_ty.elemType());
4243 try writer.writeByte(')');
4244 if (ptr_ty.isVolatilePtr()) try writer.writeAll(" volatile");
4245 try writer.writeAll(" *)");
42134246 try f.writeCValue(writer, ptr);
42144247 try writer.writeAll(", ");
4215 try f.writeCValue(writer, expected_value);
4248 try f.writeCValue(writer, local);
4249 if (is_struct) {
4250 try writer.writeAll(".payload");
4251 }
42164252 try writer.writeAll(", ");
42174253 try f.writeCValue(writer, new_value);
42184254 try writer.writeAll(", ");
42194255 try writeMemoryOrder(writer, extra.successOrder());
42204256 try writer.writeAll(", ");
42214257 try writeMemoryOrder(writer, extra.failureOrder());
4222 try writer.writeAll(");\n");
4258 try writer.writeByte(')');
4259 if (is_struct) {
4260 try writer.writeAll(";\n");
4261 } else {
4262 try writer.writeAll(") {\n");
4263 f.object.indent_writer.pushIndent();
4264 try f.writeCValue(writer, local);
4265 try writer.writeAll(" = NULL;\n");
4266 f.object.indent_writer.popIndent();
4267 try writer.writeAll("}\n");
4268 }
42234269
42244270 return local;
42254271}
......@@ -4228,12 +4274,26 @@ fn airAtomicRmw(f: *Function, inst: Air.Inst.Index) !CValue {
42284274 const pl_op = f.air.instructions.items(.data)[inst].pl_op;
42294275 const extra = f.air.extraData(Air.AtomicRmw, pl_op.payload).data;
42304276 const inst_ty = f.air.typeOfIndex(inst);
4277 const ptr_ty = f.air.typeOf(pl_op.operand);
42314278 const ptr = try f.resolveInst(pl_op.operand);
42324279 const operand = try f.resolveInst(extra.operand);
42334280 const local = try f.allocLocal(inst_ty, .Const);
42344281 const writer = f.object.writer();
42354282
4236 try writer.print(" = zig_atomicrmw_{s}(", .{toAtomicRmwSuffix(extra.op())});
4283 try writer.print(" = zig_atomicrmw_{s}((", .{toAtomicRmwSuffix(extra.op())});
4284 switch (extra.op()) {
4285 else => {
4286 try writer.writeAll("zig_atomic(");
4287 try f.object.dg.renderTypecast(writer, ptr_ty.elemType());
4288 try writer.writeByte(')');
4289 },
4290 .Nand, .Min, .Max => {
4291 // These are missing from stdatomic.h, so no atomic types for now.
4292 try f.object.dg.renderTypecast(writer, ptr_ty.elemType());
4293 },
4294 }
4295 if (ptr_ty.isVolatilePtr()) try writer.writeAll(" volatile");
4296 try writer.writeAll(" *)");
42374297 try f.writeCValue(writer, ptr);
42384298 try writer.writeAll(", ");
42394299 try f.writeCValue(writer, operand);
......@@ -4255,7 +4315,11 @@ fn airAtomicLoad(f: *Function, inst: Air.Inst.Index) !CValue {
42554315 const local = try f.allocLocal(inst_ty, .Const);
42564316 const writer = f.object.writer();
42574317
4258 try writer.writeAll(" = zig_atomic_load(");
4318 try writer.writeAll(" = zig_atomic_load((zig_atomic(");
4319 try f.object.dg.renderTypecast(writer, ptr_ty.elemType());
4320 try writer.writeByte(')');
4321 if (ptr_ty.isVolatilePtr()) try writer.writeAll(" volatile");
4322 try writer.writeAll(" *)");
42594323 try f.writeCValue(writer, ptr);
42604324 try writer.writeAll(", ");
42614325 try writeMemoryOrder(writer, atomic_load.order);
......@@ -4266,19 +4330,22 @@ fn airAtomicLoad(f: *Function, inst: Air.Inst.Index) !CValue {
42664330
42674331fn airAtomicStore(f: *Function, inst: Air.Inst.Index, order: [*:0]const u8) !CValue {
42684332 const bin_op = f.air.instructions.items(.data)[inst].bin_op;
4333 const ptr_ty = f.air.typeOf(bin_op.lhs);
42694334 const ptr = try f.resolveInst(bin_op.lhs);
42704335 const element = try f.resolveInst(bin_op.rhs);
4271 const inst_ty = f.air.typeOfIndex(inst);
4272 const local = try f.allocLocal(inst_ty, .Const);
42734336 const writer = f.object.writer();
42744337
4275 try writer.writeAll(" = zig_atomic_store(");
4338 try writer.writeAll("zig_atomic_store((zig_atomic(");
4339 try f.object.dg.renderTypecast(writer, ptr_ty.elemType());
4340 try writer.writeByte(')');
4341 if (ptr_ty.isVolatilePtr()) try writer.writeAll(" volatile");
4342 try writer.writeAll(" *)");
42764343 try f.writeCValue(writer, ptr);
42774344 try writer.writeAll(", ");
42784345 try f.writeCValue(writer, element);
42794346 try writer.print(", {s});\n", .{order});
42804347
4281 return local;
4348 return CValue.none;
42824349}
42834350
42844351fn airMemset(f: *Function, inst: Air.Inst.Index) !CValue {
test/behavior/atomics.zig-13
......@@ -4,7 +4,6 @@ const expect = std.testing.expect;
44const expectEqual = std.testing.expectEqual;
55
66test "cmpxchg" {
7 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
87 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
98 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
109 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -44,7 +43,6 @@ test "fence" {
4443}
4544
4645test "atomicrmw and atomicload" {
47 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
4846 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
4947 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
5048 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -74,7 +72,6 @@ fn testAtomicLoad(ptr: *u8) !void {
7472}
7573
7674test "cmpxchg with ptr" {
77 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
7875 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
7976 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
8077 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -101,7 +98,6 @@ test "cmpxchg with ptr" {
10198}
10299
103100test "cmpxchg with ignored result" {
104 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
105101 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
106102 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
107103 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -116,7 +112,6 @@ test "cmpxchg with ignored result" {
116112}
117113
118114test "128-bit cmpxchg" {
119 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
120115 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
121116 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
122117 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -150,7 +145,6 @@ fn test_u128_cmpxchg() !void {
150145var a_global_variable = @as(u32, 1234);
151146
152147test "cmpxchg on a global variable" {
153 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
154148 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
155149 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
156150 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -169,7 +163,6 @@ test "cmpxchg on a global variable" {
169163}
170164
171165test "atomic load and rmw with enum" {
172 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
173166 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
174167 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
175168 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -188,7 +181,6 @@ test "atomic load and rmw with enum" {
188181}
189182
190183test "atomic store" {
191 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
192184 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
193185 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
194186 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -203,7 +195,6 @@ test "atomic store" {
203195}
204196
205197test "atomic store comptime" {
206 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
207198 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
208199 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
209200 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -223,7 +214,6 @@ fn testAtomicStore() !void {
223214}
224215
225216test "atomicrmw with floats" {
226 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
227217 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
228218 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
229219 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -252,7 +242,6 @@ fn testAtomicRmwFloat() !void {
252242}
253243
254244test "atomicrmw with ints" {
255 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
256245 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
257246 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
258247 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -287,7 +276,6 @@ fn testAtomicRmwInt() !void {
287276}
288277
289278test "atomics with different types" {
290 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
291279 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
292280 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
293281 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -318,7 +306,6 @@ fn testAtomicsWithType(comptime T: type, a: T, b: T) !void {
318306}
319307
320308test "return @atomicStore, using it as a void value" {
321 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
322309 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
323310 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
324311 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
test/behavior/bugs/13068.zig-1
......@@ -7,7 +7,6 @@ var list = std.ArrayList(u32).init(allocator);
77test {
88 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
99 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1110 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1211 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1312
test/behavior/defer.zig-1
......@@ -108,7 +108,6 @@ test "mixing normal and error defers" {
108108}
109109
110110test "errdefer with payload" {
111 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
112111 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
113112 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
114113 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
test/behavior/eval.zig-1
......@@ -531,7 +531,6 @@ test "@tagName of @typeInfo" {
531531}
532532
533533test "static eval list init" {
534 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
535534 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
536535 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
537536 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
test/behavior/packed-struct.zig-3
......@@ -150,7 +150,6 @@ test "consistent size of packed structs" {
150150
151151test "correct sizeOf and offsets in packed structs" {
152152 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
153 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
154153 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
155154 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
156155 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -221,7 +220,6 @@ test "correct sizeOf and offsets in packed structs" {
221220
222221test "nested packed structs" {
223222 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
224 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
225223 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
226224 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
227225 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -270,7 +268,6 @@ test "nested packed structs" {
270268
271269test "regular in irregular packed struct" {
272270 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
273 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
274271 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
275272 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
276273 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
test/behavior/packed_struct_explicit_backing_int.zig-1
......@@ -6,7 +6,6 @@ const native_endian = builtin.cpu.arch.endian();
66
77test "packed struct explicit backing integer" {
88 assert(builtin.zig_backend != .stage1);
9 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
109 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1110 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1211 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
test/behavior/pointers.zig-2
......@@ -157,7 +157,6 @@ test "implicit casting between C pointer and optional non-C pointer" {
157157}
158158
159159test "implicit cast error unions with non-optional to optional pointer" {
160 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
161160 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
162161 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
163162 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -403,7 +402,6 @@ test "@ptrToInt on null optional at comptime" {
403402}
404403
405404test "indexing array with sentinel returns correct type" {
406 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
407405 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
408406 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
409407 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
test/behavior/struct.zig-2
......@@ -339,7 +339,6 @@ fn testPassSliceOfEmptyStructToFn(slice: []const EmptyStruct2) usize {
339339
340340test "self-referencing struct via array member" {
341341 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
342 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
343342 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
344343 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
345344 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
......@@ -978,7 +977,6 @@ test "comptime struct field" {
978977}
979978
980979test "tuple element initialized with fn call" {
981 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
982980 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
983981 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
984982 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
test/behavior/switch.zig-3
......@@ -420,7 +420,6 @@ test "else prong of switch on error set excludes other cases" {
420420 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
421421 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
422422 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
423 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
424423
425424 const S = struct {
426425 fn doTheTest() !void {
......@@ -455,7 +454,6 @@ test "switch prongs with error set cases make a new error set type for capture v
455454 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
456455 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
457456 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
458 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
459457
460458 const S = struct {
461459 fn doTheTest() !void {
......@@ -621,7 +619,6 @@ test "switch capture copies its payload" {
621619 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
622620 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
623621 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
624 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
625622
626623 const S = struct {
627624 fn doTheTest() !void {
test/behavior/translate_c_macros.zig-4
......@@ -21,7 +21,6 @@ test "casting to void with a macro" {
2121}
2222
2323test "initializer list expression" {
24 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
2524 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2625 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2726 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -48,7 +47,6 @@ test "reference to a struct type" {
4847test "cast negative integer to pointer" {
4948 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
5049 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
51 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
5250 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
5351 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
5452
......@@ -93,7 +91,6 @@ test "casting or calling a value with a paren-surrounded macro" {
9391test "nested comma operator" {
9492 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
9593 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
96 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
9794 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9895 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
9996
......@@ -117,7 +114,6 @@ test "cast functions" {
117114test "large integer macro" {
118115 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
119116 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
120 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
121117 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
122118 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
123119
test/behavior/type.zig-3
......@@ -200,7 +200,6 @@ test "Type.ErrorUnion" {
200200
201201test "Type.Opaque" {
202202 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
203 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
204203 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
205204 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
206205 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -350,7 +349,6 @@ test "Type.Struct" {
350349}
351350
352351test "Type.Enum" {
353 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
354352 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
355353 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
356354 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -395,7 +393,6 @@ test "Type.Enum" {
395393
396394test "Type.Union" {
397395 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
398 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
399396 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
400397 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
401398 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
test/behavior/union.zig-1
......@@ -1056,7 +1056,6 @@ test "containers with single-field enums" {
10561056}
10571057
10581058test "@unionInit on union with tag but no fields" {
1059 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
10601059 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10611060 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
10621061 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO