dotnet / dotnet/runtime

WasmLowering: Empty struct detection doesn't exist for ABI purposes, and should

Open
#127,361 1 comment 0 reactions 0 assignees View on GitHub
arch-wasm area-TypeSystem-coreclr
Dominant language
C#
Stars
18.3k
Forks
5.6k
PR merge metrics
PR metrics pending

Description

The WebAssembly Basic C ABI (https://github.com/WebAssembly/tool-conventions/blob/main/BasicCABI.md) specifies that empty structs and unions are "ignored" for both parameters and returns. In WasmLowering.GetSignature, empty struct parameters are currently detected via
paramType.GetElementSize().AsInt == 0. However, .NET pads empty value types to a minimum size of 1 byte:

// MetadataFieldLayoutAlgorithm.cs:1177
// Pad the length of structs to be 1 if they are empty, so we have no zero-length structures
if (type.IsValueType && instanceSize == LayoutInt.Zero)
instanceSize = LayoutInt.One;

What needs to change

1. Detect empty structs by instance field count (0 non-static fields), no explicit layout.
2. Empty struct return/parameters should not contribute to the arguments of the function at the Wasm level.
3. This applies to all calling conventions (managed and unmanaged).

Location

src/coreclr/tools/Common/JitInterface/WasmLowering.cs — the GetSignature(MethodSignature, LoweringFlags) method.

Contributor guide

Open the contributing guide

Research direction

Start in src/coreclr/tools/Common/JitInterface/WasmLowering.cs at GetSignature(MethodSignature, LoweringFlags), then read the empty-value-type handling noted in MetadataFieldLayoutAlgorithm.cs:1177 and the linked Basic C ABI guidance. Done means empty structs with no non-static fields, including explicit-layout cases as specified, are omitted from WebAssembly parameters and returns for managed and unmanaged calling conventions.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp, wasm
Domain
compilers
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.