Pull Request on 2026年04月27日

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

注意点

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


目次

  1. #127451 Handle missing Network.framework peer certificate chain
  2. #127430 [wasm] Bump chrome for testing - linux: 147.0.7727.116, windows: 148.0.7778.56
  3. #127429 Use safe Span.Slice loop pattern in Enumerable.SumSignedIntegersVectorized
  4. #127409 Use safe spans in BigInteger RightShiftSelf
  5. #127383 [browser][coreCLR] Fix download() → create() lifecycle for WASM loader
  6. #127372 [browser] Trigger library tests on WebAssembly SDK changes
  7. #127327 Extend System.Runtime.Intrinsics.Arm to support nint and nuint (ArmBase + Crc32)
  8. #127323 [browser] preparation for emscripten bump to v5
  9. #127305 Handle nullable-unwrapped generic parameter values
  10. #127274 [mobile] Add MacCatalyst to Console OpenStandardHandle test exclusions
  11. #127264 Add a fluent Validate overload for adding validator types
  12. #127262 Fix SRM branch fixup skipping bytes at BlobBuilder chunk boundaries
  13. #127258 ILLink AOT analyzer: recognize statically-known Enum.GetValues(Type) as intrinsically handled
  14. #127245 Revert PR #124400 runtime-async crossgen outerloop test leg
  15. #127229 Logic to load R2R files on WebAssembly
  16. #127135 NativeAOT: make external TypeMap trimming array-aware with MdArray element fallback
  17. #127047 Fix string buffer size calculation in Utf8JsonWriter.WriteStringValue
  18. #127028 [cDAC] Add IMetaDataImport COM wrapper over MetadataReader for no-fallback mode
  19. #126827 Pin dependencies
  20. #126562 JIT: STORE_LCL_FLD coalescing
  21. #126147 Remove duplicate instructions.
  22. #126106 Fix vararg P/Invoke cross-assembly metadata lookup using wrong module
  23. #124167 [clr-interp] Runtime async on armel

#127451 Handle missing Network.framework peer certificate chain

概要

Apple Network Frameworkを使用するTLS/WebSocketsシナリオでピア証明書チェーンハンドルが欠落/無効な場合のクラッシュを修正します。NullReferenceExceptionを防ぐため、リモート証明書抽出時に安全にnullケースを処理するようにしました。

変更内容

  • CertificateValidationPal.OSX.cs: ピア証明書チェーンハンドルをnullableにし、ハンドルが欠落または無効な場合は早期にnullを返すようにしました。SslCopyCertChain経由で作成されたコピー済み証明書チェーンハンドルを、早期リターンパスでも確実にdisposeするようにしました(SafeDeleteSslContextパス)。

パフォーマンスへの影響

影響なし

関連Issue

#123395

その他

内部実装(TLS証明書検証の内部ロジック)への修正です。公開APIの変更はありません。


#127430 [wasm] Bump chrome for testing - linux: 147.0.7727.116, windows: 148.0.7778.56

概要

WebAssembly テスト環境で使用する Chrome のバージョンを更新します。Linux 環境を 147.0.7727.116 に、Windows 環境を 148.0.7778.56 に引き上げます。

変更内容

  • eng/testing/BrowserVersions.props: Chrome のバージョン定義を更新
    • Linux: 147.0.7727.116
    • Windows: 148.0.7778.56

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

自動更新による変更です(github-actions[bot]作成者)。


#127429 Use safe Span.Slice loop pattern in Enumerable.SumSignedIntegersVectorized

概要

Enumerable.Sum()のベクトル化された符号付き整数合計処理において、unsafe ポインタ操作を安全なSpan.Sliceベースのループパターンに置き換えました。オーバーフロー検査を各イテレーション後ではなく最終段階で実施することで、パフォーマンスを向上させています。オーバーフロー発生は稀であり、発生時の例外コストが大きいため、早期終了より遅延チェックが有効との考えに基づいています。

変更内容

  • src/libraries/System.Linq/src/System/Linq/Sum.cs:
    • 4倍アンロールされたベクトルループをwhile (span.Length >= Vector<T>.Count * 4)パターンに置き換え、span.Slice()で安全に移動
    • Vector.Create(ReadOnlySpan<T>)を使用してベクトル読み込みを実行
    • 残りの単一ベクトルループも同じスライスベースパターンに統一
    • スカラー末尾ループを安全なforeachに置き換え
    • 不要なSystem.Runtime.InteropServicesインポートを削除
    • 全体で27行追加、45行削除(ネット-18行)

パフォーマンスへの影響

全体的に中立~向上。特に小規模ベクトル化域(N=32-256)で顕著な改善:

  • Apple M4: N=32で1.51倍高速化(2.73ns → 1.82ns)、N=16で1.05倍
  • Intel Xeon: N=32で1.22倍高速化(SumInt/SumLong)、N=50で1.17倍、N=256で1.10倍
  • 大規模データ: N=1M でも1.10倍改善

