Pull Request on 2026年10月16日

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

注意点

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


目次

  1. #135976 Fix R2RDump path casing in HalfEstimateR2R test
  2. #135957 Avoid tagged shared dynamic-interface vtable entries on WASM
  3. #135953 Provide NativeAOT WASM interface dispatch resolver
  4. #135950 Exclude unsupported NativeAOT WASM native-library tests
  5. #135948 Align NativeAOT Vector<T> to 16 bytes on WASM
  6. #135946 JIT: Don't assert when printing open generic method names in disasm
  7. #135934 Validate ZstandardStream constructor arguments and prevent ArrayPool buffer leak on failure
  8. #135931 [manual] Merge release/8.0-staging into release/8.0 to unblock MSRC internal-to-public builds
  9. #135924 ilverify: report boxing of byref-like types
  10. #135917 Add the missing SwitchTests.ilproj to ILVerification.Tests
  11. #135909 Split NativeAOT thread startup by multithreading support
  12. #135908 Keep hostpolicy context alive for the lifetime of the process after coreclr has been loaded
  13. #135907 [manual] Merge release/9.0-staging into release/9.0 to unblock MSRC internal-to-public builds
  14. #135899 Keep negative cast results in R2R when they can't change across versions
  15. #135883 [release/8.0-staging] Update MsQuic to 2.5.12
  16. #135877 Fix missing ILVerify messages for LdftnCtor and TailStackEmpty
  17. #135869 Add CompExactlyDependsOn to some methods so that they are compiled on wasm
  18. #135865 [QUIC] Disable QUIC test on OSX with mono runtime
  19. #135861 [QUIC] Remove timeout
  20. #135857 Swallow ObjectDisposedException when restoring blocking mode after connect async
  21. #135851 JIT: Propagate rejectNegativeConst through lcl + cns in monotonicity check
  22. #135850 JIT: Treat stores to EH-live locals as visible when hoisting
  23. #135798 ILVerify error cleanup
  24. #135789 Wait for the OOB byte in IOControl_SIOCATMARK_Unix_Success
  25. #135724 JIT: Keep volatile loads when folding full-range relational comparisons
  26. #135650 Fix concurrent CCW vtable and IID publication
  27. #135519 cDAC: skip empty assembly-list slots in Loader_1.GetModuleHandles
  28. #135471 [cDAC] Handle GettingReJITParameters state
  29. #135413 [browser][wasi] Allow uncontended synchronous waits and un-gate Roslyn workspace tests
  30. #135311 Managed ilasm: honour explicit local slots, scope local names lexically, and emit LocalScope/LocalVariable rows
  31. #135276 Fix suspend of CLR initialization thread when started from dispatch queue on apple
  32. #134978 [wasi] Enable EventPipe (FEATURE_PERFTRACING) for CoreCLR WASI
  33. #134082 Handle parameterized ILTrim interop types

#135976 Fix R2RDump path casing in HalfEstimateR2R test

  • 作成者: @jtschuster
  • 作成日時: 2026年10月16日 21:30:54(UTC)
  • マージ日時: 2026年10月16日 22:58:47(UTC)
  • ラベル: area-ReadyToRun

概要

HalfEstimateR2R.GetDisassembly が参照する R2RDump のパスを、小文字の r2rdump/r2rdump.dll から R2RDump/R2RDump.dll に修正するテスト専用の1行変更です。Core_Root のレイアウトおよび既存の Unix 向け Crossgen2 テストハーネスと表記を一致させています。小文字のパスは大文字小文字を区別しない Windows ファイルシステムでは動作しますが、Linux では ReadyToRun の逆アセンブリを検査する前に失敗します(Linux x64 Checked で The application to execute does not exist: '.../r2rdump/r2rdump.dll' が報告されていました)。

変更内容

  • src/tests/readytorun/HardwareIntrinsics/X86/HalfEstimateR2R.cs(+1/-1)
    • R2RDump のパス表記を R2RDump/R2RDump.dll に修正。
    • 既存の命令セットの前提条件チェックと逆アセンブリのアサーションは変更なし。

PR作成者によると、Linux x64 で以下を確認済みです。

  • 修正前は同一の失敗(テスト終了コード 101)を再現し、修正後は成功(期待値 100、実際 100)。
  • clr+libs+libs.pretest のビルドは警告・エラーともに 0 件。

パフォーマンスへの影響

影響なし(テストコードのパス表記修正のみ)。

関連Issue

#135963(Resolves)

その他

なし


#135957 Avoid tagged shared dynamic-interface vtable entries on WASM

概要

NativeAOT の WASM ターゲットで、sealed vtable に「タグ付きの shared な IDynamicInterfaceCastable メソッドポインタ」を出力しないようにする修正です。

instantiating thunk のフラグは関数ポインタ relocation の addend として符号化されています。WASM の関数ポインタはテーブルインデックスであり、オブジェクトライタは 0 以外の関数 addend を funclet の序数として解釈します。その結果、存在しない funclet への参照となり、コンパイルがクラッシュしていました。

WASM では shared な dynamic-interface 実装のエントリを null にし、未サポートであることを示す TODO を残しています。これはコンパイル時の bringup 用の修正であり、shared な dynamic-interface ディスパッチのランタイムサポートではありません。サポートにはジェネリックコンテキストを渡す、シグネチャ的に正しい方法が必要で、ポインタのエンコーディング変更だけでは不十分とされています。

変更内容

  • src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/SealedVTableNode.cs (+7/-0)
    • WASM ターゲットで shared な dynamic-interface 実装の sealed vtable エントリを null として出力
    • 未サポートのシナリオであることを示す TODO を追加
    • その他の sealed vtable エントリおよび WASM 以外のターゲットは変更なし

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 検証は、他の未マージの enablement を含むローカルの NativeAOT WASI bringup ツリーで実施されています。
    • .\build.cmd clr.tools -rc Checked -lc Release -os wasi -arch wasm が成功
    • Determinism テストで存在しない funclet 参照のエラーが発生しなくなった
    • オブジェクト検査により、shared な dynamic-interface vtable 2 つは relocation のないゼロエントリになり、他の 4 つの vtable は関数 relocation を保持していることを確認
    • 別の resolver/linker bringup 修正と合わせて、再ビルドした Determinism と AttributeTrimming が Wasmtime 上で 100 を返した
  • このブランチには main から cherry-pick した本コミットのみが含まれ、単独ではビルドされていません。
  • 未サポートの shared dynamic-interface ディスパッチ自体は実行されていません。

#135953 Provide NativeAOT WASM interface dispatch resolver

概要

NativeAOT の WASM 向けに、固定シグネチャの RhpDispatchResolve エクスポートを提供する変更です。ジェネリック仮想メソッド(GVM)のヘルパーパスはこのリゾルバーを参照しますが、WASM には対応するネイティブアセンブリ実装がありませんでした。そこで WASM 専用のマネージド実装をエクスポートし、既存の RhpResolveInterfaceMethod のキャッシュ/ワーカーパスへ委譲します。

  • レシーバーが null の場合は明示的に例外をスローし、ディスパッチヘルパーの従来の挙動を維持します。下位のリゾルバーは他のコンテキストでは意図的に null に対して 0 を返すため、この挙動はそちらでは提供できないとされています。
  • このヘルパーはターゲットポインターを解決して返すだけで、任意シグネチャの転送トランポリンではありません。新しい呼び出し規約は導入されていません。

変更内容

  • src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/CachedInterfaceDispatch.cs(+13/-0): WASM 専用の RhpDispatchResolve マネージド実装を追加。

パフォーマンスへの影響

影響なし(記載なし)。

関連Issue

なし

その他

  • 作成者による検証は、未マージの他の有効化変更を含むローカルの NativeAOT WASI 統合ツリー上で行われています。
    • clr.nativeaotlibs(wasi/wasm)のビルドが成功。
    • Determinism テストのビルドが強制再生成後に成功し、未定義だった RhpDispatchResolve のリンクエラーが解消。
    • 再ビルドした Determinism と AttributeTrimming は Wasmtime 上でいずれも 100 を返却。
  • このブランチは main からチェリーピックした本コミットのみを含み、単独ではビルドされていません。
  • Determinism はオブジェクトファイルの同一性を確認するもので、ランタイムでのジェネリック仮想ディスパッチの正当性を検証するものではありません。

#135950 Exclude unsupported NativeAOT WASM native-library tests

概要

NativeAOT WASM(WASI/browser)で現状サポートされていない4つのテスト構成を、CLRTestTargetUnsupported でマークして除外するPRです。除外条件は TargetsWasm に基づいており、デスクトップ向けのテストカバレッジには影響しません。

除外の理由(PR説明より):

  • AggregateLibrary、CustomMainWithStubExe、SharedLibrary: 共有ライブラリのサポートが必要だが、NativeAOT WASMは現状これを提供していない
  • CustomMain: ネイティブアーカイブが必要だが、既存のWASMネイティブテスト用CMakeトラバーサルでビルドされない

変更内容

