authorgravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-07-19 22:01:32+02:00
committergravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-07-25 06:34:00+02:00
log6b4d4c70fd8b8696eb1220438b89f769a3c3a908
treee675c397482c996915f274d082c06f7395f95ea9
parent200b2e4ee108d388e0db2120aee38f83d1c7abdb
signature Commit is signed but in an unrecognized format.

wasm: Only allow lowering C-ABI compatible types


2 files changed, 2 insertions(+), 23 deletions(-)

src/arch/wasm/abi.zig+1-19
......@@ -48,38 +48,20 @@ pub fn classifyType(ty: Type, target: Target) [2]Class {
4848 },
4949 .Bool => return direct,
5050 .Array => return memory,
51 // .ErrorUnion => {
52 // const has_tag = ty.errorUnionSet().hasRuntimeBitsIgnoreComptime();
53 // const has_pl = ty.errorUnionPayload().hasRuntimeBitsIgnoreComptime();
54 // if (!has_pl) return direct;
55 // if (!has_tag) {
56 // return classifyType(ty.errorUnionPayload(), target);
57 // }
58 // return memory;
59 // },
6051 .Optional => {
6152 std.debug.assert(ty.isPtrLikeOptional());
6253 return direct;
63 // var buf: Type.Payload.ElemType = undefined;
64 // const pl_has_bits = ty.optionalChild(&buf).hasRuntimeBitsIgnoreComptime();
65 // if (!pl_has_bits) return direct;
66 // return memory;
6754 },
6855 .Pointer => {
69 // // Slices act like struct and will be passed by reference
70 // if (ty.isSlice()) return memory;
56 std.debug.assert(!ty.isSlice());
7157 return direct;
7258 },
7359 .Union => {
7460 const layout = ty.unionGetLayout(target);
7561 std.debug.assert(layout.tag_size == 0);
76 // if (layout.payload_size == 0 and layout.tag_size != 0) {
77 // return classifyType(ty.unionTagType().?, target);
78 // }
7962 if (ty.unionFields().count() > 1) return memory;
8063 return classifyType(ty.unionFields().values()[0].ty, target);
8164 },
82 // .AnyFrame, .Frame => return direct,
8365 .ErrorUnion,
8466 .Frame,
8567 .AnyFrame,
src/codegen/llvm.zig+1-4
......@@ -9094,10 +9094,7 @@ fn firstParamSRet(fn_info: Type.Payload.Function.Data, target: std.Target) bool
90949094 .windows => return x86_64_abi.classifyWindows(fn_info.return_type, target) == .memory,
90959095 else => return x86_64_abi.classifySystemV(fn_info.return_type, target)[0] == .memory,
90969096 },
9097 .wasm32 => {
9098 const classes = wasm_c_abi.classifyType(fn_info.return_type, target);
9099 return classes[0] == .indirect;
9100 },
9097 .wasm32 => return wasm_c_abi.classifyType(fn_info.return_type, target)[0] == .indirect,
91019098 else => return false, // TODO investigate C ABI for other architectures
91029099 },
91039100 else => return false,