Pull Request on 2026年06月28日

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

注意点

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



#129950 Emit correct ELF symbol types for data in NativeAOT objects

概要

NativeAOT の ELF オブジェクトライター内で、シンボルテーブル生成時のシンボル型分類ロジックを修正しました。従来はシンボルサイズのみで型を決定していたため、非実行可能セクション内のデータシンボルが誤った型(STT_NOTYPE または STT_FUNC)として出力されていました。本変更はセクションフラグに基づいて正しい型を割り当て、デバッガ(lldb/gdb/nm など)での正確なシンボル認識を実現します。

変更内容

  • src/coreclr/tools/Common/Compiler/ObjectWriter/ElfObjectWriter.cs
    • EmitSymbolTable メソッドのシンボル型分類ロジックを修正
    • TLS セクション: STT_TLS、非実行可能セクション: STT_OBJECT、実行可能セクション: STT_FUNC/STT_NOTYPE で分類
    • 修正前:シンボルサイズ(Size > 0)のみで判定し、vtable が STT_NOTYPE、.rodata のデータが STT_FUNC として誤分類
    • 修正後:セクションフラグを優先的に参照し、実行可能セクション内のシンボル(コード)は既存動作を維持

パフォーマンスへの影響

影響なし。本変更は st_info 型バイトのみを変更するもので、オブジェクトファイルのサイズは変わりません(検証:修正前後で 3,555,456 バイト同一)。

関連Issue

なし

その他

  • 検証結果(Linux x64 cross-emit、データ脱水化有効時):
    • .hydrated セクション:1084 個の NOTYPE + 377 個の FUNC → 1461 個の OBJECT に統一
    • .rodata セクション:245 個の FUNC + 2 個の NOTYPE → 247 個の OBJECT に統一
    • .data セクション:338 個の FUNC → 338 個の OBJECT に統一
    • .text セクション(コード):83 個の FUNC のまま(変更なし)
  • 実行可能セクション内のシンボルは変更されないため、ARM/AArch64/RISC-V のマッピングシンボル($a/$d/$x)とトランポリンに影響なし
  • 他の ELF プロデューサ(gcc/llvm など)の標準的な型分類規則に準拠

#129947 wasm: fix R2R generic dictionary lookup debug assert

  • 作成者: @AndyAyersMS
  • 作成日時: 2026年06月28日 16:38:11(UTC)
  • マージ日時: 2026年06月28日 21:49:46(UTC)
  • ラベル: area-VM-coreclr

概要

WebAssemblyでのReadyToRun(R2R)コード実行時に、ジェネリック辞書ルックアップのデバッグアサーション(_DEBUGオンリー)が誤発火する問題を修正しました。WebAssemblyではR2Rコードが関数テーブル、データがリニアメモリに配置されるため、コード範囲ルックアップが正しいモジュールを解決できず、複数のR2Rイメージロード時にIsNativeImageSharedByアサーションが不適切に発火していました。修正後は、WebAssemblyで署名アドレスが現在のモジュールのR2Rイメージ境界内に存在することを検証するようになります。

変更内容

  • src/coreclr/vm/jithelpers.cpp: GenericHandleWorkerCoreにTARGET_WASM専用のデバッグアサーション経路を追加(+10行)。署名アドレスが現在のモジュールのR2Rイメージ範囲内にあることを検証し、他のターゲットではアサーション動作は変わらず。

パフォーマンスへの影響

影響なし。_DEBUGオンリーのアサーションチェックであり、リリースビルドの動作は影響を受けません。

関連Issue

#129947

その他

  • この修正はWebAssembly上でのPri-1 R2Rテストスイート実行時の最頻出アサーション失敗(全失敗の約50%、特にジェネリクステスト)を解決します。
  • 修正対象はデバッグアサーションのみであり、本質的な機能動作には影響しません。

#129944 Skip build-time RID fallback for portable builds

概要

