Pull Request on 2026年09月04日

dotnet/runtimeにマージされたPull RequestをAIで日本語要約

注意点

このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。


目次

  1. #133239 [wasm][wasi] CoreCLR-WASI bring-up fixes: Checked build, PAL stubs, getHelperFtn, call helpers
  2. #133231 Update jit-format workflow to install .NET 10 SDK
  3. #133223 [release/10.0] Source code updates from dotnet/dotnet
  4. #133210 [wasm] Narrow multi-use operands read out of long locals
  5. #133206 JIT: Synthesize profile data when invalid counts are discarded
  6. #133205 Fix EC public key export for provider keys
  7. #133202 Convert AssemblyChecker to use MetadataLoadContext to avoid file locking.
  8. #133182 [release/10.0] Release ThreadStore lock before blocking for shutdown
  9. #133181 [release/11.0] Release ThreadStore lock before blocking for shutdown
  10. #133177 [release/10.0] Check for SIG_IGN and SIG_DFL before calling previous signal handler
  11. #133173 Fix SIMD MinMax constant special cases
  12. #133170 [release/10.0] Fix SIMD primitive zero initialization
  13. #133168 [release/11.0] Fix SIMD primitive zero initialization
  14. #133165 Use writable UserSecrets path on Apple mobile
  15. #133163 [clrinterp] Avoid redundant checking for frame data during method return
  16. #133137 Improve PemEncoding.TryFind perf with degenerate inputs
  17. #133136 Fix Wasm SCC dispatcher predecessor rewrites
  18. #133117 [release/11.0] Fix Crossgen2 variance validation for type constraints
  19. #133111 Use SDK pipeline for WebAssembly framework R2R
  20. #133090 [release/8.0] Detect ephemeral client cert key via SEC_E_UNKNOWN_CREDENTIALS in QUIC
  21. #133039 Restore chaos65204782cs as a standalone JIT test
  22. #133038 Support serialized type names in R2R type maps
  23. #133000 [wasm] R2R bring-up prerequisites for browser
  24. #132965 [wasm] Delete hand-written R2R-to-interpreter thunks; rely on crossgen2's
  25. #132944 Allow constrained. call and ldftn for static virtual interface methods in ILVerify
  26. #132863 [release/11.0] Fix ConcurrentQueue.TryDequeue spuriously reporting empty during a segment freeze
  27. #132816 JIT: extend relaxed checks through morph
  28. #132713 Extract WASM data segment functionality to an interface and create implementations for WebCIL and NativeAOT
  29. #132667 Fix ILVerify validation for delegates with boxed value type targets
  30. #131931 Linked cache entry thread safety fix
  31. #131877 [wasm] Compute CoreCLR P/Invoke struct sizes with crossgen2's type system

#133239 [wasm][wasi] CoreCLR-WASI bring-up fixes: Checked build, PAL stubs, getHelperFtn, call helpers

概要

CoreCLR-on-WASI bring-up向けの複数の独立した修正セット。Checked buildでのJIT/CodeGenBringUpTests実行時に発見された問題を解決します。主な修正は、WASI PAL stubs(PAL_ProbeMemory)の提供、WASI例外処理フラグのビルド時条件制御、ReadyToRun関連アサーションの緩和、WASI call-helper テーブルの再生成です。

変更内容

  • PAL stubs修正(src/coreclr/pal/src/arch/wasm/stubs.cpp):Checked buildで未定義となっていたPAL_ProbeMemoryを追加し、DebugBreakスタブの無限再帰問題を修正
  • WASI PAL debug.cpp(src/coreclr/pal/src/debug/debug.cpp):WASI除外ファイルの無駄なWASI固有分岐を削除
  • JIT helper assertion緩和(src/coreclr/vm/jitinterface.cpp):IL-based動的helper(VirtualFunctionPointerなど)がReadyToRun有効時に解釈実行可能なよう、HasNativeEntryPointでアサーション保護
  • ビルドフラグ条件制御(eng/native/configureplatform.cmake):WASI例外処理フラグ(-fwasm-exceptions等)をクロスコンポーネント非ビルド時に限定し、MSVCホストツール側へのリーク防止
  • Call helper再生成(src/coreclr/vm/wasm/wasi/callhelpers-*.cpp):WASI framework closure上でcrossgen2 PortableCallHelpers生成器により再生成

パフォーマンスへの影響

影響なし

関連Issue

#133240、#133124、#133187

その他

セキュリティに関する指摘: Copilotレビューで、新しいPAL_ProbeMemory stubがポインタ/サイズ演算でのオーバーフロー可能性を指摘しており、範囲検証の不正が生じる懸念あり。


#133231 Update jit-format workflow to install .NET 10 SDK

概要

jitutils が net10.0 をターゲットとするようになったため、jit-format ワークフローで .NET 8.0 SDK を使用してのブートストラップが Linux で失敗する問題を解決します。ワークフローの .NET SDK バージョンを 8.0.x から 10.0.x にアップデートします。

変更内容

  • .github/workflows/jit-format.yml: インストール対象の .NET SDK バージョンを 8.0.x から 10.0.x にアップデート
  • src/coreclr/jit/importer.cpp: impResolveToken メソッド内で CORINFO_RESOLVED_TOKEN フィールドの初期化順序を変更(ワークフロー変更と無関係な変更として指摘されている)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

⚠️ スコープ問題: Copilot のレビューで指摘されている通り、importer.cpp の変更がワークフロー更新と無関係なため、別の PR に分けるか削除することが推奨されています。このスコープの混在は本 PR の目的(ワークフロー更新)に対して雑音となる可能性があります。


#133223 [release/10.0] Source code updates from dotnet/dotnet

概要

dotnet/dotnetリポジトリからのコードフロー更新です。VMR(Virtual Mono Repository)を通じた自動化されたソースコード同期であり、複数の依存パッケージバージョンが更新されています。release/10.0ブランチ向けの定期的なメンテナンス更新です。

変更内容

  • NuGet.config: NuGetフィード設定の変更
  • eng/Version.Details.props、eng/Version.Details.xml: 依存パッケージバージョンの更新
  • global.json: グローバルツールチェーンバージョン情報の更新

主な依存パッケージ更新:

  • Microsoft.CodeAnalysis系: 5.0.0-2.26451.111 → 5.0.0-2.26453.111
  • Microsoft.DotNet.Arcade.Sdk等ビルドツール: 10.0.0-beta.26451.111 → 10.0.0-beta.26453.111
  • Microsoft.DotNet.Cecil: 0.11.5-alpha.26451.111 → 0.11.5-alpha.26453.111
  • NuGet系パッケージ: 7.0.3-rc.45211 → 7.0.3-rc.45411

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

これはコードフロー自動化PRであり、dotnet/arcade、dotnet/aspnetcore、dotnet/efcore、dotnet/runtime、dotnet/sdk、dotnet/templating、dotnet/windowsdesktop、dotnet/winforms、dotnet/wpfなど複数のリポジトリからの変更が含まれています。詳細はdarc vmr diffコマンドで確認可能です。


#133210 [wasm] Narrow multi-use operands read out of long locals

概要

WebAssembly JITコード生成における型不整合バグを修正します。型縮小キャスト(long → int)が施されたローカル変数を複数回使用する場合、再マテリアライズ時に必要な型変換(i32.wrap_i64)が漏れていました。これにより、スタック型が不正なwasm(例:i32.eqz が i64 に適用される)が生成され、wasm検証に失敗していました。