ループ本体が小さく実行回数が少ない領域で、遅延オーバーフロー検査がテスト・分岐のオーバーヘッドを削減。Apple Siliconではシンプルな制御フロー(ループあたり1分岐削減)も利益。その他サイズ/ワークロードは実行ノイズ範囲(0.99-1.03倍)内。回帰なし。

関連Issue

なし

その他

  • GitHub Copilot AI生成コンテンツを使用して作成
  • 安全性と性能の両立を実現(bounds-check elision対応で最適化余地あり)

#127409 Use safe spans in BigInteger RightShiftSelf

概要

BigIntegerの右シフト操作(RightShiftSelf)をリファクタリングし、unsafe参照演算の代わりにspan slicingとVector*.Create/CopyToを使用する安全なAPIに置き換えました。左シフト操作(LeftShiftSelf)も同様に更新されています。

変更内容

  • src/libraries/System.Runtime.Numerics/src/System/Numerics/BigIntegerCalculator.ShiftRot.cs
    • RightShiftSelfメソッドを書き直し、MemoryMarshal.GetReference + LoadUnsafe/StoreUnsafeパターンを削除
    • span slicingとVector512/256/128.Create(ReadOnlySpan<nuint>)およびCopyToを使用した安全な実装に変更
    • 低位側から順次処理するウィンドウ方式を採用
    • LeftShiftSelfも同様にspan slicingベースの実装に変更
    • 不要になったSystem.Runtime.InteropServicesの使用文を削除
    • 差分: +29行/-45行(全74行)

パフォーマンスへの影響

提供されている情報では具体的なベンチマーク結果は記載されていません。ただし、PRの検証リンク(Diffs)に改善情報があるとされています。

関連Issue

なし

その他

  • 全System.Runtime.Numericsテスト3033件が合格(失敗0件)
  • GitHub Copilotが生成した説明に基づいています
  • unsafe参照演算から型安全なspan APIへの移行により、メモリ安全性が向上します

#127383 [browser][coreCLR] Fix download() → create() lifecycle for WASM loader

概要

WebAssembly ローダーの download() → create() ライフサイクルを修正し、2段階で初期化できるように再構築しました。ダウンロード状態をトラッキングして、download() 実行後の create() が不要な再初期化を行わない仕様に変更し、HTTP キャッシュのみを使用するプリフェッチモード(download(true))も新たに実装しています。

変更内容

  • run.ts(ローダーコア): モジュールレベルのフラグ(downloadStarted, downloadedIntoMemory, configInitialized)で状態を管理し、一度限りの初期化(設定初期化、ポリフィル、コンソール配線)を制御。download() 完了後は create() が高速パスで CoreCLR 初期化とモジュールロードのみ実行
  • assets.ts: download(httpCacheOnly: true) オプションを追加。資産をブラウザキャッシュに取得して破棄(WASM メモリ非消費)。後続の create() でキャッシュから再フェッチ。prefetchJSModuleLinks() で JS モジュールに <link rel="prefetch"> ヒント挿入
  • public-api.ts, dotnet.d.ts, host-builder.ts: download(httpCacheOnly?: boolean) シグネチャに更新
  • テスト: NoResourcesReFetchedAfterDownloadFinished テストを拡張し、download(true) → create() フローを検証する HttpCacheOnlyThenCreateWorks テストを追加。CoreCLR シナリオで DownloadThenInitTests を有効化

パフォーマンスへの影響

download(httpCacheOnly: true) 使用時、初回ダウンロード時のメモリ消費量削減。資産はブラウザキャッシュに保存され WASM メモリに読み込まれず、後続の create() でキャッシュからの再フェッチが行われます。重複ダウンロードは排除されます。

関連Issue

#124896

その他

なし


#127372 [browser] Trigger library tests on WebAssembly SDK changes

概要

WebAssembly SDK パック(Microsoft.NET.Sdk.WebAssembly.Browser.targets など)のファイル変更時に、ブラウザライブラリテストが CI で確実にトリガーされるよう、パス評価ルールを修正します。