portable builds(ポータブルビルド)において、runtime.jsonレガシーグラフに存在しないRID(例:openbsd-x64)に対する build-time RID フォールバックをスキップするための修正です。これにより、self-referencing RID による不正な動作を防止しています。portable buildではTargetRID == PortableTargetRIDであり、distro固有の情報を含まないため、フォールバック処理は不要となります。

変更内容

  • src/libraries/Microsoft.NETCore.Platforms/src/Microsoft.NETCore.Platforms.csproj (+2/-2)
    • portable builds時におけるRIDフォールバック処理の条件付けロジックを修正

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

この修正はportable buildとnon-portable buildの動作の区別に関連しています。non-portable buildでは、異なるRID(バージョンやdistro名を含む)を使用し、サードパーティ依存関係をdistroパッケージから取得しますが、portable buildではそのような分岐処理が不要となります。


#129942 Use ThrowHelper.ThrowInvalidOperationException in ImmutableCollection

概要

System.Collections.Immutableライブラリで、インラインthrow new InvalidOperationException文をThrowHelper.ThrowInvalidOperationException呼び出しに置き換える内部リファクタリング。FrozenSet/FrozenDictionaryで確立されているパターンに統一することで、例外処理の一貫性と保守性を向上させます。

変更内容

  • ImmutableArray_1.Enumerator.cs: 列挙子の無効状態チェックで例外スロー処理を統一
  • ImmutableDictionary_2.HashBucket.cs: ハッシュバケット処理の例外処理を統一
  • ImmutableList_1.Enumerator.cs: リスト列挙子の例外処理を統一
  • ImmutableSortedDictionary_2.Enumerator.cs: ソート辞書列挙子の例外処理を統一
  • ImmutableSortedSet_1.Enumerator.cs: ソート済みセット列挙子の例外処理を統一
  • ImmutableStack_1.Enumerator.cs: スタック列挙子の例外処理を統一
  • SortedInt32KeyNode.Enumerator.cs: キーノード列挙子の例外処理を統一
  • ImmutableArrayExtensions.cs: 拡張メソッド内の例外処理を統一

全ての変更は内部実装(非公開API)の変更であり、公開APIシグネチャへの影響はありません。

パフォーマンスへの影響

ThrowHelper呼び出しの使用により、JIT最適化が向上し、ホットパスでの例外スロー処理がより効率的になる可能性があります。影響は軽微ですが、大規模な列挙操作でのわずかなメモリ/実行速度の改善が期待されます。

関連Issue

なし

その他

このPRは純粋なコード品質改善で、機能的な変更や互換性への影響はありません。例外処理パターンの統一により、将来の保守性が向上します。


#129934 [wasm] Bump chrome for testing - linux: 149.0.7827.200, windows: 149.0.7827.201

概要

WebAssembly(WASM)テスト環境で使用するChrome for Testingのバージョンを更新します。Linux環境を149.0.7827.200に、Windows環境を149.0.7827.201にそれぞれアップグレードします。

変更内容

  • eng/testing/BrowserVersions.props: Chrome for Testingのバージョン定義を更新
    • Linux: 新バージョン 149.0.7827.200
    • Windows: 新バージョン 149.0.7827.201

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

このPull Requestは自動化されたバージョン更新(github-actions[bot]によるもの)です。WebAssemblyのテストインフラストラクチャに関連する変更であり、ランタイムのコア機能や公開APIへの直接的な影響はありません。


#129931 [cDAC] Enumerate R2R hashmap pages into triage dumps for odd entry points

概要

macOS トライアージ ミニダンプでの cDAC の R2R スタックウォークが SoftwareExceptionFrame の一フレーム先で中止する問題を修正します。根本原因は、レガシー DAC のハッシュマップ プローブをスキップする奇数エントリポイント最適化にあり、プローブが参照するバケットページがトライアージダンプに列挙されず、cDAC コンシューマーがダンプに存在しないページを読み取ろうとして失敗します。

