Pull Request on 2026年05月01日

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

注意点

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


目次

  1. #127653 Fix SIGBUS crash on ARMv7: use Unsafe.ReadUnaligned in Frozen.Hashing
  2. #127643 Always add ManagedDataDescriptorProvider to compilationRoots
  3. #127638 Fix !m_RedirectContextInUse assert in RestoreContextSimulated on win-x86
  4. #127632 Remove an unnecessary switch from GenTree:TryGetUse
  5. #127631 Delete FEATURE_AUTO_TRACE
  6. #127629 Removes unused/unreachable WinRT ContentType plumbing from assembly binding
  7. #127627 Add runtime-coreclr jit-cfg to CI pipeline monitor
  8. #127624 JIT: Simplify ifdef for R2R needsIndirectionCellArg condition in morph
  9. #127620 Fix GetUserString DEBUG validation to use length-bounded string construction
  10. #127619 [Wasm RyuJit] Use local's register type when loading it's value
  11. #127614 Change commit message topic to 'container image digests'
  12. #127571 Disable Collect_Aggressive_LargePages for R2R/CrossGen2
  13. #127560 [clr-ios] Advance past owning InterpreterFrame at StackFrameIterator::Init call sites
  14. #127549 Update DNNEVersion to 2.1.2
  15. #127528 Split the xarch specific data from register.h into its own file to match other platforms
  16. #127492 Re-enable OSX runtime-diagnostics legs
  17. #127491 [cDAC] turning a few heap into full dumps
  18. #127487 JIT: avoid store forward stall for struct params in GS frames
  19. #127395 [cDAC] Stack walk GC reference scanning and bug fixes (1/5)
  20. #127300 Remove ExInfo::m_hThrowable - use direct pointer for exception objects
  21. #126972 [NativeAOT] Add cDAC data descriptor infrastructure
  22. #126911 Move built-in array marshalling to managed and make olevariant.cpp Windows-only
  23. #125795 Include requesting assembly chain in assembly load failure exceptions

#127653 Fix SIGBUS crash on ARMv7: use Unsafe.ReadUnaligned in Frozen.Hashing

概要

ARMv7(Android Unity IL2CPPなど)でSystem.Collections.Frozen.Hashingのchar*からuint*へのキャスト時に発生するアンアライン32ビット読み取りによるSIGBUSクラッシュを修正します。ToFrozenSet<string>(StringComparer.Ordinal)を長さ≥4の文字列で呼び出す際の問題を解決します。

修正内容:

  • char*からuint*への直接デリファレンスをUnsafe.ReadUnaligned<uint>()に置き換え、アンアライン読み取りを安全に処理
  • 同じパターンが存在していたGetHashCodeOrdinalIgnoreCaseAsciiにも適用

変更内容

  • Hashing.cs — GetHashCodeOrdinalとGetHashCodeOrdinalIgnoreCaseAscii内のアンアライン読み取り箇所で、((uint*)src)[n]とuint* ptrUInt32ループをUnsafe.ReadUnaligned<uint>(ptr)に置き換え
  • using System.Runtime.CompilerServicesを追加

パフォーマンスへの影響

Unsafe.ReadUnaligned<uint>()はx86/x64環境での直接デリファレンスと同等のパフォーマンスを持つため、影響なし(アンアライン読み取りが許容される環境では最適化される、許容されない環境では正しい動作を提供)

関連Issue

なし

その他

この修正は内部実装(System.Collections.Frozenのハッシング機構)に限定される変更で、公開APIへの影響はありません。ARMv7などのアンアライン読み取りが制限される環境での実行時安定性向上が主な効果です。


#127643 Always add ManagedDataDescriptorProvider to compilationRoots

概要

NativeAOT ILCompiler でコンパイルエラー(unresolved external symbol DotNetManagedContractDescriptor)を解決するため、ManagedDataDescriptorProvider を compilationRoots に常に追加するように変更しました。これまでは --debug オプション有効時のみの追加でしたが、デバッグ情報の有無に関わらず無条件に追加するようにしました。

変更内容

  • src/coreclr/tools/aot/ILCompiler/Program.cs: --debug 条件の削除により、ManagedDataDescriptorProvider を NativeAOT コンパイレーションルーツに常に追加

パフォーマンスへの影響

影響なし(提供情報に基づく)

関連Issue

なし

その他

  • このコンパイレーション・インフラストラクチャの変更は、内部実装(ILCompiler ドライバ)の修正です
  • ランタイムの公開 API や破壊的変更は含まれません

#127638 Fix !m_RedirectContextInUse assert in RestoreContextSimulated on win-x86

  • 作成者: @Copilot
  • 作成日時: 2026年05月01日 05:32:22(UTC)
  • マージ日時: 2026年05月01日 21:47:37(UTC)
  • ラベル: area-VM-coreclr

