Pull Request on 2026年10月01日

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

注意点

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


目次

  1. #135027 [wasm][R2R] Re-enable b51875 and b77707 after #134979
  2. #135026 JIT: remove unused helpers
  3. #135020 Document synchronization for mirrored Crossgen tasks
  4. #135018 [browser][CoreCLR] Enable non-AOT WBT relinking and rebuild coverage
  5. #135016 [wasi] Don't copy runtime pack link inputs to app build and publish output
  6. #134996 Drain finalizers periodically in bestfit-finalize when multithreading is unsupported
  7. #134993 Remove a couple of static constructors/static readonly fields in corelib
  8. #134992 [wasi] Bump WASI SDK to 34.0 and wasmtime to 49.0.1
  9. #134991 Use safe scalar code for UTF-8 Equals(OrdinalIgnoreCase)
  10. #134984 [wasm][JIT] Use TYP_SIMD16 register type for 16-byte struct layouts on Wasm
  11. #134981 [wasm][R2R] Fix null ReturnTypeDesc dereference in SpillStructCallResult
  12. #134979 JIT: make Wasm frames that call a finally unwindable
  13. #134974 JIT: fix profile update when folding a switch with shared case targets
  14. #134973 JIT: mark GC safe point after stelem.ref call transformation
  15. #134971 JIT: Preserve finalizable allocations during hoisting
  16. #134967 Fix build error with latest MSVC
  17. #134962 JIT - Fix 'OperIs...' assert during forward substitution
  18. #134960 [wasm][CoreCLR] Add browser_wasm R2R_CG2 leg to runtime-coreclr outerloop
  19. #134959 [wasi] Make File.Copy metadata copy best effort
  20. #134956 Replace unsafe code with safe APIs in CoreLib and libraries
  21. #134940 JIT: don't skip covariant store check for shared sealed element types
  22. #134933 [Mono][AMD64] Fix code generation for oversized add immediates.
  23. #134927 JIT: Use a visitor for local occurrences through LocalsTreeList
  24. #134920 Move full browser WASM R2R library tests to libraries outerloop
  25. #134898 Fix Enum.Equals folding for shared-generic nested enums
  26. #134881 Fix negative tmp-buffer size in vxsort align_vectorized
  27. #134880 JIT fix for m_regAlloc->isRegCandidate assert under optrepeat
  28. #134875 Use internal metadata interfaces in CoreCLR
  29. #134874 [wasi] Use the <entry>.r2r.wasm composite owner name on WASI
  30. #134873 Decouple createdump from the DAC PAL
  31. #134872 [release/11.0] Fix NativeAOT nullable isinst branch elimination
  32. #134871 Fix DateTime.ToUniversalTime for invalid local times in the DST gap
  33. #134851 Fix segment GC total memory accounting
  34. #134845 Align TAR extraction destination handling with ZIP
  35. #134838 Fix NativeAOT EventPipe use-after-free by waiting for active writers
  36. #134816 [release/11.0] Mark ILVerify and ILVerification as shipping
  37. #134809 [release/11.0] Disable HPKE ECDH NIST curves on Android
  38. #134808 Add configurable Wasm debug information output
  39. #134728 Fix generic struct field marshalling
  40. #134702 [release/11.0] Support private scalar-only imports on iOS
  41. #134685 [release/11.0] Fix TypeLoadException in .NET 11 Preview 7 with DotNext threading
  42. #134668 Extend extend tail dup to get more ccmp
  43. #134665 [release/11.0] Fix null vnStore dereference in optAssertionProp_HWIntrinsic
  44. #134641 Fix PHA-not-offered check in NegotiateClientCertificateAsync on OpenSSL 1.1
  45. #134618 [wasm][coreclr] Enable composite ReadyToRun publishing
  46. #134611 [wasm] Use GetDelegateCtor for CoreCLR R2R delegate construction
  47. #134607 [release/11.0] X25519: Handle zero peer keys on downlevel Windows platforms
  48. #134058 [libs] Include pthread.h where pthread_once is used
  49. #133174 Skip peer certificate revalidation on resumed TLS sessions by default

#135027 [wasm][R2R] Re-enable b51875 and b77707 after #134979

概要

WebAssembly ReadyToRun環境でのJIT回帰テスト3件の隔離を解除するPRです。これらのテストは例外処理(finallyブロック内の例外がハンドルされない問題)のため隔離されていましたが、#134979で修正された後の復元となります。

変更内容

3つのJIT回帰テストファイルからActiveIssue属性を削除:

  • JIT/Regression/CLR-x86-JIT/V1-M12-Beta2/b51875/b51875.cs(Regression_8ランナー)
  • JIT/Regression/CLR-x86-JIT/V1-M12-Beta2/b51875/Desktop/b51875.cs(Regression_PdbOnly_r_2ランナー)
  • JIT/Regression/CLR-x86-JIT/V1-M12-Beta2/b77707/b77707.cs(Regression_PdbOnly_r_2ランナー)

パフォーマンスへの影響

影響なし(テストの再有効化のため、パフォーマンス変化は対象外)

関連Issue

#134975、#134979、#134960

その他

  • macOS arm64での検証完了:R2Rモードおよびインタープリタモードの両方で全テストがパスを確認
  • WebAssemblyプラットフォーム上で、finallyブロック内の例外が正しく呼び出し元のcatchに到達するようになった点が修正の核心

