Pull Request on 2026年06月27日

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

注意点

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



#129925 [11.0p6] Upgrade Emscripten to 5.0.6 & LLVM to 23

概要

.NET 11.0p6ブランチにおいて、WebAssemblyツールチェーンを大幅にアップグレードします。Emscripten 3.1.56/LLVM 19 から Emscripten 5.0.6/LLVM 23 への移行に伴い、WASM例外処理(exnref)、pthreadワーカーのブートストラップ、ローダー機能検出、ランタイム互換性を更新します。

変更内容

ツールチェーン・依存関係:

  • Emscripten を 5.0.6、LLVM を 23 へアップグレード
  • eng/Versions.props, eng/Version.Details.xml/props で各種ライブラリバージョンを刷新

WASM例外処理・ローダー関連:

  • exceptionsFinal 機能フラグへの切り替え(bootstrap.ts)
  • LLVM 23対応の例外処理実装(mini-llvm.c で NaN安全型狭窄化ヘルパーを削除、mini-exceptions.c で GCHandle 経由例外ルート化)
  • try_table/tag インデックスサポート追加(jiterpreter-support.ts)

pthreadワーカーモデル:

  • 従来の dotnet.native.worker.mjs 分離ファイルを廃止
  • ワーカーが メインモジュール経由でブートストラップ(loader/run.ts, pthreads/ui-thread.ts)
  • BootJsonData でワーカーリソースマッピングを TFM バージョン条件ゲート化