概要

Windows x86環境において、RestoreContextSimulated内でHandleThreadAbort()が呼び出される際にm_RedirectContextInUseがまだtrueのままであるという問題を修正しました。この状態でGC redirectが発火するとMarkRedirectContextInUse()がアサーション失敗を引き起こしていました。修正により、x86 SEHパスとRtlRestoreContextパスが共通の中止チェックコードパスを共有するようになり、再入可能性ウィンドウが排除されます。

変更内容

  • src/coreclr/vm/threadsuspend.cpp
    • RestoreContextSimulatedからHandleThreadAbort()呼び出しを削除し、SEHベースのコンテキスト復元機構のみに簡潔化
    • RedirectedHandledJITCase内の既存COMPlusCheckForAbort()ブロック後に、x86用のRestoreContextSimulated呼び出しを移動
    • 共有フロー:CopyOSContext + COMPlusCheckForAbort()(両方NOTHROW/GC_NOTRIGGERで管理コードなし)が全プラットフォームで無条件実行され、中止が保留中の場合はIP をリダイレクト

パフォーマンスへの影響

影響なし

関連Issue

#127638

その他

  • プラットフォーム影響:Windows x86専用の修正(#ifdef TARGET_X86 / #ifndef TARGET_UNIXで保護)
  • 顧客への影響:チェック(デバッグ)ビルドでControlledExecution.Runやスレッド中止をトリガーするコードがGC redirectと競合する際にSTATUS_FAIL_FAST_EXCEPTIONでクラッシュしていた問題を解決。リリースビルドではアサーションで保護されていませんが、リダイレクトコンテキストが破損する可能性がありました
  • リスク評価:低リスク。新しいメカニズムを導入せず、既存の他プラットフォームで実証済みのパターンとの整合性を取るための変更

#127632 Remove an unnecessary switch from GenTree:TryGetUse

概要

JITコンパイラのGenTree::TryGetUseメソッドから不要な大規模なswitchステートメントを削除するリファクタリング。既存のオペレータ分類ヘルパー(OperIsLeaf、OperIsSpecialなど)を活用して、コードの簡潔性を向上させます。ARM64のGT_SELECT_{INC,INV,NEG}ノードを真の条件付き/特殊ノードに再分類しています。

変更内容

  • src/coreclr/jit/gtlist.h: ARM64のGT_SELECT_{INC,INV,NEG}ノードのフレーバー/種類を、バイナリGenTreeOpから条件付きGenTreeConditional / GTK_SPECIALに変更。
  • src/coreclr/jit/gentree.h: インスタンスメソッドOperIsSpecial()を追加。不要になったTryGetUseBinOpヘルパー宣言を削除。
  • src/coreclr/jit/gentree.cpp: GenTree::TryGetUseロジックを簡潔化。リーフ/特殊ノード分類と統一的なユナリ/バイナリパスを使用。TryGetUseBinOpヘルパーを廃止(+121行/-185行)。

パフォーマンスへの影響

影響なし(リファクタリングの簡潔化により、わずかなコンパイル時間の改善の可能性あるが、具体的なベンチマーク値は提供されていません)。

関連Issue

なし

その他

本変更はJITコンパイラの内部実装(gentree.h/cpp)に限定されており、公開APIへの影響はありません。ARM64固有のノード再分類により、ノード型の論理的な一貫性が向上しています。


#127631 Delete FEATURE_AUTO_TRACE

  • 作成者: @Copilot
  • 作成日時: 2026年05月01日 01:13:12(UTC)
  • マージ日時: 2026年05月01日 05:54:52(UTC)
  • ラベル: area-Tracing-coreclr

概要

FEATURE_AUTO_TRACE機能を完全に削除するPRです。AutoTraceはEventPipeを経由したDiagnostic Serverの自動ストレステスト用インフラストラクチャであり、環境変数DOTNET_AutoTrace_N_TracersとDOTNET_AutoTrace_Commandで制御されていました。デフォルトでは有効化されていませんでした。

変更内容

  • コア実装の削除: src/coreclr/vm/autotrace.cppおよびautotrace.hを削除
  • ビルド設定の更新: CMakeおよびfeatures定義からFEATURE_AUTO_TRACEブロックと関連エントリを削除
    • src/coreclr/vm/CMakeLists.txt
    • src/coreclr/clrfeatures.cmake
    • src/coreclr/clrdefinitions.cmake
  • 設定値の削除: src/coreclr/inc/clrconfigvalues.hからAutoTrace_N_TracersおよびAutoTrace_Command設定エントリを削除
  • EventPipe関連コードの削除: 以下のヘッダーおよび実装から条件付きコンパイルブロックを削除
    • src/coreclr/nativeaot/Runtime/eventpipe/ds-rt-aot.h
    • src/coreclr/vm/eventing/eventpipe/ds-rt-coreclr.h
    • src/mono/mono/eventpipe/ds-rt-mono.h
    • src/native/eventpipe/ds-rt.h
  • 呼び出し元の削除: src/native/eventpipe/ds-server.cからds_rt_auto_trace_*関連の呼び出しサイトを削除
  • ドキュメント削除: docs/workflow/testing/coreclr/automated-stress-testing-diagnostic-server.mdを削除

パフォーマンスへの影響

影響なし(テスト用インフラの削除であり、ランタイムの通常動作に影響しません)

関連Issue

なし

その他

  • このPRはGitHub Copilotの支援により作成されました
  • 削除対象の機能はデフォルトで無効化されており、外部ユーザーへの直接的な影響は限定的です

#127629 Removes unused/unreachable WinRT ContentType plumbing from assembly binding

  • 作成者: @Copilot
  • 作成日時: 2026年04月30日 23:11:30(UTC)
  • マージ日時: 2026年05月01日 14:01:45(UTC)
  • ラベル: area-AssemblyLoading

概要

CoreCLR ネイティブアセンブリバインダーおよび AssemblySpec から、使用されていない/到達不可能な WinRT ContentType プランビングを削除するクリーンアップ。3つのコミットに分割され、各ステップで不要になったコードを段階的に除去しています。

変更内容

  • Commit 1: BaseAssemblySpec::SetContentType と BINDER_SPACE::AssemblyName::SetContentType の未使用メソッドを削除。デフォルト値以外の content type は IsAfContentType_Default チェックで無効として処理。
  • Commit 2: WinRT ContentType の伝播パスが到達不可能となったため、以下を削除:
    • BaseAssemblySpec::InitializeWithAssemblyIdentity / PopulateAssemblyNameData 内の WindowsRuntime 伝播ロジック
    • GetTextualIdentity の WinRT 対応表示名パス
    • AssemblyName::Equals / Hash の WinRT 対応比較/ハッシュ分岐
    • AssemblyName::GetContentType アクセッサ
  • Commit 3: 到達不可能となった AssemblyIdentity::m_kContentType フィールドと関連プランビングを削除:
    • IDENTITY_FLAG_CONTENT_TYPE、AssemblyNameData::ContentType、INCLUDE_CONTENT_TYPE フラグ
    • ContentTypeToString ヘルパー、TextualIdentityParser::ToString の unreachable ContentType= 出力
    • バインダー内部の __AssemblyContentType typedef

パフォーマンスへの影響

影響なし。本変更はクリーンアップのため、機能削減や新規機能追加はなく、パフォーマンス特性に変化なし。

関連Issue

なし

その他

  • ビルド検証済み:./build.sh clr+libs で 0 警告、0 エラーで成功
  • 管理コード側の System.Reflection.AssemblyContentType と corhdr.h の afContentType フラグは本変更対象外(ilasm/ildasm、AOT ツールチェーンで継続使用)
  • GitHub Copilot の支援で作成

#127627 Add runtime-coreclr jit-cfg to CI pipeline monitor

概要

CI パイプラインモニターの追跡対象パイプライン一覧に runtime-coreclr jit-cfg(Control Flow Guard)を追加するドキュメント更新です。

変更内容

  • .github/skills/ci-pipeline-monitor/pipelines.md:
    • Pipeline Details テーブルに runtime-coreclr jit-cfg エントリを追加(スケジュール: Sat-Sun 22:00 UTC、説明: "Control flow guard.")
    • Cached Definition ID Mapping テーブルに対応エントリを追加(Def ID: 155、ID順序での位置: runtime-coreclr superpmi-asmdiffs-checked-release (ID 153) の後)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

なし


#127624 JIT: Simplify ifdef for R2R needsIndirectionCellArg condition in morph

概要

R2R(Ready-to-Run)のneedsIndirectionCellArg条件を判定するifdef チェーンをリファクタリング。条件をより明示的にし、アーキテクチャごとの動作をドキュメント化して可読性を向上。

変更内容

  • src/coreclr/jit/morph.cpp: CallArgs::AddFinalArgsAndDetermineABIInfo内のターゲットアーキテクチャ判定ロジックを簡素化
    • 従来の#ifndef TARGET_WASM + 入れ子の#if TARGET_XARCHパターンを、明示的な#ifdef TARGET_WASM / #elif TARGET_XARCH / #elseチェーンに変更
    • xarch の「fast tailcall はexplicit indirection cell arg が必須」というルールをboolean初期化子で明示的に表現
    • アーキテクチャごと(WASM/xarch/その他)の動作説明コメントを改善・再流す

パフォーマンスへの影響

影響なし(リファクタリング・ドキュメント化のみ)

関連Issue

#115375からのフィードバック対応

その他

JIT(Just-In-Time)コンパイラの内部実装変更。R2R実行可能ファイル生成時のindirection cell argument の処理ロジックに関わるが、公開APIへの影響なし。


#127620 Fix GetUserString DEBUG validation to use length-bounded string construction

概要

cDAC(Compact Data Access Component)のGetUserString DEBUG検証ロジックにおけるアサーション失敗を修正しました。検証ブロックが null 終端に依存した文字列構築を行っていたため、バッファ内の意図的に非 null 終端なデータを誤って読み込んでいました。長さ指定の文字列構築 new string(char*, 0, length) に変更することで、バッファの内容に関わらず安全に検証できるようにします。

変更内容

  • src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/MetaDataImportImpl.cs
    • GetUserString の DEBUG 検証ブロックで、null 終端に依存した new string(char*) を長さ指定の new string(char*, int startIndex, int length) に変更
    • 文字バッファの内容を正確に取得するため、既知の文字数に基づいた長さ指定の比較を実装
    • 検証ロジックに説明的なコメントを追加

パフォーマンスへの影響

影響なし(DEBUG ビルドのみの検証ロジック変更)

関連Issue

#127471

その他

この修正により、SOS(Source Object Server)統合テストが正常に実行されるようになります。元の実装は native 動作に正しく合わせて非 null 終端バッファを返していたため、問題は検証ロジックの側にありました。


#127619 [Wasm RyuJit] Use local's register type when loading it's value

概要

WebAssembly版RyuJITでレジスタに割り当てられた構造体型ローカル変数を読み込む際のアサーション失敗を修正しました。問題は、ローカル変数の読み込み時に、消費側ノードのIR型ではなくローカル変数のレジスタストレージ型を使用することで解決されます。

変更内容

  • src/coreclr/jit/codegenwasm.cpp: GT_LCL_VARコード生成時に、レジスタ候補のローカル変数について、LclVarDsc::GetRegisterType()からロード型を計算するように修正。INS_local_getの生成時に、ローカル変数のレジスタ型に基づいたemitTypeSize(type)を使用し、TYP_STRUCTベースのサイジング/アサーション失敗を回避しています。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

本修正はWasm向けコンパイルに限定された内部実装の変更であり、公開APIへの影響はありません。レジスタ割り当て済みのローカル変数、特に構造体型ローカル変数の処理時にアサーション失敗が発生していた問題の根本的な修正です。


#127614 Change commit message topic to 'container image digests'

概要

Renovateが生成するコミットメッセージのトピックを「container image dependencies」から「container image digests」に変更し、Docker イメージのピン留め更新に関するPRタイトルをより正確にします。デフォルトのRenovate用語である「dependencies」は曖昧であり、「digests」の方がレビュワーと マージ担当者にとってより明確です。

変更内容

  • eng/renovate.json: Renovateの設定で、パッケージルールのcommitMessageTopicを「container image dependencies」から「container image digests」に変更(+1/-1)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

この変更により、dotnet-renovate-botが生成するPRタイトルが「container image digests: ...」となり、単なる依存関係更新ではなく、Dockerイメージのダイジェスト(SHA256ハッシュ)ピン留めという性質がより明確に伝わります。これは開発者体験の向上を目的とした変更であり、実装ロジックの変更ではありません。


#127571 Disable Collect_Aggressive_LargePages for R2R/CrossGen2

概要

CrossGen2がR2R (Ready-to-Run) コンパイル時に6GiBのリージョンを確保することで、テストで設定されている3GiB の GCHeapHardLimit を超過し、GCヒープ初期化に失敗する問題を修正します。Collect_Aggressive_LargePages テストをR2R/CrossGen2 環境では無効化することで問題を回避します。

変更内容

  • src/tests/GC/API/GC/Collect_Aggressive_LargePages.csproj
    • R2R/CrossGen2 での実行を無効化するプロジェクト設定を追加 (+2/-0)

パフォーマンスへの影響

影響なし

関連Issue

#127541

その他

なし


#127560 [clr-ios] Advance past owning InterpreterFrame at StackFrameIterator::Init call sites

概要

インタプリタ内で一時停止したスレッドをスタックウォークする際、StackFrameIterator::Initがインタプリタコードを指すIPを含むCONTEXTで初期化できるよう改善します。従来はこの場合にアサーション失敗が発生していましたが、呼び出し側で所有するInterpreterFrameをスキップするよう要件を明確化し、その検証をアサーションで強制することで解決します。

変更内容

  • src/coreclr/vm/frames.h/cpp: InterpreterFrame::TryGetOwningFrameFromContext()を新規実装。IPがインタプリタコード内の場合、第1引数レジスタから所有するInterpreterFrameを復元。
  • src/coreclr/vm/stackwalk.cpp: StackFrameIterator::InitとResetRegDispでインタプリタIP対応のCONTEXTの場合、pStartFrameを所有するInterpreterFrameを越えるよう進める処理を追加。既存アサーションを"開始フレームが所有するInterpreterFrameであってはならない"という呼び出し側の不変条件検証に変更。
  • src/coreclr/debug/daccess/stack.cpp: DAC スタックウォーク初期化時、インタプリタIP対応時に所有するInterpreterFrameをスキップした開始フレームを渡すよう更新。
  • src/coreclr/debug/daccess/dacdbiimpl.cpp: DAC DBI "GC安全地点"プローブをインタプリタIP対応時に対応フレームをスキップするよう更新。

パフォーマンスへの影響

影響なし

関連Issue

#126953(フォローアップ対象)

その他

  • デバッガがインタプリタ一時停止スレッドのスタックウォークを行う際の既知の問題(checked-buildでのアサーション失敗)を修正
  • 内部実装の変更で、公開API への影響なし

#127549 Update DNNEVersion to 2.1.2

概要

DNNE (C# Native Interop)のバージョンを2.1.1から2.1.2に更新するパッチリリースです。#127414の修正に対応しています。

変更内容

  • eng/Versions.props: DNNEVersionを2.1.2に更新

パフォーマンスへの影響

影響なし

関連Issue

#127414

その他

なし


#127528 Split the xarch specific data from register.h into its own file to match other platforms

概要

JITコンパイラのレジスター定義をアーキテクチャ別に整理し、汎用的なregister.hから各プラットフォーム固有の定義をsplitして個別ファイル化しました。これにより他のプラットフォーム実装との一貫性を向上させています。

変更内容

  • register.h: 汎用定義のみを残し、アーキテクチャ固有の定義を削除(365行削除)
  • registeramd64.h: 新規ファイル作成、x64専用定義を集約(288行)
  • registerx86.h: 新規ファイル作成、x86専用定義を集約(140行)
  • registerarm.h/registerarm64.h/registerloongarch64.h/registerriscv64.h/registerwasm.h: 既存ファイルの調整と整理
  • CMakeLists.txt: 新規ファイル追加に伴うビルド設定の更新

パフォーマンスへの影響

影響なし

関連Issue

#127528

その他

なし


#127492 Re-enable OSX runtime-diagnostics legs

  • 作成者: @rcj1
  • 作成日時: 2026年04月28日 04:24:24(UTC)
  • マージ日時: 2026年05月01日 18:58:17(UTC)
  • ラベル: area-Diagnostics-coreclr

概要

macOS上でのruntime-diagnosticsパイプラインのcDAC dump-testレグが無効化されていた状況を解決するため、osx_arm64とosx_x64をデフォルトのcdacDumpPlatformsリストに再追加し、macOSのカバレッジを復活させるPRです。

変更内容

  • eng/pipelines/runtime-diagnostics.yml (+2/-5): デフォルトcDAC dump-testプラットフォームマトリックスにosx_arm64とosx_x64を追加
  • src/native/managed/cdac/tests/DumpTests/cdac-dump-helix.proj (+4/-0): macOSプラットフォームの設定を追加
  • src/native/managed/cdac/tests/DumpTests/cdac-dump-xplat-test-helix.proj (+4/-0): macOSプラットフォームの設定を追加

パフォーマンスへの影響

影響なし

関連Issue

#126435

その他

なし


#127491 [cDAC] turning a few heap into full dumps

  • 作成者: @rcj1
  • 作成日時: 2026年04月28日 03:57:49(UTC)
  • マージ日時: 2026年05月01日 06:24:14(UTC)
  • ラベル: area-Diagnostics-coreclr

概要

cDAC(Component Data Access)のダンプテスト において、前回のPRで過度にヒープダンプに変換されたいくつかのテストを、フルダンプに戻す修正です。CCW、RCW、BasicThreadsの3つのダンプターゲットがフルダンプに切り替えられました。

変更内容

  • ClrMdDumpHost.cs: ダンプホストのロジック変更(+37/-30)により、ダンプ生成処理を調整
  • 各テストファイル: CCWDumpTests、RCWDumpTests、ThreadDumpTests、RuntimeInfoDumpTests、および複数のDacDbiテスト(AppDomain、CCW、Debugger、GC、Object、RCW、Thread)に、フルダンプ設定フラグを追加(各ファイル+1)
  • プロジェクトファイル: BasicThreads.csproj(+3)、CCW.csproj(+1/-1)、RCW.csproj(+1/-1)の設定変更

パフォーマンスへの影響

フルダンプはヒープダンプより情報量が多いため、ダンプサイズおよび生成時間が増加する可能性があります。ただし、テスト環境での変更のため、本番環境への実行時パフォーマンス影響はありません。

関連Issue

なし

その他

この変更は、DacDbi(Debug Assistant Component - Debugger Interface)ダンプテストの回帰を修正するものです。内部テストの修正であり、公開APIへの影響はありません。


#127487 JIT: avoid store forward stall for struct params in GS frames

概要

GS(Guard Stack)フレームにおいて、マルチレジスタ構造体パラメータのコピー時に、スピル時の狭い幅の書き込みとコピー時の広い幅の書き込みのミスマッチによるストア・フォワード・スタッシュを回避します。SIMD命令を使用した広幅コピーを避け、整数レジスタサイズのコピーを強制することで最適化します。

変更内容

  • src/coreclr/jit/lowerxarch.cpp: ブロックコピー元がマルチレジスタ引数ローカル変数の場合、SIMD適格性を無効化してアンロール展開時のSIMD使用を防止
  • src/coreclr/jit/lsraxarch.cpp: マルチレジスタ引数ローカル変数からのアンロール展開ブロックストア時に、SIMDテンポラリの割り当てを回避し、整数テンポラリを確保
  • src/coreclr/jit/codegenxarch.cpp: マルチレジスタ引数ソースに対するSIMDアンロール展開コピー出力をスキップ、GPRサイズの移動にフォールバック
  • src/coreclr/jit/compiler.h: 定義の微調整(+2/-2行)

パフォーマンスへの影響

ストア・フォワード・スタッシュの回避による性能改善が期待されます。GS フレームにおけるマルチレジスタ構造体パラメータのコピー処理の最適化により、メモリサブシステムの効率が向上します。

関連Issue

#121248

その他

この変更はx86/x64 JITコンパイラの内部実装(ローリング、LSRA、コード生成)に関するもので、公開APIへの影響はありません。GS フレームは.NETランタイムのセキュリティ機構の一部であり、この最適化はスタック保護メカニズムの性能を改善するものです。


#127395 [cDAC] Stack walk GC reference scanning and bug fixes (1/5)

概要

cDAC(Compact Data Access Contract)スタックウォーク機能の第1段階として、GC参照スキャニングとスタックウォーカーの修正を実装します。これにより、遷移フレーム経由のGCルート列挙、GCRefMap/署名ベースのスキャニング、例外フレーム状態追跡が可能になります。本PRは5部構成の予定の第1部です。

変更内容

  • GC参照スキャニング実装:GCRefMapDecoder、GcSignatureTypeProviderを追加し、ReadyToRun import sectionの解決機能を実装
  • スタックウォーカー修正:フレームIsFirstフラグの保持、例外フレームのIsInterrupted状態追跡、返却アドレス取得のゲーティング
  • Contract API拡張:
    • IGCInfo: EnumerateLiveSlots、GetStackBaseRegister、GetInterruptibleRangesを追加
    • IExecutionManager: FindReadyToRunModuleを追加
    • IRuntimeTypeSystem: RequiresInstArg、IsAsyncMethodを追加
    • IStackWalk: WalkStackReferencesを追加
  • データ記述子更新:TransitionBlock、ReadyToRunInfo、ExceptionInfo、StubDispatchFrame、ExternalMethodFrame、DynamicHelperFrameのフィールド追加
  • ドキュメント整備:GCInfo.md、StackWalk.md、ExecutionManager.md、RuntimeTypeSystem.mdに詳細な実装ドキュメント追加

パフォーマンスへの影響

影響なし

関連Issue

#126408(スタック分割前の統合PR)

その他

  • テスト状況:1727/1751ユニットテスト合格(既知の24件のThreadTests失敗は本体に存在)
  • 検証方法:StackWalkDumpTests、StackReferenceDumpTestsでエンドツーエンド検証
  • 5部構成の全体計画:
    • PR 1(本PR):スタックウォーク修正 + GCスキャニング
    • PR 2:RuntimeSignatureDecoder (ELEMENT_TYPE_INTERNAL)
    • PR 3:ArgIteratorの移植(crossgen2から)
    • PR 4:ネイティブストレステストフレームワーク
    • PR 5:マネージドストレステスト + CI パイプライン
  • 破壊的変更:なし(内部実装とContract拡張のみ)

#127300 Remove ExInfo::m_hThrowable - use direct pointer for exception objects

概要

ExInfo構造体の冗長なGCハンドルベースのm_hThrowableフィールドを削除し、既存のm_exception OBJECTREFフィールドへの直接ポインタの使用に統一します。これにより例外スロー時の割り当て/解放のオーバーヘッド(~5個のインターロック操作)とポインタ間接参照を削減し、NativeAOTのアプローチに合わせます。

変更内容

ランタイムコア(破壊的変更なし、内部実装):

  • ExInfoからm_hThrowableを削除(x64で8バイト、x86で4バイト削減)
  • m_exceptionOBJECTREF への直接アクセスに統一
  • gcenv.ee.cppのScanStackRootsにExInfoチェーンのGCルートスキャン機能を追加し、スーパーセドされた例外オブジェクトをハンドルなしで保持
  • ディスパッチエントリポイント3箇所のGCPROTECT_BEGIN(exInfo.m_exception)を削除(チェーンスキャンがGCに報告済みのため、重複報告はGCの再配置ロジックを破損)
  • GetThrowableAsPseudoHandle()を追加(m_exceptionのターゲットアドレスを疑似ハンドルとして返す、DAC互換性のため)
  • GetThrowableAsHandle() とSetThrowable()を削除
  • StackTraceInfo::AppendElementの事前割り当て例外チェックをIsPreallocatedExceptionHandleからIsPreallocatedExceptionObject(ObjectFromHandle(...))に修正
  • マネージドEH最適化アセンブリオフセット定数を更新

Interop伝播(APIシグネチャ変更):

  • コールバック署名をOBJECTHANDLEからOBJECTREFに変更(interoplibinterface_shared.cpp, interoplibinterface_objc.cpp)
  • ハンドル逆参照処理を削除

デバッガ/DAC(診断ツール向けAPI):

  • DAC: GetCurrentExceptionとGetThreadExceptionはExInfoからm_exceptionを直接読み込み、m_LastThrownObjectHandleへのフォールバック維持
  • cDAC: ThrownObjectHandle→ThrownObject(直接ポインタ、ハンドル逆参照なし); 後方互換性のためGetCurrentExceptionHandleは疑似ハンドルを返す
  • Thread::m_LastThrownObjectHandleは保持(ICorDebug マネージドデバッグプロトコル互換性のため)

テスト/検証:

  • AsmOffsetアサーションで全フィールドオフセット検証済み

パフォーマンスへの影響

改善:

  • 例外スロー時の削減: ~5個のインターロック操作、ハンドルテーブルスロット割り当て/解放、ポインタ間接参照1段階削減(2ホップ→1ホップ)
  • ExInfo構造体8バイト(x64)サイズ削減
  • ディスパッチエントリポイント3箇所のGCFrame構築削減

コスト:

  • GC実行時、スレッドあたり~2ポインタ読み込み(ExInfoチェーンウォーク追加)

#126972 [NativeAOT] Add cDAC data descriptor infrastructure

概要

NativeAOT向けのcDAC(Common Data Access Contract)データディスクリプタインフラストラクチャを追加し、診断ツール(cDAC reader、SOS)がNativeAOTランタイム状態をCoreClRと同じコントラクトベースのメカニズムで検査できるようにします。スレッド情報、MethodTable、メモリアロケーション、GCデータなどのランタイム構造体オフセットと、ILCコンパイル時に生成されるマネージド型レイアウト副記述子により、デバッグツールの相互運用性を実現します。

変更内容

  • ネイティブデータディスクリプタ(datadescriptor.inc): Thread、ThreadStore、MethodTable、ExInfo、GCAllocContext、StressLogなどの構造体定義、グローバル変数、および4つのコントラクト(Thread n1、Exception c1、RuntimeTypeSystem n1、StressLog c2)を定義
  • cdac_data<>フレンドパターン: threadstore.h、MethodTable.h、RuntimeInstance.h等でプライベートオフセットと定数をディスクリプタに公開
  • ILC管理型記述子ノード(ManagedDataDescriptorNode): [DataContract]属性で注釈されたマネージド型(System.Threading.Threadなど)のフィールドオフセットをコンパイル時に計算し、Utf8JsonWriterで型レイアウトをJSON形式でエンコード。DotNetManagedContractDescriptorシンボルとして射出
  • GC副記述子対応: ワークステーション/サーバーGCの両GC記述子をNativeAOTビルドに統合、HEAP_ANALYZEガードを追加
  • 属性ベース型検出: System.Diagnostics.DataContractAttribute(内部、Class/Struct/Fieldをターゲット)を新規追加し、Thread.NativeAot.csに適用、ILCがGetTypesWithEETypes()でスキャン
  • ビルド統合: CMake、cdac-build-tool対応、共有clrdatadescriptors.cmakeインフラ活用、WASM除外、Microsoft.NETCore.Native.targetsでシンボル公開(--export-dynamic-symbol)
  • ILC コンパイル根: Program.csに管理型記述子プロバイダーを追加、新規プロバイダー/ノードクラスをILCompiler.Compiler.csprojに包含

パフォーマンスへの影響

影響なし。このPRはディスク上の記述子データ生成と検査インフラの追加で、ランタイム実行パスに直接影響しません。

関連Issue

なし

その他

  • コントラクトバージョン戦略: NativeAOT固有はn1、CoreClRとの共有はc1/c2(同一バージョン)
  • ThreadStore: CoreClRと同じSPTR_DECL/SPTR_IMPLパターンを使用
  • シングルトンノード: ManagedDataDescriptorNodeはCompareToImplをオーバーライドせず、ILCシングルトンパターンに準拠
  • 検証: ビルド成功(警告・エラーなし)、全cDAC reader・cdacツールテスト合格(1586/1586)、シンボル

#126911 Move built-in array marshalling to managed and make olevariant.cpp Windows-only

概要

配列マーシャリング(LPArray、固定配列、SAFEARRAYコンテンツ処理)ロジックをネイティブコード(olevariant.h/cpp)から管理コード(StubHelpers.cs)に移行するPRです。これによりolevariant.cpp全体をWindows専用化でき、WASMでのマーシャリングロジック削除時の対応が容易になります。併せて、従来のSAFEARRAY向けに設計されたVTHACK_*定数を削除しています。

変更内容

  • StubHelpers.cs: 管理コード汎用配列マーシャラーフレームワークを追加し、AsAnyマーシャラーを書き直し(+1099/-704行)
  • olevariant.cpp/h: ネイティブLPArray/固定配列変換ロジックを削除、SAFEARRAY APIを管理コンバーター呼び出しに対応。ファイル全体をWindows専用化(+402/-1904行)
  • ilmarshalers.cpp/h: ネイティブ/固定配列マーシャリング呼び出しを管理汎用配列ヘルパーへ切り替え、SAFEARRAYマーシャラーをコンバーターPCODE保持に更新
  • fieldmarshaler.cpp/h: グローバルVARTYPEマッピング/ネイティブMT取得ヘルパーを新規実装
  • mlinfo.cpp/h: マーシャリング構造体にelementNativeTypeを通す
  • qcallentrypoints.cpp: 非推奨のMngd*ArrayMarshaler用QCallエントリ削除
  • テスト追加: 2D SAFEARRAY用の新規COM対応テスト(SafeArrayTest.cs、SafeArrayNative.cpp)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 互換性: 内部実装の移行であり、公開APIレベルでの破壊的変更なし
  • ビルドシステム: CMakeLists.txtでolevariant.*をWindows専用ソース・ヘッダーリストに移行
  • 複数ファイルでの散開: interopconverter.cpp、comcallablewrapper.cpp、ceemain.cpp、binder.cpでのolevariant.hインクルード削除により、Windowsのみの依存性を明確化

#125795 Include requesting assembly chain in assembly load failure exceptions

  • 作成者: @Copilot
  • 作成日時: 2026年03月19日 19:11:38(UTC)
  • マージ日時: 2026年05月01日 16:07:27(UTC)
  • ラベル: area-AssemblyLoading

概要

アセンブリロード失敗時の例外診断を改善し、依存関係の欠落や無効性の際に、ロード失敗をトリガーした要求元アセンブリのチェーンを追跡・表示するようにしました。これにより複雑な依存関係のシナリオでも開発者はロード失敗の原因を特定しやすくなります。

例:

System.IO.FileNotFoundException: Could not load file or assembly 'LibC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
Requested by: LibB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 --> LibA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 --> helloworld, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

変更内容

マネージド例外クラス(公開API)

  • BadImageFormatException、FileLoadException、FileNotFoundExceptionに_requestingAssemblyChainフィールドを追加
  • ToString()メソッドを拡張し、"Requested by: ..."セクションを表示
  • 新しいローカライズ対応リソース文字列IO_FileLoad_RequestedByを追加

ランタイム/アセンブリバインディング(内部実装)

  • CoreCLRのAssemblySpecBindingCacheから親(要求元)アセンブリをクエリできる新メソッドを実装
  • アセンブリバインディングチェーンを深さ10まで走査してチェーンを構築
  • EEFileLoadExceptionを更新し、要求元アセンブリチェーンをキャプチャ・伝播
  • アンマネージド→マネージド例外生成パスを更新し、チェーンをマネージド例外コンストラクタに渡す
  • appdomain.cpp/hppとassemblyspec.cpp/hppにヘルパー関数を追加(FindCachedParentAssembly等)

テスト

  • 3つのテストアセンブリ(MissingDependency.Root、MissingDependency.Mid、MissingDependency.Leaf)を追加
  • 推移的依存関係が欠落した際に例外メッセージにチェーンが表示されることを検証

パフォーマンスへの影響

ベンチマーク結果なし。ロード失敗時のみチェーン構築処理が動作するため、通常のロード成功時には影響なし。チェーン構築はバインディングキャッシュの反復処理で、深さ制限は10に設定されている。

関連Issue

#9185

その他

チェーンは最良努力ベース。アセンブリが複数の異なる親により要求される場合、イテレーション中に見つかった最初にキャッシュされたアセンブリの親を使用。CoreCLRコンパイラまたはランタイムの変更ですが、マネージド例外のToString()出力のみに影響し、破壊的変更ではありません(新パラメータは内部パスでのみ使用)。


目次