変更内容

  • eng/pipelines/common/evaluate-default-paths.yml
    • src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/* を wasm_specific_except_wbt_dbg の除外リストから削除し、SDK パック変更がブラウザライブラリテスト(WASM サブセット)をトリガーするようにしました
    • YAML リスト形式のバグを修正:src/mono/nuget/Microsoft.NET.Runtime.WorkloadTesting.Internal/Sdk/WorkloadTesting.Core.targets が前のエントリの継続になっていた(- プレフィックスが欠落)ため、正式な除外エントリに修正しました

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

本 PR は GitHub Copilot の支援で作成されています。src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ 配下のタスクソースパスは既に正しくトリガーされるため、変更不要です。


#127327 Extend System.Runtime.Intrinsics.Arm to support nint and nuint (ArmBase + Crc32)

  • 作成者: @Copilot
  • 作成日時: 2026年04月23日 16:38:22(UTC)
  • マージ日時: 2026年04月27日 18:50:14(UTC)
  • ラベル: area-CodeGen-coreclr

概要

System.Runtime.Intrinsics.Arm API を拡張して nint/nuint オーバーロードを追加する承認提案を実装します。スコープは ArmBase + Crc32 に限定されます。同時に、JIT の GenTreeHWIntrinsic の補助型追跡を CorInfoType から var_types へリファクタリングし、既存の JIT 型プラッシングとの整合性を向上させます。

変更内容

マネージド API(公開)

  • ArmBase: LeadingZeroCount(nint)、LeadingZeroCount(nuint)、ReverseElementBits(nint)、ReverseElementBits(nuint) を追加
  • ArmBase.Arm64: LeadingSignCount(nint) を追加
  • Crc32: ComputeCrc32(uint crc, nuint data)、ComputeCrc32C(uint crc, nuint data) を追加
  • ref assembly と PlatformNotSupported ミラーも更新

JIT 実装(内部)

  • hwintrinsiclistarm64.h: 32 ビット クラスの 64 ビット命令スロット(TYP_LONG/TYP_ULONG)を入力。NI_ArmBase_LeadingZeroCount に INS_clz、NI_ArmBase_ReverseElementBits に INS_rbit、NI_Crc32_ComputeCrc32 に INS_crc32x、NI_Crc32_ComputeCrc32C に INS_crc32cx を追加
  • GenTreeHWIntrinsic リファクタリング: 補助型ストレージを CorInfoType から var_types へ変更(gtAuxiliaryJitType → gtAuxiliaryType、デフォルト値 CORINFO_TYPE_UNDEF → TYP_UNKNOWN)
  • 約 18 カ所の呼び出しサイトを hwintrinsic.cpp、hwintrinsicarm64.cpp、hwintrinsicxarch.cpp、gentree.cpp、valuenum.cpp で更新
  • 不要になった getBaseJitTypeAndSizeOfSIMDType/getBaseJitTypeOfSIMDType ヘルパーを削除

テスト

  • BaseTests.cs: nint/nuint オーバーロードのテストジェネレータ入力を追加。LeadingZeroCount/LeadingSignCount/ReverseElementBits の期待値計算を BCL API で実装し、エッジケース(data == 0)でのループ無限化バグを修正。Crc32 nuint オーバーロードは UIntPtr.Size 分岐による動的検証

パフォーマンスへの影響

影響なし。マネージド API は単純な intrinsic スタブで、JIT が HWIntrinsic リストで処理を行います。var_types リファクタリングは型システムの整理で、既存の型プラッシング機構に統合されており、パフォーマンス低下がありません。

関連Issue

なし

その他

  • 互換性: 新規 API のみ追加で、破壊的変更なし。AdvSimd + AdvSimd.Arm64 の nint/nuint オーバーロード(数百メソッド)は後続

#127323 [browser] preparation for emscripten bump to v5

概要

Emscripten v5へのアップグレードに向けた準備作業。wasm-ldリンカフラグの構文修正、wasm-optの非トラッピング浮動小数点変換サポート追加、LLVM SIMDイントリンシクの標準化、そしてClangの新しい警告への対応を含む。これらはブラウザ/WASI向けネイティブビルドインフラストラクチャとMono WASM実行時を新しいEmscripten/LLVM/wasm-optツールチェーンと互換性を持たせるための内部実装の変更です。

変更内容

  • リンカフラグ修正: wasm-ldの新バージョンに対応するため、複数のCMakeおよびターゲットファイルで-error-limit=0から--error-limit=0(ダブルダッシュ形式)に統一
  • wasm-opt非トラッピング浮動小数点サポート: browser/wasi向けビルド設定に--enable-nontrapping-float-to-intフラグを追加
  • Emscripten HEAP ビューのエクスポート: ブラウザプロジェクトでHEAP8~HEAPU64等をランタイムメソッドとして新規追加(Emscriptenmv3では廃止)
  • LLVM SIMDイントリンシク標準化: WASM特有のwasm_sub_sat_*をx86 SSE互換の汎用ssub_sat/usub_satに置き換え
  • Windows emsdk環境修正: emsdk_envをemsdk_env.cmdに統一し、変数クォート修正
  • Clang警告抑制: PALコード(System.Native、System.Globalization.Native)で-Wjump-misses-initと-Wc++-keywordを抑制
  • ICU初期化改善: UErrorCodeをU_ZERO_ERRORで初期化、malloc戻り値に明示的キャストを追加

パフォーマンスへの影響

影響なし(準備作業のため実行時挙動の変更なし)

関連Issue

#113786(関連する上流Emscripten #18034の修正)

その他

  • 内部実装のみの変更で、公開APIへの破壊的変更なし
  • この変更はEmscripten v5へのアップグレードブロッカーを解除するための準備段階
  • 前のPR(#119409)を置き換えるもの

#127305 Handle nullable-unwrapped generic parameter values

概要

Nullable.GetUnderlyingType(typeof(T)) パターンのtrim/AOT dataflowモデリングを改善し、新しい値の種類 NullableUnwrappedGenericParameterValue を導入しました。これにより、nullable型から unwrap されたジェネリックパラメータが正しく追跡され、typeof(Gen<>).MakeGenericType(Nullable.GetUnderlyingType(typeof(T))) が不正なジェネリック化を防ぎ、適切なNativeAOT警告(IL3050)を生成するようになります。

変更内容

  • NullableUnwrappedGenericParameterValue.cs(新規): nullable unwrap後のジェネリックパラメータを表現する新しい値型を追加
  • HandleCallAction.cs: Nullable.GetUnderlyingType が GenericParameterValue を入力として受け取った場合、NullableUnwrappedGenericParameterValue を生成するロジックを追加
  • RequireDynamicallyAccessedMembersAction.cs: 制約ベースの許可(new()、Enum など)を新しいラッパーを通じて認識するようにDAM検証を更新
  • Annotations.cs: 診断メッセージ生成時に新しいラッパーを unwrap
  • DiagnosticContext.cs: Roslyn 診断マッピング時に新しいラッパーを unwrap
  • テストケース追加: MakeGenericType(Nullable.GetUnderlyingType(typeof(T))) の corner case と制約伝播シナリオをカバーするテストを追加

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

このPRはtrim analyzer・ILLink・NativeAOT向けの内部実装改善です。公開APIには影響を与えません。Nullable.GetUnderlyingType を使用した動的なジェネリック型構築を行う場合、ランタイムでの失敗を事前に検出でき、開発時に適切な警告が生成されるようになります。


#127274 [mobile] Add MacCatalyst to Console OpenStandardHandle test exclusions

概要

MacCatalystプラットフォームにおけるSystem.Console.Testsの失敗を修正するPRです。Console.OpenStandardXXXHandle()メソッドはモバイルプラットフォーム(iOS、tvOS、Android、MacCatalyst)でPlatformNotSupportedExceptionをスローしますが、テストの[PlatformSpecific]属性にMacCatalystが未追加だったため、4つのテストが失敗していました。MacCatalystをExclusionリストに追加することで、他のAppleモバイルプラットフォームと同じ挙動に統一します。

変更内容

  • src/libraries/System.Console/tests/ConsoleHandles.cs
    • OpenStandardInputHandle_ReturnsValidHandle、OpenStandardOutputHandle_ReturnsValidHandle、OpenStandardErrorHandle_ReturnsValidHandle、OpenStandardHandles_DoNotOwnHandleの4つのテストに対し、TestPlatforms.MacCatalystをExclusionリスト(& ~TestPlatforms.MacCatalyst)に追加
    • 例外スロー検証の3つのテスト("ThrowsOnUnsupportedPlatforms")にTestPlatforms.MacCatalystをInclusionリストに追加

パフォーマンスへの影響

影響なし

関連Issue

#1388505(Azure Pipelines ビルド)

その他

  • runtime-extra-platformsパイプラインのMacCatalyst arm64/x64ビルドで検出された失敗
  • MacCatalystはiOS、tvOS、Androidと同じモバイルプラットフォーム制限を持つため、テスト除外が必要
  • このPRはGitHub Copilotが自動生成したもの

#127264 Add a fluent Validate overload for adding validator types

概要

OptionsBuilderに流暢なAPI(fluent API)スタイルの新しいValidateオーバーロードを追加します。このオーバーロードは、IValidateOptionsを実装するバリデータ型を登録し、オプション型の検証を行えます。

// 使用例(推測ではなく、一般的なパターン)
optionsBuilder.Validate<MyValidatorType>();

変更内容

  • OptionsBuilder.cs: 新しいValidateオーバーロードメソッド(19行追加)をOptionsBuilderに追加し、バリデータ型を登録
  • NamedValidateOptionsFilter.cs: IValidateOptions実装クラス(34行)を新規作成
  • Microsoft.Extensions.Options.cs: パブリックAPIリファレンスファイルを更新(1行追加)
  • OptionsBuilderTest.cs: 新機能の検証テストを追加(87行)
  • PACKAGE.md: ドキュメント更新

パフォーマンスへの影響

影響なし

関連Issue

#115200

その他

なし


#127262 Fix SRM branch fixup skipping bytes at BlobBuilder chunk boundaries

概要

ControlFlowBuilder.CopyCodeAndFixupBranchesのブランチ固定化ロジックにおいて、InstructionEncoderオペコードと直接的なCodeBuilderオペランド書き込みを混在させた場合に、BlobBuilderチャンク境界でバイトをスキップしてしまい、後続のオペランドを破損する問題を修正しました。

チャンク境界(256バイトチャンクのデフォルトでローカルオフセット255)に短分岐プレースホルダが配置された場合、CopyCodeAndFixupBranchesの特殊ケース処理によりsrcBlobOffsetが誤って進行し、次のチャンク開始時に最初のバイトがスキップされていました。

変更内容

  • ControlFlowBuilder.cs — チャンク境界での誤ったオペランドスキップロジックを削除。特殊ケースのsrcBlobOffset = operandSize; breakを除去し、通常のsrcBlobOffset += operandSizeパスで正しく処理されることを確認。Debug.Assertを簡潔化。

  • MethodBodyStreamEncoderTests.cs — 2つのリグレッションテストを追加:

    • AddMethodBody_MixedOpCodeAndCodeBuilderWritesAcrossChunkBoundaries: InstructionEncoder.OpCodeと直接BlobBuilder.WriteByte書き込みを30回繰り返し、チャンク境界を強制しながら全60個のldarg.sオペランドを検証
    • AddMethodBody_ShortBranchOperandAtChunkBoundary: brfalse.sオペランドをオフセット255(256バイトチャンクの最後)に配置し、ブランチ固定化後にオフセット256(次チャンク開始)の命令がスキップされないことを確認

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

テスト環境ではnet481およびnet11.0ターゲットの両方でdotnet buildが成功し、リグレッションテストはチャンク境界を含むILストリーム全体の正確な処理を検証しています。


#127258 ILLink AOT analyzer: recognize statically-known Enum.GetValues(Type) as intrinsically handled

概要

RequiresDynamicCodeAnalyzerが静的に既知のEnum型に対するEnum.GetValues(Type)呼び出しで不要な警告を出しているため、ILCのインtrinsic処理に合わせて修正しました。型引数がSystemTypeValueで静的に既知の場合、IL3050警告を抑制します。

case IntrinsicId.Enum_GetValues:
{
    foreach (var value in arguments[0].AsEnumerable())
    {
        if (value is not SystemTypeValue)
            return false;
    }
    return true;
}

変更内容

  • RequiresDynamicCodeAnalyzer.cs: IsIntrinsicallyHandledメソッドにEnum_GetValuesケースを追加。第1引数がすべてSystemTypeValueの場合のみIL3050警告を抑制。
  • RequiresDynamicCodeAnalyzerTests.cs: ユニットテスト追加(既知型呼び出しで無警告、未知型呼び出しでIL3050警告を期待)。
  • RequiresDynamicCodeAnalyzerIntrinsics.cs (旧MakeGenericDataflowIntrinsics.cs): テストケース追加。既知型のパス(警告なし)と未知型のパス(IL3050期待)をカバー。ファイル/クラス/テストメソッド参照もリネーム対応。
  • DataFlowTests.cs: テストファイルリネームに伴う参照更新。

パフォーマンスへの影響

影響なし

関連Issue

#127258

その他

  • この変更はRoslyn analyzer(コンパイル時解析)とILCランタイムの動作を一致させるもので、MakeGenericType/MakeGenericMethodの類似対応(PR #100858)に準じています。
  • 内部APIの拡張であり、公開APIへの影響はありません。

#127245 Revert PR #124400 runtime-async crossgen outerloop test leg

概要

PR #124400で追加されたruntime-async crossgen libraries テスト用のパイプラインレグを削除します。runtime-asyncがデフォルトで有効になったため、明示的なUseRuntimeAsync=trueマトリックスは不要になりました。

変更内容

  • eng/pipelines/coreclr/crossgen2.yml: TestReadyToRun_RuntimeAsync_Librariesレグ(27行)を削除
    • 削除内容: UseRuntimeAsync=trueを指定した専用パイプラインジョブ
    • 既存のTestReadyToRun_Librariesレグおよびその他のパイプライン構造は維持

パフォーマンスへの影響

パイプラインレグの削除により、CI/CDの実行時間短縮が期待できます(具体的な数値は提供されていません)。

関連Issue

#124400

その他

  • このPRは#124400による変更を部分的に取り消すもので、eng/testing/tests.targetsの後続の関連しない変更は保持されます
  • 直接的なコード変更ではなく、パイプライン設定の調整です

#127229 Logic to load R2R files on WebAssembly

  • 作成者: @davidwrighton
  • 作成日時: 2026年04月21日 16:34:09(UTC)
  • マージ日時: 2026年04月27日 16:38:21(UTC)
  • ラベル: area-VM-coreclr

概要

WebAssemblyでReadyToRun (R2R)コードの読み込みと実行をサポートするための包括的な実装です。WebCIL v1画像でのR2Rヘッダーディスカバリー、リロケーション処理、ポータブルエントリポイント対応、およびWasm向けランタイム関数テーブルの再ロケーション生成を追加しています。

変更内容

ランタイム (CoreCLR)

  • readytoruninfo.cpp: FEATURE_PORTABLE_ENTRYPOINTS有効時にポータブルエントリポイント経由でR2Rエントリポイント解決をルーティング
  • precode_portable.cpp: WasmシナリオでDoesSlotCallPrestub()がアサート代わりにFALSEを返すように変更
  • peimagelayout.cpp/inl/h: WebCIL画像のR2Rヘッダークエリ対応、テーブルベースリロケーション処理、デコーダー経由のテーブルベースオフセット取得をサポート

WebCILデコーダー

  • webcildecoder.cpp/h: R2Rヘッダーディスカバリー、マニフェストメタデータアクセス、WebCIL v1ヘッダーからのテーブルベースオフセット抽出を追加

AOT コンパイラー

  • RuntimeFunctionsTableNode.cs: Wasm向けランタイム関数テーブルのBeginAddress値に対してWASM_TABLE_INDEX_I32リロケーション生成

Wasmホスト

  • libCorerun.js: Wasmモジュール コンパイルおよびテーブル拡張失敗時のエラーハンドリングを強化

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

Copilotレビューから、WebcilDecoder::Init()とWebcilDecoder::Reset()で新規追加されたR2Rヘッダーキャッシュフィールド(m_hasNoReadyToRunHeader、m_pReadyToRunHeader)がリセットされない潜在的な問題が指摘されています。デコーダーインスタンスの再利用時にキャッシュ状態が不正になる可能性があるため、これらのフィールドをInit/Reset時にクリアすることが推奨されています。


#127135 NativeAOT: make external TypeMap trimming array-aware with MdArray element fallback

概要

NativeAOTの外部TypeMapトリミングにおいて、配列型トリムターゲットの精度を向上させるため、配列型そのものの到達可能性に基づいて条件付きを行うように改善。従来はSomeType[]がトリムターゲットであっても要素型SomeTypeが到達可能なだけでMapエントリが保持されていたが、本変更により配列型自体またはテンプレートベースのランタイム構築可能性に基づいて判定する。

private static TypeDesc GetEffectiveTrimTargetType(TypeDesc trimmingTargetType)
{
    while (trimmingTargetType is ParameterizedType parameterized && !trimmingTargetType.IsArray)
        trimmingTargetType = parameterized.ParameterType;
    return trimmingTargetType;
}

変更内容

  • ExternalTypeMapNode.cs:

    • GetEffectiveTrimTargetTypeを修正し、ポインタ/参照型のみを展開し、ArrayTypeは保持
    • NecessaryTypeSymbol(arrayType)で配列型そのものの到達可能性を条件付けに
    • テンプレート非適格配列(多次元配列、ポインタ要素配列)に対して、要素型の正規形がテンプレート適格な場合は要素型テンプレートを条件に追加(例:TrimTarget2<__Canon>[,]はMdArrayで配列テンプレートは不可、但しTrimTarget2<__Canon>がテンプレート適格ならば条件付け)
    • ランタイム型ローダーのハードコーディングされたテンプレート(MdArrayはtypeof(object[,])、ポインタ配列はtypeof(char*[]) )により、テンプレート非適格配列は要素型の到達可能性から構築可能
  • DeadCodeElimination.cs:

    • 新規TypeMapエントリH(TrimTarget8[] -> Target8)とI(TrimTarget9[,] -> Target9)を追加
    • エントリHは要素型のみ到達可能(配列型は不到達)なケースを検証し、精密なトリミングが機能することを確認
    • エントリIはMdArray型で要素型が到達可能かつランタイム時に配列構築が起こるケースを検証
  • TypeMap.cs(ILLink): 既存テスト"TrimTargetIsUsedArrayType"を修正、new ArrayTypeTrimTargetClass[1]で配列型とその要素の両方を到達可能に

  • typemap.md: パラメータ化型トリムターゲット/プロキシキーのルール追加、要素型の要件を満たす場合にエントリ保持

パフォーマンスへの影響

影響なし。本変更はトリミング精度向上による無駄なTypeMapエントリ削減(メモリ削減可能性)を目指すが、実行時パフォーマンスへの直接的な影響はない。

関連Issue

#126380(マージ済み)の後続改善

その他

  • 互換性: 内部実装(NativeAOTコンパイラ)の最適化であり、公開APIへの破壊的変更なし
  • テンプレート適格性判定: `GenericTypesTemplateMap

#127047 Fix string buffer size calculation in Utf8JsonWriter.WriteStringValue

概要

Utf8JsonWriter.WriteStringValueでバッファサイズ計算の誤りによるIndexOutOfRangeExceptionを修正しました。非常に大きな文字列(最大166,666,666文字まで)をシリアライズする際に発生していた問題に対応しており、エスケープ時の最大バイト数を事前計算して正確に算出するようにしました。

変更内容

  • JsonConstants.cs: エスケープ時およびトランスコーディング時の最大拡張係数を定義(MaxExpansionFactorWhileEscaping: 6、MaxExpansionFactorWhileTranscoding: 3)
  • Utf8JsonWriter.WriteValues.String.cs: WriteStringMinimizedおよびWriteStringIndented呼び出し前に、入力長に基づいて必要な最大バイト数を事前計算。バッファオーバーフローを防止
  • テスト追加: 大規模エスケープ文字列のシリアライズを検証する回帰テスト(Utf8JsonWriterTests.csで最小化・インデント両パターン、Value.WriteTests.csでエンドツーエンド)

パフォーマンスへの影響

影響なし

関連Issue

#103155

その他

  • 修正は内部実装(System.Text.Jsonライブラリ)のバグ修正であり、公開APIの変更なし
  • 計算はint.MaxValue / 6(約357,000,000文字)まで安全で、実装上の最大入力制限166,666,666文字を下回るため、オーバーフロー発生なし

#127028 [cDAC] Add IMetaDataImport COM wrapper over MetadataReader for no-fallback mode

概要

cDAC(動的に静的なデータを提供するコンポーネント)のno-fallback mode(レガシーDAC不在時)において、診断ツール(SOS、ClrMD)がメタデータにアクセスできるようにするため、System.Reflection.Metadata.MetadataReaderをIMetaDataImport/IMetaDataImport2/IMetaDataAssemblyImport COM インターフェースにマッピングする管理コード COM ラッパーを実装しました。レガシー DAC が存在する場合は、実装されていない約45メソッドのフォールバックとデバッグ検証に使用されます。

変更内容

  • IMetaDataImport.cs(新規、326行):IMetaDataImport(51メソッド)、IMetaDataImport2(8メソッド)、IMetaDataAssemblyImport(14メソッド)の[GeneratedComInterface]定義、ASSEMBLYMETADATA構造体、内部CldbHResults定数
  • MetaDataImportImpl.cs(新規、1754行):[GeneratedComClass]実装。MetadataReader経由で28メソッドを完全実装、約45メソッドをレガシーDAC委譲。明示的なインターフェース実装で公開サーフェスをクリーンに保持
  • OutputBufferHelpers.cs:CopyStringToBufferを2つのオーバーロードに分割(void版とout bool truncated版)
  • ClrDataModule.cs(+57/-4):ICustomQueryInterface経由でラッパーを接続。MetadataReaderと省略可能なレガシーIMetaDataImportの両方でMetaDataImportImplを生成
  • MetaDataImportImplTests.cs(新規、1102行):MetadataBuilderで生成した合成メタデータを用いた50単体テスト
  • MetaDataImportDumpTests.cs(新規、146行):実際のメタデータに対する意味論的パリティを検証する3つのダンプベース統合テスト
  • MultiModule デバッギー:非const フィールド、ユーザー文字列、メソッドを含むテスト用デバッギー

実装済みメソッド(28個のcDAC実装):

  • 列挙:EnumInterfaceImpls、EnumFields、EnumGenericParams、CloseEnum、CountEnum、ResetEnum
  • プロパティ:GetTypeDefProps、GetMethodProps、GetFieldProps、GetMemberProps、GetGenericParamProps、GetUserString など14個
  • トークン/Blob:GetRVA、GetSigFromToken、IsValidToken、FindTypeDefByName など4個
  • アセンブリ:GetAssemblyProps、GetAssemblyRefProps、GetAssemblyFromScope

ネイティブ互換性:

  • TypeDef RID 1 の<Module>親をmdTypeDefNil(0x00000000)にマップ
  • 定数不在時のデフォルト値はELEMENT_TYPE_VOID
  • ユーザー文字列ヒープは生#USヒープ解析で正確なblob サイズ検証を実施
  • 文字列バッファ不足時はCLDB_S_TRUNCATIONを返却
  • レコード不在時は`CLDB_E_RECORD_

#126827 Pin dependencies

概要

ビルドツールのコンテナイメージ依存関係(mcr.microsoft.com/dotnet-buildtools/prereqs)を特定のダイジェスト値にピン固定する自動更新です。Renovate Botによる定期メンテナンスで、ビルド環境の再現性と安定性を確保するための変更です。

変更内容

  • eng/pipelines/common/templates/pipeline-with-resources.yml: パイプライン共通テンプレートの25行を更新
  • eng/pipelines/coreclr/templates/helix-queues-setup.yml: CoreCLR Helix キューセットアップテンプレートの10行を更新
  • eng/pipelines/installer/helix-queues-setup.yml: インストーラー Helix キューセットアップテンプレートの4行を更新
  • eng/pipelines/libraries/helix-queues-setup.yml: ライブラリ Helix キューセットアップテンプレートの22行を更新

全40箇所のmcr.microsoft.com/dotnet-buildtools/prereqsイメージリファレンスをタグベースから特定のダイジェスト値にピン固定(例:7c1931f、0ef2d61など)。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

このPRは .NET Renovate Bot による自動化されたメンテナンス処理です。ダイジェスト値へのピン固定により、ビルドの再現性が向上し、予期しないイメージ更新による問題を防止できます。


#126562 JIT: STORE_LCL_FLD coalescing

概要

JITの低レベル化時のストア合体(coalescing)ロジックをリファクタリングし、隣接する定数書き込み(GT_STORE_LCL_FLD)をINDIRECT/STORE_BLKで使用されていた既存の合体ロジックで処理できるよう拡張する。新機能はJitEnableStoreLclFldCoalescingフラグで制御可能(デフォルト有効)。

変更内容

  • jitconfigvalues.h: JitEnableStoreLclFldCoalescingリリース設定フラグを追加
  • lower.cpp: 共有ストア合体パスの実装と既存STOREIND合体ロジックのリファクタリング(+510行/-230行)
    • STORE_LCL_FLDに対応する新たな合体処理を追加
    • 重複するストアシナリオへの対応を含む
    • アトミシティ確認ロジックの集約化
  • lower.h: 合体データ構造の拡張と共有ヘルパー関数の宣言(+45行/-11行)
  • SpAddr.cs: ローカルフィールドストア合体のリグレッションテスト追加(+76行/-4行)
    • アドレス公開非対応、アドレス公開対応、重複ストアパターンをカバー

パフォーマンスへの影響

影響なし(ストア命令の合体により、生成されるIL数が削減される可能性があるが、具体的なベンチマーク結果は提供されていない)

関連Issue

なし

その他

  • 新機能は後方互換性を保ちながら、フラグで制御可能な設計
  • 既存のSTOREIND/STORE_BLKのコalescing機構を再利用し、コード重複を削減
  • JITコンパイラの内部実装変更であり、公開APIへの影響なし

#126147 Remove duplicate instructions.

概要

s390xアーキテクチャのコード生成ヘッダファイルから重複する命令定義を削除し、欠落していたカンマを追加する修正です。

変更内容

  • src/mono/mono/arch/s390x/s390x-codegen.h: 重複する命令定義を削除(-6行)、欠落していたカンマを追加(+1行)

パフォーマンスへの影響

影響なし

関連Issue

#126147

その他

なし


#126106 Fix vararg P/Invoke cross-assembly metadata lookup using wrong module

  • 作成者: @Copilot
  • 作成日時: 2026年03月25日 17:00:26(UTC)
  • マージ日時: 2026年04月27日 19:58:33(UTC)
  • ラベル: area-VM-coreclr

概要

クロスアセンブリのvararg P/Invoke呼び出しで、スタブ生成時にメソッド実装フラグ(PreserveSigなど)を呼び出し元モジュールではなく定義元モジュールのメタデータから取得するよう修正しました。修正前はBadImageFormatExceptionまたはスタック破損の原因になっていました。

// Assembly A で定義
[DllImport("msvcrt.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static unsafe extern int _scprintf(string format, __arglist);

// Assembly B から呼び出し(修正前は失敗)
_scprintf("%d\n", __arglist(42));

変更内容

  • src/coreclr/vm/dllimport.cpp — CreatePInvokeStubAccessMetadataでm_pModuleからm_pMetadataModuleへ変更(1行修正)。メタデータインポータ取得時に定義元モジュールを使用することで、正しいメソッドトークンからフラグを読み取ります。
  • src/tests/Interop/PInvoke/Varargs/CrossAssembly/ — クロスアセンブリのvararg P/Invoke呼び出しを検証する回帰テストを追加。VarArgsPInvokeLibで vararg P/Invokeを定義し、CrossAssemblyVarargsTestから呼び出します。
  • src/tests/Interop/Interop.csproj — テスト用サポートプロジェクト参照を追加。

パフォーマンスへの影響

影響なし

関連Issue

#87188

その他

  • 根本原因: vararg P/Invoke呼び出しでm_pModuleは呼び出し元モジュール、m_tkMethodDefは定義元アセンブリのトークンのため、メタデータ参照が不一致になっていました。
  • リスク評価: 低。修正はクロスアセンブリvararg呼び出し路に限定され、非vararg P/Invokeは影響なし(m_pModule == m_pMetadataModule)。
  • 後方互換性: .NET Framework時代からの既知の問題で、修正による破壊的変更なし。

#124167 [clr-interp] Runtime async on armel

概要

armel(ARM EABI)インタープリタに対してランタイム非同期サポートを追加します。これにより、インタープリタモードで非同期メソッドが正常に動作するようになります。また、armelでの関数呼び出し時のスタックサイズに関する問題も修正しています。

テスト: async/async/async.shをRunInterpreter=1で実行済み。

変更内容

  • src/coreclr/vm/arm/asmhelpers.S: armel向けアセンブリヘルパーの拡張(+75/-31)。ランタイム非同期サポートに必要なアセンブリレベルの実装追加、スタック処理の修正
  • src/coreclr/vm/arm/cgencpu.h: アーキテクチャ固有のヘッダー定義追加(+1/-0)
  • src/coreclr/vm/callstubgenerator.cpp: 呼び出しスタブジェネレーターの修正(+48/-30)。armelでの関数呼び出しスタック処理の改善

パフォーマンスへの影響

影響なし(機能追加・バグ修正であり、パフォーマンス改善を目的とした変更ではありません)

関連Issue

なし

その他

この変更はインタープリタのコア実装部分(ランタイム非同期)に関連する内部実装の修正であり、公開APIへの影響はありません。


目次