変更内容

  • src/coreclr/vm/readytoruninfo.cpp: !defined(DACCESS_COMPILE) で奇数エントリポイント最適化をゲーティング。本番ランタイム(非DAC)は性能最適化を維持し、DAC ビルドはハッシュマップ検索を実行してバケットページをトライアージミニダンプに列挙させます。また、不正確なコメントを削除
  • cDAC ExecutionManagerCore.ReadyToRunJitManager: 奇数エントリポイント時の早期終了を完全に削除。DAC がページを列挙するため、コンシューマーはそれらを自然に読み取ります

パフォーマンスへの影響

  • 本番ランタイム(非DAC): 影響なし。奇数エントリポイント最適化は維持
  • DAC/cDAC: 新規トライアージダンプ作成時にハッシュマップ検索が実行されるため、ダンプの完全性は向上しますが、ダンプ生成時のオーバーヘッドが若干増加

関連Issue

dotnet/diagnostics#5910

その他

  • この修正はコンシューマー側での症状隠蔽ではなく根本原因の修正であり、レガシー DAC コンシューマーにも利益をもたらします
  • 古いバージョンの DAC で生成されたダンプには該当ページが含まれないため、この修正は新規作成されるダンプに適用されます
  • 検証: ネイティブビルド(非DAC)と DAC ビルド共に成功、cDAC ユニットテスト(Microsoft.Diagnostics.DataContractReader.Tests)は全てパス

#129898 JIT: Remove InlineCandidateInfo::exactContextNeedsRuntimeLookup

概要

JITコンパイラのInlineCandidateInfo構造体から未使用フィールドexactContextNeedsRuntimeLookupを削除するリファクタリングです。最近の変更により不要になったこのフィールドを削除し、コードベースをクリーンアップします。

変更内容

  • inline.h: InlineCandidateInfo::exactContextNeedsRuntimeLookupフィールド定義を削除
  • compiler.h: 関連する宣言を2行削除
  • importercalls.cpp: フィールドへのアクセス/割り当てロジックを削除(15行追加、24行削除)
  • async.cpp: フィールド参照を削除(2行追加、2行削除)
  • fginline.cpp: フィールド参照を削除(1行追加、1行削除)

パフォーマンスへの影響

影響なし。メモリ使用量の軽微な削減(InlineCandidateInfo構造体のサイズ縮小)が期待されます。

関連Issue

なし

その他

削除対象フィールドは最近のリファクタリングにより実装上から既に参照されていない未使用コードです。


#129890 Save async contexts for ValueTask methods

概要

ValueTask返却型の非同期メソッドに対して、ExecutionContextの保存/復元が正しく行われていない問題を修正しました。VM内の非同期フラグチェック処理に誤りがあり、ValueTask変数がこのチェックで適切に扱われていませんでした。合わせてJIT内で最適化されたawaitをデバッグ時に選択的に制御する仕組みも追加されています。

変更内容

  • src/coreclr/vm/method.hpp: ValueTask変数向けの非同期フラグチェックロジックを修正し、operator~ヘルパーを追加してフラグマスク処理を改善
  • src/coreclr/jit/importer.cpp: await最適化の可否を判定するimpCheckOptimizeAwaitロジックを追加(DEBUG設定で動作制御可能)
  • src/coreclr/jit/compiler.h: 新しいimporterヘルパー関数を宣言
  • src/coreclr/jit/jitconfigvalues.h: DEBUG専用のawait最適化範囲/ブレークポイント設定項目を追加
  • src/tests/async/execution-context/execution-context.cs: async ValueTaskフロー向けのExecutionContext回帰テストを追加
  • src/libraries/System.Net.Http/tests/FunctionalTests/DiagnosticsTests.cs: 本件の原因となっていたActiveIssueマークを削除して診断テストを再有効化

パフォーマンスへの影響

影響なし

関連Issue

#129771、#128384

その他

本バグはタイミング依存性があり、テストコード内でawait Task.Yield()を追加するだけで再現しなくなるほど微妙な条件下での問題でした。PR内で追加されたDEBUG専用のJIT設定により、await最適化に関する二分探索的なデバッグが可能になります。


