Pull Request on 2026年09月29日

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

注意点

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


目次

  1. #134868 Use CryptoKit for recovering public key from private EC keys on macOS
  2. #134861 Remove allocation assertion from Runtime_134605 regression test
  3. #134835 Reduce CoreCLR C++ exception cleanup overhead
  4. #134827 [cDAC][wasm] Map portable entry points to interpreter code and R2R virtual IPs
  5. #134826 [wasm] Generate thunks for unmanaged calli signatures and allow thiscall
  6. #134823 Fix NativeAOT nullable isinst branch elimination
  7. #134805 Remove the dead clrinterpreter runtime-test scenario
  8. #134783 Speed up RuntimeType.GetHashCode
  9. #134781 Build native AOT runtime under Browser/WASI
  10. #134758 JIT: don't fall through from a Wasm callfinally across a try_table end
  11. #134756 [cDAC][wasm] Map portable entry points to interpreter code and R2R virtual IPs
  12. #134754 [wasm][R2R] Map state machine MoveNext method ids to virtual IPs
  13. #134735 Remove internal DisableDynamicEngine switch from feature switch docs
  14. #134718 JIT: Remove GTF_DEBUG_NODE_MORPHED tracking
  15. #134703 Fix missing env.vars in JIT tests
  16. #134690 Disable unused ReadyToRun metadata on WebAssembly
  17. #134676 [wasm][R2R] Fix generic context / async continuation order in Wasm interpreter thunks
  18. #134675 Run SOS tests on Helix across cDAC platforms
  19. #134666 [JIT] [wasm]: Compare TYP_REF references directly with null using i32.eqz
  20. #134637 Minor tweaks to CoreCLR type-loader WebAssembly code generation
  21. #134507 Dispatch Mono [JSExport] by handle
  22. #134398 Prevent CI scan duplicates after inconclusive lookups
  23. #134355 [wasm][coreclr] Dispatch R2R-compiled UnmanagedCallersOnly callbacks to their native entrypoint
  24. #134313 Pool TLS 1.3 session tickets per host instead of keeping one
  25. #134048 JIT: Defer physical promotion readbacks across basic blocks
  26. #133986 Add GC support for external memory handles
  27. #133958 [aw] Add trusted KBE search eval support
  28. #133622 Use metadata APIs in AssemblyChecker
  29. #133571 Fix combined ActiveIssue restrictions in runtime test wrappers
  30. #133265 [wasi] Enable CoreCLR WASI composite ReadyToRun publishing
  31. #133188 Add additional round-trip fixes and add additional unit tests for greater code coverage
  32. #131510 Add pseudo custom attribute lowering to managed ilasm

#134868 Use CryptoKit for recovering public key from private EC keys on macOS

概要

macOSで秘密鍵スカラー値のみから公開鍵を導出する際にCryptoKitを使用するよう統一しました。従来のPKCS#8ラウンドトリップ方式を廃止し、iOS/tvOSと同じCryptoKit実装に統合することで、CPU時間とメモリ使用量を大幅に削減します。P256で約590倍、P384で約336倍、P521で約160倍の高速化を実現しました。

変更内容

  • EccAppleCrypto.cs: CryptoKitベースの公開鍵導出ロジックを共通コードに統合(+30行)
  • EccAppleCrypto.iOS.cs: iOS固有の実装を削除し、共通実装に統一(-37行)
  • EccAppleCrypto.macOS.cs: PKCS#8ラウンドトリップ実装を削除し、共通実装に統一(-36行)

パフォーマンスへの影響

大幅な改善:

  • ImportP256: 75,153.2 μs → 127.2 μs(590倍高速化、メモリ: 4320 B → 256 B、94%削減)
  • ImportP384: 114,843.9 μs → 341.7 μs(336倍高速化、メモリ: 4469 B → 288 B、94%削減)
  • ImportP521: 158,300.2 μs → 987.9 μs(160倍高速化、メモリ: 4664 B → 337 B、93%削減)

実行速度とメモリ使用量の両面で顕著な改善があり、macOS上でのEC秘密鍵インポート性能が大幅に向上しました。

関連Issue

#134682