修正内容: genEmitMultiUseOperandGet ヘルパーを追加し、ローカル変数の再取得時に適切な型変換を挿入します。実際の案件(Jil)では7つの不正なwasm関数が修正されました。

変更内容

  • codegenwasm.cpp: 新規ヘルパー genEmitMultiUseOperandGet を実装。多用途オペランドを再マテリアライズする際、オペランドが広いローカル型(long)の型縮小ビューの場合に i32.wrap_i64 を挿入
  • codegenwasm.cpp / hwintrinsiccodegenwasm.cpp: 除算/剰余例外チェック、checked演算オーバーフロー、checked型キャストオーバーフロー、nullチェック、インデックスアドレッシング、SIMD12演算で新ヘルパーを呼び出し
  • codegen.h: wasm専用ヘルパーを宣言、genIntCastOverflowCheck シグネチャを調整
  • Runtime_133209.cs: 15個の無効なwasm関数を生成する回帰テストケースを追加(除算/剰余、オーバーフロー検出、型キャスト、nullチェック、ブロック操作を網羅)

パフォーマンスへの影響

影響なし。修正は例外チェック経路の型検証ロジックのみで、既存のコード生成に変更なし(System.Collections等の主要アセンブリでバイト同一確認済み)。

関連Issue

#133209

その他

Copilot指摘による懸念点:

  • 回帰テストで Dereference_WithNarrowedAddress のエンディアン依存アサーションがビッグエンディアン環境で失敗の可能性
  • TYP_INT / TYP_LONG のみの型チェックで、TYP_UINT / TYP_ULONG や TYP_I_IMPL(wasm32のネイティブint)が未対応
  • wasm JIT複数箇所での型スタック敏感な変更のため、最終レビューが推奨

実績: Jil ISO8601TimeSpan パーサーで 7 → 0 不正関数に改善。osx-arm64 テスト 25 ケース全パス、クロスターゲットJIT(arm64/arm/x64/x86)も再コンパイル成功。


#133206 JIT: Synthesize profile data when invalid counts are discarded

概要

JITのプロファイル誘導最適化(PGO)において、エッジカウント再構築後にプロファイルデータが無効化される場合の処理を改善しました。従来のRepairLikelihoodsに加えて、fgPgoHaveWeightsがクリアされた場合はResetAndSynthesizeを実行し、ヒューリスティクスでエッジの可能性を再合成します。これにより、無効なプロファイルデータがプロファイル由来と誤標識されることを防ぎ、コールドパスの最適化判定が正確になります。

変更内容

  • src/coreclr/jit/fgprofile.cpp: プロファイル組み込み後のエッジカウント再構築で、fgPgoHaveWeightsがクリアされた場合の条件分岐を追加
    • プロファイルが有効な場合:RepairLikelihoodsで既存の尤度を修復
    • プロファイルが無効化された場合:ResetAndSynthesizeでエッジ尤度と重みを再初期化

パフォーマンスへの影響

最適化判定の精度向上により、特にコールドパス(例:例外スロー)の処理が改善される可能性があります。ただし、具体的なベンチマーク数値は提供されていません。変更はプロファイル無効時の既存ヒューリスティクス利用に限定されており、回帰リスクは低いと判断されています。

関連Issue

なし

その他

Copilotレビューでは「Approval recommended」と評価されており、変更が狭いスコープで既存の合成モード(ResetAndSynthesize)を活用しており、正確性が確保されていると指摘されています。


#133205 Fix EC public key export for provider keys

  • 作成者: @vcsjones
  • 作成日時: 2026年09月03日 21:44:17(UTC)
  • マージ日時: 2026年09月04日 18:55:07(UTC)
  • ラベル: area-System.Security

概要

PKCS#11 OpenSSL プロバイダーを使用したEC公開鍵エクスポートが失敗する問題を修正します。プロバイダーベースのキーでは、EVP_PKEY_todata KEYMGMT APIを通じて公開鍵を取得する必要があります。既存のダイレクト公開鍵フェッチを試行し、失敗した場合にEVP_PKEY_todataを使用するフォールバック処理を追加して互換性を保ちながら対応します。

修正前:CryptographicException: Error occurred during a cryptographic operation が発生 修正後:EC公開鍵のエクスポートが成功し、X.509証明書への秘密鍵の結合が可能に

変更内容

  • pal_ecc_import_export.c: フォールバックパスとしてEVP_PKEY_todataを用いた公開鍵エクスポート処理を追加。既存のダイレクトEVP_PKEY_get_octet_string_paramが失敗時に自動的にフォールバック。EC点デコーディングロジックを両パス対応に調整
  • osslcompat_30.h: EVP_PKEY_todata、OSSL_PARAM_get_octet_string_ptr、OSSL_PARAM_locate_constのプロトタイプ宣言を追加
  • opensslshim.h: 新しいOpenSSL 3.0 APIをライトアップ関数テーブルと別名マクロに統合

パフォーマンスへの影響

既存の高速パス(ダイレクト公開鍵フェッチ)を優先し、失敗時のみフォールバックするため、通常のケースではパフォーマンス影響なし。プロバイダーベースのキーのみフォールバック処理が実行される設計。

関連Issue

#133171

その他

  • レビュー過程でCopilotから指摘されたバリデーション問題や文法問題は既に解決済み
  • ネイティブC層の暗号化実装変更であり、OpenSSL/プロバイダー構成での検証が重要
  • OSSL_PKEY_PARAM_PUB_KEYパラメータは既存パスとフォールバックパスで同じため、同一のポイント処理ロジックで対応可能

#133202 Convert AssemblyChecker to use MetadataLoadContext to avoid file locking.

概要

