Commit 74a5f4d848

Luuk de Gram <luuk@degram.dev>
2021-12-04 19:38:56
wasm: Initial behavior tests succeeding
Note: This also fixes a memory leak for inferred error sets, and for usingnamespace
1 parent b7fe958
Changed files (6)
ci/zinc/linux_test.sh
@@ -6,6 +6,7 @@ ZIG=$DEBUG_STAGING/bin/zig
 
 $ZIG test test/behavior.zig -fno-stage1 -fLLVM -I test
 $ZIG test test/behavior.zig -fno-stage1 -ofmt=c -I test
+$ZIG test test/behavior.zig -fno-stage1 -target wasm32-wasi --test-cmd wasmtime --test-cmd-bin
 
 $ZIG build test-behavior         -fqemu -fwasmtime
 $ZIG build test-compiler-rt      -fqemu -fwasmtime
src/arch/wasm/CodeGen.zig
@@ -1235,15 +1235,15 @@ fn airRetPtr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
     // local, containing the offset to the stack position
     const local = try self.allocLocal(Type.initTag(.i32)); // always pointer therefore i32
     try self.moveStack(@intCast(u32, abi_size), local.local);
-
     return local;
 }
 
 fn airRetLoad(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
     const un_op = self.air.instructions.items(.data)[inst].un_op;
     const operand = self.resolveInst(un_op);
-    const result = try self.load(operand, self.air.typeOf(un_op), 0);
-    try self.addLabel(.local_get, result.local);
+
+    const result = try self.load(operand, self.air.typeOf(un_op).childType(), 0);
+    try self.emitWValue(result);
     try self.restoreStackPointer();
     try self.addTag(.@"return");
     return .none;
@@ -1301,8 +1301,11 @@ fn airCall(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
         // so load its value onto the stack
         std.debug.assert(ty.zigTypeTag() == .Pointer);
         const operand = self.resolveInst(pl_op.operand);
-        try self.emitWValue(operand);
-        const result = try self.load(operand, fn_ty, operand.local_with_offset.offset);
+        const offset = switch (operand) {
+            .local_with_offset => |with_offset| with_offset.offset,
+            else => @as(u32, 0),
+        };
+        const result = try self.load(operand, fn_ty, offset);
         try self.addLabel(.local_get, result.local);
 
         var fn_type = try self.genFunctype(fn_ty);
@@ -1335,7 +1338,6 @@ fn airAlloc(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
     // local, containing the offset to the stack position
     const local = try self.allocLocal(Type.initTag(.i32)); // always pointer therefore i32
     try self.moveStack(@intCast(u32, abi_size), local.local);
-
     return local;
 }
 
@@ -1470,6 +1472,8 @@ fn airLoad(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
     const operand = self.resolveInst(ty_op.operand);
     const ty = self.air.getRefType(ty_op.ty);
 
+    if (!ty.hasCodeGenBits()) return WValue{ .none = {} };
+
     return switch (ty.zigTypeTag()) {
         .Struct, .ErrorUnion, .Optional, .Pointer => operand, // pass as pointer
         else => switch (operand) {
@@ -1632,7 +1636,14 @@ fn emitConstant(self: *Self, val: Value, ty: Type) InnerError!void {
             } else if (val.castTag(.decl_ref)) |payload| {
                 const decl = payload.data;
                 decl.alive = true;
-                try self.addLabel(.memory_address, decl.link.wasm.sym_index);
+                // Function pointers use a table index, rather than a memory address
+                if (decl.ty.zigTypeTag() == .Fn) {
+                    const target_sym_index = decl.link.wasm.sym_index;
+                    try self.bin_file.addTableFunction(target_sym_index);
+                    try self.addLabel(.function_index, target_sym_index);
+                } else {
+                    try self.addLabel(.memory_address, decl.link.wasm.sym_index);
+                }
             } else return self.fail("Wasm TODO: emitConstant for other const pointer tag {s}", .{val.tag()});
         },
         .Void => {},
@@ -1873,7 +1884,7 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: std.math.CompareOperator) Inner
     });
     try self.addTag(Mir.Inst.Tag.fromOpcode(opcode));
 
-    const cmp_tmp = try self.allocLocal(lhs_ty);
+    const cmp_tmp = try self.allocLocal(Type.initTag(.i32)); // bool is always i32
     try self.addLabel(.local_set, cmp_tmp.local);
     return cmp_tmp;
 }