以下の4つのテストプロジェクトに、各+2行(TargetsWasm 条件付きの CLRTestTargetUnsupported 指定)を追加しています。

  • src/tests/nativeaot/AggregateExecutableLibrary/AggregateLibrary.csproj
  • src/tests/nativeaot/CustomMain/CustomMain.csproj
  • src/tests/nativeaot/CustomMainWithStubExe/CustomMainWithStubExe.csproj
  • src/tests/nativeaot/SmokeTests/SharedLibrary/SharedLibrary.csproj

テスト用プロジェクトのみの変更で、ランタイム/コンパイラ/ライブラリの実装や公開APIには影響しません。ネイティブテストのCMakeトラバーサルの変更や、PInvokeなど無関係なテストの除外は行っていません。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 検証内容(ローカルの、他の未マージ対応を含むNativeAOT WASIブリングアップ環境での結果):
    • MSBuildのプロパティ評価で、4プロジェクトがWASI/wasmおよびbrowser/wasmで除外され、Windows/x64では有効のままであることを確認
    • .\src\tests\build.cmd nativeaot checked tree nativeaot wasm wasi で、共有ライブラリおよびCustomMainのアーカイブ欠落に起因する失敗が報告されなくなった
    • 一方、統合ツリーでの最新の実行では、既存の UnitTests のlowering assertionによる失敗とCのmath ABI警告が残っている
  • 本ブランチは main からcherry-pickした単一コミットのみを含み、単独ではビルドされていません。browserおよびデスクトップでの実行は行われていません。
  • PR説明はGitHub Copilotにより生成された旨が記載されています。

#135948 Align NativeAOT Vector<T> to 16 bytes on WASM

概要

NativeAOTのSystem.Numerics.Vector<T>に、WASMのv128 ABIが要求する16バイトアラインメントを与える修正です。

メタデータ上のレイアウトはulongフィールド2つで構成されるためアラインメントが8になります。NativeAOTはターゲットに合わせてベクターのサイズは調整していましたが、アラインメントはメタデータ由来の値のままでした。その結果、共有されているWASM ABIのロワリング処理で「16バイトのベクターは16バイトアラインでなければならない」というアサーションが失敗していました。