AssemblyCheckerツールの--is-debugチェック機能をMetadataLoadContextベースの実装に変更し、Assembly.LoadFromによる永続的なファイルロック問題を解決します。これにより、管理ILASMのPR(#133188など)で発生していたファイルロック競合を回避できます。

変更内容

  • Program.cs: Assembly.LoadFromベースのIsDebug実装を削除し、AssemblyInspectorへ処理を委譲
  • AssemblyInspector.cs: MetadataLoadContextを使用してDebuggableAttributeを検査し、最適化が無効化されているかを判定する新しいIsDebugメソッドを追加。カスタムRuntimeAssemblyResolverを実装してランタイムアセンブリの解決に対応
  • AssemblyChecker.csproj: System.Reflection.MetadataLoadContextパッケージ参照を追加

パフォーマンスへの影響

影響なし。ファイルロック問題の解決により、並列実行時の競合が低減される見込み。

関連Issue

#133188

その他

Copilotレビューで以下の懸念事項が指摘されており、改善が推奨されています:

  • 中程度: MetadataLoadContextの解決戦略がランタイムアセンブリ以外の属性依存関係を持つアセンブリで失敗する可能性がある
  • 中程度: RuntimeAssemblyResolverの実装がtypeof(object).Assembly.Locationに依存しており、環境によって動作が異なる可能性がある
  • 低: BadImageFormatExceptionが詳細メッセージなしでスローされており、診断が困難。アセンブリパスを含むメッセージの追加が推奨される

#133182 [release/10.0] Release ThreadStore lock before blocking for shutdown

概要

デバッガーのシャットダウン時にThreadStoreロックが保持され続けることで、デバッガーの終了またはアプリケーションのクローズ時に無限ハングが発生する問題を修正します。シャットダウン中に非特殊スレッドがThreadStoreロックを保持している状態でパークされるのを防ぎ、デバッガーヘルパーの同期が完了できるようにします。

変更内容

  • debugger.cpp: シャットダウンロジックに条件付きでThreadStoreロック解放処理を追加(+31行)
  • debugger.h: シャットダウン関連の新規宣言を追加(+1行)
  • crst.cpp/crst.h: 非推奨の古いロック管理コード削除(合計-54行)

パフォーマンスへの影響

影響なし。デバッガーシャットダウン時の応答性向上:内部検証により、修正版では約4秒で完了する一方、修正前はタイムアウトまで無限ハングが続いていました。

関連Issue

#126096、#133049

その他

  • ターゲットリリース:.NET 10 (release/10.0)
  • 本修正はrelease/10.0-staging ではなく release/10.0 を対象
  • 変更スコープは限定的でデバッガーシャットダウンロジックのみ対象
  • 特殊スレッドの動作は変更なし
  • リスク評価:低
  • テスト結果:CoreCLRビルド成功、前景シャットダウンテスト5回連続成功

#133181 [release/11.0] Release ThreadStore lock before blocking for shutdown

概要

#133049のrelease/11.0へのバックポート。ThreadStoreロックをシャットダウン時のブロッキング前に解放する変更を実装しています。これにより、シャットダウン処理中のデッドロック防止が期待されます。

変更内容

  • src/coreclr/debug/ee/debugger.cpp/h: ThreadStoreロック管理の実装追加(+31行)
  • src/coreclr/vm/crst.cpp/h: 既存のロック処理削除(-54行)

主な変更は、シャットダウン処理におけるThreadStoreロックの解放タイミングを最適化し、ロック保持中のブロッキング状態を回避する内容と推定されます。

パフォーマンスへの影響

シャットダウン処理の最適化による潜在的なデッドロック回避。通常の実行時パフォーマンスへの影響は軽微と考えられます。

関連Issue

#133049

その他

  • release/11.0へのバックポート対応
  • テスト方法やリグレッション検証の詳細は記載されていません

#133177 [release/10.0] Check for SIG_IGN and SIG_DFL before calling previous signal handler

概要

macOSにおけるシグナルハンドラの不正な呼び出しによるセグメンテーション違反を修正するパッチです。execve実行後、macOSはsa_flagsをクリアしないため、stale なSA_SIGINFOフラグが残り、SIG_IGNまたはSIG_DFLに設定された前のシグナルハンドラポインタを呼び出そうとしてクラッシュします。修正では、シグナルハンドラ呼び出し前にSIG_IGNとSIG_DFLを明示的にチェックします。

変更内容

  • PalUnix.cpp: Unix/macOS上でのシグナルハンドリング処理を強化。前のシグナルハンドラを呼び出す前にSIG_IGN/SIG_DFL値をチェックするロジックを追加(+27行)
  • signal.cpp: PAL層のシグナル例外処理で同様のチェックロジックを追加(+7行)
  • 回帰テスト: GitHub #132581に関連する新しい回帰テストを追加
    • nativetest132581.cpp: macOSでのシグナルハンドラ動作を検証するネイティブテスト
    • test132581.cs: C#側のテスト実装
    • CMakeLists.txt・csproj: ビルド構成

パフォーマンスへの影響

影響なし(シグナルハンドラのチェック処理は軽量な条件判定のみ)

関連Issue

#132900の release/10.0へのバックポート

その他

  • リスク評価: Low(変更範囲が小さく、対象が限定的)
  • リグレッション: なし
  • macOSの特殊なexecve動作に起因するプラットフォーム固有の修正です
  • テストにより修正効果が確認されています

#133173 Fix SIMD MinMax constant special cases

概要

SIMD Min/Max定数処理におけるNaN および符号付きゼロの検出ロジックを修正しました。従来は全ベクトルに対するチェックを行っていたため、特殊値(NaN・符号付きゼロ)と通常値が混在する定数の場合、マネージドセマンティクスが失われていました。本修正では、レーン単位での特殊値検出に変更し、任意のレーンに特殊値が存在する場合を正しく処理するようにしました。

変更内容

  • src/coreclr/jit/simd.h: SIMD定数評価ヘルパーを拡張し、部分ベクトルサイズ対応およびマスク述語(IsNaN、IsNegative、Is(±)Zero、any/allマスク判定)を追加
  • src/coreclr/jit/gentree.h: GenTreeVecConに「NaN/±0レーンを含む」かどうかの述語を新規追加
  • src/coreclr/jit/gentree.cpp: 述語実装を追加し、xarch Min/Max高速パスの適用条件を「全レーンでなく任意レーン」の特殊値検出に更新
  • src/tests/JIT/Regression/JitBlue/Runtime_133022/Runtime_133022.cs: 定数・非定数オペランドの組み合わせでNaN伝播および符号付きゼロセマンティクスをカバーする回帰テストを追加
  • src/tests/JIT/Regression/Regression_ro_2.csproj: 新規テストをプロジェクトに統合

パフォーマンスへの影響

影響なし(定数の検出ロジック改善であり、実行時パスの性能変化はない)

関連Issue

#133022

その他

注記: Copilotによるレビューコメントによると、「両オペランドが定数ベクトル」シナリオではこのロジックがまだ到達不可能であり、元の問題が完全には修正されていない可能性があるとのこと。レビュアーによる詳細な検証が推奨されます。


#133170 [release/10.0] Fix SIMD primitive zero initialization

概要

SIMD型のローカル変数をbyref経由で構造体として再解釈し、ゼロ初期化する際に、JITが不正な命令エンコーディング(vmovq ymm0, rax)を生成し、実行時にExecutionEngineExceptionまたはTier0でInvalidProgramExceptionをスローするバグを修正します。修正により、正しいSIMDゼロ(vxorps)が生成されるようになります。

// 問題のパターン例:Vector256<ulong>をstructとしてbyref経由でゼロ初期化
Unsafe.As<Vector256<ulong>, S>(ref v) = default; // 不正な命令が生成される

変更内容

  • src/coreclr/jit/morphblock.cpp: MorphInitBlockHelper::TryPrimitiveInitでSIMDゼロ初期化への変換時に、store命令のデータoperandを整数ゼロからSIMD型ゼロノードに置き換えるよう修正(2行追加)
  • src/tests/JIT/Regression/JitBlue/Runtime_133085/Runtime_133085.cs: Vector128<ulong>とVector256<ulong>をAggressiveOptimization(FullOpts)とTier0両方で検証する回帰テストを追加
  • src/tests/JIT/Regression/JitBlue/Runtime_133085/Runtime_133085.csproj: テスト構成にプロセス隔離とTier0実行用環境変数を追加

パフォーマンスへの影響

影響なし。修正はコード生成パスのバグ修正であり、正しいSIMD命令生成により不正な実行時エラーが回避される。

関連Issue

#133085 (このPRの対応元) #133100 (release/mainからのバックポート元)

その他

  • 本修正は.NET 10.0への手動バックポート(cherry-pickで競合が発生したため、メンバ名がm_compiler→m_compに異なるのみで内容は#133100と同一)
  • バグは#85585のassignment rationalization以来存在していたが、SIMDローカルを再解釈struct経由でゼロ初期化するテストがなかったため発見されなかった
  • リスク低:修正は2行で、SIMD型ローカルのブロックゼロ初期化をプリミティブstoreに変換する場合のみに影響

#133168 [release/11.0] Fix SIMD primitive zero initialization

概要

SIMD型ローカル変数(Vector128<T>/Vector256<T>)をbyrefを通じて構造体として再解釈し、ゼロ初期化する際のコード生成バグを修正します。Unsafe.As<Vector256<ulong>, S>(ref v) = default;のようなパターンで、JITが不正なVEX.256エンコーディング(vmovq ymm0, rax)を生成し、AVX対応のx64マシンで実行時にExecutionEngineException: Illegal instructionが発生する問題を解決します。

変更内容

  • src/coreclr/jit/morphblock.cpp: TryPrimitiveInit関数で、ブロック初期化がプリミティブストアに変換される際、ストア操作のデータノードがストアの型と一致していない問題を修正。ゼロ初期化時のSIMD型ローカルに対して、正しくSIMDゼロノード(vxorps)を生成するよう2行追加。
  • src/tests/JIT/Regression/JitBlue/Runtime_133085/: 回帰テストケース追加。Vector128<ulong>とVector256<ulong>に対してFullOpts(AggressiveOptimization)とTier0の両モードでゼロ初期化をテスト。

パフォーマンスへの影響

影響なし。この修正は不正なコード生成を正しくするもので、パフォーマンスには直接的な改善・低下はありません。ただし修正により、正しいSIMDゼロ命令の生成で実行時エラーを回避できます。

関連Issue

#133085、#133100

その他

  • リリース11.0へのバックポート(#133100からの移植)
  • .NET 9も同じバグを持つ非回帰。問題は#85585の割り当て合理化作業(53b4cd0912d)に遡る。legacy GT_ASGパスはgtOp2を更新していたが、合理化されたストアパスではデータ操作が更新されていなかった。
  • リスク評価:低。SIMD型ローカルのブロック初期化がプリミティブストアに変換される場合のみ到達する2行の修正で、他のケースは既に一貫性がある。

#133165 Use writable UserSecrets path on Apple mobile

概要

Apple mobile プラットフォーム(iOS、tvOS、MacCatalyst)において、UserSecrets のパス解決ロジックを修正しました。従来はHOME環境変数を使用していましたが、これらのプラットフォームではHOMEが書き込み不可のため、プラットフォーム固有の書き込み可能なアプリケーションデータディレクトリにフォールバックするようにしました。これにより、以前は無効化されていたiOS/tvOS上のUserSecretsテストを再度有効にしました。

変更内容

  • PathHelper.cs: iOS/tvOS/MacCatalystでHOMEを無視し、SpecialFolder.ApplicationDataへの解決にフォールバック(内部実装の変更)
  • PathHelperTest.cs: Apple mobileプラットフォームでのパス解決の期待値ロジックを調整
  • ConfigurationExtensionTest.cs: iOS/tvOS用のActiveIssueスキップを削除し、UserSecretsテストを再度有効化

パフォーマンスへの影響

影響なし

関連Issue

#132074、#60584

その他

  • 変更はApple mobileプラットフォームに限定されており、他のプラットフォームへの影響なし
  • 公開APIではなく、内部実装の修正
  • 破壊的変更なし

#133163 [clrinterp] Avoid redundant checking for frame data during method return

概要

CoreCLR インタープリターの戻り値パスを最適化します。localloc を使用しないメソッドの戻り時に、フレームデータスタックのポップチェックをスキップできるようにします。一般的な戻り値パスでこのチェックを避けることで、シンプルな呼び出しマイクロベンチマークで 9% の高速化 を実現します。

変更内容

  • interpexec.cpp: INTOP_EXIT_FRAME_NO_LOCALLOC / INTOP_EXIT_FRAME マクロを追加し、共通の戻り値パスで PopInfo チェックをスキップ。新しい *_LOCALLOC 戻り値オプコードの処理を追加
  • intops.h: InterpOpIsReturn を拡張して新しい *_LOCALLOC 戻り値オプコードを戻り値として分類
  • intops.def: INTOP_RET_*_LOCALLOC オプコード(3種類)を定義
  • compiler.h: m_hasLocalloc フラグと FixLocallocRet() メソッドを追加
  • compiler.cpp: CEE_LOCALLOC 遭遇時に m_hasLocalloc をセット。コード生成後に戻り値オプコードを *_LOCALLOC 変種に書き換え

パフォーマンスへの影響

改善: シンプルな呼び出しマイクロベンチマークで 9% の高速化(macOS での測定)

大多数のメソッドは localloc を使用しないため、戻り時の不要なチェック削減により改善が期待できます。localloc 使用メソッドは追加の処理(戻り値オプコードの書き換え)が発生しますが、戻り時のパフォーマンスは維持されます。

関連Issue

なし

その他

この変更はインタープリター内部実装の最適化であり、公開 API には影響を与えません。フレームデータアロケーターのスタック操作に関わるため、アンワインド不変式の正確性が重要です。


#133137 Improve PemEncoding.TryFind perf with degenerate inputs

  • 作成者: @bartonjs
  • 作成日時: 2026年09月03日 01:01:47(UTC)
  • マージ日時: 2026年09月04日 17:02:57(UTC)
  • ラベル: area-System.Security

概要

PemEncoding.TryFindのパフォーマンスを改善し、PostEB(Post-Encapsulation Boundary)の検索戦略を最適化しました。次のハイフン位置を先に確認することで、無効なPostEBに対する高コストなBase64検証をスキップできます。病的な入力(多数のBEGINマーカーを含む)でのパフォーマンス低下を緩和します。

変更内容

  • System.Security.Cryptography/PemEncoding.cs: PemEncoding.TryFindCoreのPostEB検索ロジックを再実装。次のハイフン位置をチェックしてから詳細な検証を実行し、退化した入力の処理を削減
  • Microsoft.Bcl.Cryptography/PemEncoding.cs: ダウンレベル実装で同じ最適化を適用
  • 両テストスイート: 多数のBEGINマーカーの後に単一の有効なPEMを含む回帰テストを追加

内部実装の変更(公開APIの変更なし)

パフォーマンスへの影響

多数のBEGINマーカーを含む病的な入力に対して改善。具体的なベンチマーク数値は提供されていません。IsValidBase64検証をスキップできるケースが増えることで、検索パフォーマンスが向上します。

関連Issue

なし

その他

Copilotレビューで指摘された問題点:

  • Microsoft.Bcl.Cryptography実装の境界チェック: pemEndIndex < pemData.Length - 1は最後の1文字の検証をスキップし、PostEB直後の単一の非ホワイトスペース文字が正しく拒否されない可能性がある(pemEndIndex < pemData.Lengthに修正推奨)
  • テストコードの効率性: StringBuilder.Append()ループで~4MBの大きな文字列を生成する際、Append(char, int)オーバーロードを使用することで最適化可能

セキュリティに関連する解析ロジックの変更のため、エッジケースと境界条件を慎重に検証する必要があります。


#133136 Fix Wasm SCC dispatcher predecessor rewrites

概要

Wasm SCC(Strongly Connected Component)ディスパッチャーの前身書き換え処理を修正します。TransformViaSwitchDispatchが複数のSCCエントリヘッダーを順序付けで処理する際、早期ヘッダーの書き換えによって新たにライブになった先行ブロックが、後続するtryヘッダーの先行ブロックとして扱われ、制御変数ストアが重複代入されてディスパッチケースが上書きされていた問題を解決します。

変更内容

  • src/coreclr/jit/fgwasm.cpp: 任意の書き換え前にSCCエントリヘッダーの先行ブロックセットをスナップショット化し、早期ヘッダーの変換で意図的に削除された元のエッジを無視する仕様に変更。これにより各転送ブロックが選択されたSCCエントリの制御変数割り当てを保持します。
  • src/tests/JIT/Regression/JitBlue/Runtime_133120/Runtime_133120.csproj: ブラウザのみのAlwaysUseCrossGen2設定を削除。

パフォーマンスへの影響

影響なし

関連Issue

#133120、#133132(積み重ねられたPR)

その他

  • 本PRは#133132にスタックされており、マージ後にmainへのリターゲットが予定されています。
  • 検証済み: browser-wasm Checked ビルドでRuntime_133120テストが期待値(100)を返却し、JIT ダンプ確認でSCC転送ブロックが各1つの制御変数割り当てを受け取ることが確認されています。
  • Copilot からの指摘: プロジェクト設定変更によるbrowser-wasm CrossGen2 パスの検証不足が懸念されています。

#133117 [release/11.0] Fix Crossgen2 variance validation for type constraints

概要

Crossgen2のReadyToRun型検証におけるジェネリック分散(variance)ルールの適用ロジックを修正するバックポートです。従来、型の独自の制約(own constraints)に分散ルールが誤って適用され、有効なvariant interfaceがRUNTIME_FLAG_SkipTypeValidationフラグを失う問題が発生していました。本変更でECMA-335 II.9.7仕様に準拠した検証に修正し、パフォーマンス最適化を復元します。

変更内容

  • TypeValidationChecker.cs: インターフェースメソッドシグネチャ検証をCoreClrローダーに合わせて調整し、静的な非仮想メソッドをスキップしながら全インスタンス/仮想メソッド(静的仮想・静的抽象含む)を検証。型の独自ジェネリック制約への分散検証を削除(13行削除、2行追加)
  • GenericTypeConstraints.cs: 回帰テスト用の最小限なジェネリック型制約パターンを追加(11行新規)
  • R2RTestSuites.cs: ReadyToRuヘッダーがSkipTypeValidationフラグを保持することを検証する回帰テスト追加(32行新規)

パフォーマンスへの影響

型検証スキップフラグ(READYTORUN_FLAG_SkipTypeValidation)が正しく設定されるようになり、ReadyToRun最適化が機能します。副作用による負荷低減が期待できます。

関連Issue

#132724

その他

  • 内部実装の修正: AOTコンパイラ(Crossgen2)の型検証ロジック修正であり、公開APIへの影響なし
  • 互換性: ECMA仕様準拠への修正のため、既存の有効なコードが正常に検証されるようになる(互換性向上)
  • 回帰原因: PR #120459が本回帰を導入
  • リスク評価: 低。変更はランタイムの仕様に合わせるもので、対象回帰テストが追加されています

#133111 Use SDK pipeline for WebAssembly framework R2R

概要

Browser WebAssembly CoreCLRランタイムパックのReadyToRun(R2R)コンパイレーションをSDK Crossgen2パイプラインを通じてルーティングする変更です。従来は手書きのExecパスを使用していたため、SDKの通常のコンパイラ準備、コマンド構築、エラーハンドリング、テレメトリ、インクリメンタルビルドの利点が失われていました。本変更により、WebAssembly固有のサイドバイサイドレイアウト(IL アセンブリはruntimes/browser-wasm/lib/<TFM>配下、R2R WebCILイメージはruntimes/browser-wasm/native/r2r配下)を保持しつつ、SDK パイプラインの機能を活用できるようになります。

変更内容

  • Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.cs:コンポジション スタンプ強制、出力フレーバー検証、FilesToTouch出力を追加し、IL↔R2R遷移時のインクリメンタルビルド正確性を確保
  • Crossgen2Tasks/Microsoft.NET.CrossGen.targets:R2Rコンパイルのインクリメンタル入力を改善し、シナリオ固有のCrossgen2引数をコンパイラ呼び出しに追加
  • Crossgen2Tasks/PrepareForReadyToRunCompilation.cs:WASM フレーバーの場合の出力ファイル拡張子処理を改善(内部実装)
  • Microsoft.NET.Sdk.WebAssembly.Browser.targets:SDK R2Rパイプライン駆動、IL アセンブリをlib/配下に保持、R2R出力をnative/r2r配下にパッケージ化、陳腐化した in-tree レイアウトアーティファクトをクリーンアップ
  • Microsoft.NETCore.App.Runtime.CoreCLR.sfxproj:browser R2Rを有効化し、SDK パイプライン出力をランタイムパック レイアウトに統合
  • Wasm.Build.Tests/WebcilInWasmSizesTests.cs:フレーバー/強制動作と.dll名R2R WebAssemblyキャンディダートのカバレッジを追加

パフォーマンスへの影響

影響なし。インクリメンタルビルドの最適化により、不要な再コンパイルが削減される見込み。検証により181個のILアセンブリと101個の適用可能なR2Rイメージが確認されており、不要なno-IL façadeR2Rイメージは存在しません。

関連Issue

なし

その他

Copilot レビューにより2件の中程度の懸念が指摘されています:

  1. PrebuiltR2RMatchesCandidateが.dll拡張子を持つWebCIL-in-wasmファイルの場合、バージョン検出が失敗し、プリビルト バージョン不一致保護がバイパスされる可能性
  2. PrepareForReadyToRunCompilationでWASM出力拡張子を変更する際、RelativePathメタデータが.wasm出力パスと一致せず、パッケージング/アイデンティティが破損する可能性(解決済み)

検証内容:build.cmd tasks、Wasm.


#133090 [release/8.0] Detect ephemeral client cert key via SEC_E_UNKNOWN_CREDENTIALS in QUIC

概要

MsQuicの最新版アップデートにおいて、エフェメラルキー(Windowsでキーストアに永続化されない一時的な秘密鍵)を持つ証明書の使用時に返されるエラーコードが変更され、診断困難な例外が発生していた問題を修正します。SEC_E_UNKNOWN_CREDENTIALSエラーコードを検出して、より有用なAuthenticationExceptionを生成するようにWindows QUIC実装を改善し、関連する回帰テストを追加します。

変更内容

  • MsQuicConfiguration.cs: Windows credential loading時にSEC_E_UNKNOWN_CREDENTIALSを検出し、Crypt32 interopを使用してエフェメラル秘密鍵を確認した上で、AuthenticationExceptionをスロー
  • System.Net.Quic.csproj: Crypt32 interop + SafeHandle実装を追加
  • Strings.resx: net_auth_ephemeralリソース文字列を追加
  • MsQuicTests.cs: サーバー/クライアント側のエフェメラル証明書に関するWindows専用の機能テストを追加
  • Configuration.Certificates.Dynamic.cs: テスト用のエフェメラルキー証明書生成機能を拡張

パフォーマンスへの影響

影響なし

関連Issue

#133090

その他

  • 内部実装の変更(公開APIへの影響なし)
  • 破壊的変更なし、既存コードとの互換性維持
  • リスク評価:Low。MsQuic更新による回帰修正で、エラー検出ロジックの容範囲な改善
  • レビュー指摘:テストのタイムアウト追加、例外のHResult設定による診断情報の保持が推奨されている

#133039 Restore chaos65204782cs as a standalone JIT test

  • 作成者: @steveisok
  • 作成日時: 2026年09月01日 19:28:13(UTC)
  • マージ日時: 2026年09月04日 19:06:34(UTC)
  • ラベル: area-CodeGen-coreclr

概要

PR #132167でchaos65204782cs.csをマージされたJIT.Genericsランナーにコンパイルしたことにより、Mono FullAOTの再帰的ジェネリックメタデータが拒否され、ランナー全体のAOTコンパイルが失敗していました。本PRではこのテストを専用プロジェクトとして復元し、プロセス分離で実行しながら、Mono MiniFullAOT/LLVMFullAOTからのみ除外することで、マージされたランナーのFullAOTカバレッジを維持します。

変更内容

  • src/tests/JIT/Generics/JIT.Generics.csproj: chaos65204782cs.csをマージされたランナーのコンパイルから除外し、ラッパープロジェクト参照を追加してアウトプロセステストとして構築
  • src/tests/JIT/Generics/JIT.Generics_ro.csproj: 最適化されたマージされたランナーからchaos65204782cs.csを除外
  • src/tests/JIT/Generics/Coverage/chaos65204782cs.csproj: chaos65204782csを専用プロセス分離テストとして復元し、MonoAotIncompatibleでMarked(Mono AOTバリアント用)

パフォーマンスへの影響

影響なし

関連Issue

#132942、#132167

その他

  • 変更は内部テスト構成(JIT.Genericsテストスイート)に限定されます
  • MSBuild評価により、通常ビルドでプロセス分離テストが1つ検出され、Mono MiniFullAOTでのみスタンドアロンプロジェクトが無効化され、マージされたランナーは有効なままであることが確認されています
  • PdbOnlyランナーから引き続きスタンドアロンプロジェクトが参照されるため、通常のテスト実行に参加します

#133038 Support serialized type names in R2R type maps

概要

ReadyToRun (R2R) 形式でカスタム属性ブロブから取得したシリアル化型名をサポートするための拡張です。R2R fixup(参照解決情報)では符号化できないエントリに対して、遅延解決される名前ペアとしてエンコードし、fixupハッシュテーブル後にネイティブシーケンスとして配置されます。R2R形式バージョンは28に引き上げられています。

変更内容

  • 型マップエンコーディング: ReadyToRunTypeMapEncoding.csで共有定数とエンコード可能性判定ロジックを導入
  • ExternalTypeMap/ProxyTypeMap出力: ReadyToRunExternalTypeMapNode.cs、ReadyToRunProxyTypeMapNode.csで、fixupベースのエントリを優先し、不可能な場合はシリアル化された名前ペアを追加
  • 型マップメタデータ: TypeMapMetadata.csでシリアル化型名を型マップエントリと共に追跡
  • VMリーダー更新: readytoruninfo.cpp、readytoruninfo.hで型マップ検索をリファクタリングし、ハッシュテーブル後の名前付きエントリをサポート
  • NativeFormat: nativeformatreader.hにGetParserAfterTable()を追加してハッシュテーブル後のデータにアクセス
  • R2Rバージョン: READYTORUN_MAJOR_VERSIONを28に更新
  • テスト拡張: 重複型名シナリオを検証するテスト属性を追加

パフォーマンスへの影響

影響なし(既存のfixupベース符号化を優先するため、通常ケースの性能差はなし)

関連Issue

#132811

その他

互換性上の注意:

  • R2R形式バージョン28への引き上げにより、古いランタイムは新しいR2Rイメージを読み込めません
  • 破壊的変更ではなく、既存fixupベース符号化との後方互換性を保ちつつ拡張

指摘事項(Copilotレビュー):

  1. assemblynative.cppの1796行目、1813行目、1817行目で、TryGetPrecachedExternalTypeMap/ProxyTypeMapの戻り値が_ASSERTEでのみチェックされており、リリースビルドではmalformedイメージの場合でも無言で続行する可能性があります。代わりBadImageFormat例外をスローすることが推奨されています
  2. TypeMapMetadata.csの225行目で、AddExternalTypeMapEntryのtrimmingTarget/serializedTrimmingTypeNameパラメータがnull非許容として宣言されていますが、実装ではnullが渡されており、nullability契約と矛盾しています

#133000 [wasm] R2R bring-up prerequisites for browser

概要

WebAssembly(browser/wasi)向けのReadyToRun(R2R)化に向けた基盤整備を行うPR。主な変更はブラウザテストアプリのILトリミング有効化と、R2R/crossgen2関連のビルドプラム機能の追加、及びトリミング有効化に伴う修正です。

変更内容

R2R・crossgen2関連

  • eng/codeOptimization.targets: browser/wasiターゲットのR2R時にmibc/PGOファイルを無効化(クロスモジュールR2Rでcrossgen2がクラッシュするため)
  • src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs: composite crossgen2レスポンスファイルに追加されるCrossgen2CompositeExtraCommandLineArgsを実装
  • src/native/corehost/corehost.proj: ランタイムパックのネイティブディレクトリにCoreClr共有フレームワークの静的ライブラリ(.a)を追加

wasiをクロスターゲットとして対応

  • eng/native/configureplatform.cmake: CLR_CMAKE_TARGET_OSではなくCLR_CMAKE_HOST_OS経由でwasiを検出
  • Windows向けビルドスクリプト(build-runtime.cmd、build-native.cmd): wasiをクロスターゲットとして明示的に標記

テスト・トリミング関連

  • eng/testing/tests.wasm.targets: トリミング後のテストアセンブリが非ブラウザネイティブモジュール(WASM0066)へのP/Invokeを実行するため、警告診断を抑止
  • src/mono/browser/build/BrowserWasmApp.CoreCLR.targets: EnableDiagnostics/パフォーマンス計測時のWasmBuildNativeデフォルト値設定を保留(#132772関連)
  • src/mono/wasm/build/WasmApp.Common.targets: Release時のWasmBuildNativeデフォルト値を、ツリー内デフォルトが無効化されていない場合のみ適用

SignatureMapperのリファクタリング

  • MSBuild非依存のトークンマッピング処理をSignatureMapper.Tokens.csとして分離し、テストが直接コンパイル可能に
  • リフレクションベースのロジック部分はLogAdapterを必要とするため分離

その他

  • src/native/libs/Common/JavaScript/host/index.ts: Node.js環境変数をWasmプロセスに伝播(coreurun同様)

パフォーマンスへの影響

影響なし

関連Issue

#132825(crossgen2がクロスモジュールR2Rで埋め込みPGOデータ出力時にクラッシュ) #131877(P/Invoke警告抑止の削除予定) #132772(WasmBuildNative・診断サーバー関連)

その他

Copilotレビューで以下の懸念が指摘されています:

  • BrowserWasmApp.CoreCLR.targetsのコメント化ブロックが、WasmPerformanceInstrumentation用のWasmBuildNativeデフォル

#132965 [wasm] Delete hand-written R2R-to-interpreter thunks; rely on crossgen2's

概要

WebAssembly向けRuntime環境で、R2R(Ready-to-Run)からInterpreterへの遷移thunkを手書きテーブルから削除し、crossgen2が生成するpregenerated thunkへ統一する変更です。ReadyToRunが無効な場合はnative thunkを作成しない仕様に変更し、managed/unmanagedのcalli呼び出しパスを分離して、thunk検索をR2Rイメージのstring tableに集約します。

変更内容

  • src/coreclr/vm/wasm/helpers.cpp: g_wasmPortableEntryPointThunks(手書きthunkテーブル)を削除(~400行)し、LookupPortableEntryPointThunkをR2R string hashのみ経由に変更。GetCookieForCalliSig(unmanaged calli専用)とGetCookieForManagedMethod(managed方式用)に分離。ReadyToRun無効時はGetPortableEntryPointToInterpreterThunkでアサート。
  • src/coreclr/vm/method.cpp: MethodDesc::EnsurePortableEntryPointIsCallableFromR2RとSetPortableEntrypointInitialStateForMethodにReadyToRun無効時のthunk install スキップを追加。
  • src/coreclr/vm/jitinterface.cpp: R2R onlyアサートをReadyToRun有効時のみに条件化。
  • src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs: 各compile対象のmethodに対してWasmInterpreterToR2RThunk("M"キー)とWasmR2RToInterpreterThunk("I"キー)をroot化。
  • src/tests/readytorun/wasm/WasmInterpreterTransitions: 新規R2Rテスト(struct S8/S12/S16/S48/S52/S304、scalar、void、float/double、Vector128、delegate/indirect callをカバー)。
  • src/tests/Common/CLRTest.CrossGen.targets: CrossGenTestSkipR2RDumpオプションでhost R2RDump validation passのスキップをサポート(crossgen passは実行)。
  • src/coreclr/build-runtime.cmd、src/native/libs/build-native.cmd: wasiをcross-targetとして処理。

パフォーマンスへの影響

影響なし。ただし、以下の改善があります:

  • managed method→R2R thunk検索が、libcoreclr global tableへの保証付きmissを排除し、R2R image string tableのみからresolveするため、キャッシュミス時の二重プローブを削除。
  • unmanaged calli→g_wasmThunks検索では、R2R imageテーブルへのmissプローブを排除。

関連Issue

#132926、#127483(参照)、#133124(参照)

その他

Copilot review指摘事項(アドレス必須):

  1. helpers.cpp:1132のprintfは無条件で実行されるため、release buildで出力を スパムする可能性。LOG/STRESS_LOGの使用推奨。
  2. helpers.cpp:1364-1367の_ASSERTE(g_pConfig->ReadyToRun())はdebug-onlyで、release buildではレ

#132944 Allow constrained. call and ldftn for static virtual interface methods in ILVerify

概要

ILVerifyが静的仮想インターフェースメソッドをサポートするように更新されました。Roslyn が T.M() に対して生成する IL パターン(constrained. !!T 後に call/ldftn)に対して、従来の誤った Constrained および CallAbstract エラーが報告されていた問題を解決します。制約付き型が実際にそのインターフェースを実装しているかを検証し、新しい ConstrainedTypeNoInterfaceImpl エラーを報告します。

変更内容

  • ILImporter.Verify.cs: 静的仮想インターフェースメソッドに対する call/ldftn 時に constrained. プレフィックスを認識・消費するよう処理を追加。CanCastTo による制約型のインターフェース実装検証を実装。
  • VerifierError.cs: 新しい検証エラー ConstrainedTypeNoInterfaceImpl を列挙型に追加。
  • Strings.resx: ConstrainedTypeNoInterfaceImpl のローカライズメッセージを追加。
  • PrefixTests.il: 静的仮想インターフェース call および ldftn の正有効および無効なケースをテストケースで拡張。

パフォーマンスへの影響

影響なし

関連Issue

#132820

その他

  • この変更は ILVerify(内部ツール)の IL 検証ロジックに限定されるもので、公開 API への影響はありません。
  • 静的仮想インターフェースメソッドは C# 11 で導入された機能ですが、ILVerify がこのパターンを認識するまでは適切に検証されていませんでした。

#132863 [release/11.0] Fix ConcurrentQueue.TryDequeue spuriously reporting empty during a segment freeze

概要

ConcurrentQueueのTryDequeue/TryPeekが、セグメント満杯時に新しい大きなセグメント割り当てが行われ、古いセグメントが"frozen"状態にマークされる間のレースコンディションにより、キューが実際には要素を含んでいるにもかかわらず空であると誤って報告する問題を修正しました。このレースは稀で、循環セグメントが完全に満杯で、かつキューがより大きなセグメントを割り当てると同時に古いセグメントをフリーズする特定の条件下でのみ発生します。

変更内容

  • src/libraries/System.Private.CoreLib/src/System/Collections/Concurrent/ConcurrentQueueSegment.cs: _frozenForEnqueuesフラグの発行順序をセグメントTail位置の更新より前に変更し、消費側がセグメントを一貫性のない状態で観察しないことを保証(+7/-5)
  • src/libraries/System.Collections.Concurrent/tests/ConcurrentQueueTests.cs: 修正内容を検証する新しいテストケースを追加(+45/-0)

パフォーマンスへの影響

影響なし

関連Issue

#132736、#132737(マージ元)

その他

  • 本PR は release/11.0 ブランチへのバックポート
  • リスク評価: 低(変更は_frozenForEnqueuesの発行順序の調整のみ)
  • 顧客報告による issue
  • 回帰なし

#132816 JIT: extend relaxed checks through morph

概要

JIT IR フラグ検証の「relaxed」モードを global morph を通じて拡張し、ローカル morph、インライニング、オブジェクト割り当て書き直し時に副作用とフラグ情報の一貫性を保つようにする変更です。これにより、JIT コンパイラの IR 変換プロセス全体でフラグの妥当性がより緩く追跡されるようになります。

変更内容

  • compiler.cpp: PhaseChecks::CHECK_IR_RELAXED を global morph の後まで有効に保ち、strict 検証への復帰を global morph 完了後に実施
  • lclmorph.cpp: ローカル morph のステートメント書き直し後に副作用フラグをリフレッシュし、ローカルアドレス def フラグを調整
  • fginline.cpp: 遅延仮想化更新後に子要素の effect フラグを親に伝播
  • objectalloc.cpp: sink された間接参照をサイドエフェクト抽出後に GTF_IND_NONFAULTING としてマーク
  • fgdiagnostic.cpp: DEBUG 専用の IR 検証調整(implicit-byref の stale ウィンドウ許容、ノードスレッド化チェック制御)
  • compiler.h: implicit-byref の「stale lcl fld」ウィンドウを追跡する DEBUG 専用状態を追加
  • block.h: ブロック compaction 時に BBF_RECURSIVE_TAILCALL フラグを保持

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 全テストにおいて x64 Checked JIT ビルド、SuperPMI リプレイ、jit-format で検証済み
  • JIT IR の中間表現(IR)フラグの追跡を改善し、morph フェーズ全体にわたって検証の厳密性を段階的に調整する internal な変更です
  • 破壊的変更や公開 API への影響なし

#132713 Extract WASM data segment functionality to an interface and create implementations for WebCIL and NativeAOT

  • 作成者: @jtschuster
  • 作成日時: 2026年08月24日 19:11:22(UTC)
  • マージ日時: 2026年09月04日 17:29:23(UTC)
  • ラベル: area-ReadyToRun

概要

WASM データセグメント機能をインターフェース化し、WebCIL と NativeAOT 向けの実装を作成するリファクタリング。これまで WebCIL と NativeAOT は異なる方法でデータセグメントを出力していた(WebCIL は単一セグメント内に複数の SectionWriter を使用、NativeAOT は 1:1 マッピング)が、単一の DataSection 型を使用するために IWasmDataSegment インターフェースを導入。同時にセクション/セグメントのアライメント所有権を集約器から各セクション/セグメント自体に移譲し、アクティブセグメントのメモリオフセット計算をサイズ計算・出力前に実施する構造に変更。

変更内容

  • IWasmDataSegment.cs(新規): データセグメントを抽象化するインターフェースと WasmDataSegmentEncoding ユーティリティクラスを新規作成
  • WasmDataSegmentEmitter.cs(新規): NativeAOT 向けのデータセグメント実装
  • WasmByteArrayDataSegment.cs(新規): バイト配列ベースのデータセグメント実装
  • WebcilPayloadDataSegment.cs(新規): WebCIL ペイロード向けのデータセグメント実装
  • WasmDataSection.cs: セグメントレイアウト計算ロジックを追加。アクティブセグメントのメモリオフセット割り当てをヘッダエンコード前に実行
  • WasmDataSegment.cs(削除): 機能を新しいインターフェース実装に分散
  • WebcilSection.cs: WebCIL セグメント用にアライメント指定機能を追加
  • WasmRelocatableObjectWriter.cs / WebCilObjectWriter.cs: IWasmDataSegment リストを DataSection に渡すよう修正
  • WasmInstructions.cs: メモリオフセット計算式関連の機能追加
  • AlignmentHelper.cs: アライメント検証ロジックを追加

パフォーマンスへの影響

  • WasmDataSegmentEmitter.HeaderSize 呼び出し時に毎回 WasmInstructionGroup インスタンスが生成される可能性がある(レビュー指摘)
  • セグメント レイアウト計算時にメモリオフセット割り当てをパディング計算なしで実施するため、従来の明示的なパディング挿入より効率化されている見込み
  • 詳細なベンチマーク数値なし

関連Issue

なし

その他

レビュー指摘事項(未解決):

  1. WasmDataSegmentEncoding.EncodeHeader がハッファサイズをハードコードして返すため、実際のエンコード長との検証が無効化される可能性
  2. WasmDataSegmentEncoding のメソッドシグネチャで initExpr パラメータがパッシブセグメント呼び出し時に null になるが、非 null として宣言されている(nullable 警告の原因)
  3. WasmDataSection のコメントで「パディング」に言及しているが、実装ではパディング計算を行わず、メモリオフセット割り当てのみを実施(コメント不一致)
  4. WasmDataSegmentEmitter.HeaderSize

#132667 Fix ILVerify validation for delegates with boxed value type targets

概要

ILVerifyのクローズドデリゲート検証を修正し、ボックス化された値型ターゲットがオブジェクト参照として正しく認識されるようにしました。ターゲットのStackValue情報を保持することで、ボックス化されたインスタンスの型情報が検証時に失われるのを防ぎます。

変更内容

  • ILImporter.Verify.cs: クローズドデリゲートのターゲット割り当て可能性検証を修正。StackValueを使用してボックス化されたターゲットを比較するように変更
  • FtnTests.il: ボックス化された値型に対するSystem.Objectおよびインターフェースメソッドのテストケース追加(正常系・負常系のカバレッジを強化)

パフォーマンスへの影響

影響なし

関連Issue

#96695

その他

本変更はILVerification(IL検証ツール)内の内部実装の修正です。ランタイムの実行動作には直接影響せず、IL検証の精度を向上させるものです。クローズドデリゲートでボックス化された値型をターゲットとする場合の検証精度が改善されます。


#131931 Linked cache entry thread safety fix

概要

Microsoft.Extensions.Caching.Memoryのキャッシュエントリにおいて、有効期限トークンの並行処理下での安全性を向上させるもの。可変なList<T>をコピーオンライト方式のExpirationTokensListに置き換えることで、キャッシュヒット時にロック不要なトークンスキャンを実現し、リンクされたキャッシュエントリ間のトークン伝播を並行読み取り下で安全にする。

変更内容

  • CacheEntry.ExpirationTokensList.cs(新規): コピーオンライト実装のIList<IChangeToken>を追加。スナップショット列挙を通じてロック不要な読み取りをサポート
  • CacheEntry.CacheEntryTokens.cs: 有効期限トークンストレージを新しいコピーオンライトリストに切り替え、スキャン/伝播ロジックを更新
  • CacheEntry.cs: トークン伝播時のVolatile.WriteとThread.MemoryBarrierを用いた公開セマンティクスを追加
  • TokenExpirationTests.cs: トークンの並行加算/伝播シナリオをカバーする並行性テストを追加
  • CacheEntryScopeExpirationTests.cs: コミットされた親エントリへの子トークン伝播の並行性テストを追加(ただしプラットフォームゲーティング欠落の指摘あり)

パフォーマンスへの影響

  • キャッシュヒット時のトークンスキャンがロック不要になることで、競合が削減され性能向上が期待される
  • コピーオンライト方式により、読み取り頻度が高く書き込み頻度が低いワークロードに最適化
  • 具体的なベンチマーク数値は提供されていない

関連Issue

#46032

その他

  • コンパイラ/ランタイムへの影響: ライブラリレベルの変更(内部実装)、公開APIの変更なし
  • 互換性: 破壊的変更なし
  • セキュリティ: 該当なし
  • 懸念事項:
    • メモリ順序付けの微妙な変更についてはヒューマンレビューによる検証が必要
    • CacheEntryScopeExpirationTests.csの新規並行テストについて、プラットフォームゲーティング(PlatformDetection.IsMultithreadingSupported)が欠落しており、単一スレッドランタイム(WASM等)で無限待機の可能性が指摘されている
    • Thread.MemoryBarrier()の冗長性と、弱いメモリモデルでのVolatile.Readパターンの必要性が指摘されている

#131877 [wasm] Compute CoreCLR P/Invoke struct sizes with crossgen2's type system

概要

WebAssembly CoreCLR P/Invoke ヘルパー生成パイプラインを、hardcoded構造体サイズテーブルから crossgen2 の型システムを使用した動的計算に移行します。crossgen2に --generate-portable-callhelpers オプションを追加し、構造体フィールドレイアウトを正確に計算した C++ ヘルパーファイルを直接出力します。これにより、7つのエントリしかないテーブルの制限が解消され、複雑な構造体を含む P/Invoke シグネチャが正確に処理されます。

変更内容

  • crossgen2 の新機能: --generate-portable-callhelpers <dir> オプションを追加。--targetarch wasm --targetos browser|wasi と組み合わせ、型システムセットアップ後に入力アセンブリをスキャンして C++ ヘルパーを出力
  • 古い MSBuild タスク廃止: ManagedToNativeGenerator、PInvokeCollector、SignatureMapper などの反射ベースの生成ロジック(src/tasks 配下)を削除(-2269行)
  • 新しいポータブルヘルパー実装: ILCompiler.ReadyToRun/PortableCallHelpers に統一された実装を追加(+1541行)。フィールドレイアウトアルゴリズムとシグネチャ生成をクロスプラットフォーム対応に
  • 命名変更: StringToWasmSigThunk → StringToPortableSigThunk、g_wasmThunks → g_portableCallHelperThunks、wasm_ret_S<n> → portable_callhelper_ret_S<n>
  • 警告削除: WASM0066(未解決 DllImport 警告)を削除。WASM0065(マーシャリング未設定)を新規追加
  • エクスポート検証強化: 同じ名前で異なるシグネチャの複数エクスポートをエラーで検出

パフォーマンスへの影響

影響なし(ビルド時のジェネレータ実装の置き換えのため、ランタイムパフォーマンスは変わらない)

関連Issue

#131811(ブロッキング gap #1 および gap #2 の構造体部分を解決)、#131874(未解決 P/Invoke 警告の過剰報告)

その他

  • 後方互換性: crossgen2 は既存の JIT インターフェースも同じ ABI ローイング実装を使用するため、一貫性が向上。WasmLowering の WasmValueTypeToSigChar が private から internal に変更
  • 構造体サイズ計算: 従来の hardcoded テーブル(最大7エントリ)から動的計算へ。3-int 構造体は vS12、5-double 構造体は S40i として正確に解決
  • crossgen2 検出: $(PortableCallHelpersGeneratorPath) オーバーライド、リポジトリ内ビルド、wasm-tools workload のいずれかで crossgen2 を検索
  • 既知制限: 逆スタブで構造体パラメータ使用時のスロット割り当

目次