@@ -2200,20 +2211,26 @@ fn airIntcast(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
     const operand = self.resolveInst(ty_op.operand);
     const ref_ty = self.air.typeOf(ty_op.operand);
     const ref_info = ref_ty.intInfo(self.target);
-    const op_bits = ref_info.bits;
-    const wanted_bits = ty.intInfo(self.target).bits;
+    const wanted_info = ty.intInfo(self.target);
+
+    const op_bits = toWasmIntBits(ref_info.bits) orelse
+        return self.fail("TODO: Wasm intcast integer types of bitsize: {d}", .{ref_info.bits});
+    const wanted_bits = toWasmIntBits(wanted_info.bits) orelse
+        return self.fail("TODO: Wasm intcast integer types of bitsize: {d}", .{wanted_info.bits});
 
-    if (op_bits > 32 and wanted_bits <= 32) {
+    // hot path
+    if (op_bits == wanted_bits) return operand;
+
+    if (op_bits > 32 and wanted_bits == 32) {
         try self.emitWValue(operand);
         try self.addTag(.i32_wrap_i64);
-    } else if (op_bits <= 32 and wanted_bits > 32) {
+    } else if (op_bits == 32 and wanted_bits > 32) {
         try self.emitWValue(operand);
         try self.addTag(switch (ref_info.signedness) {
             .signed => .i64_extend_i32_s,
             .unsigned => .i64_extend_i32_u,
         });
-    } else return operand;
-
+    }
     const result = try self.allocLocal(ty);
     try self.addLabel(.local_set, result.local);
     return result;
src/arch/wasm/Emit.zig
@@ -50,6 +50,7 @@ pub fn emitMir(emit: *Emit) InnerError!void {
             .call_indirect => try emit.emitCallIndirect(inst),
             .global_get => try emit.emitGlobal(tag, inst),
             .global_set => try emit.emitGlobal(tag, inst),
+            .function_index => try emit.emitFunctionIndex(inst),
             .memory_address => try emit.emitMemAddress(inst),
 
             // immediates
@@ -240,7 +241,7 @@ fn emitImm64(emit: *Emit, inst: Mir.Inst.Index) !void {
     const extra_index = emit.mir.instructions.items(.data)[inst].payload;
     const value = emit.mir.extraData(Mir.Imm64, extra_index);
     try emit.code.append(std.wasm.opcode(.i64_const));
-    try leb128.writeULEB128(emit.code.writer(), value.data.toU64());
+    try leb128.writeILEB128(emit.code.writer(), @bitCast(i64, value.data.toU64()));
 }
 
 fn emitFloat32(emit: *Emit, inst: Mir.Inst.Index) !void {
@@ -289,6 +290,21 @@ fn emitCallIndirect(emit: *Emit, inst: Mir.Inst.Index) !void {
     try leb128.writeULEB128(emit.code.writer(), label);
 }
 
+fn emitFunctionIndex(emit: *Emit, inst: Mir.Inst.Index) !void {
+    const symbol_index = emit.mir.instructions.items(.data)[inst].label;
+    try emit.code.append(std.wasm.opcode(.i32_const));
+    const index_offset = emit.offset();
+    var buf: [5]u8 = undefined;
+    leb128.writeUnsignedFixed(5, &buf, symbol_index);
+    try emit.code.appendSlice(&buf);
+
+    try emit.decl.link.wasm.relocs.append(emit.bin_file.allocator, .{
+        .offset = index_offset,
+        .index = symbol_index,
+        .relocation_type = .R_WASM_TABLE_INDEX_SLEB,
+    });
+}
+
 fn emitMemAddress(emit: *Emit, inst: Mir.Inst.Index) !void {
     const symbol_index = emit.mir.instructions.items(.data)[inst].label;
     try emit.code.append(std.wasm.opcode(.i32_const));
src/arch/wasm/Mir.zig
@@ -373,11 +373,17 @@ pub const Inst = struct {
         i64_extend16_s = 0xC3,
         /// Uses `tag`
         i64_extend32_s = 0xC4,
+        /// Contains a symbol to a function pointer
+        /// uses `label`
+        ///
+        /// Note: This uses `0xFE` as value as it is unused and not reserved
+        /// by the wasm specification, making it safe to use.
+        function_index = 0xFE,
         /// Contains a symbol to a memory address
         /// Uses `label`
         ///
-        /// Note: This uses `0xFF` as value as it is unused and not-reserved
-        /// by the wasm specification, making it safe to use
+        /// Note: This uses `0xFF` as value as it is unused and not reserved
+        /// by the wasm specification, making it safe to use.
         memory_address = 0xFF,
 
         /// From a given wasm opcode, returns a MIR tag.
src/Module.zig
@@ -1226,19 +1226,20 @@ pub const Fn = struct {
     };
 
     pub fn deinit(func: *Fn, gpa: Allocator) void {
-        if (func.getInferredErrorSet()) |map| {
-            map.deinit(gpa);
+        if (func.getInferredErrorSet()) |error_set_data| {
+            error_set_data.map.deinit(gpa);
+            error_set_data.functions.deinit(gpa);
         }
     }
 
-    pub fn getInferredErrorSet(func: *Fn) ?*std.StringHashMapUnmanaged(void) {
+    pub fn getInferredErrorSet(func: *Fn) ?*Type.Payload.ErrorSetInferred.Data {
         const ret_ty = func.owner_decl.ty.fnReturnType();
         if (ret_ty.tag() == .generic_poison) {
             return null;
         }
         if (ret_ty.zigTypeTag() == .ErrorUnion) {
             if (ret_ty.errorUnionSet().castTag(.error_set_inferred)) |payload| {
-                return &payload.data.map;
+                return &payload.data;
             }
         }
         return null;
@@ -1301,6 +1302,7 @@ pub const Namespace = struct {
             key.destroy(mod);
         }
         anon_decls.deinit(gpa);
+        ns.usingnamespace_set.deinit(gpa);
     }
 
     pub fn deleteAllDecls(
@@ -1332,6 +1334,8 @@ pub const Namespace = struct {
             child_decl.destroy(mod);
         }
         anon_decls.deinit(gpa);
+
+        ns.usingnamespace_set.deinit(gpa);
     }
 
     // This renders e.g. "std.fs.Dir.OpenOptions"
test/behavior.zig
@@ -1,198 +1,202 @@
 const builtin = @import("builtin");
 
 test {
-    // Tests that pass for stage1, stage2, and the C backend.
-    _ = @import("behavior/align.zig");
+    // Tests that pass for stage1, stage2, the C -and wasm backend.
     _ = @import("behavior/basic.zig");
     _ = @import("behavior/bitcast.zig");
-    _ = @import("behavior/bool.zig");
     _ = @import("behavior/bugs/624.zig");
     _ = @import("behavior/bugs/655.zig");
     _ = @import("behavior/bugs/679.zig");
-    _ = @import("behavior/bugs/704.zig");
     _ = @import("behavior/bugs/1111.zig");
     _ = @import("behavior/bugs/1486.zig");
     _ = @import("behavior/bugs/2346.zig");
-    _ = @import("behavior/bugs/2692.zig");
-    _ = @import("behavior/bugs/2889.zig");
-    _ = @import("behavior/bugs/3046.zig");
-    _ = @import("behavior/bugs/3586.zig");
-    _ = @import("behavior/bugs/4560.zig");
-    _ = @import("behavior/bugs/4769_a.zig");
-    _ = @import("behavior/bugs/4769_b.zig");
-    _ = @import("behavior/bugs/4954.zig");
     _ = @import("behavior/bugs/6850.zig");
-    _ = @import("behavior/byval_arg_var.zig");
-    _ = @import("behavior/call.zig");
-    _ = @import("behavior/cast.zig");
-    _ = @import("behavior/defer.zig");
     _ = @import("behavior/enum.zig");
-    _ = @import("behavior/error.zig");
-    _ = @import("behavior/fn_in_struct_in_comptime.zig");
-    _ = @import("behavior/generics.zig");
     _ = @import("behavior/hasdecl.zig");
     _ = @import("behavior/hasfield.zig");
-    _ = @import("behavior/if.zig");
     _ = @import("behavior/import.zig");
-    _ = @import("behavior/incomplete_struct_param_tld.zig");
-    _ = @import("behavior/int128.zig");
-    _ = @import("behavior/inttoptr.zig");
-    _ = @import("behavior/member_func.zig");
-    _ = @import("behavior/null.zig");
-    _ = @import("behavior/optional.zig");
-    _ = @import("behavior/pointers.zig");
-    _ = @import("behavior/ptrcast.zig");
     _ = @import("behavior/pub_enum.zig");
-    _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
     _ = @import("behavior/slice_sentinel_comptime.zig");
-    _ = @import("behavior/struct.zig");
-    _ = @import("behavior/this.zig");
-    _ = @import("behavior/translate_c_macros.zig");
     _ = @import("behavior/truncate.zig");
-    _ = @import("behavior/underscore.zig");
     _ = @import("behavior/usingnamespace.zig");
-    _ = @import("behavior/while.zig");
 
-    if (builtin.object_format != .c) {
-        // Tests that pass for stage1 and stage2 but not the C backend.
-        _ = @import("behavior/align_llvm.zig");
-        _ = @import("behavior/alignof.zig");
-        _ = @import("behavior/array.zig");
-        _ = @import("behavior/atomics.zig");
-        _ = @import("behavior/basic_llvm.zig");
-        _ = @import("behavior/bugs/394.zig");
-        _ = @import("behavior/bugs/656.zig");
-        _ = @import("behavior/bugs/1277.zig");
-        _ = @import("behavior/bugs/1381.zig");
-        _ = @import("behavior/bugs/1500.zig");
-        _ = @import("behavior/bugs/1741.zig");
-        _ = @import("behavior/bugs/2006.zig");
-        _ = @import("behavior/bugs/2578.zig");
-        _ = @import("behavior/bugs/3007.zig");
-        _ = @import("behavior/bugs/3112.zig");
-        _ = @import("behavior/bugs/7250.zig");
-        _ = @import("behavior/cast_llvm.zig");
-        _ = @import("behavior/eval.zig");
-        _ = @import("behavior/floatop.zig");
-        _ = @import("behavior/fn.zig");
-        _ = @import("behavior/for.zig");
-        _ = @import("behavior/generics_llvm.zig");
-        _ = @import("behavior/math.zig");
-        _ = @import("behavior/maximum_minimum.zig");
-        _ = @import("behavior/namespace_depends_on_compile_var.zig");
-        _ = @import("behavior/null_llvm.zig");
-        _ = @import("behavior/optional_llvm.zig");
-        _ = @import("behavior/popcount.zig");
-        _ = @import("behavior/saturating_arithmetic.zig");
-        _ = @import("behavior/sizeof_and_typeof.zig");
-        _ = @import("behavior/slice.zig");
-        _ = @import("behavior/struct_llvm.zig");
-        _ = @import("behavior/switch.zig");
-        _ = @import("behavior/undefined.zig");
-        _ = @import("behavior/union.zig");
-        _ = @import("behavior/void.zig");
-        _ = @import("behavior/widening.zig");
+    // Tests that pass for stage1, stage2 and the C backend, but not for the wasm backend
+    if (!builtin.zig_is_stage2 or (builtin.zig_is_stage2 and builtin.stage2_arch != .wasm32)) {
+        _ = @import("behavior/align.zig");
+        _ = @import("behavior/bool.zig");
+        _ = @import("behavior/bugs/704.zig");
+        _ = @import("behavior/bugs/2692.zig");
+        _ = @import("behavior/bugs/2889.zig");
+        _ = @import("behavior/bugs/3046.zig");
+        _ = @import("behavior/bugs/3586.zig");
+        _ = @import("behavior/bugs/4560.zig");
+        _ = @import("behavior/bugs/4769_a.zig");
+        _ = @import("behavior/bugs/4769_b.zig");
+        _ = @import("behavior/bugs/4954.zig");
+        _ = @import("behavior/byval_arg_var.zig");
+        _ = @import("behavior/call.zig");
+        _ = @import("behavior/cast.zig");
+        _ = @import("behavior/defer.zig");
+        _ = @import("behavior/error.zig");
+        _ = @import("behavior/fn_in_struct_in_comptime.zig");
+        _ = @import("behavior/generics.zig");
+        _ = @import("behavior/if.zig");
+        _ = @import("behavior/incomplete_struct_param_tld.zig");
+        _ = @import("behavior/int128.zig");
+        _ = @import("behavior/inttoptr.zig");
+        _ = @import("behavior/member_func.zig");
+        _ = @import("behavior/null.zig");
+        _ = @import("behavior/optional.zig");
+        _ = @import("behavior/pointers.zig");
+        _ = @import("behavior/ptrcast.zig");
+        _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
+        _ = @import("behavior/struct.zig");
+        _ = @import("behavior/this.zig");
+        _ = @import("behavior/translate_c_macros.zig");
+        _ = @import("behavior/underscore.zig");
+        _ = @import("behavior/while.zig");
 
-        if (builtin.zig_is_stage2) {
-            // When all comptime_memory.zig tests pass, #9646 can be closed.
-            // _ = @import("behavior/comptime_memory.zig");
-            _ = @import("behavior/slice_stage2.zig");
-        } else {
-            _ = @import("behavior/align_stage1.zig");
-            _ = @import("behavior/array_stage1.zig");
-            if (builtin.os.tag != .wasi) {
-                _ = @import("behavior/asm.zig");
-                _ = @import("behavior/async_fn.zig");
-            }
-            _ = @import("behavior/await_struct.zig");
-            _ = @import("behavior/bit_shifting.zig");
-            _ = @import("behavior/bitcast_stage1.zig");
-            _ = @import("behavior/bitreverse.zig");
-            _ = @import("behavior/bugs/421.zig");
-            _ = @import("behavior/bugs/529.zig");
-            _ = @import("behavior/bugs/718.zig");
-            _ = @import("behavior/bugs/726.zig");
-            _ = @import("behavior/bugs/828.zig");
-            _ = @import("behavior/bugs/920.zig");
-            _ = @import("behavior/bugs/1025.zig");
-            _ = @import("behavior/bugs/1076.zig");
-            _ = @import("behavior/bugs/1120.zig");
-            _ = @import("behavior/bugs/1310.zig");
-            _ = @import("behavior/bugs/1322.zig");
-            _ = @import("behavior/bugs/1421.zig");
-            _ = @import("behavior/bugs/1442.zig");
-            _ = @import("behavior/bugs/1607.zig");
-            _ = @import("behavior/bugs/1735.zig");
-            _ = @import("behavior/bugs/1851.zig");
-            _ = @import("behavior/bugs/1914.zig");
-            _ = @import("behavior/bugs/2114.zig");
-            _ = @import("behavior/bugs/3367.zig");
-            _ = @import("behavior/bugs/3384.zig");
-            _ = @import("behavior/bugs/3742.zig");
-            _ = @import("behavior/bugs/3779.zig");
-            _ = @import("behavior/bugs/4328.zig");
-            _ = @import("behavior/bugs/5398.zig");
-            _ = @import("behavior/bugs/5413.zig");
-            _ = @import("behavior/bugs/5474.zig");
-            _ = @import("behavior/bugs/5487.zig");
-            _ = @import("behavior/bugs/6456.zig");
-            _ = @import("behavior/bugs/6781.zig");
-            _ = @import("behavior/bugs/7003.zig");
-            _ = @import("behavior/bugs/7027.zig");
-            _ = @import("behavior/bugs/7047.zig");
-            _ = @import("behavior/bugs/9584.zig");
-            _ = @import("behavior/bugs/9967.zig");
-            _ = @import("behavior/bugs/10147.zig");
-            _ = @import("behavior/byteswap.zig");
-            _ = @import("behavior/call_stage1.zig");
-            _ = @import("behavior/cast_stage1.zig");
-            _ = @import("behavior/const_slice_child.zig");
-            _ = @import("behavior/defer_stage1.zig");
-            _ = @import("behavior/enum_stage1.zig");
-            _ = @import("behavior/error_stage1.zig");
-            _ = @import("behavior/eval_stage1.zig");
-            _ = @import("behavior/field_parent_ptr.zig");
-            _ = @import("behavior/floatop_stage1.zig");
-            _ = @import("behavior/fn_stage1.zig");
-            _ = @import("behavior/fn_delegation.zig");
-            _ = @import("behavior/for_stage1.zig");
-            _ = @import("behavior/if_stage1.zig");
-            _ = @import("behavior/ir_block_deps.zig");
-            _ = @import("behavior/math_stage1.zig");
-            _ = @import("behavior/merge_error_sets.zig");
-            _ = @import("behavior/misc.zig");
-            _ = @import("behavior/muladd.zig");
-            _ = @import("behavior/null_stage1.zig");
-            _ = @import("behavior/optional_stage1.zig");
-            _ = @import("behavior/pointers_stage1.zig");
-            _ = @import("behavior/popcount_stage1.zig");
-            _ = @import("behavior/ptrcast_stage1.zig");
-            _ = @import("behavior/reflection.zig");
-            _ = @import("behavior/select.zig");
-            _ = @import("behavior/shuffle.zig");
-            _ = @import("behavior/sizeof_and_typeof_stage1.zig");
-            _ = @import("behavior/slice_stage1.zig");
-            _ = @import("behavior/struct_contains_null_ptr_itself.zig");
-            _ = @import("behavior/struct_contains_slice_of_itself.zig");
-            _ = @import("behavior/struct_stage1.zig");
-            _ = @import("behavior/switch_prong_err_enum.zig");
-            _ = @import("behavior/switch_prong_implicit_cast.zig");
-            _ = @import("behavior/switch_stage1.zig");
-            _ = @import("behavior/try.zig");
-            _ = @import("behavior/tuple.zig");
-            _ = @import("behavior/type.zig");
-            _ = @import("behavior/type_info.zig");
-            _ = @import("behavior/typename.zig");
-            _ = @import("behavior/union_stage1.zig");
-            _ = @import("behavior/union_with_members.zig");
-            _ = @import("behavior/var_args.zig");
-            _ = @import("behavior/vector.zig");
-            if (builtin.target.cpu.arch == .wasm32) {
-                _ = @import("behavior/wasm.zig");
+        if (builtin.object_format != .c) {
+            // Tests that pass for stage1 and stage2 but not the C backend and wasm backend.
+            _ = @import("behavior/align_llvm.zig");
+            _ = @import("behavior/alignof.zig");
+            _ = @import("behavior/array.zig");
+            _ = @import("behavior/atomics.zig");
+            _ = @import("behavior/basic_llvm.zig");
+            _ = @import("behavior/bugs/394.zig");
+            _ = @import("behavior/bugs/656.zig");
+            _ = @import("behavior/bugs/1277.zig");
+            _ = @import("behavior/bugs/1381.zig");
+            _ = @import("behavior/bugs/1500.zig");
+            _ = @import("behavior/bugs/1741.zig");
+            _ = @import("behavior/bugs/2006.zig");
+            _ = @import("behavior/bugs/2578.zig");
+            _ = @import("behavior/bugs/3007.zig");
+            _ = @import("behavior/bugs/3112.zig");
+            _ = @import("behavior/bugs/7250.zig");
+            _ = @import("behavior/cast_llvm.zig");
+            _ = @import("behavior/eval.zig");
+            _ = @import("behavior/floatop.zig");
+            _ = @import("behavior/fn.zig");
+            _ = @import("behavior/for.zig");
+            _ = @import("behavior/generics_llvm.zig");
+            _ = @import("behavior/math.zig");
+            _ = @import("behavior/maximum_minimum.zig");
+            _ = @import("behavior/namespace_depends_on_compile_var.zig");
+            _ = @import("behavior/null_llvm.zig");
+            _ = @import("behavior/optional_llvm.zig");
+            _ = @import("behavior/popcount.zig");
+            _ = @import("behavior/saturating_arithmetic.zig");
+            _ = @import("behavior/sizeof_and_typeof.zig");
+            _ = @import("behavior/slice.zig");
+            _ = @import("behavior/struct_llvm.zig");
+            _ = @import("behavior/switch.zig");
+            _ = @import("behavior/undefined.zig");
+            _ = @import("behavior/union.zig");
+            _ = @import("behavior/void.zig");
+            _ = @import("behavior/widening.zig");
+
+            if (builtin.zig_is_stage2) {
+                // When all comptime_memory.zig tests pass, #9646 can be closed.
+                // _ = @import("behavior/comptime_memory.zig");
+                _ = @import("behavior/slice_stage2.zig");
+            } else {
+                _ = @import("behavior/align_stage1.zig");
+                _ = @import("behavior/array_stage1.zig");
+                if (builtin.os.tag != .wasi) {
+                    _ = @import("behavior/asm.zig");
+                    _ = @import("behavior/async_fn.zig");
+                }
+                _ = @import("behavior/await_struct.zig");
+                _ = @import("behavior/bit_shifting.zig");
+                _ = @import("behavior/bitcast_stage1.zig");
+                _ = @import("behavior/bitreverse.zig");
+                _ = @import("behavior/bugs/421.zig");
+                _ = @import("behavior/bugs/529.zig");
+                _ = @import("behavior/bugs/718.zig");
+                _ = @import("behavior/bugs/726.zig");
+                _ = @import("behavior/bugs/828.zig");
+                _ = @import("behavior/bugs/920.zig");
+                _ = @import("behavior/bugs/1025.zig");
+                _ = @import("behavior/bugs/1076.zig");
+                _ = @import("behavior/bugs/1120.zig");
+                _ = @import("behavior/bugs/1310.zig");
+                _ = @import("behavior/bugs/1322.zig");
+                _ = @import("behavior/bugs/1421.zig");
+                _ = @import("behavior/bugs/1442.zig");
+                _ = @import("behavior/bugs/1607.zig");
+                _ = @import("behavior/bugs/1735.zig");
+                _ = @import("behavior/bugs/1851.zig");
+                _ = @import("behavior/bugs/1914.zig");
+                _ = @import("behavior/bugs/2114.zig");
+                _ = @import("behavior/bugs/3367.zig");
+                _ = @import("behavior/bugs/3384.zig");
+                _ = @import("behavior/bugs/3742.zig");
+                _ = @import("behavior/bugs/3779.zig");
+                _ = @import("behavior/bugs/4328.zig");
+                _ = @import("behavior/bugs/5398.zig");
+                _ = @import("behavior/bugs/5413.zig");
+                _ = @import("behavior/bugs/5474.zig");
+                _ = @import("behavior/bugs/5487.zig");
+                _ = @import("behavior/bugs/6456.zig");
+                _ = @import("behavior/bugs/6781.zig");
+                _ = @import("behavior/bugs/7003.zig");
+                _ = @import("behavior/bugs/7027.zig");
+                _ = @import("behavior/bugs/7047.zig");
+                _ = @import("behavior/bugs/9584.zig");
+                _ = @import("behavior/bugs/9967.zig");
+                _ = @import("behavior/bugs/10147.zig");
+                _ = @import("behavior/byteswap.zig");
+                _ = @import("behavior/call_stage1.zig");
+                _ = @import("behavior/cast_stage1.zig");
+                _ = @import("behavior/const_slice_child.zig");
+                _ = @import("behavior/defer_stage1.zig");
+                _ = @import("behavior/enum_stage1.zig");
+                _ = @import("behavior/error_stage1.zig");
+                _ = @import("behavior/eval_stage1.zig");
+                _ = @import("behavior/field_parent_ptr.zig");
+                _ = @import("behavior/floatop_stage1.zig");
+                _ = @import("behavior/fn_stage1.zig");
+                _ = @import("behavior/fn_delegation.zig");
+                _ = @import("behavior/for_stage1.zig");
+                _ = @import("behavior/if_stage1.zig");
+                _ = @import("behavior/ir_block_deps.zig");
+                _ = @import("behavior/math_stage1.zig");
+                _ = @import("behavior/merge_error_sets.zig");
+                _ = @import("behavior/misc.zig");
+                _ = @import("behavior/muladd.zig");
+                _ = @import("behavior/null_stage1.zig");
+                _ = @import("behavior/optional_stage1.zig");
+                _ = @import("behavior/pointers_stage1.zig");
+                _ = @import("behavior/popcount_stage1.zig");
+                _ = @import("behavior/ptrcast_stage1.zig");
+                _ = @import("behavior/reflection.zig");
+                _ = @import("behavior/select.zig");
+                _ = @import("behavior/shuffle.zig");
+                _ = @import("behavior/sizeof_and_typeof_stage1.zig");
+                _ = @import("behavior/slice_stage1.zig");
+                _ = @import("behavior/struct_contains_null_ptr_itself.zig");
+                _ = @import("behavior/struct_contains_slice_of_itself.zig");
+                _ = @import("behavior/struct_stage1.zig");
+                _ = @import("behavior/switch_prong_err_enum.zig");
+                _ = @import("behavior/switch_prong_implicit_cast.zig");
+                _ = @import("behavior/switch_stage1.zig");
+                _ = @import("behavior/try.zig");
+                _ = @import("behavior/tuple.zig");
+                _ = @import("behavior/type.zig");
+                _ = @import("behavior/type_info.zig");
+                _ = @import("behavior/typename.zig");
+                _ = @import("behavior/union_stage1.zig");
+                _ = @import("behavior/union_with_members.zig");
+                _ = @import("behavior/var_args.zig");
+                _ = @import("behavior/vector.zig");
+                if (builtin.target.cpu.arch == .wasm32) {
+                    _ = @import("behavior/wasm.zig");
+                }
+                _ = @import("behavior/while_stage1.zig");
+                _ = @import("behavior/src.zig");
+                _ = @import("behavior/translate_c_macros_stage1.zig");
             }
-            _ = @import("behavior/while_stage1.zig");
-            _ = @import("behavior/src.zig");
-            _ = @import("behavior/translate_c_macros_stage1.zig");
         }
     }
 }