その他

  • 内部実装の改善(公開APIの変更なし)
  • プラットフォーム固有コードの統一により、保守性が向上
  • iOS/tvOSへの対応(#134682)に続く改善PR

#134861 Remove allocation assertion from Runtime_134605 regression test

概要

Runtime_134605 リグレッションテストから割り当てアサーション(allocation assertion)を削除します。このテストは不正なコード生成を検証するものであり、条件付きエスケープ分析(conditional escape analysis)の実際の動作検証は不要です。さらに、インタープリターなど条件付きエスケープ分析が期待されない設定が複数存在することから、このアサーションは削除されました。

変更内容

  • src/tests/JIT/opt/ObjectStackAllocation/Runtime_134605.cs: 割り当てアサーション関連のコード3行を削除

パフォーマンスへの影響

影響なし

関連Issue

#134746

その他

なし


#134835 Reduce CoreCLR C++ exception cleanup overhead

  • 作成者: @davidwrighton
  • 作成日時: 2026年09月29日 01:37:20(UTC)
  • マージ日時: 2026年09月29日 22:10:03(UTC)
  • ラベル: area-VM-coreclr

概要

CoreCLRのC++例外処理のオーバーヘッドを削減するため、非スロー関数にnoexcept契約を追加し、WASMコンパイラフラグ-fassume-nothrow-exception-dtorを導入しました。これにより、std::terminate呼び出しのためだけに存在する例外リージョンをコンパイラが削除できます。主な対象はメタデータ列挙/解放、例外処理、GCモード復元、スレッドロック、フレーム展開、PALリソース解放、実行可能ファイル割り当て解放、ホルダートレイトです。

変更内容

  • CMake設定 (eng/native/configureplatform.cmake): WASM向けに-fassume-nothrow-exception-dtorフラグを追加
  • ヘッダーファイルのnoexcept追加 (50+箇所): メタデータAPI、ホルダークラス、GC関連、PAL、例外処理パス、実行可能ファイル割り当てなどのクリーンアップ関数にnoexceptを明示
  • 内部実装調整: 各対象パスの例外安全性を保証するための微細な調整

パフォーマンスへの影響

Browser/WASM:

  • dotnet.native.wasm: 4,714,226バイト → 4,661,953バイト(-52,273バイト、-1.11%)
  • 直接std::terminateサイト: 2,562 → 171(-2,391サイト、-93.3%)
  • コンパイラ生成クリーンアップの削除により追加で21,436バイト削減

Linux x64:

  • libcoreclr.so: 5,174,600バイト → 5,126,520バイト(-48,080バイト、-0.93%)
  • ベンチマーク結果(メタデータ列挙): 回帰なし、メモリ割り当ても同一
    • メソッド列挙: 563.1 ns → 555.8 ns
    • メンバー列挙: 1,119.8 ns → 1,113.1 ns
    • アセンブリタイプ列挙: 66.10 us → 65.25 us

関連Issue

なし

その他

  • 変更は内部実装とヘッダー契約に限定され、公開APIの互換性に影響なし
  • 14個の正規化関数が17個のローカルterminateサイトを追加する一方、全体で2,391サイト削除(クリーンアップ専用パスまたは共有リーフハンドラで吸収)
  • -fassume-nothrow-exception-dtorフラグはBrowser/WASI向けネイティブコンパイルのみに適用(クロスコンポーネントビルドには不適用)
  • 検証済み: Linux x64でクリーン빌드、テスト4,330パス(失敗0)

#134827 [cDAC][wasm] Map portable entry points to interpreter code and R2R virtual IPs

概要

FEATURE_PORTABLE_ENTRYPOINTS対象(WebAssembly)において、メソッドのエントリポイント スロットが保持するPortableEntryPointアドレスを診断ツール向けに正しく変換する機能を追加しました。これまでcDACが生のアドレスを返していたため、SOS値やrejit/DBI経由のパスで、インタープリタ型およびR2R型メソッドのアドレスがExecutionManagerを通じて解決できない問題を修正します。

変更内容

  • 新規API: IExecutionManager.GetDiagnosticCodeStartFromEntryPointを追加。ネイティブ側の同名メソッドのcDAC版として機能します。

    • ポータブルエントリポイントなし時:既存のPrecodeStubs.GetInterpreterCodeFromInterpreterPrecodeIfPresentへ委譲(動作変更なし)
    • ポータブルエントリポイントあり時:コード範囲内のアドレスはそのまま返却、インタープリタメソッドはMethodDesc.m_interpreterCodeにマップ、R2Rメソッドはファンクションテーブルインデックスから仮想IP(funcletエントリをスキップ)にマップ
  • 新規ヘルパー: WasmFunctionTableIndexLookupをExecutionManager内に実装。ファンクションテーブルインデックス解決の機能を集約し、リスト走査の境界チェックとサイクル検出を行います。

  • データディスクリプタ追加:

    • PortableEntryPoint.ActualCode、PortableEntryPoint.Flags(FEATURE_PORTABLE_ENTRYPOINTS配下のみ)
    • MethodDesc.InterpreterCode(FEATURE_INTERPRETER配下のみ)
  • 既存APIの更新: SOSDacImpl、ClrDataMethodInstance、DacDbiImpl(EnumerateAsyncLocals含む)が新規APIを呼び出すよう変更。ネイティブDAC側のEnumerateAsyncLocalsにも同等のマッピング処理を追加。

パフォーマンスへの影響

影響なし。マッピング処理は診断パス(デバッグ時アクセス)に限定されており、ランタイムの実行パスには影響しません。

関連Issue

#134753

その他

  • 本PR(#134827)は先に#134756として提案されましたが、#134754のブランチへのマージ時の誤りで#134754の方で一度revertされたため、mainへの再cherry-pick版です。

  • #133890との相互作用あり:どちらが後でマージされるかで、WasmFunctionTableIndexLookupへのTryGetFunctionIdentityとTryIsFuncletの追加、およびWasmR2RInfoからのフォワード処理が必要になります。

  • 検証結果:cDAC単体テスト3196個(17個新規)合格、新規ExecutionManagerテストで解釈済み/R2R/funclet/poison/prefers-interpreter/非自身エントリポイント/不明なインデックスなどのケース、仮想IP→MethodDescの往路チェック、サイクリックなファンクションテーブル範囲リストをカバー。cDACダンプテスト260個合格。


#134826 [wasm] Generate thunks for unmanaged calli signatures and allow thiscall

概要

WebAssembly CoreCLR環境でアンマネージドcalli署名のthunk生成を追加し、thiscall呼び出し規約のサポートを実装しました。これにより、ブラウザ向けのCallconv テスト(CdeclMemberFunction、StdCallMemberFunction、PlatformDefaultMemberFunction、ThisCall)が機能するようになり、以前disableされていた4つのテストが再度有効化されます。

変更内容

  • PInvokeCollector.cs: 新しいCollectUnmanagedCalliSignaturesメソッドがILをスキャンしてcalli演算子を通じたアンマネージド関数ポインタ署名を収集し、interp-to-nativeのthunkテーブルに追加
  • WasmLowering.cs: GetSignatureがUnmanagedCallingConventionをビットフラグとして扱っていた問題を修正し、Cdecl、StdCall、ThisCall署名(0x1–0x3)が正しくアンマネージドとして判定されるように(内部実装の変更)
  • helpers.cpp: ComputeCalliSigThunkがIMAGE_CEE_CS_CALLCONV_THISCALLを受け入れるように拡張(ランタイムレベルの変更)
  • PInvokeTableGenerator.cs: リバースthunkが構造体を返す場合、WASM C ABI経由で参照で返されるときに隠された先頭のsretポインタを受け取り、インタプリタに返却バッファとして渡すように修正。[UnmanagedCallersOnly]ラッパーとexportに適用
  • WasmArgumentLayoutTests.cs: PortableCallHelpersGeneratorEmitsThunksForUnmanagedCalliSites、PortableCallHelpersGeneratorReturnsStructsThroughHiddenPointerInReverseThunks、SignatureCallingConventionSelectsLoweringの3つの新しいテストを追加
  • テストファイル: CdeclMemberFunction、StdCallMemberFunction、PlatformDefaultMemberFunctionテストのActiveIssueおよびWasmBuildTestCorerun=falseなどの制限を削除。ThisCallTestではMarshal.GetFunctionPointerForDelegateのリバースケースをwasmでスキップ

パフォーマンスへの影響

影響なし

関連Issue

#133571(テストのdisable)、#104391(ThisCall関連)、#134355(コールバック制限)

その他

  • 検証として、パッチ済みcrossgen2で3つのMemberFunctionテストのHelix payloadに対してポータブルcall helperを生成したところ、各テストで正しくthunkが生成される確認。
  • 全4つのcallconvテストがnode下でexit code 100で正常終了することを確認。
  • 検査済みのcoreclr/vm/wasm/{browser,wasi}/callhelpers-*.cppテーブルは、generate-coreclr-helpers.shで再生成されるまでフレームワークcalli署名が不足する可能性があるが、欠落エントリは破損エントリではない点に注意。

#134823 Fix NativeAOT nullable isinst branch elimination

  • 作成者: @agocke
  • 作成日時: 2026年09月28日 23:04:16(UTC)
  • マージ日時: 2026年09月29日 17:59:18(UTC)
  • ラベル: area-NativeAOT-coreclr

概要

NativeAOTコンパイラのisinst Nullable<T>命令に関する不正なブランチ削除を修正します。Nullable<T>のMethodTableが構築されていない場合でも、成功ブランチを到達不可能と誤って判定されるのを防ぎます。IL生成と依存スキャンの一貫性を保ちながら、ジェネリックnullable型テストのブランチをNativeAOT環境で正常に処理できるようにします。

変更内容

  • SubstitutedILProvider.cs: nullable型のis型テストを安全なブランチ折り畳み対象から除外し、ブランチ削除を防止
  • ILImporter.Scanner.cs: nullable型テストの成功ブランチの依存関係を無条件にスキャン
  • Generics.cs: マッチング、ミスマッチ、nullの各入力に対するnullable型テストのブランチをカバーする回帰テストを追加

パフォーマンスへの影響

影響なし

関連Issue

#134799

その他

このPRはNativeAOTコンパイル時のIL最適化ロジックに関する修正で、ランタイム内部実装の改善です。公開APIの変更はありません。


#134805 Remove the dead clrinterpreter runtime-test scenario

概要

clrinterpreterランタイム テスト シナリオを削除するPRです。このシナリオはテスト環境構成ファイル(testenvironment.proj)で定義されていた環境変数設定ですが、実行時には存在しない設定値を参照していため、実質的に機能していないデッドコードでした。

変更内容

  • src/tests/Common/testenvironment.proj: clrinterpreterシナリオに関連するTestEnvironmentエントリと_TestEnvFileLineアイテム(Windows のsetコマンドとUnixのexportコマンド両方)を削除(15行削除)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 削除された環境変数設定(DOTNET_Interpret、DOTNET_InterpreterHWIntrinsicsIsSupportedFalse、DOTNET_InterpreterJITThreshold、DOTNET_InterpreterDoLoopMethods)は、廃止されたレガシーCoreClrインタプリタから遺された設定で、clrconfigvalues.hに定義されていません
  • 現在のCoreClrインタプリタレーンはinterpmode1–interpmode3シナリオを使用しており、DOTNET_InterpMode設定を行っています
  • ビルドフラグの-clrinterpreter(runtime-diagnostics.ymlで使用)は別物で、このPRでは影響を受けません
  • 検証済み:interpmode1とjitstress1シナリオについて、WindowsおよびOSXターゲットでの変更前後の生成ファイル比較が完全に一致することを確認

#134783 Speed up RuntimeType.GetHashCode

  • 作成者: @EgorBo
  • 作成日時: 2026年09月28日 09:18:42(UTC)
  • マージ日時: 2026年09月29日 09:49:24(UTC)
  • ラベル: area-System.Runtime

概要

RuntimeType.GetHashCodeのパフォーマンスを向上させるため、CoreCLRでType型ハンドルベースのハッシュ計算を導入しました。COM型(CLSID)のID保持要件に対応し、Monoランタイムの既存の同一性ハッシング実装は維持されています。

変更内容

  • RuntimeType.CoreCLR.cs: Type型ハンドルを使用したハッシング実装を追加。CLSID型に対してはCOM ID保持のため既存の実装にフォールバック
  • RuntimeType.NativeAot.cs: NativeAot向けのハンドルベースハッシング実装を追加
  • RuntimeType.Mono.cs: Mono固有の既存の同一性ハッシング実装を保持
  • RuntimeType.cs: 共有実装を削除、ランタイム固有の実装に分割
  • EqualityComparer.cs: ハッシュ比較ロジック調整(+3/-3)

パフォーマンスへの影響

大幅な改善:

  • Win-x64: 5.961ns → 4.323ns(約27.6%高速化)
  • osx-arm64: 3.647ns → 2.881ns(約21.0%高速化)

Dictionary内のType型キーのルックアップベンチマークで確認された改善。Type型をDictionary/Hashsetのキーとして頻繁に使用するアプリケーションで効果あり。

関連Issue

#134783

その他

  • 互換性: Windows環境でのCOM ID保持により後方互換性を維持。ランタイム別に実装分割されているため、各実装の影響範囲は独立
  • 留意点: Copilotレビューで新しいハッシュパスの対象テスト不足が指摘されている

#134781 Build native AOT runtime under Browser/WASI

概要

NativeAOT ランタイムの Browser/WASI 環境でのビルドを可能にするための基盤を整備するPRです。ポータブル WebAssembly ランタイムパスを使用して、ネイティブ AOT ランタイムの native 部分をビルドできるようにします。

変更内容

  • WebAssembly オフセット定義: wasm/AsmOffsetsCpu.h を追加し、WASM ランタイムの CPU 固有オフセットを定義
  • プラットフォーム固有機能の無効化: WASM で非サポートの機能(シグナルハンドリング、ダンプ機能、ネイティブコンテキスト、スタックウォーキング)をガード
  • GC スキャン: WASM 向けに shadow-stack スキャンを使用するよう thread.cpp を修正
  • ビルドシステム統合: CMakeLists.txt を更新し、WASM GC ソースと portable GC/サポートライブラリのビルドを追加
  • Subset 有効化: eng/Subsets.props で NativeAOT runtime subset を WASM 対応として有効化
  • GC プリミティブ拡張: gcenv.base.h で WASM 向け GC プリミティブを提供

パフォーマンスへの影響

影響なし(ビルドインフラストラクチャの変更が主体)

関連Issue

#126633(このPRで置き換え)

その他

注意点: Copilot コードレビューにより以下の2つの高優先度の問題が指摘されています:

  1. WASM GC スキャンが ExInfo と GCFrameRegistration ルートを漏らしている可能性
  2. ClrNativeAotSubset の拡張が WASM に限定されず、非サポートターゲットにも影響を与えている可能性

これらは本 PR マージ前に対応が必要とされています。


#134758 JIT: don't fall through from a Wasm callfinally across a try_table end

概要

WebAssemblyにおいて、genCallFinallyがtry_table終了境界を越えたfall-throughを不正に許可していた問題を修正。try_table間隔の終了時にcallfinally継続へのブランチが省略されると、コードジェネレーションが検証用のunreachableを発行し、実行時にRuntimeError: unreachableでトラップしていた。特に非同期メソッド内の大規模finalize関数を含むユーザーtry/catch/finallyパターンで発生していた。

変更内容

  • codegenwasm.cpp: genCallFinallyがBasicBlock::CanRemoveJumpToTargetを使用するように変更。既存のBBJ_ALWAYS/BBJ_CONDの検証ロジックをBBJ_CALLFINALLYRETに対応させた
  • block.cpp: アサーション拡張により、BBJ_CALLFINALLYRETがTry/ExnRefWrapper終了を越えたfall-throughを正しく検出
  • fgwasm.cpp: DEBUG検査追加。隣接フォワードエッジがTry/ExnRefWrapper終了により暗黙的にfall-throughできない場合、明示的なブランチにラベルが付与されていることを検証
  • WebSocketReceiveErrorMessageTests.cs: WebSocket関連テストの再有効化(WebAssembly R2R向け)
  • Runtime_134264/: 新規回帰テスト。ユーザーtry/catch/finallyで大規模finallyを持つ非同期メソッドおよびネストされたtry/finally-in-try/catchバリアントを含む

パフォーマンスへの影響

影響なし。本修正はコード生成時の制御フロー検証を改善しており、パフォーマンス特性に変化なし。

関連Issue

#134264

その他

  • 検証: System.Net.WebSockets.Tests(browser-wasm CoreCLR、trimmed R2R)でChrome上実行。修正前はRuntimeError: unreachableでトラップ、修正後は278テスト実行で0失敗(新規4テスト含む)
  • Runtime_134264テストは修正前JITでRuntimeError: unreachableを再現可能
  • WebAssembler JITのクロスターゲッティング検証済み(14フレームワークアセンブリをcrossgen2でコンパイル、アサートなし)
  • JIT/Regression_2はWASI runtime-test treeにまだ含まれていない(#133265で対応予定)

#134756 [cDAC][wasm] Map portable entry points to interpreter code and R2R virtual IPs

概要

WebAssembly上のFEATURE_PORTABLE_ENTRYPOINTSをサポートするため、cDACがポータブルエントリーポイントをインタープリター実行またはR2R仮想IPに正しくマップする機能を追加しました。これまでネイティブコード側でマップしていた処理をcDAC側に実装し、SOS値やDBI診断パスが正しいアドレスを報告するようにします。

変更内容

  • IExecutionManager API追加:GetDiagnosticCodeStartFromEntryPointメソッドを新規追加し、ネイティブのGetDiagnosticCodeStartFromEntryPointに相当する機能を提供
  • 関数テーブル検索共通化:WasmFunctionTableIndexLookupを実装し、サイクル検出と境界チェックを含む関数テーブル走査ロジックを集約
  • データ記述子拡張:PortableEntryPoint.ActualCode/FlagsとMethodDesc.InterpreterCodeをデータ記述子として追加(WASM/インタープリター環境のみ)
  • レガシーSOS/DBIサポート:SOSDacImpl、ClrDataMethodInstance、DacDbiImplが新しいAPIを利用して診断用アドレスをマップ
  • 非ポータブルエントリーポイント環境での互換性:PrecodeStubs.GetInterpreterCodeFromInterpreterPrecodeIfPresentへの委譲で既存動作を維持
  • WasmR2RInfo簡素化:共通検索ロジックをWasmFunctionTableIndexLookupに移行し、より簡潔な実装に

パフォーマンスへの影響

影響なし。マッピング処理は診断・デバッグパス内での使用に限定され、ランタイムパフォーマンスクリティカルパスには影響しません。

関連Issue

#134753、#134754、#133917、#133890

その他

  • スタック依存:#134754に依存しており、そのマージ後にmainへリターゲット予定
  • 互換性との相互作用:#133890と並行してランディングする場合、第二段階のPRがWasmFunctionTableIndexLookupにTryGetFunctionIdentityとTryIsFuncletを追加し、WasmR2RInfoがそれらに委譲する必要があります
  • テスト検証:cDAC単体テスト3196件(17件新規)、ExecutionManager向けインタープリター/R2R/funclet/ポイズン/エントリーポイント制御ケース、非ポータブルパス、サイクル検出テストを追加。cDAC dump テスト260件パス
  • ネイティブ側同期:dacdbiimpl.cppでEnumerateAsyncLocals向けにGetInterpreterCodeFromEntryPointIfPresentマッピングを追加し、デバッグビルドでのcDAC/DAC相互チェック一貫性を維持

#134754 [wasm][R2R] Map state machine MoveNext method ids to virtual IPs

概要

Wasm ReadyToRun環境でのAsync状態機械のProfiler呼び出しスタックフレーム解決を修正します。PortableEntryPointのコードをWasm関数テーブルインデックスから診断用仮想IPへマッピングする共有ヘルパーGetDiagnosticCodeStartFromEntryPointを導入し、EventPipeとRuntimeMethodHandle_GetNativeCode間で再利用することで、非同期プロファイラーがWasm ReadyToRun上の状態機械フレーム名を正しく取得できるようにします。

変更内容

  • precode.cpp/precode.h: GetDiagnosticCodeStartFromEntryPoint共有ヘルパーを実装。Wasm環境でPortableEntryPointの実コードを診断用仮想IPにマッピング
  • runtimehandles.cpp: RuntimeMethodHandle_GetNativeCode QCallで診断マッピングを適用
  • eventtrace.cpp: EventPipeからの重複マッピング処理を削除し、共有ヘルパー経由へ統一
  • precode_portable.cpp: PortableEntryPoint::GetActualCodeのコントラクトをSTANDARD_VM_CONTRACTからLIMITED_METHOD_CONTRACTへ緩和(フィールド読み取りのみで、呼び出し側がNOTHROW/GC_NOTRIGGERと一致)
  • AsyncProfilerTests.cs: #134145の3つのActiveIssueアノテーションを削除し、テスト再有効化
  • RuntimeHandles.cs: マネージドQCall記述更新

パフォーマンスへの影響

影響なし。マッピング処理は診断パス(EventPipeおよびAsyncStateMachineDiagnostics)に限定され、本番コード実行パスには関与しません。

関連Issue

#134145、#134026、#134753

その他

  • マッピングはTARGET_WASMとFEATURE_PORTABLE_ENTRYPOINTS両方で条件付け。関数テーブルインデックスはWasm固有の実装詳細
  • 非Wasm環境では新しいマッピングコードはコンパイルから除外
  • テスト検証: Browser CoreCLR Release版でStateMachineAsync_*_ChainEventsAndCallstack 3テスト全パス、AsyncProfilerTests全体136実行61パス
  • Debug/Checkedビルドでのコントラクト検証は未検証
  • cDAC向けSOS修正は別途追跡(#134753)

#134735 Remove internal DisableDynamicEngine switch from feature switch docs

概要

ドキュメント内の誤った内容を削除するPRです。Microsoft.Extensions.DependencyInjection.DisableDynamicEngineフィーチャースイッチに対応するDisableDependencyInjectionDynamicEngine MSBuildプロパティがドキュメントに記載されていますが、このプロパティは実装上存在せず、設定しても効果がありません。内部的なスイッチとしてのドキュメント記載は削除されるべきであるという前回のレビュー指摘が反映されていなかったため、該当する行を削除します。

変更内容

  • docs/workflow/trimming/feature-switches.md: 存在しないMSBuildプロパティDisableDependencyInjectionDynamicEngineに関する1行を削除

パフォーマンスへの影響

影響なし(ドキュメント変更のみ)

関連Issue

#91133

その他

  • この変更はドキュメント専用で、コード変更はありません
  • フィーチャースイッチ自体は内部実装であり、公開APIではありません
  • AppContextスイッチとしてsrc/libraries/Microsoft.Extensions.DependencyInjection/src/ServiceProvider.csでのみ読み込まれます
  • Android開発において、このスイッチはAndroidAvoidEmitForPerformanceプロパティから設定されます

#134718 JIT: Remove GTF_DEBUG_NODE_MORPHED tracking

  • 作成者: @EgorBo
  • 作成日時: 2026年09月26日 16:55:25(UTC)
  • マージ日時: 2026年09月29日 12:57:37(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITコンパイラのGTF_DEBUG_NODE_MORPHEDフラグとそれに関連するデバッグ追跡機構を削除するクリーンアップです。このフラグはデバッグ時のみの診断補助でしたが、実際には保守負担となっていたため、フラグ、関連メソッド(SetMorphed/WasMorphed/ClearMorphed)、ノード単位のmorph計数、追跡ウォーカー、デバッグダンプ処理を削除しながら、実際のmorphing機構とアサーション伝播は保持します。

変更内容

  • gentree.cpp/gentree.h: GTF_DEBUG_NODE_MORPHEDフラグ定義、SetMorphed/WasMorphed/ClearMorphedメソッド、および関連するゲッター/セッターを削除
  • morph.cpp: morph処理の追跡ウォーカー、ノード単位のmorph計数、デバッグ出力ロジックを削除
  • morphblock.cpp: ブロック別morph処理の関連デバッグ追跡コードを削除
  • compiler.cpp/compiler.h: デバッグフラグ管理メンバー変数の削除
  • fgdiagnostic.cpp: デバッグダンプ処理における関連プリント文を調整
  • optimizer.cpp: 冗長な条件分岐の削除

パフォーマンスへの影響

影響なし(デバッグ時のみの追跡機構削除のため、Release/Debugいずれのコードジェネレーション結果に変化なし)

関連Issue

#6218

その他

これは内部実装(JITコンパイラ)のクリーンアップであり、公開APIへの影響はありません。GTF_DEBUG_NODE_MORPHEDはDebugビルド時のみ機能していたため、実際のmorphing機構の動作に変化はなく、既存の型変換やアサーション伝播は継続されます。


#134703 Fix missing env.vars in JIT tests

  • 作成者: @EgorBo
  • 作成日時: 2026年09月26日 12:28:38(UTC)
  • マージ日時: 2026年09月29日 19:23:33(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITテストにおいて環境変数が不足していた問題を修正するPull Requestです。テスト実行時に必要な環境変数が正しく設定されるようにプロジェクトファイルを更新しています。

変更内容

  • src/tests/JIT/opt/GuardedDevirtualization/badinlinee.csproj: 環境変数設定を1行追加
  • src/tests/JIT/opt/Vectorization/AvxState.csproj: 環境変数設定を2行追加

パフォーマンスへの影響

影響なし

関連Issue

#134693、#134694

その他

なし


#134690 Disable unused ReadyToRun metadata on WebAssembly

  • 作成者: @davidwrighton
  • 作成日時: 2026年09月25日 23:23:40(UTC)
  • マージ日時: 2026年09月29日 16:23:54(UTC)
  • ラベル: area-VM-coreclr

概要

WebAssemblyビルドでは実際に消費されないReadyToRun(R2R)メタデータの生成と読み込みを廃止する変更です。インライン追跡機能をプロファイリング、ReJIT、コードバージョニング機能に依存させ、WebAssemblyビルドでは無効化。Browser/WASIイメージからインライン情報とデバッグ情報をデフォルトでストリップします。

変更内容

  • ランタイム機能ゲーティング:FEATURE_INLINE_TRACKING_ENABLEDをプロファイリング/ReJIT/コードバージョニング機能マクロから導出し、WebAssemblyビルドで無効化
  • メタデータストリップ:Crossgen2タスクにBrowser/WASIビルド用の--strip-inlining-infoと--strip-debug-infoフラグを追加。System.Private.CoreLib.wasmとフレームワークライブラリの.wasmファイルに適用
  • レガシー処理削除:CoreCLRのレガシーInliningInfoセクション読み込みサポートを削除(R2RDumpは維持)。最小サポートR2Rバージョンが26となったため不要な互換性チェックを削除
  • セクションローディング最適化:ランタイム機能がない場合はモダンインライン追跡セクションの読み込みをスキップ
  • 文書化:ReadyToRun形式のドキュメントにランタイム消費セクションを明記

パフォーマンスへの影響

  • メモリ削減:WebAssembly向けR2Rイメージからデバッグ情報とインライン情報を削除することで、System.Private.CoreLib.wasmと101個のフレームワークライブラリ.wasmファイルのサイズ削減
  • ランタイム初期化:不要なメタデータローディング処理の削減により初期化時間短縮

関連Issue

なし

その他

  • 互換性:PublishReadyToRunStripInliningInfo=falseおよびPublishReadyToRunStripDebugInfo=falseプロパティで既存のオプトアウト機構を保持
  • 低優先度指摘:Copilot レビューで派生-基本ポインタキャストの安全性に関する低優先度の指摘あり
  • 検証:WebAssembly CoreCLRビルドでインライン追跡機能が正しく無効化されていることを確認済み

#134676 [wasm][R2R] Fix generic context / async continuation order in Wasm interpreter thunks

概要

Wasm インタープリタースタンブにおいて、共有ジェネリック非同期メソッドの呼び出し時に、ジェネリックコンテキストと非同期継続の引数スロットが入れ替わっていた問題を修正しました。RaiseSignatureがコンテキストを隠し先制化引数として正しく扱うよう改善し、3つのスタンブ(WasmR2RToInterpreterThunkNode、WasmInterpreterToR2RThunkNode、WasmImportThunk)の引数レイアウトを共通化して、整合性を確保しました。

変更内容

  • WasmLowering.cs: RaiseSignatureを改良し、ジェネリックコンテキストが非同期継続に先行する場合、methodRequiresInstArg: trueでArgIteratorを構築するよう改善
  • WasmThunkArgLayout.cs(新規): 3つのスタンブで手作業されていた引数レイアウト処理を統一。Wasm署名文字列を解析して各引数オフセットを決定し、ArgIteratorとの整合性を検証
  • WasmImportThunk.cs、WasmInterpreterToR2RThunkNode.cs、WasmR2RToInterpreterThunkNode.cs: WasmThunkArgLayoutを使用して手作業の引数配置を削除
  • GCRefMapBuilder.cs: GC参照マップとスタンブレイアウトが一致することを検証
  • WasmArgumentLayoutTests.cs(新規): 98個のテストケースで全スタンブの引数種別、オフセット、Wasm引数インデックスを検証
  • readytorun-format.md: 継続引数の渡し方に関する文書更新

パフォーマンスへの影響

影響なし。本修正はレイアウト順序の正確性を確保するもので、ランタイムパフォーマンスの変化なし。

関連Issue

#133953 #134660 #133627

その他

  • 修正前:[this][continuation][ctx][args]の順序で引数が配置されていた
  • 修正後:[this][ctx][continuation][args]の順序に正確化(VMのArgIterator、GC参照マップと整合)
  • CallClassConstructorなど、非同期継続がない場合でコンテキストを隠し先制化引数として扱うケースでのポインタエンコーディング(i/l)の保持を確保
  • 共有レイアウトにより、System.Private.CoreLibおよび関連アセンブリのcrossgen2出力は変わらず
  • AsyncProfilerTests.RuntimeAsync_WhenAny_TracksAllBranchesテストを再度有効化

#134675 Run SOS tests on Helix across cDAC platforms

概要

SOS(Son of Strike)テストをHelix上で実行するCI/CDパイプラインを再構築するもので、廃止予定のローカルエージェントSOS テストジョブをdotnet/diagnosticsのSOS.Tests Helixハーネスに置き換えます。cDAC(Compact DAC)ダンプテストと同じ8プラットフォームでSOS カバレッジを実行し、レガシーDACとcDACの両方に対応します。各プラットフォームで既存のCdacBuildArtifactsを再利用し、プライベートランタイムとプライベート統合cDACバイナリをSOSの横にコピーします。

変更内容

  • runtime-diagnostics.yml: パイプライン全体のロジックを更新し、SOS テストジョブを8つのcDAC プラットフォームで実行するよう変更。プライベートランタイムのHelix サポートを活用
  • sos-test-leg.yml: SOS テスト用Helix ジョブレグの大幅な拡張。ローカルエージェントから Helix ハーネスベースの実行に移行、プライベートランタイム/cDACの配布メカニズムを統合
  • cdac-helix-test-leg.yml: cDACテストレグの軽微な調整
  • runtime-diag-job.yml: 291行が削除され、廃止されたローカルエージェントベースのSOS テストジョブ定義が完全に移行

パフォーマンスへの影響

各プラットフォームのSOS ジョブをそのプラットフォームのビルド完了後に開始するよう変更することで、全プラットフォームビルド完了待機が不要になり、CI/CDパイプライン全体の並列性が向上します。

関連Issue

dotnet/diagnostics#6068(プライベートランタイムHelix サポート)

その他

  • テスト検証: パイプラインYAML構文の確認、diagnostics Release x64ビルド(PackageWithCDac=false)でのコピーハッシュ値の検証、LinuxARM32における適切なランタイムパッケージ選択の確認を実施
  • 通常のパイプライン実行はdotnet/diagnosticsのmainブランチを使用。検証が必要な場合はdiagnosticsBranchパラメータで該当PRのGitHub ref を指定可能

#134666 [JIT] [wasm]: Compare TYP_REF references directly with null using i32.eqz

概要

WebAssembly JITコンパイラの null チェック最適化。オブジェクト参照(TYP_REF)でオフセットがない場合、i32.eqz を使用してゼロとの直接比較で null チェックを実行するよう改善しました。byref/int型参照やオフセット/インデックス付きアドレスに対しては従来の i32.le_u による範囲比較を維持しています。

変更内容

  • src/coreclr/jit/codegenwasm.cpp: 型付き null チェック発行機能を実装し、呼び出し元を更新
  • src/coreclr/jit/hwintrinsiccodegenwasm.cpp: intrinsic null チェックにアドレス型情報を提供
  • src/coreclr/jit/codegen.h: null チェックヘルパー宣言を更新
  • src/coreclr/jit/lower.cpp: 軽微な更新

パフォーマンスへの影響

大幅な改善

  • コードサイズ: −70,101 バイト(−0.75%)
  • PerfScore: −2.00%
  • 10,079 件のサイズ改善(回帰なし)
  • 10,022 件の PerfScore 改善(回帰なし)

より効率的な WebAssembly 命令(i32.eqz は単一命令)の使用により、コンパイル済みコードサイズが削減されます。

関連Issue

#134463

その他

Copilot によるコード審査で、TYP_REF アドレスモード表現の null チェック正確性に関する高度な問題が指摘されており、マージ前にこの懸念事項の対応状況を確認する必要があります。


#134637 Minor tweaks to CoreCLR type-loader WebAssembly code generation

  • 作成者: @jkoritzinsky
  • 作成日時: 2026年09月25日 03:51:08(UTC)
  • マージ日時: 2026年09月29日 22:22:19(UTC)
  • ラベル: area-VM-coreclr

概要

WebAssembly対象のCoreCLR型ローダーのネイティブコード生成を最適化します。ClassLoader::CreateTypeHandleForTypeDefThrowingとそのCalleeで識別された冗長なネイティブ処理と例外処理スカッフォルディングを削減し、既存の不変式をオプティマイザーにより明確にします。型検証とクリーンアップは保持されます。

変更内容

  • methodtablebuilder.h/cpp: 14個の固定ワーキングレコードをMethodTableBuilderに直接格納し、bmtInitialDataとSetBMTDataを削除。フィールドオフセットアクセッサを最適化(一時配置用は生オフセット、検証済みインスタンスオフセット用はGetOffsetUnsafe())。配置カウントをキャッシュして直接状態メンバーアクセスを使用。MethodImplトークン比較を最適化し、シグネチャ解析を単一の局所カーソルで実行。
  • class.cpp: EnCフィールド/メソッド初期化パスを更新して所有状態を使用。例外ハンドリング スカッフォルディング削減。
  • siginfo.cpp: 値型シグネチャヘッダー解析を最適化。
  • nativeformatreader.h: HOST_WASM下でのみfatal継続をunreachableとマーク。
  • その他の軽微な修正(metadata.h, utilcode.h, rwutil.cpp, collections.cpp)。

パフォーマンスへの影響

コード生成改善(WebAssemblyリリースビル):

  • dotnet.native.wasm: 4,690,014 → 4,681,442バイト(8,572バイト削減)
  • WAsmコード部分: 3,648,376 → 3,639,806バイト
  • CreateTypeHandleForTypeDefThrowing: 55,856 → 52,507バイト(5.6%削減)
  • HandleAutoLayout: 2,300 → 2,042バイト
  • PeekValueTypeTokenClosed: 1,966 → 1,317バイト(33%削減)
  • MayHaveCustomAttribute: 1,520 → 720バイト(52%削減)

例外テーブル削減: try_table領域が84から64に減少。明示的レイアウト最適化により14個の大規模RVA比較パスを削除。注記: これはコード生成測定であり、起動時間やスループット改善の実測値ではありません。

関連Issue

#134631

その他

  • 互換性: 公開API変更なし。内部実装のみの最適化。
  • 検証: ブラウザWASM Releaseビルドで完全検証実施。既存の4つのスタンドアロン型ローダーテスト(ManagedSequential、self_override1、dim_devirtualization、CuriouslyRecurringThroughInterface)と7つの明示的レイアウトプロジェクトで合計11個の成功したラッパーを確認。149,161ペアのSigParser入力テスト実施。
  • 制限事項: EnC実行時テストは未実施。OOM及びx64/WASI完全ランタイムスイートは未実行。
  • MethodTableBuilderサイズ: w

#134507 Dispatch Mono [JSExport] by handle

概要

Mono と CoreCLR の [JSExport] ディスパッチを統一し、両者が integer ハンドルベースの managed table を経由して export をルーティングするようにしました。従来 Mono は MonoMethod* ポインタを JS 側の閉包に保持していましたが、CoreCLR のアプローチに統一することで、重複排除とシグネチャ変更の診断を改善しています。[JSImport] スタブから Unsafe.SkipInit は削除されず、AllowUnsafeBlocks の要件は変わらないため互換性が保たれています。

変更内容

  • JSHostImplementation.Exports.cs (新規・共有): reflection ベースの BindManagedFunction を実装し、handle table を構築
  • JavaScriptExports.Mono.cs: CallJSExport(int methodHandle, JSMarshalerArgument*) を追加し、CoreCLR エントリポイントとミラー化
  • driver.c: 既存の invoke パスを invoke_jsexport_method に統合、mono_wasm_set_jsexport_dispatcher と *_by_handle sync/async/post エントリポイントを追加
  • managed-exports.ts / invoke-cs.ts: CSFnHandle を使用した handle ベースのディスパッチに変更
  • JSHostImplementation.CoreCLR.cs / JSHostImplementation.Mono.cs: 重複していた BindAssemblyExports 実装を削除(flavor ごとの違いは保持)
  • 不要な interop 宣言(SystemInteropJS_GetAssemblyExport 関連)を削除
  • JSImportGenerator の diagnostic テスト更新

パフォーマンスへの影響

影響なし。ディスパッチが managed table の integer ハンドルを通じて統一されることで、Mono 側の直接ポインタ参照から managed 経由へ変わりますが、すでに CoreCLR はこのパターンで動作しており、パフォーマンス特性は既存と同等です。Mono コールバックの reflection 関連オーバーヘッドについては Copilot レビューから指摘されていますが、本 PR では対処されていません。

関連Issue

#120215

その他

  • AllowUnsafeBlocks 要件の維持: 前版で Unsafe.SkipInit 削除を試みた修正は revert されました。JSMarshalerArgument の 104 個の public メンバーのうち 44 個が unsafe 宣言されており、caller-unsafe rules により呼び出し側も unsafe context が必要なため、将来的に要件が復活するリスクがあります。
  • テスト結果: JSImportGenerator.Unit.Tests は 36 実行、0 失敗。CoreCLR browser-wasm では 481 実行中 472 合格、9 スキップ。Mono runtime パスは CI での検証に依存。
  • BindAssemblyExports の分離: CoreCLR 版は export なし assembly で例外、Mono 版は寛容に扱う動作差を保持(統一による副作用回避)。

#134398 Prevent CI scan duplicates after inconclusive lookups

  • 作成者: @kotlarmilos
  • 作成日時: 2026年09月22日 08:18:34(UTC)
  • マージ日時: 2026年09月29日 10:59:51(UTC)
  • ラベル: area-skills

概要

CI失敗スキャンにおける重複Issue検出の精度向上を目的とした変更です。Knowledge Base Entry(KBE)作成指示の更新により、完全なルックアップ結果と作成者メタデータを保持し、結論に至らないIssue/PR検索後は新規Issueの作成を停止するようにしました。また、閉鎖された重複Issueが再度発生した場合、重複リンクをたどって元のKBEを参照するよう改善されています。

変更内容

  • .github/workflows/shared/create-kbe.instructions.md: KBE作成手順を更新し、以下の動作を追加
    • ルックアップ結果とメタデータの完全保持
    • 結論に至らないIssue/PR検索後は新規Issue作成を停止
    • 重複リンクの追跡機能により、閉鎖された重複Issueから元のKBEへのアクセスが可能に

パフォーマンスへの影響

影響なし

関連Issue

#134302、#134304

その他

  • 変更は指示ドキュメントのみで、スクリプトやワークフロー設定の直接的な変更はありません
  • このPRはGitHub Copilotで生成されました
  • Copilotレビューでは複数の指摘(CLIプロキシイメージの欠落、明示的な重複リンク検出の改善など)が挙げられていますが、本要約は提供された情報に基づいています

#134355 [wasm][coreclr] Dispatch R2R-compiled UnmanagedCallersOnly callbacks to their native entrypoint

概要

WebAssembly上のpartial ReadyToRun環境において、[UnmanagedCallersOnly]属性でマークされた外部公開コールバックが、インタープリタパスを迂回して直接R2Rネイティブエントリポイントにディスパッチされるように修正しました。従来はnull interpreter bodyやinterp-to-R2Rパスのエラーが発生していたものを、原子操作によるキャッシュを用いた直接ディスパッチと、フォールバックパスの組み合わせで解決します。

変更内容

  • PInvokeTableGenerator.cs: 外部公開コールバック向けに直接R2RディスパッチコードをC言語で生成。multi-slot UCO署名(Int128パラメータ等)、Vector128<T>、隠れた戻り値バッファを必要とするaggregate返却を事前に拒否。
  • helpers.cpp: 共有R2R UCOエントリポイント検索ロジック追加。
  • callhelpers-reverse.cpp(browser/wasi): 生成済みリバースヘルパー再生成。WASI版ではexportされたコールバックがないため直接R2Rディスパッチが削除。
  • WasmArgumentLayoutTests.cs: 生成されたR2Rディスパッチと87テストケースを含む回帰テスト追加。
  • WasmInterpreterTransitions: エンドツーエンド検証用マネージド/ネイティブコード追加(native echo.c含む)。
  • CLRTest.WasmCorerun.targets: ランタイムテスト用の生.c/.cpp NativeFileReferenceをコンパイル・リンク対応。

パフォーマンスへの影響

R2RコンパイルされたUnmanagedCallersOnlyコールバックは、原子操作を用いたキャッシュによるワンタイムルックアップコストで、インタープリタパスより高速に実行されます。影響なし(既存interp-only環境)から改善(R2R環境)への移行。

関連Issue

#134200、#134337

その他

コード例(生成されるC関数):

void* r2r = __atomic_load_n(&R2RCode_..., __ATOMIC_ACQUIRE);
if (r2r == (void*)(intptr_t)-1)
{
    r2r = GetR2RNativeCodeForUnmanagedCallersOnly(MD_...);
    __atomic_store_n(&R2RCode_..., r2r, __ATOMIC_RELEASE);
}
if (r2r != nullptr)
{
    ((void(*)())r2r)();
    return;
}
ExecuteInterpretedMethodFromUnmanaged(MD_..., ...);

外部公開コールバックのみにこのディスパッチが限定される理由:native C exportはextern "C"を通じて直接呼ばれるため、呼び出し側のラッパー自体がR2Rエントリポイントに到達する必要があります。その他のリバースサンクはGetUnmanagedCallersOnlyThunkを通じて配布され、既にR2Rコード優先返却のため、ここでの直接ディスパッチは冗長です。

実装時の追加堅牢化:HasNativeEntryPointはインタープリタ優先エントリポイントを除外し、


#134313 Pool TLS 1.3 session tickets per host instead of keeping one

概要

Linux上のOpenSSL TLS 1.3クライアントセッションキャッシュを改善するPRです。従来は1ホストあたり1つのセッションチケットのみを保持していましたが、TLS 1.3では同一チケットを複数回使用できないという制約があるため、複数チケット(最大8個)をプールして保持するように変更しました。これにより並行接続時のセッション再開成功率が向上し、キャッシュ同期の問題とロック順序の問題も解決されます。

変更内容

  • Native層(pal_ssl.h/c、opensslshim.h): SSL_SESSION_up_refのネイティブラッパーを追加してセッション参照カウントを管理
  • マネージド層(Interop.SslCtx.cs): ホストごとのセッションプール実装(最大8個)、キャッシュエビクション、参照管理ロジック追加
  • Interop定義(Interop.Ssl.cs、Interop.OpenSsl.cs): SSL_SESSION_up_refのマネージド相互運用バインディング追加、TLSバージョン判定機能追加

パフォーマンスへの影響

TLS 1.3(セッション再開有効時)では大幅な改善:

  • 64並行接続時:14%高速化(318.4µs → 273.2µs)
  • 128並行接続時:12%高速化(326.1µs → 285.6µs)

低並行数での影響:

  • N=1, N=8時点ではTLS 1.3で2-3%低速化(追加のSSL_SESSION_up_ref呼び出しとリスト検索により)
  • メモリ使用量は約1%増加(12.33KB → 12.44KB、N=64時点)

変更の影響を受けないケース:

  • TLS 1.2(再開有効/無効):ほぼ影響なし
  • TLS 1.3(再開無効):ほぼ影響なし

関連Issue

なし

その他

  • 設計の考慮点: TLS 1.2では同一チケットの反復使用が可能だったため従来の1チケット設計でも機能していましたが、TLS 1.3ではチケットの1回限りの使用制約により複数保持が必須となりました
  • キャッシュ削除戦略: OpenSSLのSSL_CTX_add_sessionはDefaultTlsCacheSizeClientの上限を超えた場合に最も期限が近いセッション(oldest-first)から自動削除を行い、マネージド辞書はremove_session_cbコールバックで同期を保つ設計
  • Copilotレビューの指摘: TLS 1.3の並行処理とキャッシュエビクションに関する専門的なテストカバレッジの追加が推奨されている

#134048 JIT: Defer physical promotion readbacks across basic blocks

概要

物理プロモーションの最適化により、構造体パラメータなどの昇格されたローカル変数から、基本ブロック間でのフィールド読み戻しを遅延させます。RPO(逆ポスト順序)での処理追跡と、プロファイルガイド最適化(PGO)を活用した配置により、不要な読み戻し挿入を削減し、メモリオーバーヘッドを軽減します。

変更内容

  • promotion.cpp: 遅延読み戻し計画と挿入ロジック(+402行)を実装。前任者の合意に基づいた読み戻しの継承、ドミネータベースの共通読み戻し配置をサポート。バックエッジ対象ブロックへの保守的な同期も対応。
  • promotion.h: 読み戻し追跡と計画状態の追加データ構造(+30行)。
  • promotionliveness.cpp: 昇格フィールドの使用/定義クエリ機能(+36行)を追加。
  • physicalpromotion.cs: 分岐、ループ、例外処理、部分書き込みを含む回帰テスト(+120行)を追加。

パフォーマンスへの影響

  • 多くのフィールドを持つ構造体パラメータに対して、エントリブロックでの過度なフィールド抽出を削減し、ライブ状態のサイズを削減。
  • ビット演算コストの削減により、稀に使用されるフィールドの抽出コストを回避。
  • ドミネータベースの計画フェーズにより、複数の読み戻し挿入より共通読み戻しが有利な場合を検出。
  • 具体的なベンチマーク数値は提供されていません。

関連Issue

なし

その他

  • Copilot reviewにより、共通読み戻し配置のカバレッジ追加とコード生成およびパフォーマンス影響の検証が推奨されています(Low severity)。
  • JIT内部実装の変更であり、公開APIへの影響はありません。
  • 互換性への影響なし。

#133986 Add GC support for external memory handles

概要

GCが管理するヒープ外やスタック外に存在する管理対象参照を追跡するため、AppDomain管理の外部メモリハンドル機能を追加しました。この機能により、デバッガーのfunc-eval(関数評価)結果とDAC/cDAC経由での参照追跡が可能になります。主な実装は、GCスキャン、DAC列挙、ポインタ解析、およびbyref-like型のfunc-eval結果の保護を含みます。

変更内容

ランタイム(内部実装)

  • externalmemoryhandle.h/cpp: 外部メモリハンドルの格納・スキャン機構を実装
  • appdomain.cpp: AppDomainで外部ハンドルの管理・スキャン・ダンプ機能を追加
  • gcenv.ee.cpp: GCスキャン時に外部ハンドルをルートとして扱う処理を統合
  • datadescriptor.inc: ランタイムデータ記述子を拡張

デバッガー(内部実装)

  • debugger.cpp/h: 外部ハンドルの作成・破棄機能を追加
  • funceval.cpp: byref-like型のfunc-eval結果を保護
  • rsthread.cpp: func-eval完了時のハンドル転送とクリーンアップを実装
  • divalue.cpp: デバッガー値とハンドルの関連付け処理を追加
  • dacdbiimpl.cpp/h: DAC経由での外部ルート列挙機能を実装

DAC/cDAC(公開API含む)

  • IExternalMemoryHandles.cs: 外部メモリハンドル列挙用の新規公開契約
  • ExternalMemoryHandles_1.cs: 外部ルート列挙の実装(cDAC内部)
  • RuntimeTypeSystem_1.cs: インラインアレイ型の検査機能を追加
  • RefWalk.cs: 外部ルートをRefWalk統合に組み込み
  • テスト追加: cDAC単体テスト、RefWalk統合テスト、ダンプベーステストなど

ドキュメント

  • ExternalMemoryHandles.md: 外部メモリハンドル契約の仕様を新規作成
  • RuntimeTypeSystem.md: インラインアレイメタデータの説明を追加

パフォーマンスへの影響

影響なし(メモリ・スキャンオーバーヘッドに関する具体的な測定情報は提供されていません)

関連Issue

なし

その他

Copilotレビューの指摘事項(重要)

  • 高刺激度: DAC/cDACの外部ハンドル走査で並行GCとの同期が必要(Synchronize external-handle traversal with concurrent GC)
  • 高刺激度: DAC構築時のDebuggerExternalMemoryOwnerクリーンアップの保護が必要
  • 高刺激度: 外部メモリオーナーイベントのサイズ処理が不足
  • 中刺激度: FieldDescデータ読み込み失敗時のベストエフォート処理の復元が必要
  • API承認: IExternalMemoryHandlesは新規公開API(Microsoft.Diagnostics.DataContractReader.Abstractions配下)であり、API承認ラベル付きのIssueがリンク

#133958 [aw] Add trusted KBE search eval support

  • 作成者: @vitek-karas
  • 作成日時: 2026年09月15日 16:15:59(UTC)
  • マージ日時: 2026年09月29日 09:24:05(UTC)
  • ラベル: area-skills

概要

CI評価スキャナー向けに、信頼できるKBE(Knowledge Base Engine)問題検索評価サポートを追加します。リポジトリスコープのKBE問題検索ラッパー、候補読み取りグレーダー、フォーカステストを実装し、CI/CD評価ワークフローに統合しています。これは#133684の前提条件となります。

変更内容

  • ci-eval.yml: 評価ワークフローを拡張し、信頼できるベースチェックアウトから評価入力をプロビジョニングし、フォーカステストとグレーダーを評価ランナーに統合(+44/-4)
  • kbe-search.test.mjs: KBE検索機能の13個のフォーカステストを追加(新規ファイル)
  • kbe-candidate-reads-grader.mjs: 候補読み取り検証用グレーダー実装(新規ファイル、257行)
  • search-kbe-issues.cjs: リポジトリスコープのKBE問題検索ラッパー実装(新規ファイル、75行)
  • README.md、package.json: 評価関連ドキュメントと依存関係の更新

信頼できるヘルパー、グレーダー、フォーカステストはエージェント書き込み可能な評価ワークスペース外に配置されています。

パフォーマンスへの影響

影響なし

関連Issue

#133684(依存PR)

その他

検証状況: npm test実行で13個のテストが合格、JavaScript構文チェックとYAML解析が成功しています。

Copilotレビューの指摘: グレーダー実装に複数の信頼境界問題が指摘されています:

  • ツール結果のエラー状態チェックが不十分(成功フラグのみで判定)
  • 時間的順序の検証でインデックス参照が正確でない(ツール結果インデックスと呼び出しインデックスを混同)
  • マッチしないツール呼び出しが適切に失敗として扱われていない

本PR merge後、依存PRで本番ワークフローと評価仕様の変更が利用可能になります。


#133622 Use metadata APIs in AssemblyChecker

  • 作成者: @jkoritzinsky
  • 作成日時: 2026年09月10日 18:22:30(UTC)
  • マージ日時: 2026年09月29日 01:28:30(UTC)
  • ラベル: area-ReadyToRun

概要

AssemblyCheckerツールのデバッグアセンブリ検出ロジックを、MetadataLoadContextからSystem.Reflection.MetadataのAPIを使用した直接的なメタデータ検査に変更しました。これにより、アセンブリの依存関係を解決する必要がなくなり、System.Reflection.MetadataLoadContextパッケージ依存を削除できます。

変更内容

  • AssemblyInspector.cs: IsDebugメソッドをPEReader/MetadataReaderを使用してアセンブリレベルのカスタム属性からDebuggableAttributeを直接検査するように変更。サポート対象のDebuggableAttributeコンストラクタシグネチャとその引数の明示的な検証ロジックを追加。
  • AssemblyChecker.csproj: System.Reflection.MetadataLoadContextパッケージ依存を削除(4行削除)。

パフォーマンスへの影響

  • 依存関係の解決を回避することで、アセンブリ検査時のオーバーヘッドが削減されます。
  • 軽量なメタデータAPIへの変更により、メモリ使用量が削減される見込みです。

関連Issue

#134296

その他

注意点: Copilot Code Reviewにより、中程度の重要度の警告が指摘されています。IsDebugメソッドがpeReader.GetMetadataReader()およびreader.GetAssemblyDefinition()を呼び出す際に、事前にHasMetadata/IsAssemblyチェックを行わないため、非マネージドPEやマネージドモジュール上で例外がスロー可能という指摘があります。本番環境での使用前に対応が必要と考えられます。


#133571 Fix combined ActiveIssue restrictions in runtime test wrappers

  • 作成者: @Copilot
  • 作成日時: 2026年09月10日 05:07:12(UTC)
  • マージ日時: 2026年09月29日 00:57:44(UTC)
  • ラベル: area-Infrastructure

概要

xUnit テストラッパージェネレーターの ActiveIssue 属性フィルタリングロジックを修正し、複数制約(プラットフォーム、ターゲットフレームワーク、ランタイム)が論理積(AND)で評価されるようにしました。従来は制約のいずれかがマッチすると無条件にテストをスキップしていましたが、すべての制約をマッチさせることで正確な条件付きスキップを実現します。また calli_excep.il に Windows 専用制約を追加し、Linux での kernel32 依存性による DllNotFoundException を解決しています。

変更内容

  • src/tests/Common/XUnitWrapperGenerator/XUnitWrapperGenerator.cs: 4 引数の ActiveIssue オーバーロードおよび条件付き OuterLoop 属性の評価ロジックを修正。プラットフォーム・フレームワーク・ランタイムがすべてマッチした場合にのみスキップが適用される論理積セマンティクスに変更
  • src/tests/JIT/Directed/pinvoke/calli_excep.il: kernel32 依存性により Linux での実行不可のため、Windows 専用マーク([Platform("windows")])を追加
  • callconv テスト群の .csproj: ThisCallTest, CdeclMemberFunctionTest, PlatformDefaultMemberFunctionTest, StdCallMemberFunctionTest に browser opt-out プロパティを追加

パフォーマンスへの影響

影響なし。本変更は条件判定ロジックの修正であり、実行時パフォーマンスへの直接的な影響はありません。

関連Issue

#126517(SkipOnCoreClr の既定値に関連)、#133367(Browser/WASM テスト対応)、#131811

その他

  • 検証: CoreCLR/release ライブラリ baseline ビルド成功、VSTest と /t:Test target で 46 個のホスト側 xUnit ジェネレーター回帰テスト合格(スキップなし)
  • 互換性: 従来の過度なスキップ条件が是正され、正確な制約評価が実現。ただし browser/WASM 対応テストの opt-out 再導入については、レビュー指摘により #133367 で検証済みの browser カバレッジ喪失の懸念が指摘されています
  • 制限事項: 実際の Windows/Mono SEH 実行テストは Linux ホストで実施(利用不可)、generator 回帰テストは提供されていない

#133265 [wasi] Enable CoreCLR WASI composite ReadyToRun publishing

概要

WASIプラットフォーム上でCoreClrのComposite ReadyToRun (R2R)出版を有効にする機能です。Crossgen2を用いて、アプリケーションとフレームワークをコンポジットR2Rイメージに編集し、WASIホストに埋め込むパイプラインを実装します。WebCILの自己インストール機能を活用し、wasm-toolsとBinaryenを使用してリンク後の統合とグローバル最適化を行います。

変更内容

  • WASI R2Rビルドパイプライン: ComposeWasiReadyToRunタスクでセルフインストールコンポジットをWASIホストに統合、イメージバッファとテーブルサイズをホスト設定に対して検証
  • WebCIL拡張: アクティブセグメントをサポートする自己インストール形状(patchWebcilHeaderハンドシェイク付き)を実装
  • WASI外部アセンブリプローブ: 埋め込みコンポジットとWebCILスタブを提供するwasi_r2r_probe.hppを追加
  • ツール管理: AcquireWasiR2RTools.targetsでpinnedバージョンのwasm-tools/Binaryenを共有wasm工具キャッシュに取得
  • スプライスパイプライン: eng/wasi-r2r/pipeline_shim.pyで非再配置可能なWasm R2Rをネイティブリンク後に統合
  • テストCI統合: WASI CoreClr R2R実行を検証するための「Checked R2R」パイプラインレーンを追加
  • ドキュメント: docs/workflow/building/coreclr/wasi-r2r.mdとdocs/design/mono/webcil.mdに仕様を記載

パフォーマンスへの影響

影響なし。本変更は出版とコンポジション処理のみであり、ランタイム性能への直接的な影響は報告されていません。

関連Issue

#134312(自己インストールWebCIL R2Rイメージの基盤) #134813(WASI R2R runtime-test/library-test CI対応、本PRに依存) #130129(関連)

その他

  • 検証済み: ./build.sh -s clr+libs+packs -os wasi -arch wasm -c Releaseで警告/エラーなし。サンプルアプリ(src/mono/sample/wasi/console)のPublishTrimmed + PublishReadyToRun=true出版で、6つの読み込まれたアセンブリすべて(CoreLib、アプリ、System.*)について「Ready to Run initialized successfully」確認
  • 非R2R CoreCLr WASI出版は引き続き弱いプレースホルダバッファにリンクされ動作
  • Copilot指摘: wasm compositeの出版対象ロジックがR2R wasm sidecarをResolvedFileToPublishに追加していない可能性があり、対応が必要

#133188 Add additional round-trip fixes and add additional unit tests for greater code coverage

概要

IL Assembler(ilasm)ツールに対して、ラウンドトリップ(IL → PE → IL)検証シナリオの修正と、包括的なユニットテスト追加を実施。メタデータ/PE出力のエッジケース修正、CLIパース正規化の改善、マネージド ilasm ラウンドトリップテスト基盤の整備を含む。

変更内容

  • ilasm実装の修正:

    • VTableExport PE出力(CORヘッダ vtableディレクトリオフセット、エクスポートテーブル生成ロジック)
    • PrivateScope メタデータ名正規化($PSTトークンサフィックス削除)
    • 変長引数(vararg)シグネチャ処理
    • Include スタック EOF 処理
  • テスト拡充:

    • TypeSignature/TypeReference/Typedef/TypeDefinition 解析テスト
    • Exception Handling、Property/Event メタデータ出力テスト
    • Preprocessor 統合テスト(マクロ展開、条件付きコンパイル)
    • Native Export ディレクトリ生成テスト
    • CLI オプション正規化テスト
  • テスト基盤:

    • ManagedIlasmRoundTripIncompatible マーカー導入(マネージド ilasm 非互換プロジェクト除外)
    • CI パイプラインに managedilasmroundtrip シナリオ追加
    • テスト設定ドキュメント更新
  • Options.cs 公開API変更: DLL出力オプションのプロパティ名が変更(IsDll → Dll 相当の推定、互換性の課題あり)

パフォーマンスへの影響

影響なし

関連Issue

#131509(本PR で置き換え対象)

その他

互換性に関する懸念:

  • Copilot レビューで指摘:
    • Options クラス(公開型)のプロパティ名変更は破壊的変更(互換性維持 or 内部化の検討が必要)
    • NativeCommandLine.cs の CLI 正規化で Option.Name vs エイリアスの分類ミス
    • -h オプション互換性未解決

#131510 Add pseudo custom attribute lowering to managed ilasm

概要

managed ilasmにPseudoCustomAttributesローリング機能を追加し、DllImportAttribute、MarshalAsAttribute、MethodImplAttribute、StructLayoutAttributeなどの既知属性をメタデータフラグ・補助テーブルに変換します。これによりnative ilasmの動作と一致させます。

変更内容

  • PseudoCustomAttributes.cs系モジュール(1,747行追加): 属性の識別(Identity)、デコーディング(Decoding)、既知属性定義(KnownAttributes)、適用ロジック(Application)、MarshalAs・セキュリティ属性の特殊処理を実装
  • EntityRegistry.cs: ローリング後のカスタム属性行削除と事前エミッション用ローカルタイプ定義検索機能を追加
  • MetadataExtensions.cs: フラグマスク・マーシャリング定数などのヘルパー定数を追加
  • GrammarVisitor.cs: ローリングパスをコンパイルパイプラインに統合し、.customソース位置を記録
  • Diagnostic.cs: 属性検証失敗向けの新規診断ID/メッセージを追加
  • テストケース(1,195行追加): CustomAttributeTests、InteropTests、FieldTests、MethodTests、ParameterTests、PropertyEventTests、AssemblyTestsで属性ローリング・バリデーション・フラグ/テーブルエミッション動作をカバー

パフォーマンスへの影響

影響なし

関連Issue

#131510

その他

  • 内部実装の変更(ilasm ツール向け)で、ランタイムの公開APIや互換性に直接的な影響なし
  • native ilasmとの動作一致により、IL中間表現から適切なメタデータエミッション(P/Invoke、マーシャリング、レイアウト、セキュリティ属性など)が実現される
  • Everett(古い.NET Framework)の互換性に関する特殊処理を含む

目次