テスト・ランタイムの更新:

  • Mono ActiveIssue ゲーティング削除(複数の IL/C# テスト)
  • gshared ABI ストラドリング型テスト追加(StraddlingVtypeAbi.cs/csproj)
  • 全プラットフォーム TLS 構造体オフセット更新
  • System.IO.FileSystem 時間精度テスト リファクタ(ブラウザ特別扱い削除)
  • WASM ランナーテンプレートに exnref フラグ追加

CI/ビルド:

  • V8 テスト無効化(exnref サポート未対応による)
  • Helix への WASM ランタイムテスト送信を V8 時は無効化
  • LLVM パイプライン PR パスフィルタ拡大

ファイルシステム:

  • FileStatus.Unix.cs でブラウザ/WASI futimens 特別扱い削除

パフォーマンスへの影響

提供情報に具体的なベンチマーク数値記載なし。ただし、LLVM 23 へのアップグレードに伴うコード生成最適化、 wasm-opt に multivalue/reference-types フラグ追加による最適化が期待されます。ワーカーブートストラップの変更は初期化経路簡略化を意図していますが、詳細な影響は測定結果待ちです。

関連Issue

#129299(バックポート元)

その他

  • このPRは 11.0p6 ブランチへのバックポートであり、main ブランチの変更を遡及適用
  • V8 との互換性未確立により、複数パイプラインシナリオを無効化・コメント化(runtime.yml の WasmTestOnV8 など)

#129917 JIT/wasm: keep EH frame slots at the bottom after frame alignment

概要

WASM EH(Exception Handling)フレームスロットの固定位置をフレームアライメント後も保持するための修正です。#129815で追加されたアライメントパディングによってWASM EH関連スロットがフレーム底部から移動し、EHディスパッチが破損していた問題を解決します。

変更内容

  • src/coreclr/jit/lclvars.cpp: Compiler::lvaAlignFrame()のWASM固有ロジックを更新
    • アライメントパディング計算をcompLclFrameSizeの変更前に実施
    • パディング適用時に、WASM EHスロット(lvaWasmFunctionIndex、lvaWasmVirtualIP、lvaWasmResumeIP)をパディング量分下にシフト
    • FP相対オフセットの最終位置を変更しない

パフォーマンスへの影響

影響なし

関連Issue

#129815

その他

内部実装の修正です。フレームレイアウト不具合によるWASM上でのEH処理の動作復旧が目的であり、ユーザー向けの破壊的変更はありません。


#129916 [cDAC] fix some stack walking bugs.

  • 作成者: @rcj1
  • 作成日時: 2026年06月26日 23:25:10(UTC)
  • マージ日時: 2026年06月27日 13:57:27(UTC)
  • ラベル: area-Diagnostics-cdac

概要

cDAC(Compact Data Access Contract)のStackWalk実装に関する2つのバグを修正しました。

  1. FuncEvalFrameのリターンアドレス取得バグ: FuncEvalFrame::m_ReturnAddressフィールドを直接読み取るよう修正
  2. フレーム状態遷移バグ: Frame状態でアンマネージドコンテキストの場合の状態遷移ロジックを修正し、不正なFrame → NativeMarker遷移を防止

内部診断テストで検出されました。

変更内容

  • FuncEvalFrame.cs: ReturnAddressフィールドをマネージドcDACデータモデルに追加
  • StackWalk_1.cs: 既にFrame状態でアンマネージドコンテキストの場合、NativeMarkerに遷移しない状態遷移ロジックを修正
  • FrameHelpers.cs: FuncEvalFrame.ReturnAddressを使用してリターンアドレスを計算するよう変更
  • frames.h: FuncEvalFrame::m_ReturnAddressオフセットをcDACデータとして公開
  • datadescriptor.inc: FuncEvalFrame.ReturnAddressデータディスクリプタフィールドを追加
  • StackWalk.md: 新しいFuncEvalFrame.ReturnAddressディスクリプタの依存関係をドキュメント化
  • テスト関連: TypedView.csおよびMockDescriptors.Frame.csにテストサポートコードを追加

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

この修正はランタイムの診断機能(スタックウォーキング)に関わる内部実装の修正であり、公開APIには影響を与えません。CoreCLRのフレームセマンティクスをより正確にcDACで反映することが目的です。


#129914 JIT: fix stale VN in redundant branch opts dominating-branch simplification

  • 作成者: @EgorBo
  • 作成日時: 2026年06月26日 21:35:38(UTC)
  • マージ日時: 2026年06月27日 21:38:20(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITの冗長分岐最適化(Redundant Branch Opts)における値番号の陳腐化バグを修正。optRedundantDominatingBranchがドミネータツリーを走査する際に、中間の関係演算子を書き直した後も古い値番号でキャッシュされた値を使用していたため、不正な分岐の除去が発生していました。StreamReader.ValidateArgsAndOpenPathの条件ロジックが誤って最適化される具体例が報告されています。

変更内容

  • redundantbranchopts.cpp: 開始ブロックの関係演算子が書き直された直後に、treeNormVN(開始ブロックの条件の値番号)を再計算する処理を追加(5行追加、1行削除)
  • Runtime_128062.cs: 回帰テストを新規追加。bufferSize != -1チェック後にArgumentOutOfRangeException.ThrowIfNegativeOrZero(bufferSize)を呼び出すパターンをテスト
  • Regression_ro_2.csproj: テストプロジェクトへのテストケース参照を追加

パフォーマンスへの影響

影響なし。本修正は不正な最適化を抑制するもので、SuperPMI検証で~530Kコンテキストに対してアセンブリ差分はゼロ。

関連Issue

#128062、#127181

その他

  • レグレッションは#127181で導入された
  • libraries-pgo / jitosr_stress_randomテスト環境で露出
  • 修正は簡潔(わずか数行の変更)で、ドミネータツリー走査中の各イテレーション時に最新の値番号で推論することを保証

#129911 AES-KWP Performance Improvements for Apple

概要

Apple プラットフォーム上での AES-KWP (AES Key Wrap with Padding) パフォーマンスを大幅に改善します。従来は ECB 暗号化/復号化の呼び出し毎にハンドル設定・破棄を繰り返していたのに対し、単一の lite cipher インスタンスを再利用することで 5〜10 倍のパフォーマンス向上と大幅なメモリ割り当ての削減を実現します。

変更内容

  • Aes.cs: RFC 3394 ラップ/アンラップ処理に ECB 変換デリゲートを注入可能にする内部ヘルパーメソッドを追加。既存の protected virtual 実装との互換性を維持。
  • AesImplementation.Apple.cs: Apple 固有の EncryptKeyWrapPaddedCore/DecryptKeyWrapPaddedCore オーバーライドを追加。単一の AppleCCCryptorLite インスタンスをラップ/アンラップ全体で再利用し、セットアップオーバーヘッドと割り当てを削減。

パフォーマンスへの影響

実行速度の改善:

  • [1, 8] バイト: パフォーマンス変化なし
  • (8, 512] バイト: 約 5 倍高速化
  • (512 以上) バイト: 約 10 倍高速化

メモリ割り当ての改善:

  • 入力長 512 バイト以上で劇的に削減。例として 4096 バイト入力の場合、従来は 221,192 バイト割り当てていたのに対し、変更後は 72 バイトに削減(約 3,000 分の 1)。
  • 割り当ては入力サイズに関わらず定量化。

具体例 (ベンチマーク結果より):

  • 16 バイト入力: 3,539.1 ns → 633.2 ns (約 5.6 倍)、864 B → 72 B
  • 512 バイト入力: 110,421.3 ns → 11,922.3 ns (約 9.3 倍)、27,649 B → 72 B

関連Issue

なし

その他

  • Windows プラットフォーム向けの同様の最適化はフォローアップ PR で対応予定。
  • 基盤実装の protected virtual インターフェースは変更なく、互換性が保たれています。

#129906 Disable OpenBSD execute-only for NativeAOT stubs

概要

OpenBSD上でNativeAOT生成バイナリがスタートアップ時に即座に終了する問題を修正しました。OpenBSDのexecute-only機能が有効な場合、バイナリヘッダーの実行フラグが競合を引き起こしていたため、リンカオプション--no-execute-onlyを追加して無効化しています。

変更内容

  • src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets: NativeAOTスタブのリンク処理にOpenBSD向けの条件分岐を追加し、--no-execute-onlyフラグをリンカコマンドに追加(+6/-2)

パフォーマンスへの影響

影響なし

関連Issue

#124911

その他

本修正により、OpenBSD 7.8上でNativeAOT公開アプリケーション(ASP.NET Core Web APIなど)が正常に起動・動作することが確認されています。


#129903 JIT/wasm: pass type-context arg for LDVIRTFTN calls

概要

WebAssemblyにおいて、仮想関数呼び出しがLDVIRTFTN経由でルーティングされる際に、ジェネリック型コンテキスト引数(CORINFO_CALLCONV_PARAMTYPE)が欠落していた問題を修正します。特に多次元配列のAddressアクセッサなど、型情報を必要とするメソッドへの呼び出しでシグネチャ不一致によるランタイムトラップが発生していました。修正では、隠し引数の計算を共有ヘルパーimpGetInstParamArに抽出し、Wasm LDVIRTFTN経路でも使用するようにしました。

変更内容

  • src/coreclr/jit/importercalls.cpp: 新たにimpGetInstParamArgヘルパーメソッドを追加し、型コンテキスト引数の計算ロジックを共有化。Wasm LDVIRTFTN経路でsig->hasTypeArg()時にこのヘルパーを呼び出し、インスタンス化パラメータを挿入します。
  • src/coreclr/jit/compiler.h: Compiler::impGetInstParamArgメソッドを宣言。

パフォーマンスへの影響

影響なし。ヘルパー抽出は動作上中立的で、新規コードは#ifdef TARGET_WASMでWebAssembly固有の変更です。x64 SuperPMI検証で約2.7M個のコンテキストに対してアセンブリ差分なしを確認。

関連Issue

#129622(本修正はこのIssueのwasm-R2Rサブセット)

その他

  • ローカルWasm Pri-1 R2Rテスト実行結果: +1242テスト成功、16個中14個のラッパーハードクラッシュが解決、リグレッションなし
  • 残存する2つの失敗は既知のEH/インフラ関連の問題で、本修正と無関係

#129899 [release/10.0] Fix TypeLoadException in GetMarshalAs when SafeArray has zero-length user-defined type name

概要

.NET 9での回帰により、MetadataImport.GetMarshalAsがメタデータブロブの長さ付きの文字列をヌル終端として誤読し、ガベージメモリを読み込んでいた問題を修正します。tlbimp生成のCOM相互運用アセンブリ(例:Interop.MFilesAPI)で、ParameterInfoのCustomAttributes取得時にTypeLoadExceptionが発生していました。

修正内容:

  • GetMarshalAsをFCALLからQCallに変換し、返されたポインタに明示的なUTF-8バイト長を追加
  • マネージド側で有界スパンデコーディングを使用し、ヌル終端読み込みを回避
  • メタデータブロブの後続バイトを不正に拒否していたネイティブアサートを緩和

変更内容

  • MdImport.cs: LibraryImport QCallに切り替え、返された文字列を明示的な長さ(有界スパン)を使用してデコード
  • managedmdimport.hpp/cpp: GetMarshalAsをQCallに移行、文字列バイト長のアウトパラメータを追加
  • mlinfo.cpp: SAFEARRAY/CUSTOMMARSHALER FieldMarshalブロブの後続バイトを不正に拒否していたデバッグアサートを削除
  • qcallentrypoints.cpp: 新しいMetadataImport_GetMarshalAs QCallエントリポイントを登録
  • ecalllist.h: 古いFCALLエントリを削除
  • MarshalAsAttributeTests.cs: ゼロ長SAFEARRAY UDT名シナリオの回帰テストを追加(PersistedAssemblyBuilderでFieldMarshal blobを構築)

パフォーマンスへの影響

影響なし

関連Issue

#124346、#129889、#124408

その他

  • 回帰元: .NET 9のコミット a3dc1337でGetMarshalAsがマネージド文字列返却からraw byteポインタ返却に変更された際に発生
  • リスク: 低 - メタデータblobの解析に限定され、有界スパン読み込みとアサート削除はSAFEARRAY/CUSTOMMARSHALER復号パスのみに影響
  • テスト: 回帰テストが追加済み

#129884 Avoid stripping IL of non-async Task-returning methods

概要

ReadyToRun IL body stripping処理を改善し、--strip-il-bodiesが有効な場合でも、ランタイムでのコンパイルに必要となる可能性があるメソッドの実IL を保持するようにしました。特に非async Task/ValueTask返却メソッドは、async版がランタイムで生成される際にそのILが必要になるため、最小限のthrowingスタブへの置き換えを回避します。

変更内容

  • CopiedMethodILNode.cs: IL stripping判定ロジックをMayNeedILAtRuntimeヘルパーメソッドに集約
    • 既存の「non-genericのみ」という条件を置き換え
    • generic メソッド/型に加え、非async Task/ValueTask返却メソッドのILも保持対象に追加

パフォーマンスへの影響

IL body stripping時により多くのメソッドのILが保持されるため、ReadyToRun バイナリのサイズが増加する可能性があります。ただし、ランタイム時のJIT コンパイル発生を抑制し、async版メソッドの動的生成をサポートすることで、実行時の処理効率が向上する可能性があります。

関連Issue

#129884

その他

この変更はReadyToRun (R2R)コンパイラの内部実装に関連するもので、公開APIへの影響はありません。Task/ValueTask返却メソッドの async 対応が必要なシナリオにおいて、IL stripping による問題を回避します。


#129827 [cdac] Add default (empty-version) contract registration logic

概要

cdac(Contracts as Data Contract)フレームワークにデフォルト(空文字列バージョン)のコントラクト登録ロジックを導入します。対象がコントラクトのバージョンを広告しない場合のフォールバック機構を確立します。

  • Register("", creator) で空文字列バージョンの実装を登録
  • 対象がバージョンを広告しない場合、空文字列登録にフォールバック
  • 対象がバージョンを広告する場合は完全一致が必須(フォールバックなし)→ バージョンスキュー検出を保持

変更内容

  • CachingContractRegistry.cs — TryGetContract で空文字列バージョンのフォールバック処理を実装(内部実装)
  • ContractDescriptorBuilder.cs — TryCreateTarget がオプショナルな contractRegistrations パラメータを受け入れ、テストでのコントラクト登録が可能に
  • ContractRegistrationTests.cs (新規) — 公開 API Target.Contracts 経由で本番環境の CachingContractRegistry をテスト。全標準アーキテクチャで以下をカバー:
    • バージョン未広告 → デフォルト登録にフォールバック
    • バージョン未広告&デフォルト登録なし → 失敗
    • バージョン広告 → バージョン登録がデフォルトより優先
    • バージョン広告&実装なし → バージョンスキュー失敗(フォールバックなし)

パフォーマンスへの影響

影響なし

関連Issue

#129675

その他

  • 全 cdac ユニットテスト合格: Microsoft.Diagnostics.DataContractReader.Tests 2611 passed / 16 skipped / 0 failed(新規テストケース 16 含む)、DataGenerator.Tests 34/34
  • この変更は #129675 からの抽出であり、スタンドアロン機能として独立している

#129769 [cDAC] ArgIterator stress validation: enable byte-identical GCRefMap blobs across x64/x86 and wire ARGITER sub-check into Helix

概要

cDACのArgIteratorポートを拡張し、ランタイムのComputeCallRefMapと完全に一致するGCRefMapブロブを生成できるようにしました。Windows x64/x86で0失敗を達成し、ARGITER検証パスをHelixに統合してCI上で回帰を検出します。

変更内容

公開API追加(ICallingConvention):

  • TryComputeArgGCRefMapBlob(MethodDescHandle, out byte[]) -- ストレステスト用の主要API。非対応のABIパスではfalseを返す
  • IByRefLike(TypeHandle) -- Span<T>等のrefструкт検出
  • IsUnboxingStub(MethodDescHandle) -- アンボックススタブのthisスロット処理
  • GetFieldDescApproxTypeHandle(TargetPointer) -- フィールド型の解決

引数列挙エンコーダ:

  • 構造化引数(GCポインタ埋め込み)、ByRefLike構造体、VarArgs(__arglist)、x86特有のパス(スタックポップ、非単調なオフセット処理)に対応

ストレステスト統合:

  • cdacstress.cppにARGITERサブチェック実装:毎回のマネージド割り当てで全スタック上のMethodDescについて検証
  • xUnit理論でGCRefStress_AllVerificationsPass(全プラットフォーム)とArgIterStress_AllVerificationsPass(Windows x86/x64のみ)を定義
  • 新規CallSignaturesデバッギー:310+個の引数形状パターンを網羅
  • 新規DACSTRESSPRIV_REQUEST_COMPUTE_ARG_GCREFMAPプライベートDAC要求オペコード

コード共有化:

  • ArgIterator/TransitionBlockをITypeHandle抽象化で汎用化し、crossgen2とcDAC間で再利用可能に
  • SystemVAmd64PassingDescriptor等の呼び出し規則型をCommon配下に移動

CI拡張:

  • runtime-diagnostics.ymlにwindows_x86をcdacStressPlatformsに追加

パフォーマンスへの影響

影響なし。検証ロジックはストレステスト専用で本番コードパスに影響しません。

関連Issue

なし

その他

スコープ(検証済み):

  • Windows x64: 292通過 / 0失敗 / 0エラー
  • Windows x86: 311通過 / 0失敗 / 0エラー

スコープ外(フォローアップ):

  • Linux/macOS x64: SystemV-AMD64構造体内レジスタ分類未実装
  • Windows/Linux ARM64: HFA/HVA検出未実装
  • Linux ARM32: 共有ArgIterator移植途上
  • RISC-V/LoongArch64: FP構造体分類未実装
  • WASM32: フィールド配置未実装

Helixマトリクスは全6メインラインプラットフォームで実行;ARGITER理論はWindows x86/x64に限定、他はスキップメッセージ付き。


#129662 Cleanup dead delegate code

概要

デリゲート実装の死亡コード(使用されていないコード)を削除し、実装を簡潔にするクリーンアップです。#99200から分割されたPRで、CoreCLR、Mono、診断ツール(DAC)にまたがるデリゲート関連の不要なコードを整理します。

変更内容

  • Delegate.CoreCLR.cs: デリゲート初期化ロジックの簡潔化(-15行)
  • MulticastDelegate.CoreCLR.cs: マルチキャストデリゲートの不要なコード削除(-20行)
  • comdelegate.cpp: ネイティブデリゲート実装の不要なスタブ生成ロジック削除(-32行)
  • stubmgr.cpp: 使用されていないスタブ管理コードの完全削除(-33行)
  • DynamicMethod.CoreCLR.cs: 動的メソッド実装の整理(-3行)
  • dacdbiimpl.cpp: デバッグアクセス層の関連コード調整
  • Mono実装: Mono版デリゲート実装の同期調整
  • Object.md: オブジェクトレイアウトのドキュメント更新
  • CDAC(Diagnostics): コントラクトリーダーの更新

パフォーマンスへの影響

影響なし(クリーンアップのみ、機能変更なし)

関連Issue

#99200

その他

  • 複数のランタイム実装(CoreCLR、Mono)にまたがる変更
  • ネイティブ層(C++)の実装簡潔化を含む
  • デバッグとランタイム診断インフラストラクチャへの影響あり
  • 内部実装の整理であり、公開APIへの影響なし

#129464 Add IParsable/ISpanParsable to Rune

  • 作成者: @Copilot
  • 作成日時: 2026年06月16日 14:03:45(UTC)
  • マージ日時: 2026年06月27日 06:02:45(UTC)
  • ラベル: area-System.Runtime

概要

System.Text.Rune に IParsable<Rune> と ISpanParsable<Rune> インターフェースを明示的に実装し、ジェネリック解析サポートを拡張するPRです。既存の IUtf8SpanParsable<Rune> パターンに合わせて実装されています。

変更内容

  • Rune.cs: IParsable<Rune> と ISpanParsable<Rune> の4つの明示的インターフェースメンバーを実装。DecodeFromUtf16 と入力全体の消費チェックを使用。
  • System.Runtime.cs: Rune の公開契約を更新し、新しいインターフェースと明示的メンバー宣言を追加。
  • RuneTests.cs: 文字列とスパン解析パスの成功・失敗ケースのカバレッジを追加(理論ベースのテスト)。

パフォーマンスへの影響

影響なし

関連Issue

#60231

その他

  • 実装は明示的インターフェース実装として提供されます
  • DecodeFromUtf16 を活用して単一の Rune として有効な UTF-16 入力のみを受け入れます

#128365 Add AvxVnni.V512 hardware intrinsics

概要

AVX-512 VNNI (AVX512-VNNI) ハードウェア intrinsics のサポートを追加します。新しい AvxVnni.V512 nested クラスを導入し、512ビット ベクトルに対する VPDPBUSD/VPDPWSSD/VPDPBUSDS 命令を公開します。CPUID AVX512-VNNI 検出をランタイム/JIT の AVXVNNI_V512 命令セット フラグに統合し、コード生成と LSRA 処理を拡張します。

変更内容

  • マネージド API: AvxVnni.V512 nested クラスに MultiplyWideningAndAdd/MultiplyWideningAndAddSaturate メソッド追加(byte/sbyte および short/short オーバーロード)
  • JIT 統合: 新しい AVXVNNI_V512 命令セット enum 値を CorInfo/JIT/R2R/CPU フィーチャ検出に統合
  • CPUID 検出: cpufeatures.h/c で AVX512-VNNI を CPUID leaf 7 ECX bit 11 経由で検出
  • コード生成: hwintrinsicxarch.cpp に AVXVNNI→AVXVNNI_V512 マッピング追加、hwintrinsiccodegenxarch.cpp で EVEX-512 形式コード生成対応
  • LSRA 処理: lsraxarch.cpp で新規 NI のレジスター割り当て処理追加
  • テスト: AvxVnni_V512 テスト プロジェクトおよびハンドライト サンプル テスト追加(VPDPBUSD/VPDPBUSDS/VPDPWSSD の 512ビット ベクトル動作確認)

パフォーマンスへの影響

影響なし。ハードウェア intrinsics API の追加であり、既存コードのパフォーマンスに変更はありません。

関連Issue

#86849

その他

互換性に関する注記: AVX512-VNNI を記録している既存 R2R イメージは、より幅広い AVX512v3 バケットではなく、より正確な AVXVNNI_V512 JIT ISA にマッピングされます。これは意図的な変更です。AVX512-VNNI は個別の CPUID フィーチャであり、新しいマネージド API はその特定の機能を必要とする一方、既存の R2R 数値値 (Avx512Vnni = 79) は保持されています。

Hardware 検証(Strix Halo):

  • AvxVnni.V512.IsSupported == True
  • VPDPBUSD-zmm: 期待値 160、取得値 160 ✓
  • VPDPWSSD-zmm: 期待値 8、取得値 8 ✓
  • VPDPBUSDS-zmm: 期待値との一致確認済み ✓

目次