注意点
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
目次
- #128048 Limit sccache cache size to 3.5 GB to reduce transfer overhead
- #127963 [ci-scan] Skip AsyncProfilerTests on Android, iOS, tvOS, and MacCatalyst (refs #127951)
- #127950 Fold more branches via O1K_VN <relop> O2K_VN comparisons
- #127939 Improve some string Rune helpers
- #127936 crossgen2: Add Length Prefix to Crossgen-Generated Wasm
- #127931 Move the return var out of liveLocalsIntervals
- #127926 [wasm][coreclr] Enable System.Linq.Expressions.Tests
- #127921 Reduce Unsafe usage in TryWriteSignificand/TryHash helpers
- #127911 Fix ThinSList size and unify
EMPTY_BASESdefinitions - #127904 Replace
GetOsPageSize()withminipal_getpagesize()in CoreCLR - #127787 [mono] Handle nint/nuint in Crc32 and ArmBase intrinsic dispatch
- #127636 [cDAC] RuntimeSignatureDecoder and centralized Signature contract (2/5)
- #127538 Arm64 SVE2: CreateWhileGreaterThan* and CreateWhileReadAfterWrite*
- #127483 [WASM] Add READYTORUN_FIXUP_InjectStringThunks and R2R thunk infrastructure
#128048 Limit sccache cache size to 3.5 GB to reduce transfer overhead
- 作成者: @agocke
- 作成日時: 2026年05月11日 18:02:47(UTC)
- マージ日時: 2026年05月11日 21:41:49(UTC)
- ラベル: area-Infrastructure
概要
CoreCLR パイプラインの sccache ローカルキャッシュサイズを3.5GBに制限し、ローリングビルド時のキャッシュ復元・保存のオーバーヘッドを削減します。デフォルトの10GB制限では、古いエントリが蓄積して6~7GBまで増加し、キャッシュの転送に約3分のオーバーヘッドが発生していました。LRU削除により、作業セットサイズ(~3GB)に近い状態を維持します。
変更内容
- eng/pipelines/coreclr/templates/setup-sccache.yml:
SCCACHE_CACHE_SIZE=3.5G環境変数を設定して、キャッシュサイズを制限し、古いエントリの自動削除を有効化。Azure Pipelines キャッシュのキーからbuildConfigを除外し、PR ビルドがローリングビルドのキャッシュを活用できるように変更。 - System.Security.Cryptography 関連ファイル:
X25519DiffieHellmanCng.DeriveRawSecretAgreementCoreの部分オーバーライドにunsafeキーワードを追加(Windows実装、共通シム、非サポート実装)。
パフォーマンスへの影響
- キャッシュサイズ: 6~7GB(増加傾向)→ 3.5GB(安定化)
- 復元時間: ~1分 → ~30秒
- 保存時間: ~1分45秒 → ~50秒
- 総オーバーヘッド/レグ: ~3分 → ~1.5分
- レグあたりの実質的な時間短縮: ~6分 → ~7.5分
キャッシュヒット率が低下した場合は制限値を引き上げることで調整可能。
関連Issue
なし
その他
- Copilotによるレビューでは、PR説明とスコープの不一致を指摘。
buildConfigキャッシュキー変更についての説明が不足していると指摘されている。 - System.Security.Cryptography の
unsafeキーワード追加は、PR のスコープ(sccache キャッシュサイズ制限)と無関連な変更のため、分離すべき可能性がある。
#127963 [ci-scan] Skip AsyncProfilerTests on Android, iOS, tvOS, and MacCatalyst (refs #127951)
- 作成者: @github-actions[bot]
- 作成日時: 2026年05月08日 18:27:35(UTC)
- マージ日時: 2026年05月11日 20:05:22(UTC)
- ラベル: area-Infrastructure-mono agentic-workflows
概要
AsyncProfilerTestsクラスはEventPipeベースの非同期プロファイリング(RuntimeAsync イベント)をテストしていますが、モバイルプラットフォーム(Android、iOS、tvOS、MacCatalyst)でEventPipeランタイムイベントが一貫して発火しないため、テスト失敗が発生します。これはプロダクトバグではなくテスト環境の制限です。クラスレベルに[ActiveIssue]属性を追加することで、当該プラットフォームでのテストをスキップします。
変更内容
- AsyncProfilerTests.cs: クラスレベルに
[ActiveIssue("#127951")]属性を追加し、Android、iOS、tvOS、MacCatalystプラットフォームでテストをスキップ- テストクラス全体がEventPipe依存であり、すべてのテストが同一理由で失敗するため、クラスレベルのスキップが適切
パフォーマンスへの影響
影響なし(テストのスキップのため)
関連Issue
その他
- 失敗パターン:
Assert.NotEmpty() Failure: Collection was empty(EventPipeイベント未発火)Expected callstack with 4 frames, got 3(不完全なコールスタック)
- 影響を受けていたビルド: runtime-extra-platforms build 1411505、1413202以降
- スキップ対象プラットフォーム: Android arm64、tvOS Simulator、iOS、MacCatalyst
#127950 Fold more branches via O1K_VN <relop> O2K_VN comparisons
- 作成者: @EgorBo
- 作成日時: 2026年05月08日 12:26:48(UTC)
- マージ日時: 2026年05月11日 17:02:13(UTC)
- ラベル: area-CodeGen-coreclr
概要
CoreCLR JIT コンパイラの大域的アサーション伝播と範囲解析を拡張し、両方のオペランドが任意の値番号(VN)である符号付き比較(VN <relop> VN)に対応します。これにより、リレーショナルファクトをチェーン化することで追加的なブランチ折畳みが可能になります。
例えば if (x > 10 && x < 100) の後に if (y > x) がある場合、JIT は y > 11 という推論を行い、その後の return y > 0; を常に真として最適化できます。
変更内容
- compiler.h: 新しいグローバルアサーション演算子タイプ
O2K_VNを追加して、"op2 が任意の値番号" を表現。VN間の関係演算アサーション用のファクトリメソッドを追加 - assertionprop.cpp: VN間の関係演算アサーションの生成ロジックを実装。JTRUE ノードで利益がある場合に VN間の関係演算アサーションを作成
- rangecheck.h: 境界付き再帰的な VN間アサーション解決をサポートする
MergeEdgeAssertionsWorkerメソッドを宣言 - rangecheck.cpp: エッジアサーション統合のワーカー/ラッパーパターンを実装。VN間の関係演算アサーションを使用した範囲の絞り込みロジックを追加
パフォーマンスへの影響
ブランチ折畳みの拡張により、複数の関連する条件チェックをコンパイル時に最適化できるようになります。これにより生成されるコードサイズが削減され、実行時パフォーマンスが向上する可能性があります。ただし、具体的なベンチマーク数値は提供されていません。
関連Issue
なし
その他
この変更は JIT コンパイラの内部実装(範囲解析とアサーション伝播)に限定され、公開 API や破壊的な変更は含まれません。符号付き int32 の場合に限定して実装されています。
#127939 Improve some string Rune helpers
- 作成者: @MihaZupan
- 作成日時: 2026年05月08日 00:54:07(UTC)
- マージ日時: 2026年05月11日 11:47:34(UTC)
- ラベル: area-System.Runtime tenet-performance
概要
string型のRune関連ヘルパーメソッドのパフォーマンスを向上。BMP(Basic Multilingual Plane)Rune入力に対してはchar オーバーロードへの委譲、非BMP Runeに対しては直接UTF-16サロゲートペア比較を実装。Trim関連メソッドもTrimHelperを用いて最適化。
変更内容
- String.Comparison.cs:
StartsWith(Rune)とEndsWith(Rune)にBMP高速パス追加。BMP Runeはchar比較、非BMPはUTF-16サロゲートペア直接比較を実装 - String.Searching.cs:
Contains(Rune)にBMP高速パス追加。BMP RuneはContains(char)に委譲 - String.Manipulation.cs:
Replace(Rune)とSplit(Rune)にBMP高速パス追加。Trim(Rune)/TrimStart(Rune)/TrimEnd(Rune)をTrimHelperを用いたピンド UTF-16スパン実装に統合(コード削減)
パフォーマンスへの影響
大幅な改善。BMP Rune処理では30~60%削減:
ContainsBmp: 11.0ns → 5.3ns(約52%短縮)StartsWithBmp: 5.6ns → 2.2ns(約61%短縮)EndsWithBmp: 5.6ns → 2.5ns(約56%短縮)TrimBmp: 35.2ns → 14.9ns(約58%短縮)TrimEndBmp: 24.8ns → 11.8ns(約52%短縮)
非BMP Supplementary処理は概ね同等またはわずかな低下(1-6%)。Replace/Split/Trim系統で最適化効果が顕著。
関連Issue
なし
その他
内部実装の最適化。公開API仕様に変更なし。
#127936 crossgen2: Add Length Prefix to Crossgen-Generated Wasm
- 作成者: @adamperlin
- 作成日時: 2026年05月08日 00:20:04(UTC)
- マージ日時: 2026年05月11日 16:01:12(UTC)
- ラベル: area-crossgen2-coreclr
概要
Wasm AOT コンパイル(Crossgen2)において、関数本体の ULEB128 長プレフィックスを ObjectData に直接エンコードする仕組みに統一しました。従来は SectionWriter/ObjectWriter で動的に長プレフィックスを挿入していましたが、これを廃止し、JIT と同じ方式(#127773 で導入)に合わせています。
変更内容
- WasmObjectWriter.cs: Wasm 固有の長プレフィックス設定ロジックを削除
- WasmInstructions.cs: 関数本体に長プレフィックスが含まれることを考慮したリロケーションオフセット調整
- SectionWriter.cs:
EmitDataからの長プレフィックス挿入機能を削除 - ObjectWriter.cs: 従来の動的プレフィックス挿入補正ロジックを削除
- WasmEmitter.cs: Crossgen2 生成の Wasm import thunk に ULEB128 長プレフィックスを直接先頭に付与
パフォーマンスへの影響
影響なし(リファクタリングであり、ランタイム動作は変わらない)
関連Issue
その他
内部実装の変更であり、公開 API に影響はありません。JIT とAOT コンパイラのプレフィックス処理を統一することで、コード生成パイプラインの一貫性が向上します。
#127931 Move the return var out of liveLocalsIntervals
- 作成者: @BrzVlad
- 作成日時: 2026年05月07日 19:00:38(UTC)
- マージ日時: 2026年05月11日 16:08:04(UTC)
- ラベル: area-CodeGen-Interpreter-coreclr
概要
非同期呼び出し時の継続状態キャプチャにおいて、戻り値変数がライブローカル変数として継続オブジェクトに保存されていた問題を修正。これにより未初期化データがコピーされ、GCの不整合クラッシュを引き起こしていた。戻り値メタデータを専用に追跡し、再開パスで明示的に復元することで解決。
変更内容
- src/coreclr/interpreter/compiler.cpp: 非同期サスペンド時に戻り値変数をライブ変数セットから除外し、
InterpAsyncSuspendDataに戻り値サイズとスタックオフセットのメタデータを記録。インターバルマップファイナライズ時に変数インデックスから最終スタックオフセットへのパッチ処理を追加。 - src/coreclr/interpreter/inc/interpretershared.h:
InterpAsyncSuspendData構造体に戻り値の継続サイズとスタックオフセットフィールドを追加。 - src/coreclr/vm/interpexec.cpp: ライブローカル変数のコピー領域を結果ストレージの後ろに移動し、再開時に
GetResultStorage()から戻り値を明示的にインタープリタスタックに復元するロジックを追加。
パフォーマンスへの影響
影響なし
関連Issue
その他
非同期継続をサポートするインタープリタモードでのGCクラッシュを修正するもの。メモリレイアウトの変更により、継続オブジェクトでの未初期化データ保存が防止される。
#127926 [wasm][coreclr] Enable System.Linq.Expressions.Tests
- 作成者: @radekdoulik
- 作成日時: 2026年05月07日 16:52:19(UTC)
- マージ日時: 2026年05月11日 14:48:09(UTC)
- ラベル: arch-wasm area-Infrastructure-libraries
概要
WebAssembly(Browser)上のCoreClrランタイムでSystem.Linq.Expressions.Testsが実行されるようになります。このテストスイートは以前は無効化されていましたが、調査により5,670件のテストすべてがRelease CoreClrで成功することが確認されたため、再度有効化するものです。
変更内容
src/libraries/tests.proj:Browser/CoreClr固有のプロジェクト除外設定からSystem.Linq.Expressions.Testsを削除(1行削除)- 他のシナリオ(AOT/aggressive trimming、Apple mobile simulator CoreCLr)の除外設定は変更なし
- 既存の3件のテスト失敗は[ActiveIssue]属性で適切に処理済み
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
- 以前、Debug-onlyのSkipOnCoreClr trait filterが原因で0件のテストが実行されていた状況が解決されます
- 5,670件のテストがBrowser/CoreCLrランタイムのテスト対象に追加されます
#127921 Reduce Unsafe usage in TryWriteSignificand/TryHash helpers
- 作成者: @EgorBo
- 作成日時: 2026年05月07日 15:50:59(UTC)
- マージ日時: 2026年05月11日 15:11:52(UTC)
- ラベル: area-System.Numerics reduce-unsafe
概要
TryWriteSignificandおよびTryHashヘルパーメソッドにおいて、安全でないコード(unsafe)の使用を削減するリファクタリング。型安全性を向上させながら同等の機能を維持する変更。
変更内容
- Decimal.cs:
unsafeキーワード使用箇所を削減(-26行) - Double.cs: ポインタ操作を安全な方法に置き換え(+28行、-8行)
- Single.cs: ポインタ操作を安全な方法に置き換え(+28行、-8行)
- NFloat.cs: 大幅なリファクタリング、
unsafeコード削減(+4行、-77行)
これらはいずれも内部実装の変更で、公開APIに影響なし。
パフォーマンスへの影響
影響なし(リファクタリングによる機能的な動作変更がないため)
関連Issue
なし
その他
本変更は内部ヘルパーメソッドのコード品質向上を目的としており、互換性への影響はなし。unsafe コード削減により、メモリ安全性の向上と保守性の向上が期待される。
#127911 Fix ThinSList size and unify EMPTY_BASES definitions
- 作成者: @Copilot
- 作成日時: 2026年05月07日 12:55:39(UTC)
- マージ日時: 2026年05月11日 14:53:58(UTC)
- ラベル: area-PAL-coreclr
概要
SListがMSVCにおいて空ベースクラス最適化を受けていないために2ポインタサイズの容量を無駄に消費していた問題を修正。EMPTY_BASES_DECLマクロをminipalに一元化し、CoreCLRとNativeAOT両者で共通利用できるようにしました。これによりSListのメモリフットプリント(特にヘッドのみのリスト)が削減されます。
変更内容
src/native/minipal/utils.h—EMPTY_BASES_DECLの正規定義を追加(MSVC:__declspec(empty_bases)、その他は空)src/coreclr/pal/inc/pal.h— 無条件のEMPTY_BASES_DECL定義を削除し、minipalの定義を有効化src/coreclr/inc/palclr.h— ローカル定義を削除してminipal定義に統一src/coreclr/inc/slist.h—EMPTY_BASES_DECLをSListに適用。レイアウト検証用のstatic_assertを#ifdef _DEBUG配下に移動(リリースビルドへの影響を排除)- その他複数ファイル — マクロ定義の統一に伴う軽微な調整
パフォーマンスへの影響
メモリ効率の向上。SListのインスタンスサイズが削減され、特にヘッド専用リスト等でメモリ使用量が改善されます。ただしベンチマーク結果の記載なし。
関連Issue
なし
その他
EMPTY_BASES_DECLがminipalの単一ソースの真実(single source of truth)となることで、CoreCLRとNativeAOT間での定義の一貫性が確保されます。デバッグビルドでのレイアウト検証が組み込まれており、予期されたサイジングが保証されます。
#127904 Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR
- 作成者: @pavelsavara
- 作成日時: 2026年05月07日 08:04:20(UTC)
- マージ日時: 2026年05月11日 15:22:12(UTC)
- ラベル: area-VM-coreclr
概要
CoreCLRのGetOsPageSize()ラッパーを削除し、すべてのコールサイトを#127328で導入された標準APIminipal_getpagesize()に統一するPR。WASMの16KBページサイズなど、プラットフォーム間でのページサイズ意味論の一貫性を確保します。
変更内容
- 削除:
src/coreclr/utilcode/util.cppからGetOsPageSize()とGetOsPageSizeUncached()を削除、src/coreclr/inc/utilcode.hから宣言を削除 - 追加:
utilcode.hに#include <minipal/ospagesize.h>を追加(VM/utilcodeのすべてのコンシューマーをカバー)、PALテストファイル2つにも追加 - 置換: CoreCLR内の30ファイルにおいて、すべての
GetOsPageSize()呼び出しをminipal_getpagesize()に置換 - 型の変更:
minipal_getpagesize()の戻り値型をsize_tからuint32_tに変更(コールサイトでの不要なキャストを削除) - マクロ修正:
HARD_GUARD_REGION_SIZEの二重定義を削除、SIZEOF_DEFAULT_STACK_GUARANTEEとHARD_GUARD_REGION_SIZEのマクロ衛生を改善(外側の括弧で囲む、不要な1 *乗数を削除) - ビット演算修正:
codeman.hのROUND_DOWN_TO_PAGE/ROUND_UP_TO_PAGEマクロをページサイズをsize_tに拡張してから逆ビットマスクを適用(MSVC C4319警告を回避)
パフォーマンスへの影響
影響なし。これはコード統一化のリファクタリングで、実行時の動作やパフォーマンス特性は変わりません。ただしWASMではページサイズが64KB(memory.grow粒度)から正しい16KBに修正されます。
関連Issue
その他
- 関連するミニPAL
ospagesize.hでは各プラットフォームの最適化が維持されます:Windows/WASMはコンパイル時定数(GCがアライメント計算で定数折り畳み可能)、Unixは1回のみキャッシュされたgetpagesize()結果 - 同期的なAPI標準化により、今後の保守性が向上します
#127787 [mono] Handle nint/nuint in Crc32 and ArmBase intrinsic dispatch
- 作成者: @kotlarmilos
- 作成日時: 2026年05月05日 10:48:06(UTC)
- マージ日時: 2026年05月11日 15:14:56(UTC)
- ラベル: area-Codegen-JIT-mono
概要
Mono AOT コンパイル時に nint/nuint 型のオーバーロードを持つ Crc32 と ArmBase 組み込み関数のディスパッチが失敗する問題を修正します。simd-intrinsics.c の型チェックロジックを改善し、MONO_TYPE_I/U に対応させることで、tvos-arm64 での System.Private.CoreLib.dll AOT プリコンパイルをブロック解除します。
変更内容
src/mono/mono/mini/simd-intrinsics.c: ARM64 組み込み関数のオペコード選択ロジックを修正ArmBase.ReverseElementBitsのディスパッチを更新し、引数の実際の型に基づいて 32 ビット/64 ビット命令を選択Crc32.ComputeCrc32/ComputeCrc32Cのディスパッチを更新し、MONO_TYPE_I/Uを認識してポインタサイズ/オペランド幅に基づいて CRC32W vs CRC32X を選択
パフォーマンスへの影響
影響なし
関連Issue
その他
- この修正により、tvos appletv 上で以下の 4 つのテスト作業が復帰します:
System.Configuration.ConfigurationManager.Tests、System.Reflection.MetadataLoadContext.Tests、System.Security.Cryptography.Xml.Tests、System.Text.Json.Tests(以前は終了コード 21 で失敗していました) - 影響範囲は Mono ランタイムの SIMD 組み込み関数ディスパッチ(内部実装)です
- 破壊的変更なし
#127636 [cDAC] RuntimeSignatureDecoder and centralized Signature contract (2/5)
- 作成者: @max-charlamb
- 作成日時: 2026年05月01日 04:27:56(UTC)
- マージ日時: 2026年05月11日 14:53:37(UTC)
- ラベル: area-Diagnostics-cdac
概要
cDAC(CoreCLR Diagnostic Data Access Contract)の署名デコーディング統一化の第2段階。RuntimeSignatureDecoderを導入し、System.Reflection.Metadata の SignatureDecoder に合わせた API を提供しつつ、CoreCLR 固有の内部署名要素型(ELEMENT_TYPE_INTERNAL / ELEMENT_TYPE_CMOD_INTERNAL)に対応。Signature契約と StackWalk契約(GC参照スキャン)で統一的に署名をデコードするようにリファクタリング。
変更内容
RuntimeSignatureDecoder(新規): ECMA-335準拠の署名デコーダ、DecodeType/DecodeFieldSignature/DecodeMethodSignature/DecodeLocalSignatureメソッドを提供。IRuntimeSignatureTypeProvider(新規):ISignatureTypeProviderの上位セットで、ランタイム内部型用のGetInternalType()/GetInternalModifiedType()コールバック追加。SignatureTypeProvider拡張:IRuntimeSignatureTypeProviderを実装し、内部型をRuntimeTypeSystem.GetTypeHandleで解決。- GC参照スキャンの署名ベース化:
GcSignatureTypeProviderで各メソッドパラメータを Ref/Interior/Other/None に分類、GcSignatureContextで型変数を解決。 - StackWalk統合:
TransitionBlockのウォークを予約スロット数に基づいて実施、IsStoredSigMethodDescで動的・配列メソッドの署名を取得。 - Signature契約の簡潔化: GC固有デコーディングは StackWalk契約に隔離、Signature契約は最小限のサーフェス維持。
- ドキュメント更新:
SignatureDecoder.mdでRuntimeSignatureDecoderの説明追加、StackWalk.mdで "Signature-Based Scanning" セクション追加。
パフォーマンスへの影響
影響なし(リファクタリングと API統一化で機能的な変更なし)。モジュール単位の GcSignatureTypeProvider キャッシング導入により、重複デコーディングを削減。
関連Issue
その他
Copilot指摘事項の確認:
SignatureTypeProviderの未使用フィールド_targetを削除またはCS0414対応が必要。GcScanner.csでisValueTypeThisが常にfalseのまま、値型インスタンスメソッドのthisがGC_CALL_INTERIORで報告されていない可能性。- 契約名を
ISignatureDecoderからISignatureに変更する場合、ワイヤレベルの互換性低下(TContract.Nameルックアップキー)への対応が必要。公開API変更にはapi-approvalイシューの事前確認が推奨。 - ドキュメント記載が
ISignatureDecoderで統一されているが、コード上はISignatureに改名。
テスト状況: 全 1921 cDAC ユニットテスト合格、ビルドは警告・エラーなし。
#127538 Arm64 SVE2: CreateWhileGreaterThan* and CreateWhileReadAfterWrite*
- 作成者: @dhartglassMSFT
- 作成日時: 2026年04月28日 23:44:12(UTC)
- マージ日時: 2026年05月11日 22:29:18(UTC)
- ラベル: area-System.Runtime.Intrinsics
概要
Arm64 SVE2命令セットに対応した新しいハードウェア組み込み関数を追加します。CreateWhileGreaterThan*(ベクトルの末尾から始まるマスクビット)とCreateWhileReadAfterWrite*(ポインタ値に基づくマスク生成)の2つのイントリンシクファミリーを実装します。これらは既存のCreateWhileLess*イントリンシクをベースにしており、Linux-arm64でjitstressテストに合格しています。
変更内容
公開API(System.Runtime.Intrinsics.Arm):
Sve2.cs/Sve2.PlatformNotSupported.cs:CreateWhileGreaterThan*、CreateWhileGreaterThanOrEqual*、CreateWhileReadAfterWriteMask*の新規イントリンシク定義(603行追加)System.Runtime.Intrinsics.cs:参照アセンブリの更新(90行追加)
JITコンパイラ実装:
hwintrinsiclistarm64sve.h:新イントリンシクのメタデータ定義(30行追加)hwintrinsiccodegenarm64.cpp:SVE2コード生成ロジック(+64/-22)hwintrinsic.cpp:汎用処理追加(20行追加)
テスト関連:
SveCreateWhileRWMaskTest.template:新規テンプレート。ポインタ値に基づくマスク検証(同一アドレス、オフセット+1のシナリオ対応)Helpers.cs:WhileGreaterThanMask/WhileGreaterThanOrEqualMaskヘルパー関数追加Sve2Tests.cs:生成テスト用エントリ追加(93行追加)
パフォーマンスへの影響
影響なし。新規イントリンシクの追加であり、既存コードのパフォーマンス変化はありません。
関連Issue
その他
CreateWhileGreaterThan*APIは#108233で提案された仕様に準拠CreateWhileReadAfterWrite*のテストは従来と異なり、ポインタ値自体(内容ではなく)に依存する動作のため、専用テンプレートが必要- Linux-arm64プラットフォーム上でのjitstressテストに合格
#127483 [WASM] Add READYTORUN_FIXUP_InjectStringThunks and R2R thunk infrastructure
- 作成者: @davidwrighton
- 作成日時: 2026年04月28日 00:01:45(UTC)
- マージ日時: 2026年05月11日 20:41:41(UTC)
- ラベル: area-crossgen2-coreclr
概要
WebAssembly上のReadyToRun (R2R) イメージにおいて、文字列キーによるプリジェネレーテッドコード thunk の検出を可能にする end-to-end インフラストラクチャを追加します。新しいR2R fixup READYTORUN_FIXUP_InjectStringThunks (0x39) により、R2R コンパイル済みコードと WASM インタープリタ間の相互運用性を実現します。
変更内容
コンパイラ側 (Crossgen2)
StringDiscoverableAssemblyStubNode:文字列キーで検出可能な stub の抽象基底クラスWasmR2RToInterpreterThunkNode:R2R→インタープリタ遷移用 thunk (キー形式:"I"+signatureString)WasmInterpreterToR2RThunkNode:インタープリタ→R2R遷移用 thunk (キー形式:"M"+signatureString)WasmLowering.cs:署名文字列生成・エンコード機能を拡張(S<N>struct、Tthis ポインタ、pByRef 接尾辞に対応)InjectStringThunksSignature.cs:(UTF8 文字列、テーブル相対インデックス) ペアのペイロード生成
ランタイム側 (CoreCLR)
StringToThunkHash:グローバル CAS ベースの copy-on-write ハッシュテーブル(ロックフリー読み取り)ProcessInjectStringThunksFixup:R2R イメージから fixup を処理し、グローバルテーブルに統合LookupPregeneratedThunkByString:ロックフリー lookup APIPortableEntryPoint::TrySetInterpreterThunk:CAS ベースの thunk 割り当て(1 回限り)- 遅延 thunk 解決:R2R モジュール読み込み前に初期化された
PortableEntryPointを追跡・解決 LoaderAllocator::Destroy:集約可能アセンブリの cleanup 処理
JIT 統合
CorInfoImpl.ReadyToRun.csのrecordCallSite:WASM callsite 依存関係を記録し、適切なWasmInterpreterToR2RThunkNodeを demand-driven で生成INDEBUG_OR_WASMマクロ:WASM 非デバッグビルドでも callsite 署名情報を保持
署名エンコード (ABI)
- 統一フォーマット:
<prefix><return>[T][hidden-params]<explicit-params>[p] - WasmLowering.cs (crossgen2)、SignatureMapper.cs (WasmAppBuilder)、helpers.cpp (runtime) に3つの並列実装
- struct (
S<N>)、ByRef (p接尾辞)、TypedByReference、generics context、this ポインタに対応
R2R ヘッダバージョン
- minor version を 18.6 に bump(managed/native 両側)
パフォーマンスへの影響
lock-free CAS ベースのハッシュテーブル実装により、R2R モジュール読み込み時のグローバルテーブル更新時のみ同期化。通常の lookup 時はロック不要のため、インタープリタ dispatch パスでのオーバーヘッド最