dotnet / dotnet/runtime

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

オープン
#127,361 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る
arch-wasm area-TypeSystem-coreclr
主要言語
C#
スター
18.3k
フォーク
5.6k
PR マージ指標
PR 指標を取得中

説明

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.

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

評価

技術スタック
csharp, wasm
領域
compilers
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
静か
明瞭さ
おおむね明確
初心者へのやさしさ
68/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。