#129856 JIT: ensure magic divisors are always marked DONT_CSE for all targets

概要

JITのモーフィング段階で、符号付き整数除算(GT_DIV)のConstant-CSE最適化を制御する処理を追加しました。magic-divide展開が後の段階で定数除数を認識できるよう、eligible な定数除数に DONT_CSE フラグを確実に設定します。符号なし除算(GT_UDIV/GT_UMOD)は既に対応済みでしたが、符号付き除算が漏れていました。

変更内容

  • src/coreclr/jit/morph.cpp: fgMorphSmpOpOptional内のGT_DIV case で CheckDivideByConstOptimized を呼び出す処理を追加(val / 1の高速パス後)
  • src/coreclr/jit/gentree.cpp: 関連する処理の調整(+9/-2)

パフォーマンスへの影響

間接的な改善が期待されます。修正前は ARM64/RISC-V 環境で constant-CSE により定数除数がローカル変数に書き換えられ、その結果 magic-divide 最適化が失敗して低速なidiv命令へのフォールバックが発生していました。修正後は magic-divide 展開が正常に適用され、より高速な乗算ベースの除算が利用可能になります。

x64ではJitConstCSEデフォルト設定により整数定数CSEが抑制されているため、現状では影響が観測されません。

関連Issue

#129856

その他

  • 修正前:符号付きGT_DIVはval / 1チェックのみで breakし、定数除数が CSE の対象となっていた
  • 修正後:GT_UDIV/GT_UMODと同じ処理フロー(CheckDivideByConstOptimized呼び出し)を適用
  • 符号付きGT_MODは既にfgMorphModToSubMulDivで対応済み

#129502 Move thin lock acquire/release in CoreCLR to managed code

  • 作成者: @VSadov
  • 作成日時: 2026年06月17日 05:40:43(UTC)
  • マージ日時: 2026年06月28日 17:28:10(UTC)
  • ラベル: area-System.Threading

概要

シンロック(オブジェクトヘッダ)の取得/解放処理をCoreClrでネイティブコードからマネージドコードに移行し、CoreClrとNativeAOT間の実装の共有を拡大させました。また、シンロックが他のスレッドに所有されている場合にTryAcquireが過度にスピンする問題を修正しました。パフォーマンスはプラットフォームとロック方式に応じて最大+30%の改善を実現しており、一部で軽微な-3%程度の回帰が見られますが、これはハードウェア差による「アーキテクチャノイズ」と評価されています。

変更内容

  • ネイティブコード削除: syncblk.inl, syncblk.hのシンロック実装、comsynchronizable.cpp/.hのFCALL実装、ecalllist.hのFCALL/ecall マッピングを削除
  • マネージドコード実装(CoreCLR): ObjectHeader.CoreCLR.csにシンロック取得/解放ロジックを実装し、AcquireThinLock()とRelease()を公開
  • Monitor統合: Monitor.CoreCLR.csから157行削除し、新しいマネージドシンロックエントリポイントへのルーティングに変更
  • NativeAOT同期: ObjectHeader.NativeAot.csとMonitor.NativeAot.csを更新し、統一されたAcquireThinLock()エントリポイントに対応
  • ビルド設定: CMakeLists.txt、common.h、pal.hから不要なincludesと参照を削除

パフォーマンスへの影響

  • 改善: スループットで最大+30%の向上(プラットフォームとシンロック/ファットロック方式に依存)
  • 軽微な回帰: 一部シナリオで最大-3%
  • 評価: 小さな差異はコード生成やハードウェア差異(AMD Epyc 7763 vs AMD Ryzen 7950など)に由来する「アーキテクチャノイズ」と判断

関連Issue

なし

その他

  • 公開API仕様の変更なし(内部実装の移行)
  • CoreClrとNativeAOT間の実装共有が大幅に増加
  • FCALLサーフェスの削除により、マネージドコード割合が増加

目次