本PRではWASMの場合に限りフィールドのアラインメントを上書きします。ABIのアサーションは維持され、他のアーキテクチャのレイアウトには影響しません。これは、crossgen2/VM側で先に行われた補正(dotnet/runtime#131328)がNativeAOT独自のレイアウトアルゴリズムには反映されていなかったことへの対応です。

変更内容

  • src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/VectorOfTFieldLayoutAlgorithm.cs(+4/-1): WASMターゲットでのみVector<T>のフィールドアラインメントを16バイトに上書きするよう変更

パフォーマンスへの影響

影響なし。ABI要件に合わせたレイアウト補正であり、パフォーマンス改善を目的とした変更ではありません。

関連Issue

  • #131328(crossgen2/VM側の先行する補正。参照として言及)

その他

  • 検証はローカルのNativeAOT WASIブリングアップ環境(未マージの他の対応を含む統合ツリー)で実施されています。
    • 修正前は、PreinitializationとReflection_FromUsageの両テストがWasmLowering.IsWasmV128Typeのアラインメントアサーションで失敗しました。
    • 修正後はclr.toolsのビルドが成功し、対象の2プロジェクトのコンパイルとリンクも成功しました。ただしツリー全体では、既存のUnitTestsのロワリングアサーションで失敗が残っており、C数学関数のABI警告も残っています。
    • AttributeTrimmingとDeterminismは、Wasmtime上で再ビルド後に終了コード100を返しました。
  • このブランチはmainからcherry-pickした本コミットのみを含み、単独ではビルドされていません。また、影響を受けるベクターのテストは実行されていません。

#135946 JIT: Don't assert when printing open generic method names in disasm

  • 作成者: @EgorBo
  • 作成日時: 2026年10月16日 13:35:24(UTC)
  • マージ日時: 2026年10月16日 18:21:54(UTC)
  • ラベル: area-CodeGen-coreclr

概要

Checked JITが、オープンジェネリックメソッド(例: ジェネリックメソッド定義の ldtoken)のdisasmコメントを出力する際にassertで失敗する問題の修正です。このメソッドのシグネチャには CORINFO_TYPE_UNDEF 型が含まれるため、assertが発生していました。この問題により、FSharp.Core.dll に対する jit-diff --pmi が失敗していました。

eePrintMethod と eeGetMethodFullName が CORINFO_TYPE_UNDEF を許容し、<UNDEF> として出力するようになりました。

変更内容

  • src/coreclr/jit/eeinterface.cpp (+6/-3)
    • eePrintMethod と eeGetMethodFullName で CORINFO_TYPE_UNDEF を扱えるようにし、<UNDEF> と表示するよう変更

パフォーマンスへの影響

影響なし(JITのdisasm出力用の診断コードの変更であり、生成コードや実行時の性能には関係しません)

関連Issue

なし

その他

  • 対象はChecked JITでのassert回避であり、公開APIや互換性への影響はありません。
  • 主に jit-diff などJIT開発・解析ツールの動作を改善する変更です。

#135934 Validate ZstandardStream constructor arguments and prevent ArrayPool buffer leak on failure

概要

ZstandardStream のコンストラクタにおける引数検証の不備と、失敗時に ArrayPool から借りた内部バッファが返却されない(リークする)問題を修正するPRです。

  • ZstandardCompressionOptions に null を渡した場合に ArgumentNullException を送出するようにしました。
  • 不正な CompressionLevel 列挙値は、バッファを借りる前に ArgumentOutOfRangeException を送出するようにしました。
  • ネイティブのエンコーダー/デコーダーのコンテキスト確保・設定が失敗した場合に、内部バッファ(_buffer)を破棄するようにしました。

変更内容

  • ZstandardStream.Compress.cs
    • ZstandardStream(Stream, ZstandardCompressionOptions, bool) で Init 呼び出し前に ArgumentNullException.ThrowIfNull(compressionOptions) を追加し、XMLドキュメントを更新しました。
    • ZstandardStream(Stream, CompressionLevel, bool) で Init の前に quality を解決するよう変更しました。これにより、不正な CompressionLevel の場合は内部の64KBバッファをレンタルする前に ArgumentOutOfRangeException が送出されます。
    • Init 後のエンコーダー確保処理を try-catch で囲み、例外時に _buffer を破棄するようにしました。
  • ZstandardStream.Decompress.cs
    • Init 後のデコーダー確保処理を try-catch で囲み、例外時に _buffer を破棄するようにしました。
  • ZstandardStream.cs
    • 上記の変更に伴う共通部分の修正を行いました。
  • CompressionStreamUnitTests.Zstandard.cs
    • null の圧縮オプションと、範囲外の圧縮レベルを検証するユニットテストを追加しました。

パフォーマンスへの影響

影響なし。ArrayPool バッファのリークを防ぐ修正であり、失敗時にバッファが適切に返却される点が改善されます。ベンチマーク結果の記載はありません。

関連Issue

#135933(Fixes)

その他

なし


#135931 [manual] Merge release/8.0-staging into release/8.0 to unblock MSRC internal-to-public builds

概要

release/8.0-staging を release/8.0 にマージし、MSRC の internal-to-public ビルドが失敗している問題を解消するための手動マージ PR です。現在の release/8.0 に対する internal-to-public マージでは、複数の Windows ビルドレッグで同じ警告(エラー扱い)が発生して失敗しています。

  • 原因: System.Net.Quic が依存する Microsoft.Native.Quic.MsQuic.Schannel (>= 2.5.11-ci.159417053) が見つからず、NU1603(Warning As Error)となる
  • 2.5.11-ci.159417053 は MSRC の調整済みサービシング作業で内部的に使われるプライベート MsQuic パッケージであり、パブリックビルドでは意図的に利用できない
  • 対応する公開サービシングパッケージ 2.5.12 が利用可能になったため、#135883 で release/8.0-staging を同バージョンに更新済み。本 PR はその変更を release/8.0 に反映する

変更内容

  • eng/Versions.props: MsQuic パッケージのバージョン指定を更新(+1/-1)

パフォーマンスへの影響

影響なし

関連Issue

なし(関連 PR: #135883)

その他

  • 作成者の記載によると、System.Net.Quic を対象にしたローカルでの restore は NU1603 なしで成功している
  • この変更が release/8.0 に入り、internal-to-public マージが更新されれば、パブリック CI で依存関係を通常どおり restore できる見込み

#135924 ilverify: report boxing of byref-like types

概要

ILVerify が byref-like 型(ref struct)の boxing を検出できていなかった問題(#132954)を修正する PR です。ref struct の boxing は検証エラーとなり、ランタイムが許容する box シーケンスのみ例外として扱われます。また ref struct の配列作成も検証エラーとなります。

変更内容

  • src/coreclr/tools/ILVerification/ILImporter.StackValue.cs(+1/-3): 共有の検証チェックを拡張し、型メタデータを通じて byref-like 型を認識するように変更。
  • src/coreclr/tools/ILVerification.Tests/ILTests/ValueTypeTests.il(+55/-0): boxing が拒否されるシーケンスおよび ref struct の配列作成に対する回帰テストを追加。

影響範囲は ILVerify(コンパイラ/検証ツール側)の内部検証ロジックで、公開 API の変更は提供情報からは確認できません。

パフォーマンスへの影響

影響なし(提供情報にパフォーマンスに関する記載はありません)。

関連Issue

#132954

その他

  • 互換性: これまで ILVerify を通過していた ref struct の boxing / 配列作成を含む IL が、今後は検証エラーとして報告されるようになります(ランタイムが許容する box シーケンスを除く)。
  • Copilot のレビュー概要では「承認推奨」とされ、未解決の指摘はないとされています。ただしビルドとテストはレビュー中には実行されていません。

#135917 Add the missing SwitchTests.ilproj to ILVerification.Tests

概要

ILVerification.Tests は ILTests\*.ilproj を使ってILテストケースをアセンブルしますが、ILTests/SwitchTests.il だけ対応する .ilproj が存在せず、10個のswitchテストメソッドがアセンブルも実行もされていませんでした。本PRは欠落していた SwitchTests.ilproj を追加し、これらのテストが実行されるようにします。テスト基盤のみの変更で、ランタイム/ライブラリの実装や公開APIへの影響はありません。

変更内容

  • src/coreclr/tools/ILVerification.Tests/ILTests/SwitchTests.ilproj を新規追加(+9行)
    • ShiftTests.ilproj など、追加オプション不要な他のテストプロジェクトと同一の内容

作成者による検証結果(linux-x64、SDK 11.0.100-rc.1.26420.103、main 1d7bc42efc3 ベース):

状態 結果(成功/全体)
main 未変更 484/484
本変更適用後 494/494
本変更 + Switch.Int32Value_Valid のswitch値を ldnull に一時変更 493/494(Switch.Int32Value が StackUnexpected で失敗)
本変更 + Switch.IntoTryMiddle の期待値を BranchOutOfTry に一時変更 493/494(実際のエラーは BranchIntoTry)
  • 新たに含まれた10ケースはすべて成功
  • 下2行は新規ケースが実行され失敗もしうることを示すための一時的な編集で、本PRには含まれません

パフォーマンスへの影響

影響なし

関連Issue

なし

(PR説明内で言及されている過去の変更: dotnet/corert#6307、dotnet/runtimeの #35038)

その他

  • 欠落の経緯は、2018年のdotnet/corert#6307で個別プロジェクトが追加された際に SwitchTests.il が漏れたことで、ILVerifyがこのリポジトリへ移動した後もプロジェクトが存在しなかったとのことです。
  • 作成者によれば、本PRはAI支援(Anthropic Claude、OpenAI Codex)を用いて作成され、投稿前にレビュー済みです。

#135909 Split NativeAOT thread startup by multithreading support

概要

NativeAOTのスレッド起動処理を、マルチスレッドサポートの有無で分割するPRです。CoreCLRのmultithreading/single-threadingのpartialパターンに倣い、マルチスレッドが無効な場合はスレッド生成用ヘルパーとブートストラップのスレッドエントリスロットを除外し、シングルスレッド用のThreadプリミティブを提供します。

変更内容

  • src/coreclr/nativeaot/Bootstrap/main.cpp (+6/-0): マルチスレッド無効時にブートストラップのスレッドエントリスロットを除外するための変更
  • src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csproj (+5/-0): 新しい partial ファイルのビルドへの組み込み
  • Thread.NativeAot.Multithreading.cs (新規, +114): 既存の Thread.NativeAot.cs から切り出したスレッド生成まわりのコード(マルチスレッド有効時用)
  • Thread.NativeAot.SingleThreading.cs (新規, +23): シングルスレッド用の Thread プリミティブの実装
  • Thread.NativeAot.cs (+1/-101): スレッド生成関連のコードを上記ファイルへ移動
  • Thread.NativeAot.Unix.cs / Thread.NativeAot.Windows.cs (各 +2/-0): partial 分割に伴う小規模な調整

パフォーマンスへの影響

影響なし(提供された情報にはパフォーマンスに関する記述やベンチマーク結果はありません)。なお、マルチスレッド無効時にスレッド生成ヘルパー等が除外される構成のため、そのような構成ではコード量が減る可能性がありますが、具体的な数値は提供されていません。

関連Issue

なし

その他

  • 内部実装(NativeAOTのSystem.Private.CoreLibおよびブートストラップ)の再構成であり、公開APIの変更や破壊的変更に関する記載はありません。
  • 作成者による概要のみで、Copilotによる概要はありません。

#135908 Keep hostpolicy context alive for the lifetime of the process after coreclr has been loaded

  • 作成者: @elinor-fung
  • 作成日時: 2026年10月15日 23:59:38(UTC)
  • マージ日時: 2026年10月16日 12:40:56(UTC)
  • ラベル: area-Host

概要

hostpolicy コンテキストの寿命を変更するPRです。ホスト・ランタイム間のコントラクトで提供されるコールバックや値はプロセスの生存期間中ずっと有効であるべきため、CoreCLR のロード後は、hostpolicy コンテキストをプロセス終了まで保持するようになります。CoreCLR のロード前に解放されるコンテキストは、従来どおり削除されます。

変更内容

  • src/native/corehost/hostpolicy/hostpolicy.cpp(+7/-1)
    • CoreCLR ロード後は hostpolicy コンテキストをプロセス終了まで保持するよう変更

パフォーマンスへの影響

影響なし(提供された情報にベンチマーク結果や性能に関する記載はありません)。なお、CoreCLR ロード後はコンテキストがプロセス終了まで解放されなくなります。

関連Issue

dotnet/dotnet の Issue #10115 を修正します(https://github.com/dotnet/dotnet/issues/10115)。

その他

  • 変更対象は公開APIではなく、ネイティブホスト(corehost/hostpolicy)の内部実装です。
  • 互換性や破壊的変更に関する記載は提供情報にはありません。

#135907 [manual] Merge release/9.0-staging into release/9.0 to unblock MSRC internal-to-public builds

概要

release/9.0 への internal-to-public マージが、Windows の複数のビルドレッグで NU1603(警告のエラー扱い)により失敗している問題の解消が目的です。原因は、MSRC の協調サービシング中に内部でのみ使われる非公開の MsQuic パッケージ 2.5.11-ci.159417053 を参照していることで、公開ビルドからは入手できません。release/9.0-staging では対応する公開サービシングパッケージ 2.5.12 が利用可能になっており(#135884)、これを release/9.0 に取り込むためのマージです。作成者によると、System.Net.Quic を対象にした restore はローカルで NU1603 なしに通っています。この変更が release/9.0 に入り、internal-to-public マージが更新されれば、公開 CI で依存関係を通常どおり restore できる見込みです。

変更内容

  • eng/Versions.props: 1行変更(+1/-1)。提供された情報からは、MsQuic パッケージ(Microsoft.Native.Quic.MsQuic.Schannel)のバージョンを 2.5.12 に更新する変更と考えられますが、差分の詳細は提供されていません。

パフォーマンスへの影響

影響なし(提供された情報にパフォーマンスに関する記載はありません)

関連Issue

  • #135884(release/9.0-staging を 2.5.12 に更新する PR。Issue ではなく PR)

その他

  • 公開 API・互換性への影響に関する情報は提供されていません。
  • 手動マージ([manual])の PR で、内容は依存パッケージのバージョン更新に限られます。

#135899 Keep negative cast results in R2R when they can't change across versions

概要

crossgen2 の compareTypesForCast(CorInfoImpl.cs)は、R2R では「後の版で依存アセンブリが更新されるとキャストが成功しうる」ため、MustNot を常に May として JIT に返していました。その結果、box T; isinst X のパターンが定数畳み込みされず、R2R コードの否定的キャストではボックス割り当てとキャストヘルパー呼び出しが残っていました(例: MemoryExtensions.IndexOfAnyInRange<char> で 48 B/呼び出しの割り当て)。

本 PR では、バージョン間で結果が変わりえない場合に限り MustNot を維持します(COM 型等価を使わない型が対象)。判定は CorInfoImpl.ReadyToRun.cs の IsNegativeCastResultVersionResilient に実装されています。

  • 値型ルール: fromType が値型で、toType がインターフェースでも System.Enum でもない場合
  • バージョンバブルルール: toType、fromType の基底型チェーンの全型、および fromType が実装する全インターフェースがバージョンバブル内にある場合(配列、バリアンスを持つジェネリックインターフェース/デリゲート、COM クラスは除外)

変更内容

  • src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs: R2R 用 #if READYTORUN ブロックで、無条件に MustNot→May へ変換していた処理を、新しい判定関数を介する形に変更
  • src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs: IsNegativeCastResultVersionResilient を追加(+38行)
  • src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/CastFolding/CastFolding.cs: キャスト畳み込みを検証する新規テストフィクスチャ(+117行)
  • src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs: CastFoldingRespectsVersionBubble テストを追加(per-assembly ビルドと input-bubble ビルドの2パターンで実行)
  • src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCasesRunner/R2RDriver.cs: Crossgen2Option.InputBubble が渡していた不正なオプション --input-bubble を、正しい --inputbubble に修正

パフォーマンスへの影響

  • 対象は、R2R コードが上位ティアで再コンパイルされない環境(CoreCLR on WebAssembly、iOS、tvOS)や TieredCompilation=false のアプリ。MacCatalyst は未確認。それ以外ではティア再コンパイルで既に畳み込まれるため、効果は起動時・コールドコードに限られる。
  • issue の再現コード CallSame(char): osx-arm64 で 180 B → 20 B、browser-wasm で 415 B → 23 B
  • browser-wasm(R2R composite, Node/V8, 中央値):
    • IndexOfAnyInRange('!', '#') len=16: 89.2 ns → 11.6 ns
    • 同 len=1024: 114.9 ns → 42.7 ns
    • IndexOfAnyInRange/IndexOfAnyExceptInRange(char) の割り当て: 48 B → 0 B
  • その他36ベンチマークの変化比の中央値は 0.998(範囲 0.96–1.13)。
  • SearchValues<string> len=1024 は 91.1 → 103.3 ns と遅く見えるが、ホットメソッドのコードは変更前後でほぼ同一(relocation アドレスのみ差)で、実行順序依存の測定アーティファクトと説明されている(V8 でのマシンコード配置の変化が推定原因)。
  • コードサイズ: 12,409 メソッド中 14 メソッドが縮小(計 −4,927 B)、増加なし(例: DefaultInterpolatedStringHandler.AppendFormatted<bool> 1146 → 429 B)。

関連Issue

#135892(Resolves)。副次的に見つかった where T : struct ジェネリックの char インスタンス化がインライン化されない問題は #135906 で別途対応。

その他

  • 健全性の根拠: 新たなキャスト判定ロジックは追加せず、crossgen2 が既に計算し、ランタイム JIT/NativeAOT が既に畳み込んでいる MustNot の結果が、バージョン間で変わらないと判断できる場合にのみ保持する。
  • 他の JIT 側の compareTypesForCast 利用箇所は、否定結果を畳み込む前に正確なソース型を要求するため安全。
  • 検証: 新規テスト CastFoldingRespectsVersionBubble(バブルルールの4つのガードのいずれを外しても失敗)、R2R テストスイート全体(149 passed、15 skipped)、osx-arm64 の既存ランタイムテスト、CoreLib 再ビルド+TieredCompilation=0 での System.Runtime.Tests/System.Collections.Tests が全て通過。
  • 未検証: x64/arm/wasm でのランタイムテスト、バブルルール付き composite フレームワークでのランタイムテスト、ランタイムテスト全体。

#135883 [release/8.0-staging] Update MsQuic to 2.5.12

概要

release/8.0-staging ブランチで使用する MsQuic を、非公開の 2.5.11-ci.159417053 から公開パッケージの 2.5.12 に更新します。非公開の MSRC 向けパッケージを参照したままだと、公開 CI で restore が NU1603 で失敗してビルドが通らなくなる問題への対応です。マネージドコードの変更はなく、パッチバージョンの依存関係更新(1行)のみです。

変更内容

  • eng/Versions.props: MsQuic のバージョン指定を 2.5.12 に更新(+1/-1)

パフォーマンスへの影響

影響なし

関連Issue

その他

  • 公開 API や互換性(破壊的変更・非推奨化)への影響は、記載された情報からは確認できません。
  • 作成者の記載によるリスクは Low で、System.Net.Quic.csproj の restore が NU1603 なしで 2.5.12 を解決することをローカルで確認済みです。機能テストは CI に委ねるとのことです。
  • パッケージプロジェクトやパッケージのメタデータは変更せず、固定されているネイティブ依存のバージョンのみを更新します。

#135877 Fix missing ILVerify messages for LdftnCtor and TailStackEmpty

概要

ILVerify が LdftnCtor と TailStackEmpty のエラーメッセージを表示できず、エラー名がそのままメッセージとして出力される問題を修正します。

Verifier は IL インポーターが報告するエラーのメッセージを、エラー名をキーに Strings.resx から検索します。エントリが存在しない、または空の場合はエラー名がそのまま使われます。LdftnCtor のエントリは LdftnConstructor という名前だったため一致せず、TailStackEmpty にはエントリ自体がありませんでした。

修正前後の CLI 出力(PR 作成者の報告より):

# 修正前
[IL]: Error [LdftnCtor]: ... LdftnCtor
[IL]: Error [TailStackEmpty]: ... TailStackEmpty

# 修正後
[IL]: Error [LdftnCtor]: ... ldftn/ldvirtftn not allowed on .ctor.
[IL]: Error [TailStackEmpty]: ... Stack not empty after tail call.

変更内容

  • src/coreclr/tools/ILVerification/Strings.resx
    • エントリ名 LdftnConstructor を LdftnCtor にリネーム
    • TailStackEmpty エントリを追加(文言は VerifierError.cs のコメント "Stack not empty after tail call." と同じ)
  • src/coreclr/tools/ILVerification.Tests/VerificationResultTests.cs
    • VerificationResultTests.EveryErrorHasMessage テストを追加。None を除くすべての VerifierError について、Strings.resx に空でないエントリがあることを検証します(文言の内容は検証しません)。

enum メンバーではなく resx のエントリをリネームしているため、公開 VerifierError と、エラー名にマッチする CLI の --ignore-error パターンは変更されません。リポジトリ内に LdftnConstructor を参照する他の箇所はないとのことです。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 作成者によれば、ILVerification.Tests は修正前後で Release/Debug とも通過しています(main は 484/484、本変更では 485/485)。
  • 新規テストは、修正を戻した場合や TailStackEmpty エントリを外した場合に失敗し、不足しているエラー名を列挙することが確認されています。
  • 作成者は、リソース修正に対してこのテストの価値は低いと見なされるなら削除してよいとコメントしています。
  • 本 PR は AI(Anthropic Claude と OpenAI Codex)の支援を受けて作成され、作成者がレビューしたと記載されています。

#135869 Add CompExactlyDependsOn to some methods so that they are compiled on wasm

概要

CompExactlyDependsOn 属性を一部のメソッドに追加し、WebAssembly (wasm) 向けにコンパイルされるようにする変更です。複数の CompExactlyDependsOn が付いたメソッドは、指定された命令セットのうち少なくとも1つがサポートされている場合にのみコンパイルされます(すべてのISAが実行時に決定的にサポート/非サポートであることも前提)。対象メソッドはすでに PackedSimd に依存する他のメソッドの文脈で使われているため、不足していた属性を追加するだけでコンパイルが有効になります。

変更内容

いずれも System.Private.CoreLib 内で、属性の追加のみ(ロジック変更なし)です。

  • Buffers/Text/Base64Url/Base64UrlDecoder.cs: 属性を3行追加
  • SearchValues/Strings/AsciiStringSearchValuesTeddyBucketizedN2.cs: 属性を2行追加
  • SearchValues/Strings/AsciiStringSearchValuesTeddyBucketizedN3.cs: 属性を2行追加
  • SearchValues/Strings/AsciiStringSearchValuesTeddyNonBucketizedN2.cs: 属性を2行追加
  • SearchValues/Strings/AsciiStringSearchValuesTeddyNonBucketizedN3.cs: 属性を2行追加

公開APIの変更はなく、内部実装(ランタイムのコンパイル対象選択)に影響する変更です。破壊的変更や互換性への影響は記載されていません。

パフォーマンスへの影響

wasm 上で対象メソッドがコンパイルされるようになることで、たとえば System.Text.RegularExpressions.Tests.Perf_Regex_Common.ReplaceWords が約100倍高速化されるとのことです(作成者による記載)。

関連Issue

なし

その他

なし


#135865 [QUIC] Disable QUIC test on OSX with mono runtime

  • 作成者: @ManickaP
  • 作成日時: 2026年10月15日 14:16:03(UTC)
  • マージ日時: 2026年10月16日 13:31:24(UTC)
  • ラベル: area-System.Net.Quic

概要

OSX 上の mono runtime(MiniJIT)で発生する QUIC テストのタイムアウト対策として、該当テストを mono 環境で無効化する変更です。mono MiniJIT 専用のプラットフォーム検出が存在しないため、絞り込まず mono 全般でスキップする方針が取られています(絞り込むには yaml から msbuild 経由でテストプロセスへ環境変数を渡す必要があり、過剰と判断されています)。#133373 に関連します。

変更内容

src/libraries/System.Net.Quic/tests/FunctionalTests/ 配下のテストファイルのみの変更で、ランタイムやライブラリ本体、公開 API への影響はありません。

  • MsQuicCipherSuitesPolicyTests.cs (+1/-1)
  • MsQuicRemoteExecutorTests.cs (+1/-1)
  • MsQuicTests.cs (+1/-1)
  • QuicConnectionTests.cs (+1/-1)
  • QuicListenerTests.cs (+1/-1)
  • QuicStreamConnectedStreamConformanceTests.cs (+1/-1)
  • QuicStreamTests.cs (+1/-1)
  • QuicTestBase.cs (+2/-0)

各テストファイルでは1行が差し替えられ、QuicTestBase.cs では2行が追加されています。具体的な差分内容は提供情報に含まれていません。

パフォーマンスへの影響

影響なし(テストコードのみの変更)

関連Issue

#133373

その他

mono 全般でテストを無効化するため、OSX 以外の mono 環境でも対象テストがスキップされる可能性があります。


#135861 [QUIC] Remove timeout

  • 作成者: @ManickaP
  • 作成日時: 2026年10月15日 11:29:14(UTC)
  • マージ日時: 2026年10月16日 08:54:24(UTC)
  • ラベル: area-System.Net.Quic

概要

QUICのテストにおける不安定さの修正です。WaitAsync に設定されていた3秒のタイムアウトが、キャンセル処理が完了する前に切れてしまうことがありました。その場合、クライアントストリームが破棄(graceful close)され、abortではなく例外が発生しない結果になっていました。このタイムアウトを削除しています。

なお、テスト自体は RunClientServer によるタイムアウトを既に持っているため、個別のタイムアウトがなくてもテストのハングは防止されます。

変更内容

  • src/libraries/System.Net.Quic/tests/FunctionalTests/QuicStreamTests.cs: WaitAsync の3秒タイムアウトを削除(+1/-1)

パフォーマンスへの影響

影響なし(テストコードのみの変更)

関連Issue

#135255

その他

  • テストコードのみの変更であり、公開APIやライブラリ本体の実装、互換性への影響はありません。

#135857 Swallow ObjectDisposedException when restoring blocking mode after connect async

  • 作成者: @rzikm
  • 作成日時: 2026年10月15日 10:45:31(UTC)
  • マージ日時: 2026年10月16日 07:26:47(UTC)
  • ラベル: area-System.Net.Sockets

概要

ConnectAsync 完了後にソケットのブロッキングモードを元に戻す処理で、並行して Dispose が呼ばれると、すでに破棄された SafeHandle を使用して ObjectDisposedException が発生しうる問題を修正します。ブロッキングモードの復元はベストエフォートの最適化にすぎないため、並行 Dispose に起因する ObjectDisposedException は握りつぶす(無視する)ようにしています。

変更内容

  • src/libraries/System.Net.Sockets/src/System/Net/Sockets/SafeSocketHandle.Unix.cs(+2/-2)
  • src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncContext.Unix.cs(+9/-2)
    • ブロッキングモード復元処理における ObjectDisposedException の扱いを変更(詳細な差分内容は提供情報に含まれていません)

パフォーマンスへの影響

影響なし

関連Issue

#126183

その他

  • 変更対象は Unix 向け実装(*.Unix.cs)です。
  • 公開 API の変更や互換性への影響に関する記載はありません。

#135851 JIT: Propagate rejectNegativeConst through lcl + cns in monotonicity check

  • 作成者: @EgorBo
  • 作成日時: 2026年10月15日 09:43:26(UTC)
  • マージ日時: 2026年10月16日 14:13:19(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITのレンジチェック最適化における「単調増加(monotonically increasing)判定」のバグ修正です。lcl + lcl の判定では両オペランドの初期値(seed)が非負であること(rejectNegativeConst)を要求しますが、オペランド自体が lcl + cns の場合、再帰呼び出しで rejectNegativeConst = false が渡されていました。その結果、i += k; k = m + 2 のようなパターンで m の負のseed(-4)が許容され、i が単調増加と誤判定されて i < -2 が false に畳み込まれていました。

修正として、lcl + cns のケースでも呼び出し元の rejectNegativeConst をそのまま引き継ぐようにしました。

変更内容

  • src/coreclr/jit/rangecheck.cpp(+3/-3): lcl + cns ケースの再帰呼び出しで rejectNegativeConst を伝播するよう変更
  • src/coreclr/jit/rangecheck.h(+1/-1): ヘルパー関数の宣言にフラグを追加
  • src/tests/JIT/Regression_ro_2/Runtime_134454.cs(+30/-0): 負のseedを持つ回帰テストを追加(期待値は -3)

パフォーマンスへの影響

影響なし。libraries.pmi ではasm diffはありませんでした(作成者の記載)。いくつかのdiffは正確性に関するものとされています。

関連Issue

#134454(本PRで修正)

その他

  • 本件はJITの誤最適化(誤ったコード生成)による正確性の修正です。
  • Copilotのレビュー概要では、最適化を有効にした回帰テストの実行は未検証とされており、修正前に失敗し修正後に成功することを人間のレビューで確認する必要があるとされています。

#135850 JIT: Treat stores to EH-live locals as visible when hoisting

  • 作成者: @EgorBo
  • 作成日時: 2026年10月15日 09:42:50(UTC)
  • マージ日時: 2026年10月16日 23:52:04(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITのループ不変コード移動(hoisting)において、例外ハンドラ内で参照されるローカル変数へのストアが「外部から可視」と扱われていなかったため、後続のthrowしうる式(a / b)がプリヘッダへ誤ってhoistされ、catchハンドラが古い値を観測してしまう問題を修正します。

HoistVisitor はローカルがアドレス公開(address-exposed)されている場合のみストアをグローバルに可視と見なしていたため、state = i + 1 の後も m_canHoistSideEffects が true のままでした。本修正では、ブロックがハンドラへ例外をスローしうる場合に、ハンドラへlive-in/outなローカル、または untracked なローカルへのストアも可視として扱います。

変更内容

  • src/coreclr/jit/optimizer.cpp(+5/-1): ストアの可視性判定を拡張し、ハンドラにlive、または untracked なローカルへのストアも、例外ハンドラへの後続を持つブロックでは可視として扱うようにしました。
  • src/tests/JIT/Regression_ro_2/Runtime_134938.cs(+37/-0): 除算で例外が発生した後、catchハンドラが更新後のローカル値を観測できることを検証する回帰テストを追加しました。

パフォーマンスへの影響

作成者によると、libraries.pmi では asm diff はありません。一部のdiffは作成者がAzure DevOpsのビルド結果として共有していますが、具体的な数値は提供情報に含まれていません。

hoistingがより保守的になるため、該当パターンでは最適化機会が減る可能性があります。ただし、正しさを優先した修正です。

関連Issue

#134938(Fixes)

その他

  • Copilotのレビュー概要では、例外に敏感なJITのコード移動であるため、メンテナによる確認とチェック付きランタイムでの回帰検証が必要とされています(このレビュー内では未実施)。未解決の指摘事項は0件です。

#135798 ILVerify error cleanup

概要

ILVerifyのエラー整理に関するPRです。unaligned. プレフィックスのアライメントオペランドが現状では検証されていなかったため、そのチェックを追加し、回帰テストを加えています。あわせて、既存の検証器が別のエラーコードでカバー済みの旧診断コメントアウト項目を削除しています。Closes #37393。

変更内容

  • src/coreclr/tools/ILVerification/ILImporter.Verify.cs (+1/-0): unaligned. のアライメントオペランドを検証する処理を追加(Copilotの概要によると、有効な値は 1, 2, 4 のみ)。
  • src/coreclr/tools/ILVerification/VerifierError.cs (+1/-68): 旧診断のコメントアウト項目を削除し、新しいエラーコード UnalignedAlignment を追加。既存コードの番号振り直しは行わない。
  • src/coreclr/tools/ILVerification/Strings.resx (+3/-0): 診断メッセージ用のリソースを追加。
  • src/coreclr/tools/ILVerification.Tests/ILTests/PrefixTests.il (+18/-0): 有効なアライメント値のテストと、不正値(3)を拒否する回帰テストを追加。

パフォーマンスへの影響

影響なし

関連Issue

#37393(Closes)

その他

  • 互換性: ILVerifyの検証ツール側の変更であり、ランタイムの実行時挙動や公開APIへの影響は記載されていません。
  • Copilotレビューでは「承認推奨」とされていますが、不正なアライメント値に対する診断メッセージのリソース文言に関する指摘が1件(重要度Low、ブロッキングではない)残っています。
  • ビルドとテストは実行されていないと記載されています。

#135789 Wait for the OOB byte in IOControl_SIOCATMARK_Unix_Success

概要

IOControl_SIOCATMARK_Unix_Success テストの不安定さ(flaky)を修正するテスト専用の変更です。Unix では SIOCATMARK はデータ到着前から 0 であるため、既存のスピン待機が即座に終了してしまいます。その状態でクライアントが帯域内(in-band)バイトを先に読むと、帯域外(OOB)バイトがまだ届いておらずマークが存在しません。結果として SIOCATMARK == 1 を期待するアサートが 0 で失敗していました(OSSupport.cs:151)。

修正として、2 回の送信の後に Socket.Select(クライアントを error リストに指定、タイムアウト 10 秒)で OOB バイトの到着を待機し、クライアントがリストに残っていることをアサートします。既存のアサートはすべて維持されています。

変更内容

  • src/libraries/System.Net.Sockets/tests/FunctionalTests/OSSupport.cs(+7/-0)
    • 送信後、Socket.Select で OOB データの到着を待機するコードを追加
    • 既存のスピン待機は OOB 到着後に実行されるため、「OOB データ受信済み、読み取りポインタはマーク位置にない」という確認が意図どおりの状態に対して機能する

設計上の判断:

  • client.Poll(..., SelectMode.SelectError) は不採用です。macOS の poll は OOB データを POLLPRI として報告せず、macOS CI の 2 構成(OSX.15.Amd64.Open、OSX.26.Arm64.Open)でタイムアウトしました。
  • Linux では Socket.Select は POLLPRI をポーリングし、Apple プラットフォームでは select を使用して、macOS では例外セットが保留中の OOB データを報告します。
  • 「帯域内読み取り後に SIOCATMARK が 1 になるまでスピンする」案も検討されましたが、「マーク位置にある」アサートが待機に変わり、「マーク位置にない」チェックが OOB 到着前に実行され得るため不採用です。
  • Windows 版のテストは変更なしです(データ送信前から SIOCATMARK が 1 であるため、既存のスピンが OOB 到着を待つ)。

パフォーマンスへの影響

影響なし(テストコードのみの変更)。

関連Issue

#135787(Resolves)

その他

  • 検証(Linux): ループバックの TCP セグメントのうち URG フラグ付きのものだけを 20/100/300 ms 遅延させた環境(NFQUEUE ヘルパーと iptables ルール使用)で、変更前のテストは毎回 OSSupport.cs:151 で Expected: 1 / Actual: 0 により失敗し、変更後のテストは毎回成功しました。遅延なしでは両方成功します。System.Net.Sockets の機能テスト(outer-loop 除く)は変更の有無にかかわらず Linux で成功し、テストプロジェクトは net11.0-windows でもビルドできます。
  • 未検証: Socket.Select 版は macOS およびその他の非 Linux Unix では実行されていません。Windows の .NET テストも実行されていません。
  • 作成者の注記によると、本 PR の説明は AI により生成され、作成者のレビューを経ています。

#135724 JIT: Keep volatile loads when folding full-range relational comparisons

  • 作成者: @EgorBo
  • 作成日時: 2026年10月13日 20:48:01(UTC)
  • マージ日時: 2026年10月16日 23:53:23(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITのfgOptimizeRelationalComparisonWithFullRangeConstが、volatileByte >= 0のようなフルレンジ比較を定数に置き換える際、副作用チェックにGTF_SIDE_EFFECTのみを使っていたため、非フォールトのvolatileロード(GTF_ORDER_SIDEEFFのみ保持)が捨てられ、acquireセマンティクスが失われる問題を修正します。その結果、後続のロードがスピンループの外へホイストされる可能性がありました。判定をGTF_OBS_EFFECTに変更することで、volatileロードが保持されるようになります。

変更内容

  • src/coreclr/jit/morph.cpp: 定数畳み込みの副作用チェックをGTF_OBS_EFFECTベースに変更(+1/-1)
  • src/tests/JIT/Regression_ro_2/Runtime_134477.cs: volatileロードのacquireセマンティクスを検証するスレッドを用いた回帰テストを追加(+33)

パフォーマンスへの影響

影響なし(記載された情報の範囲では、パフォーマンスに関する言及はありません)。ただし、volatileロードが畳み込みで除去されなくなるため、該当パターンでは本来必要なロードが保持されます。

関連Issue

#134477

その他

  • Copilotのレビューでは、回帰テストがマルチスレッドを使用するため、シングルスレッド構成(例:マルチスレッド非対応の環境)ではテストをゲートする必要があるとの指摘(Medium)が1件オープンになっています。
  • レビュー結果は「Changes recommended」です。

#135650 Fix concurrent CCW vtable and IID publication

  • 作成者: @Copilot
  • 作成日時: 2026年10月12日 23:07:59(UTC)
  • マージ日時: 2026年10月16日 22:35:54(UTC)
  • ラベル: area-Interop-coreclr

概要

CCW(COM Callable Wrapper)の vtable とディスクリプタの初期化・公開が並行クエリ間で競合し、準備完了フラグが初期化完了前に観測される問題を修正するPRです。また、レイアウトフラグや遅延IIDフラグの競合更新でビットが失われ、使用中の vtable が再構築されうる問題も修正します。

変更内容

  • src/coreclr/vm/comcallablewrapper.cpp(+33/-52)
    • 共有フラグを acquire 読み取りし、既存ビットを保持するポインタ幅の CAS で更新するようにしました。
    • クラスの準備完了の公開を、ディスクリプタの割り当てとアロケーション所有権のコミット後に行うようにしました。
    • 遅延IIDは、既存の Crst の外でプライベートに生成し、ロック下で再確認したうえで不変のIIDを1つだけコミットします。成功した読み取り側はロックフリーのままです。
  • src/coreclr/vm/comcallablewrapper.h(+22/-38)
    • フラグオフセットのアライメントをコンパイル時に強制するようにしました。
    • CMT の表現とコントラクト上で参照されるビットは変更していません。
  • カバレッジとして、新規型に対する並行クラスレイアウト/IID検索と、明示的インターフェースのレイアウトのストレスケースを追加し、その後にネイティブ呼び出しを行うとされています。ただし、提示された変更ファイルにはテストファイルは含まれていません。

パフォーマンスへの影響

ベンチマーク結果の記載はありません。IIDの読み取りパスはロックフリーのまま維持され、IID生成はロックの外で行われるため、ロック保持範囲が縮小します。

関連Issue

#134232

その他

なし


#135519 cDAC: skip empty assembly-list slots in Loader_1.GetModuleHandles

概要

cDAC の Loader_1.GetModuleHandles が、collectible アセンブリのアンロード後に AppDomain のアセンブリリスト内に残る空スロット(NULL)を読み込んで例外を投げる問題を修正します(Fixes #135518)。AppDomain::RemoveAssembly はアンロード時にスロットを NULL にしますが、ネイティブの AppDomain::AssemblyIterator::Next_Unlocked はこれをスキップします。Loader_1 も同様に null エントリをスキップするようにし、残りのモジュールを返せるようにしました。

変更内容

  • Loader_1.cs: GetModuleHandles で null のアセンブリポインターをスキップする処理を追加 (+4)
  • docs/design/datacontracts/Loader.md: 疑似コードに同じ null チェックを追加。また、Tenured 判定の条件の反転を修正(疑似コードでは module が Tenured の collectible アセンブリをスキップしていましたが、ネイティブおよび Loader_1 では Tenured でない場合にスキップします)
  • LoaderTests.cs: GetModuleHandles_SkipsEmptySlots を追加。mock AppDomain のリスト [empty, A, empty, B, empty] を列挙し、[A, B] が返ることを検証します
  • MockDescriptors.Loader.cs: AddAppDomain が空スロットとして null を受け取れるようにし、3つの AppDomain データ型の登録を共通ヘルパーに集約

パフォーマンスへの影響

影響なし

関連Issue

#135518(本PRで修正)。#135516 がマージ済みで、そこで追加された mock AppDomain をテストが利用しています。

その他

  • 修正前は、新規テストが mock の全4アーキテクチャで VirtualReadException: Failed to read pointer at 0x10(32bit では 0x8)により失敗します。これはアドレス 0 にある Assembly の Assembly.Error のオフセットです。
  • 修正後は、リベース済みコミットで linux-x64、osx-arm64、windows-x64 の Microsoft.Diagnostics.DataContractReader.Tests(3361 テスト)が成功したと報告されています。テスト変更のみを適用した場合は、各環境でこの4ケースのみが失敗します。
  • 作成者によると、本変更は AI(Anthropic Claude、OpenAI Codex によるチェック)の支援で作成され、作成者がレビューと計測を行っています。

#135471 [cDAC] Handle GettingReJITParameters state

概要

ReJIT のパラメータ設定中に IL コードバージョンが取る状態 RejitFlags::kStateGettingReJITParameters (1)(例: プロファイラの GetReJITParameters コールバック実行中)を、cDAC の ReJIT コントラクトが扱えず InvalidOperationException を投げていた問題を修正します。ダンプ取得やライブアタッチがこの状態のメソッドを捕捉すると、SOS/DBI のクエリが失敗していました。

修正後は、Requested/Active 以外の未知の状態値(状態 1 を含む)を新設の RejitState.Unknown にマップし、例外を投げずにレガシー DAC と同様の挙動にします。

変更内容

  • IReJIT.cs: RejitState.Unknown を追加
  • ReJIT_1.cs: 認識できない状態値を例外ではなく Unknown にマップ
  • SOSDacImpl.cs:
    • GetReJITInformation と GetMethodDescData 経由の CopyNativeCodeVersionToReJitData で、Unknown を kUnknown として報告
    • GetReJITInformation の未処理状態パスの Debug.Assert(true, ...)(実質 no-op)を Debug.Fail に変更
    • 既存の Requested/Active 比較を使う呼び出し元は、Unknown に対してレガシー DAC と同じ挙動に
      • GetPendingReJITID は S_FALSE を返す
      • GetRejitIds は該当バージョンをスキップ
      • GetProfilerModifiedILInformation / GetMethodsWithProfilerModifiedIL は ReJIT で変更されたバージョンとして扱う
      • GetActiveRejitILCodeVersionNode はアクティブなノードなしと報告
  • ReJIT.md: 仕様を更新し、「認識できない値は Unknown」というルールを明記
  • テスト:
    • ReJITTests.cs / MockDescriptors.ReJIT.cs: 状態 1 と未定義値 3 で GetRejitState が例外なく Unknown を返すことを検証
    • SOSDacInterface7ReJITTests.cs: 状態 1 のバージョンで GetReJITInformation が成功し kUnknown を報告することを検証

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 作成者によるテスト結果: linux-x64 で UnitTests 3300/3300 が成功。GetRejitState の Unknown 分岐を元の throw に戻すと、追加した 2 テストの全 12 行のみが失敗することを確認済み。CdacUsageGraph docs --check と Usage.Tests も成功。
  • 作成者の補足: レガシー GetPendingReJITID は S_FALSE 時に *pRejitId を -1 に設定しますが、cDAC は値を変更しません(本 PR では未対応)。
  • 本 PR は AI(Anthropic Claude、OpenAI Codex によるレビュー)の支援で作成されたと記載されています。

#135413 [browser][wasi] Allow uncontended synchronous waits and un-gate Roslyn workspace tests

概要

マルチスレッド非対応ランタイム(Browser/WASI)で、#123329 により一律に PlatformNotSupportedException(PNSE)になっていた同期待機を見直し、「待機が即座に完了できる場合」は正常に完了させるようにする変更です(#135335 の3コミットを Pavel 氏の authorship のまま含み、さらに Roslyn ワークスペース系テストのゲートを解除)。実際にブロックする場合のみ PNSE を投げるため、#123329 のイベントループのデッドロック防止は維持されます。代表的な影響先は Workspace.SetCurrentSolution 内の競合のない SemaphoreSlim.Wait です。

  • セマフォのカウント/タスク完了/イベントのセット状態がすでに利用可能な場合は待機が成功する
  • タイムアウト0の待機で条件未成立の場合は、PNSE ではなく通常の結果(false など)を返す
  • SemaphoreSlim、ManualResetEventSlim、Task、Monitor に一貫して適用
  • Thread.Sleep と WaitHandle の挙動は変更なし
  • マルチスレッド対象では、元の Task 待機のセットアップと継続パスを維持
  • API は Browser 向けの unsupported 注釈を維持(ブロックするかどうかは実行時状態に依存するため)

変更内容

  • ランタイム/CoreLib
    • System.Private.CoreLib の Condition.cs、ManualResetEventSlim.cs、Monitor.cs、SemaphoreSlim.cs、Task.cs(+44/-29 と最大の変更)を修正し、実際にブロックする経路でのみ PNSE を投げるよう変更
    • Mono 側 Monitor.Mono.cs も修正
    • src/mono/wasm/threads.md にドキュメントを追記
  • テストの追加
    • SemaphoreSlimTests、ManualResetEventSlimTests、MonitorTests、TaskRtTests_Core に Wait_SingleThreaded 系のテストを追加
  • テストのゲート解除
    • ConfigBindingGenTestDriver.cs、GeneratorTests.Incremental.cs(Configuration.Binder)、Options の SourceGeneration.Unit.Tests/Main.cs と EmitterTests.cs から IsMultithreadingSupported 条件を削除
  • WASI で引き続きスキップ
    • UpgradeToGeneratedRegexAnalyzerTests は WASI でスキップ継続。理由は、Roslyn の ReferenceAssemblies.ResolveAsync が nuget.org への外向き通信を必要とし、WASI テストサンドボックスでは利用できないため

パフォーマンスへの影響

影響なし(ベンチマーク結果の記載なし)。ブロックを伴わない同期待機を許可する動作変更が中心で、イベントループのデッドロック保護は維持されます。

関連Issue

  • #134972(Resolves)
  • 関連: #123329、#135335、#135778、#135887、#135888、#135889

その他

  • 互換性(単一スレッド Browser): #123329 で PNSE になっていた「利用可能な SemaphoreSlim」「セット済み ManualResetEventSlim」「ゼロタイムアウト待機」は、.NET 10 の #123329 以前と同様に成功/通常結果を返すようになります。条件未成立で正のタイムアウトまたは無限待機は引き続き PNSE です。
  • テスト結果
    • Browser: System.Threading.Tests は 640 実行、552 成功、88 スキップ、0 失敗
    • WASI CoreCLR(Release, interpreter): Roslyn 系3プロジェクトのベースライン201件の失敗(SemaphoreSlim.Wait 由来の PNSE)が本変更で全て成功
    • 成功から失敗に変わったテストはなし
  • MutexTests.NameOptionsApiCompatibilityTest の3件の失敗は本変更の有無に関わらず発生(#135778 起因、#135887 で追跡)
  • Mono の WASI 実行は未検証

#135311 Managed ilasm: honour explicit local slots, scope local names lexically, and emit LocalScope/LocalVariable rows

概要

マネージド版ilasm(src/tools/ilasm)をネイティブilasmの代替とするための一環として、ローカル変数の扱いにある3つの欠陥を修正するPRです。これにより、PortablePdbテスト(src/tests/ilasm/PortablePdb)のTestPortablePdbLocalScope4ケースが通るようになります(修正前は10ケース中6ケースのみ成功、修正後は全ケース成功)。

  1. LocalScope/LocalVariableの行が未出力だった問題: PDB要求時、名前付きローカルを宣言する字句スコープごとに、{から}のオフセット範囲でLocalScope行を出力し、各名前付きローカルにLocalVariable行(Index=スロット、属性0)を出力します。メソッド本体全体、.try/catch/filter/finally/faultの各本体もスコープとして扱われます。行は開始オフセット順、同一開始なら長い範囲が先にソートされます。
  2. 明示スロットが無視されていた問題: .locals init ([3] int32 x)の[n]がスロットnとして扱われ(テーブルはパディング)、[n]なしのローカルは最大スロットの次を使用します。スコープを閉じて解放されたスロットは同じ型で再宣言可能です。ネイティブ同様の診断("Local var slot n is in use"警告、"type conflict"/"Undefined type of local var slot"エラー)を出力します。.locals内の...センチネルはスロットを消費しなくなりました。
  3. ネストしたブロックで名前がスコープされない問題: ブロックごとに名前スコープを持ち、最内側から検索します。同スコープ内では最初の宣言が優先され、名前は大文字小文字を区別します。

変更内容

  • GrammarActions.MethodBodies.Locals.cs(新規、+362): ローカルのスロット割り当て・スコープ管理ロジック
  • GrammarActions.BuildImage.cs: LocalScope/LocalVariable行の出力処理
  • GrammarActions.MethodBodies.Directives.cs / .ExceptionHandling.cs: ブロック(.try/catch等)のスコープ開始・終了への対応
  • GrammarActions.Conversions.cs / .Instructions.cs / .Signatures.Actions.cs、CILParser.SemanticValues.Signatures.cs: スロット指定・名前解決に伴う変更
  • Diagnostic.cs、EntityRegistry.cs: 新規診断およびローカル管理に関する追加
  • MANAGED-ILASM-FIXES.md: ネイティブとの意図的な差異を追記
  • テスト追加: LocalTests(33件)、LocalScopeTests(38件)、LocalScopeCaseGenerator/LocalScopeGeneratedCaseTests(シード付き200プログラム生成、5 theory・1,000行)

互換性への影響: 項目2・3により、スロットが飛び飛び・再利用されている、名前がシャドーイング/スコープ外で使われている、.localsにセンチネルがある入力では、出力ILが変わります。ブロック内で宣言した名前をブロック外で使うとエラーになります(ネイティブと同様)。

ネイティブとの意図的な差異:

  • 命令を持たないスコープにはLocalScope行を出力しない(ネイティブは長さ0で出力するが、仕様は正の長さを要求)
  • 同一スコープ内で名前が重複する場合、最初の宣言のスロットに対する行のみ出力(仕様が禁じる重複した名前/インデックスを避けるため)
  • スロット範囲は0〜65535。範囲外の明示スロット([-1]を除く)は報告され、次のスロットが使われる

パフォーマンスへの影響

影響なし(PDB専用のアロケーション制御があるが、出力は変わらない)。

関連Issue

  • #135212(マネージドilasmをネイティブilasmの代替にする議論)
  • #135297(PDBドキュメント、マージ済み)、#135289(別ファイル.pdb、マージ済み)
  • #135314(ネイティブとの未対応の差異の追跡)

その他

  • 作者からの質問: 仕様ではメソッドの最初のスコープは本体全体に及ぶとされているが、ネイティブ同様、メソッドレベルの.localsが名前を持たない場合は全体スコープを出力していない(TestLocalScopes3がその挙動を期待)。常にルートスコープを出力すべきか。
  • TestLocalScopes4.ilはネイティブ同様に"in use"警告を出すようになるが、CLIの診断表示が位置情報としてソース全文を出力する問題は別途修正が必要。
  • ネイティブilasmとの比較では、ツリー外で実行した14件のIlasmPortablePdbTesterケースが両ilasmとも全て成功。
  • 本変更はAI支援(Anthropic Claude、OpenAI Codex)により作成され、作者がレビュー済み。

#135276 Fix suspend of CLR initialization thread when started from dispatch queue on apple

  • 作成者: @BrzVlad
  • 作成日時: 2026年10月06日 14:36:13(UTC)
  • マージ日時: 2026年10月16日 05:29:28(UTC)
  • ラベル: area-VM-coreclr

概要

Apple プラットフォームで、dispatch_async 経由で起動されたスレッド上から CoreCLR を初期化した場合、GC サスペンドに使うシグナル(INJECT_ACTIVATION_SIGNAL)がマスクされたままになり、そのスレッドが GC で停止せずアプリがハングし得る問題を修正します。

従来、外部スレッドをランタイムにアタッチする AllocatePalThread 経路ではシグナルのマスク解除が行われていましたが、CoreCLR 初期化スレッド自体には行われていませんでした。本 PR でこの初期スレッドにも同様のマスク解除を行います。作成者によれば、macios は CoreCLR をこのようなワーカースレッドから初期化しないため、モバイルのテストランナーなど主にテスト用途向けの修正です。

変更内容

  • src/coreclr/pal/inc/pal.h: +6 行(PAL 側の公開宣言/定義の追加)
  • src/coreclr/pal/src/exception/signal.cpp: +4/-4(シグナル関連処理の変更)
  • src/coreclr/pal/src/include/pal/signal.hpp: -10 行(内部宣言の削除)
  • src/coreclr/pal/src/init/sxs.cpp: -4 行
  • src/coreclr/pal/src/arch/wasm/stubs.cpp: +2/-1(wasm 向けスタブの調整)
  • src/coreclr/vm/threads.cpp: +4 行(初期化スレッドに対する処理の追加)
  • src/tests/JIT/Regression/CLR-x86-JIT/V2.0-Beta2/b425314/b425314.cs、b426654/b426654.il: 各 -1 / -5 行(テストファイルの変更)

内部実装(PAL / VM)の修正であり、公開 API の変更や互換性への影響は提供情報からは読み取れません。

パフォーマンスへの影響

影響なし

関連Issue

#134770

その他

  • 対象は Apple プラットフォーム上で dispatch_async により起動されたスレッドから CoreCLR を初期化するケースです。
  • テストファイルの変更内容の詳細は提供情報からは不明です。

#134978 [wasi] Enable EventPipe (FEATURE_PERFTRACING) for CoreCLR WASI

概要

CoreCLR の WASI ビルドで EventPipe(FEATURE_PERFTRACING)を有効化する PR です。従来は無効だったため、EventPipe 経由の機能が動作せず、特に EventSource.CurrentThreadActivityId が常に Guid.Empty を返していました。browser CoreCLR と同様に、スレッドレス EventPipe(FEATURE_PERFTRACING_DISABLE_THREADS)を使って有効化します。

変更内容

  • 機能の有効化: src/coreclr/CMakeLists.txt の WASI 向けオーバーライドと、clr.featuredefines.props の FeaturePerfTracing=false を削除し、ネイティブランタイムと CoreLib の設定を一致させました。
  • WASI 用コールヘルパーの再生成 (src/coreclr/vm/wasm/wasi/): 旧テーブルには [UnmanagedCallersOnly] EventPipeEventProvider.Callback のリバース thunk や、EventPipe / NativeRuntimeEventSource の QCall 用 interp-to-native thunk がなく、EventSource 使用時に unknown thunk でクラッシュしていました。generate-coreclr-helpers で再生成しています(今後のずれを防ぐ CI チェックは #135156 で追加)。
  • 診断サーバー PAL: WASI には AF_UNIX がないため、TCP 版(FEATURE_PERFTRACING_PAL_TCP)をビルドして debug-pal にリンクしました(#130383 で追跡されていたリンク無効化を解除)。ただしリッスン/接続ポートはすべて無効(Mono WASI と同じ設定)のため、EventPipe はプロセス内でのみ動作し、外部ツールからのアタッチはできません。
  • WASI イベントループからの EventPipe ジョブ実行: WASI にはホストのイベントループがないため、ep_rt_queue_job がネイティブのリストにジョブを積みます(eventpipeinternal.cpp)。ThreadPoolWorkQueue.Dispatch() の前に WasiEventLoop が EventPipeInternal_WasiHasPendingJobs で保留ジョブを確認し、あればマネージドのポンプ(WasiEventPipeJobs.cs)を起動します。ポンプは EventPipeInternal_WasiRunJobs を呼び、Task.Delay で 100ms ごとに再ポーリングし、ジョブがなくなると停止します。
  • シャットダウン時のトレース完結: ep_rt_shutdown で WASI のみキュー済みジョブを一度実行し、ストリーミングセッションの参照を解放して、end-of-stream タグの書き込みとファイルクローズを行います。
  • 共有コード ep-session.c の修正: ep_rt_queue_job 失敗時はジョブ用に取得した参照を解放し、書き込み失敗後は streaming_loop_tick がジョブを保持して次の tick でセッション参照を解放します(リーク防止。browser のこの経路の挙動も変わります)。
  • テスト: ActivityTracking から #134963 の [ActiveIssue] 4 件を削除しました。Mono WASI は System.Diagnostics.Tracing.Tests を実行しないため影響はありません。また EventPipeListener ハーネスは DiagnosticsClient IPC が必要なため、browser と同様に WASI では除外しています。
  • ビルド関連: eng/native.wasm.targets、qcallentrypoints.cpp、eventpipeadapter.h、System.Private.CoreLib.Shared.projitems、EventPipeEventDispatcher.Wasm.cs なども変更されています。

パフォーマンスへの影響

ベンチマーク結果は示されていません。メモリについては、セッションのバッファマネージャーが上限までオンデマンドで確保します。上限は起動時ファイルセッションで DOTNET_EventPipeCircularMB(既定 1024 MB)、プロセス内 EventListener セッションで 10 MB です。既定の Drop モードでは上限超過分のイベントは破棄されます(バッファ済みデータは上書きされません)。Block モードはドレインスレッドが必要なため、シングルスレッドビルドでは拒否されます。Main が同期の場合はポンプが動かず、イベントは上限までバッファされ、シャットダウン時にセッション無効化とともに書き出されます。

関連Issue

  • #134963(Resolves)
  • #130383(診断サーバーのリンク無効化の追跡)
  • #135156(コールヘルパーのずれを防ぐ CI チェック)
  • #134813([ActiveIssue] 隔離を追加した PR)

その他

  • 検証(macOS arm64、Debug ランタイム、Release ライブラリ、WASI SDK 34、wasmtime 49.0.1):
    • System.Diagnostics.Tracing.Tests は 39 件実行、37 件成功、0 件失敗、2 件スキップでした。隔離を外した ActivityTracking の 4 テストも成功しています。
    • チェックイン済みのコールヘルパーで構築した corerun でも同じ結果です(再生成前は unknown thunk for unmanaged callers only method でクラッシュしていました)。
    • ドレイン確認(マージ前、wasmtime 45

#134082 Handle parameterized ILTrim interop types

概要

ILTrimにおいて、PInvokeメソッドのシグネチャに含まれるパラメータ化された型(配列・ポインター・byref など)を再帰的に要素型へ正規化してから、フィールドおよびアロケーションの保持処理を適用するようにする変更です。これにより、パラメータ化型を経由して渡されるinterop型のフィールドが正しく保持されることを狙っています。

変更内容

  • src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/MethodDefinitionNode.cs: PInvokeメソッドのシグネチャ中の型を要素型まで再帰的に正規化する処理を追加(+7/-3)。
  • src/tools/illink/test/Mono.Linker.Tests.Cases/Interop/PInvoke/UnusedFieldsOfTypesAreNotRemoved.cs: パラメータ化型を含むinterop型のテストケースを追加(+87/-1)。作成者によると、構造体は既定で Sequential のため常にフィールドが保持され、既存の「interop型のフィールドを保持する」テストでは今回の変更対象コードを検証できません。そのため追加テストでは構造体に Auto を指定しています。これは現実的なシナリオではないものの、正しさの検証には有効とのことです。

検証結果(作成者による記載):

  • Release ILTrim: 合計928件、成功424件、スキップ504件、失敗0件、エラー0件
  • ./build.sh tools+tools.ilasm+tools.illinktests+tools.cdactests -test は警告0・エラー0で成功
  • ILCompiler.Compiler の Release ビルドは警告0・エラー0で成功

パフォーマンスへの影響

影響なし(パフォーマンスに関する記載はありません)。

関連Issue

なし

その他

  • 本PRはGitHub Stacks CLIで作成されたスタックの一部です。
  • 変更はILTrim(トリミングツール)の内部実装とテストに限られ、公開APIの変更や互換性への影響に関する記載はありません。

目次