#135026 JIT: remove unused helpers

  • 作成者: @EgorBo
  • 作成日時: 2026年10月01日 15:02:05(UTC)
  • マージ日時: 2026年10月01日 18:19:42(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITコンパイラ内で参照されていない未使用のヘルパー関数やコードを削除するクリーンアップPRです。浮動小数点演算、レイアウト、ビットベクトル、スコープ、コード生成関連の未使用ヘルパーと、無効化されたEH正規化コードを削除します。アクティブな動作には影響を与えません。

変更内容

  • utils.h/utils.cpp: 未使用の浮動小数点ヘルパー関数の削除(271行削除)
  • layout.cpp: 未使用の数値レイアウト識別子の削除(105行削除)
  • jiteh.cpp: 無効化されたEH正規化ケース3の削除(531行削除)
  • hashbv.h/hashbv.cpp: 未使用のビットベクトルAPI、フリーリスト状態の削除(合計397行削除)
  • fgprofilesynthesis.h/fgprofilesynthesis.cpp: 未使用の合成オプション・尤度変換の削除(合計91行削除)
  • compiler.h/compiler.cpp: 未使用のスコープ処理ヘルパー・廃止宣言の削除(合計104行削除)
  • codegenlinear.cpp/codegencommon.cpp/codegen.h: 未使用ブロック操作・レジスタプッシュ/ポップヘルパーの削除(合計281行削除)

全体: 約1,400行のコード削除(JIT内部実装のみ)

パフォーマンスへの影響

影響なし。削除されるコードは全て未使用のため、コンパイル時間・メモリ使用量・ランタイム動作に変化なし。

関連Issue

なし

その他

  • 全ての削除対象はJITコンパイラの内部実装に限定されており、公開APIには影響なし
  • Copilotの自動レビューにより「削除対象は参照されておらず、内部スコープで一貫している」と確認済み
  • 破壊的変更なし

#135020 Document synchronization for mirrored Crossgen tasks

概要

Crossgen2タスクのドキュメント化。SDK内に複製されているタスクについて、半同期状態を保つ必要があることを明確にするためのコメント追加。

変更内容

  • PrepareForReadyToRunCompilation.cs: コメント追加(+3行)
  • ResolveReadyToRunCompilers.cs: コメント追加(+3行)
  • RunReadyToRunCompiler.cs: コメント追加(+3行)

3つのCrossgen2Tasksファイルに対し、SDKで複製されているため半同期状態を保つ必要があることを示すコメントが追加されました。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

なし


#135018 [browser][CoreCLR] Enable non-AOT WBT relinking and rebuild coverage

概要

CoreCLR browser-wasm向けのネイティブリリンク機能を検証するため、Wasm.Build.Tests内の23メソッドでMono専用カテゴリを縮小し、ランタイム対応のテストデータを有効化しました。既存のMonoテスト入力は保持し、プロダクトコードは変更しません。有効化されたカバレッジには、P/Invoke ABI、ネイティブライブラリ名、インバリアント国際化/タイムゾーン、Bug49588リリンク回帰、テンプレートmarshal-IL生成、メイン引数、サテライトリソース、Blazorシナリオ、インクリメンタルネイティブリビルドなどが含まれます。

変更内容

  • テスト範囲の拡大: 23メソッドで84行の新規CoreCLRテストケースを有効化(Monoは102行不変)
  • ランタイム対応テストデータ: Mono/AOT行を削除せず、理論データを使用して実行時向けのテストを追加
  • ネイティブビルド追跡: MonoのP/Invokeテーブル/ドライバオブジェクトの代わりに、CoreCLRのポータブルコールヘルパーソース、オブジェクト、レスポンスファイル、シンボルマップを追跡
  • ランタイム固有の検証: no-op、ソース変更、コンパイラ/リンカフラグ、最適化動作をランタイム特有に検証
  • テンプレート処理の統一: marshal-IL生成でJavaScriptエントリポイントを再利用(JavaScriptエクスポートなしのケース)

パフォーマンスへの影響

影響なし。本変更はテストカバレッジの拡大であり、ネイティブリリンク時の生成ファイル存在チェックを厳格化する点を除き、パフォーマンスに関連する変更はありません。

関連Issue

なし

その他

  • 検証済み環境: macOS/arm64、Chrome 154.0.8037.58、SDK 12.0.100-alpha.1.26471.108
  • テスト結果: CoreCLR 23メソッド84行パス、Mono 12行パス(全て0失敗)。70行でネイティブリンク実行確認、14行は意図的にno-relink検証
  • 既知制限: ReferenceNewAssemblyRebuildTest.ReferenceNewAssemblyはMonoのみ。CoreCLRではSystem.Text.RegularExpressions.dllがWebCIL/公開資産から漏落するインクリメンタルトリミング公開バグを露出(別途修正が必要)
  • 除外ケースの保持: NativeRelinkFailsWithInvariant、BuildWithUndefinedNativeSymbol、AOT/ジェネレータ/プロファイラケース、auto-layoutダイアグノスティック、Windowsテンポラリパステスト、メモリテストはMonoのみで保持

#135016 [wasi] Don't copy runtime pack link inputs to app build and publish output

概要

WASI ランタイムパックのネイティブリンク入力(.a ファイル、.wit ファイル、corerun など)が、アプリの bin と publish 出力ディレクトリに不要にコピーされていた問題を修正します。これらのファイルはリンク時に $(MicrosoftNetCoreAppRuntimePackRidNativeDir) から読み込まれるため、出力ディレクトリのコピーは使用されていません。新しい _WasiRemoveRuntimePackLinkInputs ターゲットが ResolveRuntimePackAssets 後に実行され、不要なネイティブアセットを RuntimePackAsset と ReferenceCopyLocalPaths から削除します。

変更内容

  • src/mono/wasi/build/WasiApp.targets: _WasiRemoveRuntimePackLinkInputs ターゲットを追加(30行追加)
    • AfterTargets="ResolveRuntimePackAssets" で実行
    • .a、.o、.c、.h、.rsp、.props、.wit、wasm-props.json の拡張子を持つファイルと、CoreCLR の corerun を削除
    • 削除は RuntimePackAsset アイテムのみを対象とし、アプリが提供する NativeFileReference には影響なし
    • WasmNestedPublishApp による早期の ResolveRuntimePackAssets 呼び出しに対応するため、アイテム条件 '@(RuntimePackAsset)' != '' で保護

パフォーマンスへの影響

顕著な削減効果が確認されました(macOS arm64、wasi-sdk 33 での測定):

  • CoreCLR(インタプリタ、アンダイム): bin と publish で約 100 MB 削減(bin: 127.2 MB → 27.2 MB)
  • CoreCLR(R2R + 積極的トリミング): bin と publish で約 115 MB 削減(bin: 127.6 MB → 27.6 MB、publish: 112.2 MB → 12.2 MB)
  • Mono(インタプリタ): bin と publish で約 53 MB 削減(bin: 66.8 MB → 40.0 MB)
  • 削除されるのは .a ファイル(CoreCLR: 18個の 66.5 MB、Mono: 23個の 26.8 MB)と corerun / .wit のみ

アプリバンドルのファイル一覧とサイズは変更なし。AppBundle の managed/corerun は引き続きアプリごとの再リンク版または R2R コンポーズ版が使用されます。テスト実行結果(3 シナリオとも 541 テスト中 538 合格、0 失敗)で動作は検証済み。

関連Issue

#134813(このPR作成のトリガーとなった関連変更)

その他

  • Browser(WebAssembly)では既に ComputeWasmBuildAssets/ComputeWasmPublishAssets パイプラインで同様のフィルタリングが実装されており、本変更で WASI の扱いが Browser と一致します
  • .o、.c、.h などのファイルは現在、どちらの WASI パックの RuntimeList.xml にもリスト化されていませんが、

#134996 Drain finalizers periodically in bestfit-finalize when multithreading is unsupported

  • 作成者: @lewing
  • 作成日時: 2026年10月01日 01:00:19(UTC)
  • マージ日時: 2026年10月01日 11:17:39(UTC)
  • ラベル: area-GC-coreclr

概要

マルチスレッド非対応のブラウザ/WASI環境において、bestfit-finalizeテストがファイナライザー枯渇によるOOMを発生させる問題に対する回避策です。ホストイベントループで実行されるファイナライザーが、同期的なメモリ割り当てループによってスターベーション状態に陥るため、テスト内で定期的にGC.WaitForPendingFinalizers()を呼び出してファイナライザーをドレインします。

変更内容

  • src/tests/GC/Features/HeapExpansion/bestfit-finalize.cs: RuntimeFeature.IsMultithreadingSupportedがfalseの場合、NumRequestsイテレーションごとにGC.WaitForPendingFinalizers()を呼び出すロジックを追加(+9行)
    • マルチスレッド対応プラットフォームには影響なし
    • ランダム割り当てシーケンス、テストロジック、合格/不合格条件は変更されず

パフォーマンスへの影響

マルチスレッド対応プラットフォーム(Desktop等): 影響なし

マルチスレッド非対応プラットフォーム(Browser/WASI): GC.WaitForPendingFinalizers()呼び出しによるオーバーヘッド有り(ただし必須)

関連Issue

#132107

その他

  • これはテストレベルの回避策であり、ランタイムの根本的な修正ではありません
  • マルチスレッド環境を持たないプラットフォームで、ファイナライザースレッドが存在しない場合、同期的なメモリ割り当てループはファイナライザーをスターベーションさせる汎用的な問題です
  • 検証:Desktop環境での単体実行テスト(args: 1 200 10000)成功。Browser/WASI環境ではCI実行で再現確認済み

#134993 Remove a couple of static constructors/static readonly fields in corelib

  • 作成者: @EgorBo
  • 作成日時: 2026年09月30日 23:49:23(UTC)
  • マージ日時: 2026年10月01日 17:14:10(UTC)
  • ラベル: area-Meta

概要

CoreLibの複数の静的コンストラクタと静的読み取り専用フィールドを削除し、RVAバッキングされたReadOnlySpan<T>プロパティ、定数、またはJITで折り畳み可能なプロパティに変換することで、スタートアップ時の割り当てと初期化オーバーヘッドを削減するもの。

変更内容

  • RuntimeType.cs (CoreCLR/Libraries/Mono): 静的フィールド初期化の削減により静的コンストラクタの削除
  • Decimal.DecCalc.cs: 定数データを含む静的読み取り専用フィールドをRVAバッキングされたプロパティに変換
  • Decimal128.cs: 複数の静的フィールド定義を簡略化(40行削減)
  • DelegateHelpers.cs (NativeAOT): 静的コンストラクタ全体を削除(20行削減)
  • XplatEventLogger.cs: TraceLogging関連の静的フィールドをRVAバッキングプロパティに変換
  • Statics.cs: TraceLogging静的フィールドの最適化
  • TimeZoneInfo.AdjustmentRule.cs: 静的フィールド初期化の最適化
  • ComVariant.cs、StandardOleMarshalObject.Windows.cs: 相互運用関連の静的フィールド最適化

パフォーマンスへの影響

  • スタートアップ時間の短縮: 複数の静的コンストラクタ削除により、ランタイム初期化時のオーバーヘッド削減
  • メモリ効率向上: RVAバッキングされたReadOnlySpan<T>は、ヒープ割り当てを避け、メタデータセクションから直接データを参照
  • JIT最適化向上: 定数折り畳み可能なプロパティはコンパイル時に値に置き換え可能

関連Issue

#134993

その他

  • この変更は内部実装(CoreLib内の非公開フィールド)のみを対象としており、公開APIへの影響なし
  • NativeAOT、CoreCLR、Monoランタイムすべてに対応した変更
  • RVAバッキングはマネージドコード内で読み取り専用データを効率的に扱うための標準的な最適化パターン

#134992 [wasi] Bump WASI SDK to 34.0 and wasmtime to 49.0.1

概要

WASI SDK 34.0 とwasmtime 49.0.1 への更新。主な目的は、WebAssembly/wasi-libc#861 で報告されたpread関数の未初期化メモリアクセスバグを修正すること。また、WASI 0.2.12 で導入されたwasi:cli/exit exit-with-codeを活用して、プロセス終了時に実際の終了コードを直接返すように改善。

変更内容

  • WASI SDK/wasmtime バージョン更新:wasi-sdk 34.0、wasmtime 49.0.1 へ更新
  • System.Native (pal_networking.c):descriptor_table_get_ref → descriptor_table_get に変更。リファレンスカウント対応により、マネージドの TCP/UDP ソケットミラーに refcnt フィールドを追加
  • ホスト終了処理の簡略化:corerun、wasihost、Mono main.c で、"WASM EXIT <n>" というマーカーを廃止し、実際の終了コードを直接 exit() で返すように変更。CLRTest launcher、tests.wasi.targets、WasmAppHost、samples から対応するコードを削除
  • ビルド改善:WASI_SDK_PATH を CoreCLR ネイティブビルドに明示的に渡し、CI 環境で異なるバージョンの SDK が使用されることを防止
  • ターゲット更新:wasm32-wasi から wasm32-wasip2 へのコメント更新(wasi-sdk 34 で wasm32-wasi/wasm32-wasi-threads は削除)

パフォーマンスへの影響

影響なし

関連Issue

#134957

その他

  • wasi-libc の API 変更(descriptor_table_get)に対応するため、マネージドコードとネイティブコード間のインターフェース調整が必要
  • exit-with-code サポートにより、WASI ホスト環境での終了コード伝播が改善

#134991 Use safe scalar code for UTF-8 Equals(OrdinalIgnoreCase)

概要

UTF-8浮動小数点解析のOrdinal.EqualsIgnoreCaseUtf8実装を、ベクトル化されたUnsafeコードから安全なスパンベースコードに置き換えました。ASCII高速パスは8バイト単位での比較を行い、非ASCII文字についてはRuneループでフォールバックします。これにより、特にNaN/Infinity記号のマッチング処理で大幅なパフォーマンス向上が実現されました。

変更内容

  • Ordinal.Utf8.cs: EqualsIgnoreCaseUtf8の実装を簡潔化。ASCII高速パスでBinaryPrimitives.ReadUInt64LittleEndianとUInt64OrdinalIgnoreCaseAscii SWAR ヘルパーを使用して8バイト単位比較、その後バイト単位で比較。非ASCII場合は既存のRuneループにフォールバック。
  • Utf8Utility.cs: 未使用のUInt32OrdinalIgnoreCaseAsciiとVector128OrdinalIgnoreCaseAsciiを削除。
  • MemoryExtensions.Globalization.Utf8.cs: 関連する実装を調整。
  • DoubleTests.cs: テストケースを追加。

パフォーマンスへの影響

大幅な改善(特にマルチバイト文字を含むNaN記号):

  • Ru_NaN: 168.56ns → 42.84ns(0.25倍、約75%削減)、Linux x64では212.84ns → 44.43ns(0.21倍)
  • Ru_NaN_Upper: 170.80ns → 53.91ns(0.32倍)
  • Ru_NegInfinity: 39.66ns → 26.30ns(0.66倍)
  • Ru_Infinity: 23.50ns → 21.30ns(0.91倍)

一般的なASCIIケースでも安定した改善:

  • Inv_Infinity: 約1-2%削減
  • Inv_PlusInfinity: 約7-9%削減
  • Long_NaN: 約4-5%削減

Windows x64で一部ケース(Inv_Invalid, Inv_nan)で軽微な低下が見られますが、全体的には明らかな改善傾向。

関連Issue

#134857(前提となるPR)

その他

  • 変更はUTF-8浮動小数点解析の内部実装(内部API)であり、公開APIへの影響なし。
  • インライン化によりTryMatchSpecialValueSymbolで実装が直接展開され、関数呼び出しオーバーヘッドが削減。
  • ASCII vs. 非ASCIIバイト比較はインライン時に拒否され、不要な処理分岐を削減。

#134984 [wasm][JIT] Use TYP_SIMD16 register type for 16-byte struct layouts on Wasm

概要

WebAssembly上で16バイト構造体がTYP_SIMD16レジスタ型として扱われるよう改善するもの。従来はWasm向けにこの最適化が除外されていたため、Vector128<T>をラップする構造体が戻り値として返される際に不要な一時変数経由でのスピルが発生していました。本変更により、Wasm上でも他のSIMD対応ターゲットと同じく16バイト構造体レイアウトでTYP_SIMD16が使用されるようになります。

変更内容

  • src/coreclr/jit/layout.h: ClassLayout::GetRegisterType()の条件式を#if defined(FEATURE_SIMD) && !defined(TARGET_WASM)から#ifdef FEATURE_SIMDに変更。これにより、Wasm上で16バイト構造体レイアウトに対してTYP_SIMD16レジスタ型が割り当てられるようになります。

パフォーマンスへの影響

  • R2R(ReadyToRun)イメージサイズの削減:
    • Vector128_1_r.wasm: 4,957,655 → 4,951,047 バイト(-6.6 KB)
    • Vector128_1_ro.wasm: 4,926,510 → 4,919,838 バイト(-6.7 KB)
  • JIT生成コードの最適化:v128呼び出し結果が直接格納され、不要なReturn value tempスピル処理が削除

関連Issue

#134976、#134981

その他

  • 本変更は#134981の修正と組み合わせて検証されています
  • HardwareIntrinsics_General テストスイートでの検証結果:2584/2584、2551/2551パス
  • 16バイト構造体ローカル変数全般に影響するため、より広範なWasm R2Rカバレッジ(outerloop R2R_CG2 browser-wasm lane等)とWasm JIT所有者の承認が必要とされています

#134981 [wasm][R2R] Fix null ReturnTypeDesc dereference in SpillStructCallResult

概要

WebAssembly環境で構造体の戻り値をスピル処理する際、GetReturnTypeDesc()がnullptrを返すことによるnull参照逆参照のバグを修正しました。WebAssemblyはFEATURE_MULTIREG_RETを0で定義しており、マルチレジスタ戻り値が非サポートのため、オフセット0を使用する処理に修正しています。

変更内容

src/coreclr/jit/lower.cpp

  • Lowering::SpillStructCallResult内で、GetReturnTypeDesc()がnullptrを返した場合の処理を追加
  • WebAssembly上で構造体呼び出し結果(例:Vector128<byte>を含むTestStructがv128/simd16で戻されプリミティブにリタイプできないローカル)をスピルする際、マルチレジスタ戻り値がサポートされていない場合のオフセット値として0を使用するよう修正

パフォーマンスへの影響

影響なし

関連Issue

#134976

その他

  • 本修正により、WebAssembly環境でのcrossgen2クラッシュ(Linux Helixではabort exit 134、macOSではPAL fault dispatchでのハング)を解決
  • 検証済み:HardwareIntrinsics_General_r(2584/2584パス)、HardwareIntrinsics_General_ro(2551/2551パス)
  • RISC-VおよびLoongArchを除く全ターゲットでGetSingleReturnFieldOffset()は同じ値を返すため、他のターゲットへの影響は回避

#134979 JIT: make Wasm frames that call a finally unwindable

概要

WebAssembly JITでfinallyブロックを呼び出す際に、呼び出し元の関数がアンワインド可能(unwindable)フレームとしてマークされていなかった問題を修正しました。genCallFinallyがensureCurrentFuncIsUnwindable()を呼び出すようにすることで、finallyからの例外スロー時に正しくスタックアンワインドできるようにします。

修正前は、finallyが唯一の呼び出しであった場合にプロローグでR2R関数テーブルインデックスが格納されず、finallyが例外をスロー時にスタックウォーク時に古い値を読み込んでいました。その結果、例外が呼び出し元のcatchブロックに到達せず、ハンドルされない例外として報告されていました。

変更内容

  • src/coreclr/jit/codegenwasm.cpp: genCallFinally内でensureCurrentFuncIsUnwindable()呼び出しを追加(+2行)
    • genCallInstructionとgenEmitHelperCallに既に存在する同じ処理をfinallyの呼び出しにも適用
    • プロローグ生成後に処理されるため、フラグが正しく反映される

パフォーマンスへの影響

影響なし(レジスタ保存などの最小限のオーバーヘッドのみで、正確な例外処理が可能に)

関連Issue

#134975

その他

  • テスト検証(browser-wasm R2R環境):
    • JIT/Regression --runner-filter=Regression_8(#b51875): 未修正時はUnhandled exceptionでランナーが中止 → 修正後は13/13 パス
    • JIT/Methodical(6ランナー): 未修正時は最初の4テスト以内でクラッシュ → 修正後は1968中1924パス、22失敗、22スキップ
  • この修正はWebAssemblyプラットフォーム上のfinallyブロック呼び出しのコード生成にのみ影響

#134974 JIT: fix profile update when folding a switch with shared case targets

  • 作成者: @EgorBo
  • 作成日時: 2026年09月30日 18:29:53(UTC)
  • マージ日時: 2026年10月01日 10:33:47(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITコンパイラのスイッチ文の折り畳み処理においてプロファイル更新時の重み計算にバグが存在していました。複数のケースターゲットが同じFlowEdgeを共有する場合、各ジャンプテーブルスロット毎に対象重みを減少させると、同じエッジ重みが複数回減算されていました。本修正では、ユニークな後続エッジ毎に重みを1回のみ減少させることで問題を解決します。

変更内容

  • src/coreclr/jit/morph.cpp: ジャンプテーブルエントリの重み計算ロジックを修正。重複するエントリが同じFlowEdgeを参照する場合、エッジ毎に重みを1回のみ減算するように変更(+14/-5行)
  • src/tests/JIT/Regression_ro_2/Runtime_134896.cs: リグレッション対応のテストケースを追加(+28行)

パフォーマンスへの影響

影響なし(バグ修正のため、不正確なプロファイル情報に基づいた最適化を回避し、正確なプロファイル誘導最適化を実現)

関連Issue

#134896

その他

  • この変更はJITランタイムの内部実装に対するもので、公開APIへの影響なし
  • スイッチ文の最適化時のプロファイル計算の正確性向上

#134973 JIT: mark GC safe point after stelem.ref call transformation

  • 作成者: @EgorBo
  • 作成日時: 2026年09月30日 18:27:06(UTC)
  • マージ日時: 2026年10月01日 14:49:23(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JIT コンパイラの fgMorphCall で、stelem.ref 呼び出しの変換後に GC safe point マークを設定するタイミングを修正しました。従来は user call の段階でマークされていたため、プレーンストアまたはヘルパー呼び出しに変換された後も stale フラグが残り、GC ポーリングのない呼び出し不在ループが生じていました。

変更内容

  • src/coreclr/jit/morph.cpp: GC safe point マークの設定タイミングを、stelem.ref 呼び出しが最終的な形に変換された後に移動(7行追加、10行削除)
  • src/tests/JIT/Regression_ro_2/Runtime_134894.cs: リグレッションテスト追加(50行)

パフォーマンスへの影響

GC ポーリング機構が正常に機能することで、長時間実行ループにおける GC latency の改善が期待されます。

関連Issue

#134894

その他

なし


#134971 JIT: Preserve finalizable allocations during hoisting

  • 作成者: @EgorBo
  • 作成日時: 2026年09月30日 18:22:40(UTC)
  • マージ日時: 2026年10月01日 18:21:18(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JIT最適化において、ファイナライザーを持つオブジェクトの割り当てを含む処理が不適切にホイストされることを防ぐ変更です。割り当て呼び出しの観測可能な副作用を、後続のスロー式に対する順序バリアとして扱うことで、メモリ安全性を確保します。

変更内容

  • src/coreclr/jit/optimizer.cpp: JITオプティマイザーに4行追加し、ファイナライザー割り当てを順序バリアとして認識するロジックを実装
  • src/tests/JIT/Regression_ro_2/Runtime_134936.cs: 回帰テスト(49行)を追加し、ファイナライザー割り当てがホイストされないことを検証

パフォーマンスへの影響

影響なし (順序バリアの追加により、特定のホイスト最適化が制限される可能性がありますが、メモリ安全性を維持するためのトレードオフです)

関連Issue

#134936

その他

なし


#134967 Fix build error with latest MSVC

  • 作成者: @jkotas
  • 作成日時: 2026年09月30日 17:52:57(UTC)
  • マージ日時: 2026年10月01日 01:33:02(UTC)
  • ラベル: area-Infrastructure

概要

最新のMSVCプレビュー版がポインタからboolへの暗黙的な型変換について警告を出すため、ビルドエラーを修正するPRです。

変更内容

  • src/native/containers/dn-umap.c: ポインタからboolへの暗黙的な型変換を修正(2行追加、2行削除)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

最新のMSVCプレビュー版のコンパイラ警告に対応するための修正です。ネイティブC実装の互換性改善です。


#134962 JIT - Fix 'OperIs...' assert during forward substitution

概要

32ビットターゲットでのフォワード置換時のJITアサーション失敗を修正しました。32ビットではint32がアドレス型と正規化型の両方として機能するため、アドレス式を期待するコードにキャスト・ノードが渡される可能性がありました。

変更内容

  • src/coreclr/jit/forwardsub.cpp: フォワード置換ロジックにおいて、アドレス式の検証を強化。キャスト・ノードがアドレス型として渡されるケースに対応する処理を追加(+11行)
  • src/tests/JIT/Regression_ro_2/Runtime_134818.cs: 回帰テスト追加。32ビット環境でのアサーション失敗を再現・検証するテストケース(+28行)

パフォーマンスへの影響

影響なし

関連Issue

#134818 #134829(重複Issue、同様に修正) #133703(このバグを導入した変更)

その他

  • JITコンパイラの内部実装(forwardsub.cpp)への修正であり、公開APIへの影響なし
  • 32ビット環境固有の問題であり、64ビット環境では影響なし

#134960 [wasm][CoreCLR] Add browser_wasm R2R_CG2 leg to runtime-coreclr outerloop

概要

browser_wasm プラットフォームの ReadyToRun (R2R) コンパイルされたコードに対する priority-1 テストを実行するため、runtime-coreclr outerloop パイプラインに新しい R2R_CG2 ビルド レグを追加します。これにより、browser での完全な R2R 実行時のテスト カバレッジが向上し、R2R 固有の問題の検出が可能になります。

変更内容

  • CI パイプライン構成 (eng/pipelines/coreclr/ci.yml): checked browser_wasm R2R_CG2 outerloop レグを追加。既存の browser インタープリタ レグと同じ extraBuildArgs (-os browser -p:HostConfiguration=Release) を使用し、既に生成されている browser ビルド成果物を再利用
  • テスト修正: R2R 環境で発生する既知の問題に対して、メソッドレベルの ActiveIssue 属性またはスキップ条件を追加
    • finallyブロック例外処理の回帰 (b51875.cs, b77707.cs)
    • ジェネリクス プリスタブ assertion の問題 (self_override5.il)
    • Stack 制限超過による R2R イメージ読み込み失敗 (abovestacklimit.cs)
    • Vector128 ハードウェアの内在関数に関する crossgen2 の abort/hang (HardwareIntrinsics_General_*.csproj)
    • GC 参照追跡の不正確さ (gc.cs, arrres_il_r.ilproj)
    • Assembly.Location が空の R2R イメージでのアセンブリ読み込み失敗 (Runtime_64883.cs, Runtime_66624.cs, test115667.cs, test132982.cs, ResolvedFromDifferentContext.cs)

パフォーマンスへの影響

影響なし。このレグの追加はテスト パイプラインの構成変更であり、ランタイム パフォーマンスに直接的な影響はありません。

関連Issue

  • #134975: finally ブロックの例外処理の回帰
  • #134949: self_override5 の assert 問題
  • #132855: R2R イメージの wasm パラメータ制限超過
  • #134976: Vector128 に関する crossgen2 の abort/hang
  • #134803: GC シナリオに関連する既知問題
  • #134076: Assembly.Location 関連の既知問題
  • #134771: 関連する先行 PR

その他

  • 検証済み: Build 1618757 で 87 個の browser R2R ワークアイテムすべてが合格、新しいコミットが 4 つのテスト失敗に対応
  • マージされた子テストは AnyOS マネージド テスト ビルドでコンパイルされるため、wasm 条件のプロジェクト プロパティは効きません。メソッドレベル属性またはランナー/プロセス分離テストのプロパティ

#134959 [wasi] Make File.Copy metadata copy best effort

概要

WASI環境でFile.CopyとFileInfo.CopyToがファイルデータのコピー後にIOException: Function not implementedをスローする問題を修正します。原因は、WASIのfchmodがスタブ実装(常にENOSYSを返す)であるのに対し、コピー処理がメタデータのコピーに失敗した場合に例外をスローしていたことです。本修正により、WASI上でのメタデータコピーをベストエフォート化し、パーミッションコピーをスキップし、タイムスタンプコピーの失敗を許容するようにしました。

変更内容

  • src/native/libs/System.Native/pal_io.c: SystemNative_CopyFileの実装を修正
    • TARGET_WASI環境ではパーミッションコピー(fchmod呼び出し)をスキップ(WASIはパーミッションビットをサポートしない)
    • WASI環境でのタイムスタンプコピー失敗時にENOSYS/ENOTSUPエラーを許容する防御的チェックを追加
    • その他のプラットフォームでの動作は変更なし

パフォーマンスへの影響

影響なし

関連Issue

#134944

その他

テスト結果(WASI環境、wasmtime上で実施):

  • System.IO.Tests: 修正前は99件の失敗(うち78件はFunction not implemented)→ 修正後は21件の失敗(Function not implementedは0件)。全317件のGB18030 FileTests/FileInfoTests ケースが合格。残り21件の失敗は修正前から発生している無関係な問題(GetTempFileNameの問題、PlatformNotSupportedケース、OOM)。
  • Microsoft.VisualBasic.Core.Tests: 22244件合格、2件失敗。全CopyFile_*/CopyDirectory_*テストが合格。残り2件の失敗は無関係な問題(LastAccessTime不一致、GetTempFileName)。

#134956 Replace unsafe code with safe APIs in CoreLib and libraries

概要

CoreLibおよび各ライブラリのホットパスにおけるunsafeなポインタ操作を、安全なSpan API、インデックスアクセス、SIMD APIに置き換えるリファクタリング。WebSocketのマスキング、バイナリ操作、バッファ検索などの複数の低レイヤーコンポーネントで unsafe コードを削減し、型安全性を向上させます。

変更内容

  • String/Buffer検索: String.Searching.cs、StringSearchValuesHelper.cs、IndexOfAnyAsciiSearcher.cs、BitmapCharSearchValues.cs で Span ベースの安全なAPI に移行
  • エンコーディング: UTF8Encoding.Sealed.cs でスタック割り当てSpan を活用
  • 文字プロパティ: XmlCharType.cs、CharUnicodeInfo.cs でインデックス化された安全なテーブルアクセスに変更
  • バイナリ操作: BinaryPrimitives.ReverseEndianness.cs、BitConverter.cs で Span ベースのベクトル操作を採用
  • ネットワーク処理: ManagedWebSocket.cs のマスキング処理、NetworkStream.cs のバイト操作を安全なスカラー/ベクトルAPIで実装
  • メモリ管理: SharedArrayPool.cs で間接参照ストレージから配列インデックスに移行
  • ストリーム処理: StreamWriter.cs でポインタコピーを Span コピーに置き換え

パフォーマンスへの影響

Copilot レビューより、以下のホットパスで性能検証が必要とされています:

  • StreamWriter.WriteSpan: Span コピー導入前にベンチマーク確認必須
  • SharedArrayPool 戻り値パス: 共変性チェック回避の必要性を指摘

それ以外の変更は一般的に安全な置き換えと考えられます。具体的なベンチマーク数値は提供されていません。

関連Issue

なし

その他

  • 破壊的変更: なし(内部実装の安全性向上)
  • 公開API影響: 主に内部実装(CoreLibおよびネットワークライブラリの非公開メソッド)
  • Copilot レビュー: "Changes recommended" ステータスで、2件の中程度の懸念事項が指摘されています。マージ前にこれらのホットパスのパフォーマンス検証が推奨されます

#134940 JIT: don't skip covariant store check for shared sealed element types

  • 作成者: @Copilot
  • 作成日時: 2026年09月30日 14:16:41(UTC)
  • マージ日時: 2026年10月01日 18:33:46(UTC)
  • ラベル: area-CodeGen-coreclr

概要

R2R/NativeAOT共有ジェネリックコード内で、JITが共変配列ストア検証を誤ってスキップしていた問題を修正。G<object>をG<string>[]に格納できてしまう不正な操作が、正しくArrayTypeMismatchExceptionをスロー するようになります。

public sealed class G<T> { }

static void Test<T, U>(G<T>[] arr, G<U> val)
{
    object[] o = arr;
    o[0] = val; // Test<string, object>: ArrayTypeMismatchExceptionをスロー
}

変更内容

  • gentree.cpp: gtCanSkipCovariantStoreCheckに!eeIsSharedInst(arrayElementHandle)チェックを追加。共有型の場合、ハンドルが等しくても実行時型が異なる可能性があるため、検証をスキップしない判定に変更
  • ネストされた配列: 共有型フラグが配列にも適用されるため、G<__Canon>[][]など複数レベルの配列にも対応
  • 既存の検証パス: object[]型やcompareTypesForCast == Mustパスは既に共有型に対して保守的な動作をしているため変更なし

パフォーマンスへの影響

懸念点: 共有型パラメータでの同一型ストア(例:G<T>[]にG<T>を格納)は、従来のハンドル比較では型パラメータを区別できないため、CORINFO_HELP_ARRADDR_STヘルパー呼び出しが発生するようになりパフォーマンスが低下する可能性があります。
改善点: 非共有密閉型の配列ストア(例:G<int>[])はチェックスキップが維持されるため、一般的なケースへの影響は限定的です。

関連Issue

#134889

その他

  • 破壊的変更:なし(セキュリティ面で正しい動作に修正)
  • 共有ジェネリック型を使用するR2R/NativeAOT環境での配列ストア操作の型安全性向上

#134933 [Mono][AMD64] Fix code generation for oversized add immediates.

概要

Mono AMD64コード生成において、符号付き32ビット即値の範囲を超える定数を含むアドレス加算の処理を修正しました。値型のロード/ストア分解時に大きな配列インデックスでアクセスする場合に発生していた問題を解決します。

修正前は以下の問題が発生していました:

  • AOT コンパイル時のADDエミット時にアサーション失敗
  • JITのピープホール最適化パスでLEA命令に変換される際に変位が切り詰められていた

修正後は、オーバーサイズの定数をOP_I8CONSTで実体化し、ピープホール最適化とレジスタ割り当て前のロアリング段階でレジスタ間のOP_LADDを使用します。即値でエンコード可能な加算は変わりません。

変更内容

  • src/mono/mono/mini/mini-amd64.c: AMD64アーキテクチャ向けのコード生成ロジックを修正。オーバーサイズ即値の処理を改善(+10行)

パフォーマンスへの影響

影響なし。修正は正確性を確保するもので、即値でエンコード可能な加算は従来通りの処理のため、パフォーマンスには実質的な変化はありません。

関連Issue

その他

既存のRuntime_133785テストがこの潜在的な欠陥を露出させていました。本修正によってテストの無効化は不要です。


#134927 JIT: Use a visitor for local occurrences through LocalsTreeList

概要

ローカル変数の出現箇所をスキャンする抽象メカニズムとして、LocalsTreeListのビジター実装を導入するリファクタリングです。将来的にGT_STORE_LCL_VARSが導入される際に、呼び出し元での変更を最小限に抑え、ビジター自体の変更のみで対応できるようにする目的です。

変更内容

  • gentree.h/gentree.cpp: LocalsTreeListの抽象ビジター機構を追加。ローカル変数の出現箇所を処理するための訪問者パターンを実装
  • compiler.hpp: ビジター関連の新規定義を追加(+29行)
  • forwardsub.cpp: Forward substitutionロジックをビジター呼び出しに変更(-40行の削減)
  • lclmorph.cpp: ローカル変数のモルフィングをビジター化(-41行の削減)
  • liveness.cpp: ライブネス解析ロジックをビジター実装に統合(-17行の削減)
  • promotionliveness.cpp: プロモーション関連のライブネス解析をビジター化(-56行の削減)
  • promotion.cpp/promotion.h: プロモーション処理のビジター対応
  • morph.cpp, optimizemaskconversions.cpp: 既存ロジックのビジター適用

パフォーマンスへの影響

影響なし(内部実装の再構成で、ランタイムパフォーマンスは変わらず)

関連Issue

なし

その他

このリファクタリングは将来のNovember型ノード(GT_STORE_LCL_VARS)の導入に向けた準備作業です。複数の最適化パス(forward substitution、liveness analysis、promotion等)が統一的なビジター機構を通じて処理されるようになり、今後の拡張性が向上します。


#134920 Move full browser WASM R2R library tests to libraries outerloop

概要

WebAssembly用の完全なトリミング済みCoreCLR ReadyToRun (R2R)ライブラリテストレーンを、スケジュール済みのruntime-extra-platformsパイプラインからruntime-libraries-coreclr outerloopパイプラインへ移行します。このテストレーンはLinuxで実行され、既存のブラウザWASM解釈器アウターループレーン同様にtestScope: allを使用しながら、トリミングとR2R公開を保持します。

変更内容

  • wasm-coreclr-library-tests.yml: 共有テンプレートにtestScopeパラメータを追加。デフォルトはinnerloop(後方互換性)。ビルドコマンド、パイプラインジョブパラメータ、Helixサブミッションにスコープを伝播。
  • runtime-extra-platforms-wasm.yml: 完全R2Rレーン(16行)を削除。スケジュール済みWASM AOT、WASI AOT、高リソースジョブは保持。
  • outerloop.yml: 新しいR2RアウターループレーンをUmbrellaおよびLinux定義に追加(15行)。testScope: allを指定し、20スイートのグリーディバッチ、7つの遅いスイートをソロバッチ化、270~300分のタイムアウトポリシーを適用。
  • RegexFindOptimizationsTests.cs、tests.proj: マイナー調整(合計18行、2行の変更)。

パフォーマンスへの影響

影響なし。(パイプライン構成変更のため、ランタイムパフォーマンスへの直接的な影響はありません。)

関連Issue

なし

その他

  • 互換性: 破壊的変更なし。既存の共有テンプレート呼び出し元(手動R2Rパイプラインを含む)はinnerloopデフォルトを保持。
  • 検証内容: YAMLファイルは3つ変更され、Ruby YAMLパーサーで解析済み。定義125(outerloop umbrella)と127(outerloop-linux)にLibraryTestsCoreCLR_R2R = 1、定義126(outerloop-windows)と128(outerloop-osx)に0を確認。スケジュール済みパイプラインではR2Rレーン削除を確認。手動runtime-wasm-libtestsパイプラインはtestScope: allで1レーン保持。
  • テスト戦略: testScope: allはOuterLoopテストを含む通常テストと外側ループテストの両方を実行(従来のOuterLoop特性フィルタは適用しない)。R2Rレーンは解釈器レーンと同じ270~300分バッチタイムアウトポリシーを使用。

#134898 Fix Enum.Equals folding for shared-generic nested enums

  • 作成者: @Copilot
  • 作成日時: 2026年09月29日 22:52:43(UTC)
  • マージ日時: 2026年10月01日 18:22:56(UTC)
  • ラベル: area-CodeGen-coreclr

概要

共有ジェネリック型の入れ子Enum(例:C<string>.EとC<object>.E)において、Enum.Equalsが異なるランタイム型にもかかわらず正規ハンドルが一致することで誤った等値判定を行う問題を修正しました。JITがペイロード比較へのfolding前に共有インスタンス型を拒否するガードロジックを追加し、Enum.HasFlagの既存ガードと一貫させています。

変更内容

  • src/coreclr/jit/gentree.cpp: JIT最適化時にEnum.Equalsをfolding前に共有インスタンス型の検査を追加(+3/-1)
  • src/tests/JIT/Intrinsics/EnumIntrinsics.cs: 共有/非共有Enum型での等値・不等値ペイロードの比較をカバーするパラメータ化テストケースを追加(+17)

パフォーマンスへの影響

影響なし。本修正はJIT最適化時の正確性を高めるもので、パフォーマンスの低下・向上は伴いません。

関連Issue

#134890

その他

なし


#134881 Fix negative tmp-buffer size in vxsort align_vectorized

  • 作成者: @janvorli
  • 作成日時: 2026年09月29日 21:10:28(UTC)
  • マージ日時: 2026年10月01日 13:23:42(UTC)
  • ラベル: area-GC-coreclr

概要

vxsort のベクトル化パーティションアルゴリズムにおいて、左側の読み込みポインタ非整列時の一時バッファサイズ計算が負の値になるバグを修正しました。GC背景スレッドがメモリアクセス違反でクラッシュする問題(#86548)の根本原因であり、本修正で解決します。

変更内容

src/coreclr/gc/vxsort/vxsort.h

  • align_vectorized() 関数内で、左右両側の一時バッファオフセット計算を修正
  • 左側:定数 L(不要なjunk要素数)による前提ではなく、実際にpivot以下の側に着地したjunk要素数(popcount)を使用
  • 右側:同様に右側の不要要素に対して、定数 rightAlign ではなく正確なjunk要素カウントを適用
  • 右側の max() による過度な補正を削除

根本原因の詳細:

  • ベクトル非整列読み込み時、事前アライメントで読まれる full vector の低 L lanes はパーティション外の要素(junk)
  • これらすべてが pivot 以下と仮定して tmpStartLeft を定数 L 進めていたが、実際には ltPopCountLeftPart < L の場合がある
  • 結果として tmpLeft - tmpStartLeft が負値になり、unsigned として解釈される際に巨大なサイズになってメモリ違反を引き起こしていた

パフォーマンスへの影響

バグ修正のため、正確な計算に基づく動作となります。パフォーマンスへの明確な改善は記載されていませんが、クラッシュの回避と正確なソート結果が得られるようになります。

関連Issue

#86548

その他

  • Windows Server/Workstation GC の背景スレッド内で発生(mark_phase/plan_phase のGCマークリストソート中)
  • AMD EPYC/Zen4 AVX-512 環境での本番クラッシュダンプから根本原因を特定
  • CoreCLR Debug x64 ビルドで WKS/SVR GC、gcsample、NativeAOT 対応の全テスト実施済み
  • AVX2/AVX-512 および int32/int64 要素型での検証完了

#134880 JIT fix for m_regAlloc->isRegCandidate assert under optrepeat

概要

JIT のコピープロパゲーション最適化において、OptRepeat 時に EH (例外処理) リヴネス情報の再計算後、enregisterable ローカル変数が GT_LCL_FLD で不正に使用される問題を修正。lvDoNotEnregister==false なローカル変数を GT_LCL_FLD へコピープロパゲートすることを禁止することで解決。

変更内容

  • src/coreclr/jit/copyprop.cpp: コピープロパゲーション時に、lvDoNotEnregister==false なローカル変数が GT_LCL_FLD ノードに使用される場合、コピープロパゲートを拒否するチェックロジックを追加
  • テストケース: Runtime_134824 回帰テストを新規追加し、問題のシナリオを再現

パフォーマンスへの影響

影響なし(SPMI (Static Program Metrics Infrastructure) で 0 diffs を確認)

関連Issue

#134824

その他

この修正は JIT コンパイラの内部実装(コピープロパゲーション最適化)の assert エラーを回避するもので、公開 API には影響しない。代替案として修正後にローカル変数に lvDoNotEnregister フラグを設定することも検討されたが、EH リヴネスの再計算前に対応する現在の方法がより enregistering の機会を増やす可能性があるため採用された。


#134875 Use internal metadata interfaces in CoreCLR

  • 作成者: @davidwrighton
  • 作成日時: 2026年09月29日 19:31:28(UTC)
  • マージ日時: 2026年10月01日 18:48:01(UTC)
  • ラベル: area-VM-coreclr

概要

CoreCLRのメタデータAPI実装をレガシーな公開インターフェース(IMetaDataTables、IMetaDataEmitなど)から内部インターフェース(IMDInternalImport、IMDInternalEmit)へ移行する包括的なリファクタリング。プロファイラーが無効な環境(特にWebAssembly)ではメタデータ永続化、検査用インターフェース、未使用のメタデータ操作を削除し、バイナリサイズを大幅削減します。

変更内容

  • メタデータインターフェース移行: Reflection.Emit操作を内部インターフェース(IMDInternalImport/IMDInternalEmit)に統一、動的PEAssemblyインスタンスで直接利用
  • プロファイラー無効時の最適化: RegMetaビルドから公開インターフェース(IMetaDataTables、IMetaDataTables2、IMetaDataInfo)を削除し、プロファイラー/DAC/DBI/ポータブルPDBターゲットのみで保持
  • WebAssembly向け削減: メタデータ永続化、ダイナミックスナップショット、ストリーム処理を削除しつつ、Reflection.Emit機能は保持
  • 未使用APIの整理: MDTOKENMAPを疎な移行マップのみに縮減、ILAsm/ILDasm専用API(CoreCLR版)はE_NOTIMPLを返すように
  • 条件付きコンパイル: シンボルリーダーインポーターはFEATURE_ISYM_READER有効時のみコンパイル

パフォーマンスへの影響

WebAssemblyバイナリサイズ大幅削減(測定:Release build):

  • dotnet.native.wasm: 4,714,654 → 4,612,862 bytes (-101,792 bytes, -2.16%)
  • dotnet.native.wasm (gzip -9): 1,784,275 → 1,749,185 bytes (-35,090 bytes, -1.97%)
  • corerun.wasm: 4,542,104 → 4,440,392 bytes (-101,712 bytes, -2.24%)
  • corerun.wasm (gzip -9): 1,742,265 → 1,706,092 bytes (-36,173 bytes, -2.08%)

メモリフットプリント削減により、特にWebAssembly環境でのロード時間・実行効率が向上します。

関連Issue

なし

その他

  • テスト結果: System.Reflection.Emit.Tests 2,640件全てパス、ビルド警告0件
  • 互換性: 非プロファイラー環境では公開メタデータインターフェースが削除されますが、内部APIで同等機能を提供。内部実装の変更であり公開APIへの直接影響は限定的
  • ツール対応: ILDasm/ILAsm互換のE_NOTIMPLスタブ(9バイト)をシンボルマップに残し、ポータブルPDFツールでは完全実装を保持

#134874 [wasi] Use the <entry>.r2r.wasm composite owner name on WASI

概要

WASIのComposite ReadyToRun(R2R)イメージの所有者名をcomposite-r2r.wasmから<entry>.r2r.wasm(メインアセンブリ名)に統一する変更です。これによってWASIはブラウザComposite実装と同じ命名規約を採用し、SDK移行時の二重管理を回避します。Composite所有者名はクロスジェン2により書き込まれたファイル名が唯一の権威となり、WASIホストはこの名前をバッファに記録して、要求されたCompositeが一致する場合のみ提供します。

変更内容

  • PrepareForReadyToRunCompilation.cs: WASIに対する特別なTargetOS処理を削除。Composite所有者名の決定をクロスジェン2の出力に統一。
  • WasiApp.CoreCLR.targets: Composite パスを@(_ReadyToRunCompileList)の%(OutputR2RImage)から取得。CreateCompositeImage=trueの設定で正確に1つのComposite編集が必須。
  • wasi_r2r_probe.hpp: ホストに256バイトのComposite名バッファ(ゼロ初期化)を予約し、wasi_r2r_composite_name_baseとwasi_r2r_composite_name_capをエクスポート。要求名が記録名と一致し、かつ空でない場合のみCompositeを提供。
  • ComposeWasiReadyToRun.cs: Composer は新しいエクスポートを読み取り、名前が空でない・NULを含まない・バッファに適合することを検証。webcil.memoryをインポートし、Path.GetFileName(CompositePath)をホストバッファに書き込むアクティブデータセグメントを含む。
  • ドキュメント: webcil.mdとwasi-r2r.mdのWASIホスト編集セクションを更新。

パフォーマンスへの影響

影響なし

関連Issue

#134618 #134813 dotnet/sdk#56395(フォローアップ作業)

その他

互換性: 破壊的変更。Composite名がハードコードされていない設計により、既構築ホスト(runtime-test corerunなど)は任意の名前を持つCompositeで構成可能になります。

検証済み:

  • フル構築完了(警告・エラーなし)
  • Wasi.Console.Sample のR2R公開・実行成功(Wasi.Console.Sample.r2r.wasmで確認)
  • Ready to Run初期化成功ログ記録(複数アセンブリ)
  • 名前不一致テスト: 名前をWrong.r2r.wasmに変更した場合、スタートアップがEEStartupでトラップ。静かな誤解釈ではなく明示的に失敗。
  • 非R2R公開: インタプリタで正常実行、R2Rヘッダー未検出ログ。

互換性への懸念点: WASIブランチが削除されたため、TargetOS=wasiの従来コードパスは実行されません。ブラウザR2Rテストは変更なし(ブラウザ命名パス不変)


#134873 Decouple createdump from the DAC PAL

概要

createdumpツールをDACの依存関係から分離し、PALとリモートアンワインド機能を直接Unix createdump実行可能ファイルにリンクするようにリファクタリングしました。これにより、createdumpはlibmscordaccoreを経由せずにPALサービスを直接初期化・終了できるようになり、DAC PAL転送レイヤーと重複するローカルPAL APIは削除されています。

変更内容

  • src/coreclr/debug/createdump/CMakeLists.txt: PALとリモートアンワインド機能への直接リンク追加(+1行)
  • src/coreclr/debug/createdump/createdumppal.cpp: DAC PAL転送レイヤーを削除、PAL直接呼び出しに変更(-104行、大幅簡素化)
  • src/coreclr/debug/createdump/main.cpp: PAL初期化ロジックを削除、終了コード処理の調整(-23行)
  • src/coreclr/pal/src/CMakeLists.txt: リモートアンワインド機能の独立リンク対応(+5行)
  • src/coreclr/pal/src/exception/remote-unwind.cpp: DAC依存の転送レイヤーを削除、クリーンアップ(-99行)

パフォーマンスへの影響

影響なし。本変更は構造的なリファクタリングであり、実行時パフォーマンスへの影響は想定されません。

関連Issue

#132584(ネイティブDACのダンプ列挙役割削除の準備)

その他

本PRは#132584への準備作業です。createdumpがDAC経由ではなくPALを直接所有することで、将来的にDAC PAL機能を削除できるようになります。内部実装の変更であり、公開APIへの影響はありません。


#134872 [release/11.0] Fix NativeAOT nullable isinst branch elimination

概要

NativeAOT コンパイラにおいて、nullable型に対する isinst 命令のブランチ削減処理のバグを修正しました。nullable値型のインスタンスチェックが正しく最適化されるようになります。

変更内容

  • SubstitutedILProvider.cs: IL生成時にnullable型チェックの最適化ロジックを追加(+4行)
  • ILImporter.Scanner.cs: nullable型の isinst 命令処理でブランチ削減条件を改善(+3行/-1行)
  • Generics.cs: 修正の検証用ユニットテストを追加(+23行)

パフォーマンスへの影響

影響なし

修正により、nullable型に対する不要なチェック処理が削減され、NativeAOT生成コードのサイズ最適化に寄与します。

関連Issue

#134823

その他

  • リスク度: 非常に低い(内部実装の修正、回帰なし)
  • 顧客報告: あり
  • リリース: release/11.0 ブランチへのバックポート
  • テスト: ユニットテスト追加により検証済み

#134871 Fix DateTime.ToUniversalTime for invalid local times in the DST gap

概要

DateTime.ToUniversalTime()がDST春時間変化による無効な時刻(DST gap)に対して誤った結果を返していた回帰を修正しました。無効なローカル時刻をUTC時刻に変換する際、UTC オフセットを加算していたのを減算に修正することで、正確な変換結果を実現します。

例:W. Europe標準時で02:30が03:30Zではなく01:30Zに正しく変換されるようになりました。

変更内容

  • TimeZoneInfo.Cache.cs: 無効な時刻のフォールバック処理に新しい共有ルール選択ロジックを追加(59行追加)
  • TimeZoneInfo.cs: ConvertTimeメソッドの無効時刻処理で、UTC オフセットの加算を減算に修正(内部実装)
  • TimeZoneInfoTests.cs: ヨーロッパ複数地域(W. Europe、CentralEurope、E. Europeなど)を対象にDST gap無効時刻の変換をテストする回帰テストを追加(42行追加)

パフォーマンスへの影響

影響なし

関連Issue

#134846

その他

本修正によりTimeZoneInfo.Local.GetUtcOffsetおよびnew DateTimeOffset(local).UtcDateTimeとの動作が一貫するようになりました。変更は内部実装の修正であり、公開APIの変更はありません。


#134851 Fix segment GC total memory accounting

  • 作成者: @kkokosa
  • 作成日時: 2026年09月29日 11:13:27(UTC)
  • マージ日時: 2026年10月01日 20:34:06(UTC)
  • ラベル: area-GC-coreclr

概要

Segment GCにおいて、Gen0メモリ計算がエフェメラルセグメント開始位置から測定されていたため、昇格されたGen1/Gen2オブジェクトが重複してカウントされ、GC.GetTotalMemory()の戻り値が過大報告される問題を修正します。Gen0の実際の割り当て開始位置から測定するよう修正し、昇格されたオブジェクトを含む回帰テストを追加します。

変更内容

  • src/coreclr/gc/interface.cpp: Gen0メモリ計測ロジックを修正。エフェメラルセグメント開始位置ではなく、Gen0の実際の割り当て開始位置から計測するよう変更(+1行、-3行)
  • src/tests/GC/API/GC/GetTotalMemory.cs: 昇格されたオブジェクトを含むケースの回帰テストを新規追加(+27行)

パフォーマンスへの影響

影響なし(メモリ計算の正確性向上であり、パフォーマンスへの直接的な影響なし)

関連Issue

#134755

その他

なし


#134845 Align TAR extraction destination handling with ZIP

概要

TAR抽出時に宛先ディレクトリの存在を必須としていた動作をZIP抽出と統一し、存在しない宛先への抽出をサポートするようにしました。8つのオーバーロード(同期/非同期、ファイル/ストリーム入力、bool overwriteFiles/TarExtractOptions)全てで宛先の自動作成が可能になります。空のアーカイブの場合は遅延ディレクトリ作成の動作を維持します。

変更内容

  • TarFile.cs: 宛先存在チェック(DirectoryNotFoundException)を削除し、既存の抽出ヘルパーメソッドに宛先およびその親ディレクトリの作成を委譲。8つのオーバーロード全てで統一的に処理。
  • テストベースクラス(TarFile.ExtractToDirectory.Base.cs): 回帰テストを追加。既存/欠落した宛先、欠落した親ディレクトリ、空のアーカイブ、ネストされたファイル・ディレクトリエントリ、ファイル衝突、ファイルが必須ディレクトリパスを占有する場合、無効なパス、ファイル/リンクエントリによるトラバーサル、キャンセレーションの各ケースをカバー。
  • プラットフォーム別テスト: Windows/Unixの既存テストを更新・統合。

パフォーマンスへの影響

影響なし

関連Issue

#134845

その他

互換性に関する注意(破壊的変更): 従来は欠落した宛先に対してDirectoryNotFoundExceptionが発生していましたが、この変更後は抽出が成功するようになります。宛先ディレクトリの存在を強制したいアプリケーションは、呼び出し側で明示的に事前検証を行う必要があります。本PR は needs-breaking-change-doc-created ラベルが付与されており、リポジトリの互換性ドキュメント作成プロセスで対応予定です。

検証結果: Windows x64でのビルド成功、TAR全体テストスイート6,956ケースで全て成功(344の宛先回帰テストケースとキャンセレーションテスト4ケースを含む)。


#134838 Fix NativeAOT EventPipe use-after-free by waiting for active writers

  • 作成者: @Copilot
  • 作成日時: 2026年09月29日 05:47:54(UTC)
  • マージ日時: 2026年10月01日 01:35:58(UTC)
  • ラベル: area-Tracing-coreclr

概要

NativeAOT の EventPipe で発生していた use-after-free バグを修正します。EP_YIELD_WHILE マクロがno-opだったため、EventPipe リーダーがバッファを消費・解放する際にライターがまだそのバッファを使用している状態が発生していました。

本修正では、条件を再チェックするループでライターの同期を復元し、バッファ受け渡し時とセッションシャットダウン時の待機を機能させます。また、PalSwitchToThread に基づく NativeAOT アダプタヘルパーを追加し、リーダーの待機中にライターが進行できるようにします。

変更内容

  • ep-rt-aot.h: EP_YIELD_WHILE マクロの実装をno-opから条件再チェックループに変更し、ライター同期を復元
  • ep-rt-aot.cpp: スレッド譲渡ヘルパー機能の追加
  • src/native/minipal/time.c, time.h: PalSwitchToThread アダプタの実装追加
  • src/coreclr/vm/hosting.cpp: 関連コード削除(27行削減)

パフォーマンスへの影響

ループ内での無制限の yield が CPU スピンロックを引き起こし、ライター側の飢餓状態またはリーダー側の無限スピンが発生する可能性が指摘されています。Copilot による高優先度の推奨事項として、bounded backoff (周期的なスリープ)の追加が提案されています。

関連Issue

#134785

その他

  • 互換性への影響: NativeAOT ランタイム内部実装の修正であり、公開 API への影響はなし
  • セキュリティ: use-after-free バグ修正であり、メモリ安全性向上に寄与
  • レビュー状況: Copilot コードレビューにより高優先度の改善提案があり、unbounded yield ループへの bounded backoff 追加が検討中

#134816 [release/11.0] Mark ILVerify and ILVerification as shipping

概要

.NET 11.0向けのバックポートPRで、ILVerifyおよびILVerificationツールをShipping対象として公式にマークします。これにより、dotnet-ilverifyとMicrosoft.DotNet.ILVerification NuGetパッケージがnuget.orgで公開されるようになります。

変更内容

  • ILVerification.csproj: Shipping設定メタデータを追加(5行追加)
  • ILVerify.csproj: Shipping設定メタデータを追加(1行追加)
  • PACKAGE.md: ILVerificationおよびILVerifyの パッケージ説明ドキュメントを新規作成(合計16行追加)

これらの変更により、両ツールが正式なNuGetパッケージとしてリリースビルドに含まれるようになります。

パフォーマンスへの影響

影響なし

関連Issue

#120853(回帰の原因)、#134804(元のPR)

その他

  • 内部で発見された問題のバックポート
  • 低リスク:プロジェクトメタデータとマークダウンファイルの変更のみ
  • テスト済み:パッケージファイルがShipping directoryに正しく配置されることを確認
  • .NET 9以降ではパッケージオーサリング設定が不要になっているため、本変更は.NET 11.0固有の対応です

#134809 [release/11.0] Disable HPKE ECDH NIST curves on Android

概要

Android環境でのHPKE(Hybrid Public Key Encryption)ライブラリの互換性問題を修正するバックポート。EC-DiffieHellmanベースのNIST曲線KEMはAndroidのプロバイダが公開鍵を事前計算なしのプライベートキーインポートをサポートしていないため、これらのKEMをAndroid上で非サポートとして報告するようにしました。

変更内容

  • System.Security.Cryptography/HpkeKemMetadata.Managed.cs: Android環境でNIST曲線を使用したECDH KEMをサポート対象外として マークする条件を追加(4行追加、1行削除)

パフォーマンスへの影響

影響なし

関連Issue

#134688

その他

  • 対象バージョン: .NET 11(release/11.0ブランチへのバックポート)
  • 新機能の問題: HPKE機能は.NET 11で新たに追加され、RC2で初めてリリース予定。本修正前に実際の依存機能がないため、リスクは低い
  • テスト状況: 既存テストが問題を検出していたが、Androidビルド結果がBuild Analysisに含まれていなかったため検出漏れ
  • 破壊的変更: なし。既存コードは影響を受けず、単にAndroid上で特定のKEMが非サポートになる

#134808 Add configurable Wasm debug information output

  • 作成者: @davidwrighton
  • 作成日時: 2026年09月28日 17:32:02(UTC)
  • マージ日時: 2026年10月01日 21:43:36(UTC)
  • ラベル: area-ReadyToRun

概要

WebAssembly ReadyToRun生成時のデバッグ情報出力を設定可能にする機能を追加しました。新しい --wasm-debug-info Crossgen2オプションで、デバッグ情報の出力形式を none、name、symbol-map、all、またはそれらの組み合わせで指定できます。デフォルトは既存の name セクション保持形式を維持し、Emscripten互換の .symbols サイドカーファイルを出力します。

変更内容

  • Crossgen2オプション追加: --wasm-debug-info パラメータを Crossgen2RootCommand.cs に実装し、複数の出力形式をサポート
  • デバッグ情報出力制御: WebCilObjectWriter.cs と ReadyToRunObjectWriter.cs でデバッグ情報出力のロジックを強化
  • コンパイル設定拡張: ReadyToRunCodegenCompilation.cs と ReadyToRunCodegenCompilationBuilder.cs でデバッグ情報オプションを伝播
  • テスト整備: WasmR2RAssert.cs で Wasm ReadyToRun 出力の検証ロジック追加、R2RTestSuites.cs でテストケース拡充
  • リソース更新: ヘルプテキストなどを Resources.resx に追加

パフォーマンスへの影響

影響なし(オプション選択に基づいて出力内容が変わるが、基本的な処理フローには影響しない)

関連Issue

なし

その他

  • この変更は DWARF 出力を後続で追加するための基盤となります
  • 不要な symbol-map サイドカーファイルは自動で削除されます
  • Emscripten 互換性を維持し、絶対関数インデックスと名前を含む .symbols サイドカーを生成します

#134728 Fix generic struct field marshalling

概要

.NET 11のリグレッションを修正します。クローズド型のジェネリック構造体をフィールドとして持つ非ジェネリック構造体が、組み込みの逆P/Invoke マーシャリング中に失敗していた問題に対応します。

内部構造体マーシャラーが公開API Marshal.SizeOf<T>() を呼び出していましたが、このメソッドのジェネリック型制限が既存のフィールドマーシャリング互換性より厳密だったため、ArgumentException がスローされていました。マーシャラーをCoreClrの内部サイズヘルパーを使用する実装に変更し、既存の列挙型処理と公開API制限を維持しました。

変更内容

  • src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs: ネイティブサイズの取得方法を変更(3行追加、1行削除)
  • src/tests/Interop/StructMarshalling/ReversePInvoke/MarshalExpStruct/DelegatePInvoke/DelegatePInvokeTest.cs: 逆P/Invokeの回帰テストを追加(51行)。ネストされたint/boolフィールドレイアウトとネイティブ値を検証します。

パフォーマンスへの影響

影響なし

関連Issue

#134578

その他

  • 修正前の動作:ArgumentException がスロー
  • 修正後の動作:ネストされたジェネリック構造体フィールドのマーシャリングが正常に実行
  • CoreClrビルドテストは成功
  • 回帰テストで修正を確認済み

#134702 [release/11.0] Support private scalar-only imports on iOS

概要

.NET 11で追加されたHPKE機能がiOS環境で動作するよう、EC-DH秘密鍵単独インポート機能を実装するバックポート変更です。これまでiOS系プラットフォームではこの機能が未実装でPlatformNotSupportedExceptionが発生していました。

変更内容

  • EccAppleCrypto.iOS.cs: iOS向けECC実装で、秘密鍵のみのインポートに対応する新規ロジックを追加(29行の追加、2行の削除)
  • Interop.Ecc.cs: ネイティブ相互運用インターフェース拡張で新規エクスポートを追加(51行の追加)
  • pal_swiftbindings.swift: Swift側の実装で秘密鍵単独インポート処理を追加(43行の追加)
  • pal_swiftbindings.h: Swiftバインディングのヘッダー定義追加(2行の追加)
  • entrypoints.c: エントリーポイント定義追加(1行の追加)
  • DefaultECDiffieHellmanProvider.Unix.cs: テスト設定の微調整(1行の削除・追加)

パフォーマンスへの影響

影響なし。既にサポートされていた他のコードパスに変更なし。

関連Issue

#134682(オリジナルのmain向けPR)

その他

  • リスク評価:Low。以前は必ず失敗していたコードパスを機能実装で置き換えるため、新規の問題発生可能性は低い
  • 既存の無効化テストが有効化され、iOS系プラットフォーム上でパスを確認済み
  • 非破壊的変更で、既存の互換性への影響なし

#134685 [release/11.0] Fix TypeLoadException in .NET 11 Preview 7 with DotNext threading

概要

.NET 11 Preview 7でDotNext threadingを使用する場合に発生するSystem.TypeLoadExceptionを修正するバックポート。Task → Task<T>の仮想オーバーライドで、ランタイムが内部的に生成するthunkが誤ってabstractとマークされていた問題を解決します。これはnet10からのリグレッション修正です。

変更内容

  • src/coreclr/vm/method.cpp: thunk生成時のabstractビットコピー処理を修正(10行追加)
  • src/coreclr/vm/methodtablebuilder.h: メソッドテーブルビルダーのthunk処理ロジックを調整(15行追加、1行削除)
  • src/tests/async/covariant-return/covariant-returns.cs: 共変戻り値を伴うタスクのオーバーライドシナリオをカバーするテストを追加(78行)

パフォーマンスへの影響

影響なし。

関連Issue

#132971

その他

  • リスク評価: Low。修正は単純で、実装するthunkからabstractビットをコピーしないようにするだけです。元のメソッドがabstractであっても、それを呼び出すthunk自体がabstractである必要はありません。
  • リグレッション: net10からのリグレッション。
  • 顧客報告: あり。

#134668 Extend extend tail dup to get more ccmp

概要

JITコンパイラがo is int || o is uint || o is longのような条件式で条件付き比較(CCMP)最適化を見逃していた問題を修正します。テイルデュプリケーション(tail duplication)ヒューリスティックと前方代入(forward substitution)を拡張し、ローカル変数間のコピーを経由した比較を最適化できるようにしました。

変更内容

  • src/coreclr/jit/fgopt.cpp: テイルデュプリケーションの収益性チェックでローカル変数間のコピーを認識するよう拡張。fgFoldSimpleCondByForwardSubで定数をコピーされたローカル変数を通して前方代入できるように改善。小整数正規化を保持。
  • src/tests/JIT/opt/Compares/compareAnd2Chains.cs: インラインされた型テストでCCMP生成を検証するテスト(+30行)
  • src/tests/JIT/opt/RedundantBranch/CopyAndBranch.il: コピーされたローカル変数を通した正規化をテストするILテスト(+60行)
  • src/tests/JIT/opt/RedundantBranch/CopyAndBranch.ilproj: IL回帰テストの構成ファイル(+8行)

パフォーマンスへの影響

SPMI(Static Profile-Guided Method Inventory)による差分測定:

  • ARM64: 472,977コンテキスト中835個のアセンブリ差分、−8,000バイトのコードサイズ削減
  • x64: 1,022,657コンテキスト中2,042個のアセンブリ差分、−13,991バイトのコードサイズ削減

コードサイズの大幅な削減により、メモリ効率とキャッシュ局所性が向上します。

関連Issue

#134668

その他

  • JITコンパイラの内部実装(fgopt.cpp)の変更であり、公開APIへの影響はありません。
  • インラインされたメソッドに対する最適化です。インラインされていないメソッドに対する同様の形状への対応には別途の変更が必要とされています。
  • Copilot Reviewでは「グローバルJITヒューリスティックが数千のコード生成差分を生じる」ため、メンテナーによる最終確認が必要と指摘されています。

#134665 [release/11.0] Fix null vnStore dereference in optAssertionProp_HWIntrinsic

概要

JITのローカルアサーション伝播フェーズにおいて、値番号ストア(vnStore)が存在しないままoptAssertionProp_HWIntrinsic最適化が呼び出される問題を修正します。このバグにより、SIMD ExtractMostSignificantBits操作をコンパイル中にJITがクラッシュする可能性があり、.NET 11のLinux arm64 JIT PGOトレーニングをブロックしていました。

変更内容

  • src/coreclr/jit/assertionprop.cpp: optAssertionProp_HWIntrinsicの呼び出し前にvnStoreが有効であることを確認するガード条件を追加。値番号が利用不可のローカルアサーション伝播フェーズではこの最適化をスキップするよう修正(+8/-1)。

パフォーマンスへの影響

影響なし。ローカルアサーション伝播フェーズではこの最適化を実行しないようになりますが、グローバルアサーション伝播フェーズでは従来通り実行されるため、全体の最適化効果は変わりません。

関連Issue

#134441(オリジナル修正PR)、#134435(報告Issue)、#129688(回帰を導入した変更)

その他

  • 回帰: .NET 11開発中の#129688で導入されたハードウェア組み込み関数アサーション伝播ヘルパーが、ガード条件なく呼び出されていた
  • リスク評価: 低。変更は条件ガードと前提条件アサーションのみで、隣接する配列長ケースと同じパターンに統一されている
  • テスト: 22個のJIT/opt/InstructionCombiningテストが合格(デフォルト設定およびDOTNET_EnableAVX512=0での検証済み)

#134641 Fix PHA-not-offered check in NegotiateClientCertificateAsync on OpenSSL 1.1

概要

OpenSSL 1.1でTLS 1.3のポストハンドシェイク認証が提供されていない場合、NegotiateClientCertificateAsyncが正しくエラーコードを解析できず例外をスローしていた問題を修正。OpenSSL 3とOpenSSL 1.1のエラーコードレイアウトの違い(lib << 23 | reason vs lib << 24 | func << 12 | reason)に対応し、ランタイム時にロードされたOpenSSLのバージョンに応じた正しい解析を実装。

変更内容

  • Interop.OpenSsl.cs: 新しいGetSslLibraryReasonメソッドを追加。ロードされたOpenSSLバージョンに基づいてエラーコードを正しく解析。OpenSSL 3.0以上か1.1以下かで異なるビットマスク処理を実施。SSL_LIBライブラリからの理由コードのみを抽出。
  • TlsSocketSession.cs: RequestClientCertificateでクライアント証明書未提供時にCompleteを返すよう修正(OpenSSL 1.1でAuthenticationExceptionをスローしていた動作を修正)。
  • OpenSslErrorTests.cs: 新規ユニットテストを追加。両方のレイアウト形式でのエラーコード解析、異なるライブラリからの理由コード、OpenSSL 3のシステムエラーをカバー。
  • TlsSessionTests.cs: 新規機能テストSocketBoundSession_RequestClientCertificate_Tls13PhaNotOffered_Completesを追加(Linuxのみ)。
  • .csproj: テスト実行時の依存設定を追加。

パフォーマンスへの影響

影響なし

関連Issue

#134640

その他

  • 修正は内部実装(OpenSSL相互運用層)の範囲で、公開APIへの破壊的変更なし。
  • OpenSSL 3では理由279と339が他のライブラリから返される場合、「ポストハンドシェイク認証未提供」と見なされなくなる動作変更あり。
  • テストはUbuntu 22.04(OpenSSL 3.0.2)およびUbuntu 20.04(OpenSSL 1.1.1f)で検証済み。
  • シムレベルでの修正ではなく、ネイティブコード側で実装したのはコンパイル時のヘッダーレイアウト固定を避けるため。

#134618 [wasm][coreclr] Enable composite ReadyToRun publishing

  • 作成者: @lewing
  • 作成日時: 2026年09月24日 21:06:30(UTC)
  • マージ日時: 2026年10月01日 18:46:46(UTC)
  • ラベル: arch-wasm area-Host

概要

CoreCLR browser-WASM環境でWebCIL有効時のComposite ReadyToRun (R2R)公開を実装しました。Compositeはオプトインであり、デフォルトのアセンブリ単位R2Rモードは変更されません。Composite所有者(<entry>.r2r.wasm)を静的Webアセットとして公開し、ローダーが初期化前にロードします。コンポーネントスタブはTPA(Trust Path Assembly)に保持され、Composite/per-assemblyモード切り替え時の無効化とスタブの整理を実装しています。

変更内容

ビルドシステム(WebAssembly SDK):

  • Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets: Composite R2R のルーティング、検証、出力処理を追加
  • Microsoft.NET.Sdk.WebAssembly.Browser.targets: Composite アセット公開と無効化スタンプの管理
  • GenerateWasmBootJson.cs: Composite イメージを resources.coreAssembly に分類、isCompositeImage: true フラグを設定
  • BootJsonData.cs: Composite フラグの構造体フィールドを追加

ランタイムローダー(JavaScript):

  • run.ts: Composite コアアセンブリをCoreClR初期化前にロード
  • assets.ts: Composite .r2r.wasm パスを保持(ファイル名ベースではなくフラグで識別)
  • host.ts: Composite イメージをTPA から除外
  • internal.ts, public-api.ts: Composite トレイト定義の型追加

CoreCLRコンパイラ:

  • WebCilObjectWriter.cs: WebCIL関数インデックスリロケーション処理を追加

テストおよびドキュメント:

  • ReadyToRunTests.cs: Composite trim/untrim、ネイティブリリンク、ブラウザ実行、モード切り替えをカバーするテスト追加(10/10パス)
  • 新テスト資産R2rSuffixLibrary: R2r命名規則の検証用
  • testing-wasm.md: Composite R2R テスト手順を文書化

パフォーマンスへの影響

大幅な改善: ベンチマーク(IndexOfMax<double>(3079)、ブラウザ環境)

  • Composite R2R: 4,040 ns/op(SIMD パス使用)
  • Interpreted: 1,013,940 ns/op(約250倍低速)
  • Per-assembly R2R: 10,652,060 ns/op(約2,600倍低速)

Composite により、JIT/Interpreterの動的コンパイル/実行オーバーヘッドを排除し、事前コンパイル済みコードの実行が可能になります。

関連Issue

dotnet/sdk#56395(SDK ReadyToRun タスクでCompositeオーナー名対応待ち) #134559(Composite R2R テスト統合) #134312(WebCIL wrapper v2) #133265(WASI Composite in Crossgen2Tasks) [#134690](https://github.com/dotnet/runtime/issues/134690


#134611 [wasm] Use GetDelegateCtor for CoreCLR R2R delegate construction

概要

Browser-Wasm ReadyToRun環境でデリゲートコンストラクタの最適化を有効化します。これまでWasm ReadyToRunは動的に生成されるREADYTORUN_DELEGATE_CTORヘルパーを使用できず、インタープリタを通じた低速な実行時実装を呼び出していました。本変更により、WasmはJITと同じGetDelegateCtor変換パスを使用し、Crossgen2がコンテキストに応じてDelegate.CtorClosedまたはDelegate.DelegateConstructを選択します。

変更内容

  • flowgraph.cpp: TARGET_WASM上でReadyToRun分岐をNativeAOTのみに制限し、Wasm ReadyToRunはGetDelegateCtorパスにフォールスルーするよう変更。呼び出し先変更後、getFunctionEntryPointでAOTエントリポイントを再計算。
  • Crossgen2実装: ReadyToRun部分にGetDelegateCtorを実装。CtorClosedとDelegateConstructのマニフェストトークンを遅延シード化。
  • テストカバレッジ: WasmDelegateConstructorsテストを追加し、デリゲート構成の複数パターン(オープン静的、クローズド インスタンス、クローズド静的、仮想、ジェネリック)をカバー。
  • R2Rフォーマット、JIT-EEインターフェース、VMに変更なし。イメージバージョンは30.0を維持。

パフォーマンスへの影響

大幅な改善を確認:

デリゲート形式 インタープリタのみ R2R R2R + --opt-cross-module:*
オープン静的 9.83 ms 6.61 ms (33%削減) 6.55 ms
クローズド インスタンス 6.15 ms 2.50 ms (59%削減) 2.22 ms

100,000回の構成テストにおいて中央値を測定(3回実行×4サンプル)。変更前はR2R構成が約44~46ms要していた。

関連Issue

#134564

関連変更:

  • #134108 (マージ済): クローズド静的構造体戻り値呼び出しアダプタ
  • #134497 (マージ済): クローズド静的ターゲットインタープリタスタブカバレッジ

その他

  • ローカル検証: macOS arm64上でmainブランチとのマージ後にビルド・テスト実施
  • ILCompiler.ReadyToRun.Tests: 123パス、0失敗(Wasmターゲット)
  • WasmInterpreterTransitionsランタイムテスト: コンポジット、アセンブリ単位、クロスモジュールインライニング有無の各構成で合格
  • DOTNET_GCStress=0xC設定下でも動作確認

#134607 [release/11.0] X25519: Handle zero peer keys on downlevel Windows platforms

概要

X25519DiffieHellman クラスが特定の無効な公開鍵を適切に処理していない問題を修正したバックポートです。Windows 10 の古いビルドにおいて、無効な公開鍵のインポート時に他のプラットフォームと異なる動作(早すぎる拒否または遅すぎる拒否)をしていました。公開鍵はインポートは許可されるべきですが、秘密鍵の導出時に拒否される必要があります。

変更内容

  • X25519DiffieHellmanCng.Windows.cs: Windows CNG 実装に 8 行追加(バリデーション強化)
  • X25519DiffieHellmanImplementation.Windows.cs: Windows 実装に 54 行追加、8 行削除(合計 62 行。ゼロピア鍵の処理ロジック改善)
  • X25519DiffieHellmanBaseTests.cs: テストケース拡充(46 行追加、19 行削除。エラーパスの検証)
  • X25519DiffieHellmanCngTests.Windows.cs: Windows 固有テスト追加(4 行追加)

パフォーマンスへの影響

影響なし

関連Issue

#134535(本体の修正)

その他

  • 内部実装の修正であり、公開 API に影響はありません
  • リスク評価: 低(小規模で理解しやすく、X25519DiffieHellman の Windows 実装に限定)
  • Hpke のテストケース追加時に発見された問題
  • 非互換性や破壊的変更なし
  • .NET 11 の release/11.0 ブランチへのバックポート

#134058 [libs] Include pthread.h where pthread_once is used

概要

OpenSSL 3.5との互換性問題を修正するためのPull Requestです。pal_hmac.cがpthread_once_tとPTHREAD_ONCE_INITを使用していながら、pthread.hを直接インクルードしていませんでした。OpenSSL 3.5ではOpenSSLヘッダがpthread.hを引き込まなくなったため、コンパイルエラーが発生していました。修正はpthread.hを直接インクルードすることで、既に同じアプローチを採っているpal_evp.c、opensslshim.c、pal_bio.cと統一します。

変更内容

  • src/native/libs/System.Security.Cryptography.Native/pal_hmac.c: pthread.hをインクルードして、pthread_once_tとPTHREAD_ONCE_INITの定義を確実に利用できるようにしました(+1行)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • System.Security.Cryptography.Nativeライブラリの内部実装(ネイティブコード層)の修正
  • OpenSSL 3.5への対応が必要な環境での必須修正
  • 他のファイルで既に確立されているパターンに従った修正

#133174 Skip peer certificate revalidation on resumed TLS sessions by default

概要

このPRは、SslStreamがTLSセッション再開時の証明書再検証動作を変更します。再開(短縮)ハンドシェイク中、ピアは証明書を再送信せず、その身元は元のセッションチケット/セッションIDを作成した完全ハンドシェイク時に確立・検証済みです。デフォルトでは、再開された初期ハンドシェイク時にチェーン構築とユーザー検証コールバックをスキップし、OpenSSLやSChannelなどの標準TLSスタックの動作に合わせます。AppContext設定System.Net.Security.RevalidateCertificateOnTlsResumeで従前の動作に戻すことができます。

変更内容

セキュリティ関連の公開APIレベルの破壊的変更:

  • SslStream.RemoteCertificateValidationCallbackがTLSセッション再開時(Windows/Linux)に呼び出されなくなります(デフォルト)
  • RemoteCertificateプロパティはキャッシュされた証明書を返しますが、チェーン検証とコールバック実行が省略されます

マネージドコード変更:

  • LocalAppContextSwitches.cs: 新規オプトアウトスイッチRevalidateCertificateOnTlsResumeを追加
  • SslStream.Protocol.cs: 再開検出時にチェーン構築・コールバック実行をスキップする条件ロジックを追加
  • SslConnectionInfo.*.cs (Windows/Linux/OSX/Android): プラットフォーム別のTLS再開検出(TlsResumed)を#if DEBUGから無条件に変更

ネイティブ変更:

  • pal_ssl.c/h (Apple): AppleCryptoNative_SslGetSessionResumedを実装してセッション再開を検出

テスト追加:

  • SslStreamAllowTlsResumeTests.cs: 新規テストで再開時の動作(再検証スキップと条件付きコールバック)を検証

パフォーマンスへの影響

TLS 1.2(ベンチマーク結果:Windows x64):

  • ハンドシェイク時間:14〜23%削減(762.1 µs → 628.4 µs、RSA-2048: 568.4 → 490.3 µs)
  • メモリ割り当て:約0.76〜0.99 KB削減

TLS 1.3:

  • ハンドシェイク時間:ほぼ無変化(ネイティブSSPI処理が主コスト)
  • メモリ割り当て:約0.72〜0.94 KB削減

懸念点:

  • Enum.HasFlag使用によるボックス化がRelease動作パスで発生し、パフォーマンス回帰の可能性

関連Issue

なし

その他

セキュリティ上の重要な注意:

  • ⚠️ これはセキュリティ関連のデフォルト動作変更です。ユーザーのRemoteCertificateValidationCallbackが再開初期ハンドシェイク時に沈黙のうちに呼び出されなくなるため、意図的で十分に文書化された決定が必要です
  • ⚠️ 再交渉またはTLS 1.3

目次