Commit 6b4d4c70fd

Luuk de Gram <luuk@degram.dev>
2022-07-19 22:01:32
wasm: Only allow lowering C-ABI compatible types
1 parent 200b2e4
Changed files (2)
src
arch
wasm
codegen
src/arch/wasm/abi.zig
@@ -48,38 +48,20 @@ pub fn classifyType(ty: Type, target: Target) [2]Class {
         },
         .Bool => return direct,
         .Array => return memory,
-        // .ErrorUnion => {
-        //     const has_tag = ty.errorUnionSet().hasRuntimeBitsIgnoreComptime();
-        //     const has_pl = ty.errorUnionPayload().hasRuntimeBitsIgnoreComptime();
-        //     if (!has_pl) return direct;
-        //     if (!has_tag) {
-        //         return classifyType(ty.errorUnionPayload(), target);
-        //     }
-        //     return memory;
-        // },
         .Optional => {
             std.debug.assert(ty.isPtrLikeOptional());
             return direct;
-            // var buf: Type.Payload.ElemType = undefined;
-            // const pl_has_bits = ty.optionalChild(&buf).hasRuntimeBitsIgnoreComptime();
-            // if (!pl_has_bits) return direct;
-            // return memory;
         },
         .Pointer => {
-            // // Slices act like struct and will be passed by reference
-            // if (ty.isSlice()) return memory;
+            std.debug.assert(!ty.isSlice());
             return direct;
         },
         .Union => {
             const layout = ty.unionGetLayout(target);
             std.debug.assert(layout.tag_size == 0);
-            // if (layout.payload_size == 0 and layout.tag_size != 0) {
-            //     return classifyType(ty.unionTagType().?, target);
-            // }
             if (ty.unionFields().count() > 1) return memory;
             return classifyType(ty.unionFields().values()[0].ty, target);
         },
-        // .AnyFrame, .Frame => return direct,
         .ErrorUnion,
         .Frame,
         .AnyFrame,
src/codegen/llvm.zig
@@ -9094,10 +9094,7 @@ fn firstParamSRet(fn_info: Type.Payload.Function.Data, target: std.Target) bool
                 .windows => return x86_64_abi.classifyWindows(fn_info.return_type, target) == .memory,
                 else => return x86_64_abi.classifySystemV(fn_info.return_type, target)[0] == .memory,
             },
-            .wasm32 => {
-                const classes = wasm_c_abi.classifyType(fn_info.return_type, target);
-                return classes[0] == .indirect;
-            },
+            .wasm32 => return wasm_c_abi.classifyType(fn_info.return_type, target)[0] == .indirect,
             else => return false, // TODO investigate C ABI for other architectures
         },
         else => return false,