#128817 Fix minor typo/formatting in the memory model spec
Memory Model仕様ドキュメントにおける軽微な表記ゆれを修正するドキュメント更新です。".Net" を ".NET" に統一し、公式ブランディングガイドラインへの準拠を改善します。
dotnet/runtimeにマージされたPull RequestをAIで日本語要約
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
この月にマージされた 509 件を新しい日から順に並べています。タイトルをクリックするとその日のページの該当箇所へ移動します。Bot が作成した 41 件はタイトルのみにして、各日の最後にまとめています。
Memory Model仕様ドキュメントにおける軽微な表記ゆれを修正するドキュメント更新です。".Net" を ".NET" に統一し、公式ブランディングガイドラインへの準拠を改善します。
ARM64 SVE における mask/SIMD ロード/ストア命令のアドレスモード生成を制限し、LEA ノードの使用を回避する変更です。従来のスケール可能な即値オフセット処理を削除し、lowering フェーズで address mode 生成を拒否することで、emitter の複雑性を軽減しています。
JIT のループクローナーから、ループ内に BBJ_RETURN ブロックが存在しないという古い仮定に基づいた assertion とコメントを削除します。EH-ループクローニングがデフォルトで有効になったことで、BBJ_RETURN ブロックがクローン可能なループに合法的に出現するようになったため、この制約は不要になりました。
thunkジェネレータが生成するコードのフォーマットをdotnet-formatに準拠させるための修正です。新しい命令追加時に自動生成されるコードが一貫性のあるフォーマットで出力されるようになります。
cDAC(Compact Debugger Access Component)にデリゲート型判定機能を実装します。型がSystem.MulticastDelegateを親MethodTableとして持つ場合、それをデリゲートと見なす新しいIRuntimeTypeSystem.IsDelegate契約APIを追加し、レガシーDAC実装からの移行を完了します。
cDAC (Compact Diagnostics And Inspection Container) の EcmaMetadata_1 において、読み取り専用メタデータアドレスをモジュールごとにキャッシュする最適化。これにより、毎回のPEヘッダウォークと不要なメタデータプリフェッチを削減し、ダンプ分析時のパフォーマンスを大幅に改善します。
AndroidのSystem.Security.Cryptography.Native.Androidライブラリで、JNI例外処理が不適切により発生していたCheckJNI SIGABRTを修正。特に16384ビットRSA鍵などをConscrypt + BoringSSLプロバイダが拒否する場合に、JNI呼び出し間で保留中の例外をクリアせずに次の呼び出しを実行していた問題を解決。
SystemNative_GetHostEntryForNameがローカルホスト名の解決時にgetifaddrsで取得したインターフェイスアドレスを追加する際、リクエストされたアドレスファミリでフィルタリングしていなかった問題を修正します。getaddrinfoは既にhint.ai_familyでフィルタリングしていますが、ローカルインターフェイスの追加パスではこのフィルタが適用されておらず、IPv4のみのリクエストでもIPv6アドレスが含まれる可能性がありました。
cDAC(Contract Data Access Component)とレガシーDBI(Debugger Bridge Interface)の相互運用層を拡張し、関数ポインタ型を含む正確な型ハンドル解決をサポートするGetExactTypeHandle DacDbi APIを実装しました。ローダーアロケータのコレクティビリティメタデータの読み取りと、DAC互換の関数ポインタ型比較を実現します。
crossgen2のWebCIL(WebAssembly内に埋め込まれたIL)コンパイル機能に対する基本的なテストを追加します。ILCompiler.ReadyToRunテストハーネスを拡張して、.dll以外の出力形式(.wasmなど)に対応し、WASM/ブラウザターゲット向けのWebCILペイロード生成と検証を行うxUnittestケースを実装しています。
DAC/DBI(デバッグアクセスコンポーネント/デバッグインターフェース)のモジュール照会APIをリファクタリングしました。EnumerateModulesInAssemblyコールバックを廃止し、GetModuleForAssemblyに「モジュールがロード済みか」を示すフラグを統合する変更です。cDAC(Microsoft.Diagnostics.DataContractReader.Legacy)に新APIを実装し、ダンプベースのテストも更新しました。
System.Net.Socketsライブラリ内で定義されている定数のタイポを修正するPull Requestです。複数のファイルにおいて、誤字がある定数名を正しい名称に統一しています。
CI失敗スキャンフィードバックワークフローの3つの改善を実施しました。
protect_top_level_dot_foldersルール対象外とするため、.github/workflows/ci-failure-scan.mdに対する明示的なprotected-files設定を追加し、ワークフロー生成時にprotected_dot_folder_excludesとprotected_files_policyを含める設定を追加target: "*"を追加し、長寿命KPIトラッカー(#128742)をissue番号で更新可能にdotnet/corert#3873で導入されたワークアラウンドを削除し、コンパイル時の汎用メソッド検索を厳密化します。従来は遅延初期化で処理していた仮想テーブルスライスと汎用辞書レイアウトの生成を事前計算必須に変更し、スキャナの漏れを明示的にエラーで検出するようにします。
WebAssembly(browser)ビルドのCMakeキャッシュ機能をWindowsでも有効化します。非Windows環境ですでに実装されていたtryrun.browser.cmakeキャッシュの使用をWindows環境にも適用し、configure処理の高速化を実現します。
HashMap、PtrHashMap、EEHashTableの実装を簡素化・最適化するPRです。未使用の置換関数を削除し、仮想関数を使用するCompare関数を非仮想のComptrFunc関数に置き換えることで、メモリ効率と実行速度を向上させます。また、LookupValueの代わりにGetHashを適切に使用するよう変更しています。
JITのテール マージ最適化におけるバグを修正します。仮想スタブ呼び出しを正しく区別せず、異なる型の共有ジェネリックメソッドを呼び出す複数のテール コール サイトで呼び出しを誤って統合し、間違ったメソッドが呼び出される問題を解決します。
// 問題のパターン例
if (tag == "bytes") return ((IFoo<byte[]>)this).Get();
if (tag == "string") return ((IFoo<string>)this).Get();
IMAGE_REL_SYMBOL_SIZE解決パスでリロケーション加数(addend)とインライン値が無視されていた問題を修正しました。PE/COFF形式のシンボルサイズ計算で、呼び出し元の加数と既存のインライン値を組み合わせるようにしました。これにより、R2Rヘッダー内のRuntimeFunctions エントリが、不正に4バイトの末尾sentinelを含めずに正しいサイズを報告するようになります。
具体的には、definedSymbol.Size + addend + inline という計算式に修正され、すべてのCOFF/PEターゲットで意図された動作が復元されます。
Wasm RyuJIT の逆P-Invoke(RPI)ケースにおいて、宣言されたローカル変数のカウントに1つのずれが生じていた問題を修正します。スタックポインタ(SP)が RPI では明示的に宣言されたローカル変数に存在する一方、非RPI では入力引数として扱われることによる不一致を解決しています。
Webcil/WebAssembly ReadyToRun (R2R) イメージが従来Machine.I386として扱われていたため、x86固有のデコーディングパスを再利用していた問題を解決します。WebAssembly専用の機械タイプセンチネル(WasmMachine.Wasm32)を導入し、ポインタサイズ、インポートセクション、トランジションブロック、GC情報、r2rdumpのアーキテクチャ処理をWebAssembly固有のコードパスにルーティングします。
Legacy DAC (Data Access Component) の列挙型インターフェース IEnum<T>.LegacyHandle の型を TargetPointer から nuint に修正するPRです。Legacy DAC列挙ハンドルはホスト側の不透明なポインタであり、ネイティブDAC内で CLRDATA_ENUM 経由で (ULONG_PTR) として格納されるため、nuint が意味論的に正しくなります。これはプロジェクト内の既存慣例(DBI stack/heap/ref walkハンドルなど)に準拠しています。
32ビットプラットフォーム(arm32/x86)で GThread01_threadstart テストが OutOfMemoryException で失敗するのを防ぐため、スレッド数を50から5に削減する変更です。32ビットプロセスの限定的な仮想アドレス空間を考慮し、テストスキップではなく実行継続しながら安定動作させます。
// Use fewer threads on 32-bit platforms to avoid OOM from exhausting the virtual address space.
public static int nThreads = PlatformDetection.Is32BitProcess ? 5 : 50;
JITコンパイラのLowerBlockStoreAsGcBulkCopyCall関数において、GC含有ブロックストアをバルク書き込みバリアヘルパーに変換する際の冗長なnullcheck処理を削除します。先行フェーズで間接参照がfaultしないことが証明されている場合、元のGT_STORE_BLKの例外フラグに依存することで、不要な明示的nullcheckをスキップします。
Process.GetProcessById と SafeProcessHandle.Open の非スロー型代替メソッドを追加します。これらの新しいAPI(Process.TryGetProcessById と SafeProcessHandle.TryOpen)はプロセスが存在しない場合に false を返し、存在する場合に true を返します。UnauthorizedAccessException などの権限エラーはスロー型と同じく例外として発生します。これにより、プロセスID取得時の競合状態を安全に処理できます。
// プロセスが存在しない場合は false を返す(権限エラーは例外をスロー)
SafeProcessHandle.TryOpen(int processId, out SafeProcessHandle? processHandle);
Process.TryGetProcessById(int processId, out Process? process);
マネージドNTLMクライアントのCHALLENGE_MESSAGE解析を強化し、不正形式または切詰められたチャレンジが範囲外スライス例外やサイレント誤解析を引き起こさないようにしました。宣言されたオフセット、長さ、およびAVペアサイズが提供されたblobに適合することを検証し、不正な入力に対してはInvalidTokenを返すようにしました。
NegotiateAuthentication.GetOutgoingBlob(string) メソッドの base64 デコード処理を改善しました。従来は Convert.FromBase64String を使用して例外をスローしていましたが、Convert.TryFromBase64String に切り替えることで、不正な base64 入力を InvalidToken ステータスコードとして返すようにしました。HTTP サーバーなど、信頼できないクライアントトークンを処理する場合に try/catch を使用する必要がなくなります。
CORINFO_HELP_ASSIGN_BYREF ヘルパーと JIT_ByRefWriteBarrier / RhpByRefAssignRef 実装を削除する変更です。これは前回のPR #128542 のフォローアップで、JIT-EE インターフェースから不要になったByRef write barrier ヘルパーを完全に削除し、ReadyToRun(R2R)ヘルパーマッピングを更新し、JIT/EEバージョンGUIDをバンプします。
cDAC(Compact Data Access Component)のスタックウォーク機能をDacDbi向けに準備するため、スタックウォーキングイテレータをリファクタリングしました。ネイティブマーカーフレームをcDAC APIから公開し、レガシーのSOSDac互換性を保ちながらDacDbiスタックウォークで消費可能にします。フレームフィルタリングはコンシューマーレベルで実施されます。
ARM64プラットフォームにおいて、popcnt(ポップカウント)とtzcnt(末尾のゼロビット数)命令の処理を改善します。従来はpopcntがまったく処理されておらず、tzcntが2つのIRノードとしてインポートされていたため、ヒューリスティクスやパターンマッチングに悪影響を及ぼしていました。この変更により、これら命令の処理を最適化し、コード生成の効率を向上させます。
cDAC(CoreDAC)における AreOptimizationsDisabled メソッドの実装を完了するPRです。従来のレガシー実装へのフォールバックを排除し、IReJIT コントラクトに IsDeoptimized を追加し、ILCodeVersionNode に Deoptimized フィールドを公開しています。
SuperPMI(JIT性能測定・比較ツール)のCI パイプラインにWebAssembly(wasm)クロスターゲット JIT対応を追加します。wasm JIT(clrjit_universal_wasm_<host_arch>)のコレクション、リプレイ、アセンブリ差分解析機能を統合し、パイプライン・スクリプト・ビルドシステムを拡張して wasm をクロスターゲット altjit ケースとして処理します。
NativeAOTが使用しないllvm-libunwindの公開API(unw_*関数など)をガード化し、Android NDK r29などのプラットフォームlibunwindとのシンボル重複を回避する変更です。NativeAOTは内部C++クラス(DwarfInstructions、CompactUnwinder、UnwindCursorなど)のみを使用するため、これらの公開APIをコンパイル時に除外し、新たにUnwindHelpers::FindUnwindSections()アクセッサを導入してアンワインドセクション検出を処理します。
AndroidプラットフォームにおけるX509Storeのメモリリーク問題を修正します。JNIローカル参照とプライベートキーエントリの破棄漏れを解決し、証明書列挙、ストアオープン失敗時のクリーンアップ、および証明書削除の各パスでリソースリークを防ぎます。
DAC/DBI型パラメータ取得APIを、割り当てられたTypeParamsListバッファを返すモデルから、コールバックベースの列挙方式へリファクタリングしました。GetMethodDescParams/GetTypeHandleParamsをEnumerateMethodDescParams/EnumerateTypeHandleParamsに置き換え、ネイティブ(DAC/DBI+RS)および管理cDAC側の対応インフラを整備しています。
cDAC(Common Data Access Component)領域のレビュー/自動化ガイダンスを明確化するため、フォルダ固有のインストラクション文書を追加します。繰り返されるレビューコメントを削減し、レビュー基準を統一することを目的としています。
NativeAOTランタイムのGC設定処理を修正し、文字列型のGC設定値(例:GCHeapAffinitizeRanges)が正しく取得できるようにしました。従来はGCToEEInterface::GetStringConfigValueが常にfalseを返していたため、文字列設定の抽出ができず、CoreCLRとの動作差異が生じていました。本修正により、環境変数および組み込み設定ブロブから文字列設定値を読み込めるようになります。
Android arm32デバイス上でのテスト実行を再有効化するPR。新しいAndroidキューの作成により、arm32エミュレーション対応デバイスを個別に管理し、既存の大規模キューはarm64専用に変更。これにより#125440が解決される。
モバイルプラットフォーム上でのアセンブリロード失敗テストの失敗を解決するPRです。TpaLoadFailureTestの2つのテストケースにモバイルプラットフォーム除外条件を追加します。モバイルではファイル削除とパッケージング/バンドリングの相互作用によってテストが失敗するため、デスクトップ/CoreCLRプラットフォームのみでのテスト実行に限定します。
area-GC-coreclrの所有者を@JulieLeeMSFTから@anicka-netに変更し、GitHub policies設定も同期して、エリアタグ付けの動作を所有権更新に合わせたものです。
runtime_config_tから未使用のプライベートメンバ変数m_prop_keysとm_prop_valuesを削除し、ランタイム設定型の不要な状態を削減しました。
sccacheのキャッシング機能をarm64とFreeBSDのクロスコンパイルに対応させるPRです。キャッシュキーにarchTypeとosSubgroupを含めることで、各バリアント(arm64、FreeBSD、musl)が個別のキャッシュエントリを取得できるようにしています。arm64とFreeBSDはx64マシン上でクロスコンパイルされるため、既存のx64 sccacheバイナリで対応可能です。
ブートストラップビルド機能をテストビルドで有効化するための変更。--use-bootstrapフラグをライブラリテストとランタイムテストで使用できるようにし、ローカルターゲットパック基盤を統一することで、クロスコンパイルテストの構築プロセスを改善します。
ManagedTypeSource_1における負のキャッシング機構の追加により、ホットパスの効率性を大幅に改善しました。従来は成功したルックアップのみをキャッシュしていたため、失敗したルックアップは毎回System.Private.CoreLib内のすべてのTypeDefinition行を再スキャンしていました。本修正により、負のルックアップ結果をセンチネル値(nullやTypeHandle(TargetPointer.Null))としてキャッシュし、繰り返される失敗ルックアップの再スキャンを回避します。
非同期テール マージング時のレイアウト等価性チェックをアサーション(デバッグ用)から実際のチェック(本番対応)に変更します。Issue #128704で既存のコメントが不正確であることが判明したため、詳細な原因調査までの一時対応として実施されます。
JITのValue Numberingにおいて、VNFuncAppの内部フィールドをカプセル化し、危険な直接アクセス(特にm_args配列へのstd::swap)を排除しました。GetArg(x)メソッドでarityチェック付きアクセスを提供し、安全性を向上させています。またVNFunc比較や関数型チェックのコードをより標準的なヘルパー(FuncIs、IsVNBinFunc)に統一しました。
dotnet/runtimeリポジトリの主要コンポーネントディレクトリ配下に軽量なREADME.mdファイルを追加し、AIエージェントやユーザーが容易にドキュメントを発見できるようにするための"breadcrumb"ドキュメント構造を導入します。各READMEはdocs/workflow/配下の権威的なドキュメントへのリンク集となっています。
JIT コンパイラの GenTree::Equals メソッドにおいて、異なるディスパッチセルを持つ仮想スタブコールが同一と判定される問題を修正しました。この問題により、共有ジェネリック インターフェース ディスパッチの不正なヘッド/テール マージが発生していました。
2019年のAppDomain-per-process廃止以降、g_HandleTableMapは単一ノードで安定し、CreateHandleStoreの呼び出し元がなくなったため、マルチバケット・マルチAppDomain対応の不要なスキャフォルディングコードを削除します。削除されたコードはアサーション付きのスタブに置き換えられ、リグレッション検出を強化します。
WASMにおけるEventPipeベースの診断インフラストラクチャを改善するPRです。主な変更は以下の3点です:
ds_rt_browser_performance_measureの追加 — ネイティブコードからJS側のperformance.measure()を呼び出し、DevToolsでのプロファイリング/トレーシング表示を有効化DOTNET_DiagnosticPorts=js://readyをデフォルト有効化し、ランタイム初期化前から診断シナリオ(gcdump、counters、cpu-samples)に接続可能にArray.shift()をヘッドポインタ方式に変更し、O(n)の配列コピーをO(1)に改善dotnet/runtime リポジトリの area-Extensions 関連領域のオーナーシップを @karelz から @anicka-net に移管するドキュメント更新です。8つの拡張機能領域のリードを変更し、組織的な責任を再配分します。
createdumpツールのElfReader::EnumerateLinkMapEntriesメソッドで、動的リンカーのlink_mapリストをたどる際にサイクル検出機能がなく、メモリ破損やプロセス改変によってlink_mapが循環構造になった場合に無限ループに陥る問題を修正します。Brentのサイクル検出アルゴリズムを実装し、チェックポイントポインタを指数間隔(2の累乗)で移動させることで、メモリ読み込み失敗時の元の動作(すべてのモジュール訪問まで続行)を保持しながらサイクルを検出します。
NativeAOT環境でのSafeProcessHandle/System.Diagnostics.Processの使用時に、Win32 APIをOS ローダーによる直接インポート(hard import)として解決できるようWindowsAPIs.txtを更新しました。これにより、LoadLibrary/GetProcAddressを用いた動的ロード機構が不要となり、バイナリサイズを1 MBから972 KBへ削減(約27 KB削減)します。
JIT範囲分析(RangeCheck::GetRangeFromAssertionsWorker)を更新し、lzcnt/tzcnt/popcount命令に関連する追加のvalue-numbering関数ケースを認識するようにしました。また、推論される定数上限を固定値の64からビット幅に応じて32または64に厳密化しています。
Known Build Error(KBE)トリアージガイダンスを共有ドキュメント化し、CI失敗スキャンワークフローとローカルPR対応ツーリング間で同じKBEマッチング・テンプレートルールを使用するようにしました。新規のcreate-kbeスキルを追加し、PR Build Analysis結果を分析してKBE案を生成し、GitHub Issueの作成前にユーザー確認を行うローカルツーリングを実現します。
WebAssembly ブラウザ ビルドで __stack_pointer グローバル エクスポートがデッドコード削除(metadce)により削除される問題を修正します。libCorerun.js が動的に読み込まれた Webcil サブモジュールとスタック ポインタを共有するために必要です。
CoreCLR DAC/DBI インターフェースの例外スタックフレーム列挙機能を、コールバックベースの API として実装しました。GetStackFramesFromException から EnumerateStackFramesFromException へ移行し、管理コード側の cDAC (DataContractReader) 実装に新しい Exception contract API を追加しています。
新しい公開 API:
record struct ExceptionStackFrameInfo(
TargetPointer Ip,
TargetPointer MethodDesc,
bool IsLastForeignExceptionFrame);
IEnumerable<ExceptionStackFrameInfo> GetExceptionStackFrames(TargetPointer exceptionAddr);
CORINFO_HELP_ASSIGN_BYREFヘルパー(GC ポインタを含む構造体コピー用のカスタム呼び出し規約を持つ書き込みバリア)を削除し、CORINFO_HELP_ASSIGN_REFまたはCORINFO_HELP_CHECKED_ASSIGN_REF、あるいはバルク書き込みバリア(CORINFO_HELP_BULK_WRITEBARRIER)に置き換えます。x64での遅いrep movsq命令の使用を回避し、SIMDの活用が可能になります。
// GC ポインタを含む構造体のコピーが高速化
record struct MyStruct(long N1, long N2, long N3, long N4, long N5, string A, string B);
class MyClass
{
MyStruct _fld;
void SetA(MyStruct value) => _fld = value; // 大幅に高速化
}
JITのエスケープ解析を拡張し、未使用のローカル変数に対するスタック割り当てをスキップする最適化を実装しました。追跡対象のローカル変数が実際に使用されているかどうかを判定する「used」ビットを追加し、エスケープせず使用もされないローカル変数はヒープ割り当てのままにして後続フェーズで削除可能にします。これにより、不要なスタック展開と死んだストア推論を回避できます。
ci-failure-scan agentic workflowの改善を行うPRです。既存のCI失敗スキャナーの発行ルールを厳密化して誤検知を削減し、新たに ci-failure-scan-feedback workflowを追加して、メンテナーからのフィードバックを収集し、KPIトラッキングとプロンプト編集提案を日次で行う仕組みを導入します。
Roslyn増分ソースジェネレータ(DataGenerator)を導入し、cDAC IData<T> データクラスの生成を自動化するPRです。属性駆動型のアプローチにより、~150個の手書きクラスをポートしました。[CdacType]、[Field]、[StaticAddress] などの属性で、フィールド読み書きや型ハンドルアクセサを宣言的に定義できます。
[CdacType("System.Threading.Lock")]
internal sealed partial class Lock : IData<Lock>
{
[Field("_state")]
public uint State { get; }
[Field("_owningThreadId")]
public int OwningThreadId { get; }
}
runtime-diagnostics パイプライン(Azure DevOps定義ID 309)をBuild Analysis設定に追加するPRです。このパイプラインはSOS統合テスト、cDAC no-fallbackテスト、DACベースラインテスト、cDACダンプテストを実行します。現在これらのテスト結果はBuild Analysisで追跡されていないため、PR mergeをブロックできない状態が改善されます。
JIT のジェネリック仮想メソッド(GVM)デバーチャライゼーション機能を準備するための段階的リファクタリングです。CORINFO_DEVIRTUALIZATION_INFO 構造体の複数の ad-hoc フラグを単一の instParamLookup に統一し、GVM テストカバレッジを拡充します。これにより後続の GVM デバーチャライゼーション有効化作業が容易になります。
RunDumpTests.ps1スクリプトに-RuntimeConfigurationパラメータを追加し、Release以外のChecked/Debug ランタイムビルドのテストに対応しました。これにより、Checked ビルドで有効になる追加のアサーションを活用して、Release ビルドでは検出できないバグをキャッチできるようになります。
NativeAOT outerloopパイプラインのlibs legジョブのタイムアウト値を延長しています。製品ビルドとテストビルドが約3時間かかり、Helixキューが満杯の場合さらに2時間以上かかることがあるため、タイムアウトによる失敗を防ぐための変更です。
JIT のエスケープ分析で使用されていない古いコピー検出ロジックを削除します。現在はコピー追跡を CheckForGuardedAllocationOrCopy で行っているため、ObjectAllocator::AnalyzeParentStack 内の非機能的な状態管理コードは不要になっています。
Linux上のGCメモリ管理におけるmadvise()呼び出しの不正な引数結合を修正するバックポート。VirtualResetがMADV_FREEとMADV_DONTDUMPをビット演算で結合していたため、無効な引数値がシステムコールに渡されていました。.NET 9で導入された最適化(#95643)による回帰を解決します。
s390x(big-endian)プラットフォームにおいて、UTF-8↔UTF-16変換関数(utf8_to_utf16、utf16_to_utf8)がMINIPAL_TREAT_AS_LITTLE_ENDIANフラグ設定時に誤った文字列を返す問題を修正しています。エンディアンの扱いに関する実装ロジックを改善することで、big-endianアーキテクチャでの正確な変換を実現します。
このPRは、ランタイム非同期await ヘルパーの動作正確性と効率を改善し、複数の継続がタスクに登録されている場合のasync1との動作差異を解決します。RuntimeAsyncTaskの代わりにRuntimeAsyncTaskContinuation(以前のTaskContinuation)を継続オブジェクトとして使用し、JITインライン化を有効化(テール await時)し、キャッシュされた継続により継続割り当てを削減します。
System.Net.Quic.QuicStream.WriteAsyncの動作を修正し、ストリームの書き込み側がCompleteWrites()で完了した後の書き込み試行時にInvalidOperationExceptionをスローするように変更しました。これまでは成功した完了済みのValueTaskを返していた不正な動作を改善します。
JIT ループ反転最適化(optTryInvertWhileLoop)を改善し、既にボトムテスト(ループの継続条件がループ末尾で判定される構造)されているループでの反転をスキップするようにしました。これにより、冗長なプリヘッダテストと不要な制御フローの分岐を回避できます。
Microsoft.CodeAnalysis.BannedApiAnalyzersの依存関係管理をMaestro依存関係フロー(eng/Version.Details.*)から自動供給される方式に変更しました。従来のハードコード版指定から、依存関係フローを経由した動的バージョン管理に移行し、バージョン最新化を実現しています。
複数のライブラリテストプロジェクトでTrim/AOT アナライザーを有効化し、プロジェクトレベルの一括無効化を削除した上で、リフレクションと動的コード使用箇所に対してターゲット化された修正と注釈を適用する変更。アナライザーフレンドリーなAPIの使用(Enum.GetValues<TEnum>()、DiagnosticMethodInfoなど)に置き換えることで、警告を最小化している。
crossgen2でメソッドコードノードのシンボル定義にThumb bit(ARMアーキテクチャの命令セット識別ビット)を含める変更を行います。これにより、ARM環境でのメソッドコードポインタの正確な表現が可能になります。
CoreCLRのインプロセスクラッシュレポート機能にコンパクトなテキスト形式の出力を追加します。既存のJSON形式のレポートファイル出力は保持しながら、モバイルプラットフォーム向けにシグナルセーフなコンパクト形式をサポートします。Android環境ではlogcatのDOTNET_CRASHタグで出力され、iOS環境では標準エラー出力経由で出力されます。
メタデータテーブルの再割り当て時に発生するポインタ無効化による競合状態を修正します。ExpandTables()がメタデータテーブルのバッキングバッファを再割り当てする際、GetMethodRecord/GetFieldRecord/GetMemberRefRecordが返すポインタが無効になる問題がありました。プロファイラのemit操作(DefineMemberRefなど)がLOCKWRITE下でExpandTablesをトリガーする際、use-after-free読み込みが発生し、MissingMethodExceptionやセグメンテーション違反が散発的に発生していました。
GetSigOfMethodDef、GetSigOfFieldDef、GetNameAndSigOfMemberRef、GetSigFromTokenにLOCKREADIFFAILRET()を追加してこれを修正します。
JIT コンパイラのストア合成(store coalescing)機能における重複チェック(overlap check)ロジックを修正しました。新しいストアが古いストアと完全に重複することを確保する条件を改善しています。
ReSizeNoThrow関数をヘッダファイルにインライン化し、実装ファイルから削除するリファクタリング。内部実装の最適化を目的とした変更です。
JITコンパイラのパイプライン順序を調整し、fgSetOptions()(fully-interruptible GCやフレームポインタ要件などのコード生成選択をコミットする)を、空のEH領域削除の第2パスが完了した後に実行するように変更しました。これにより、不要なEH領域が削除されてからコード生成オプションが最終決定されるようになります。
cDAC(managed Debugger Access Component)のIDacDbiInterface.IsExceptionObjectメソッドを実装します。対象プロセスのグローバルExceptionMethodTableを読み取り、IRuntimeTypeSystemとIObjectコントラクトを使用してオブジェクトのMethodTable階層を走査し、例外型かどうかを判定します。DEBUG構成では従来のDAC実装との検証も含まれます。
ARM32プラットフォームにおいて、GetFuncletStartAddressがThumbビットを正しく処理していなかった問題を修正します。#128154以降、GetStartAddressはThumbビットを削除してタグ付けされていますが、GetFuncletStartAddressがこれに対応していなかったため、ARM32上のすべてのR2Rメソッドが不正にFuncletと判定されていました。
Process.WaitForExit(int milliseconds) のパラメータ検証が不足していた問題を修正しました。Windows では不正な値が WaitHandle.WaitOne に伝播して誤った ParamName の ArgumentOutOfRangeException が発生し、Unix では負の値(例:-2)が暗黙的に WaitForExit(0) として動作していました。ArgumentOutOfRangeException.ThrowIfLessThan(milliseconds, Timeout.Infinite) を追加することで、全プラットフォーム間で一貫した検証動作を実現します。
// すべてのプラットフォームで ArgumentOutOfRangeException をスロー
process.WaitForExit(-2); // throws
process.WaitForExit(-1); // OK (Timeout.Infinite)
process.WaitForExit(0); // OK (poll)
async メソッドの JIT コンパイル時に、複数の先行ブロックが同じ非同期呼び出しで終了して join する場合、サスペンション/レジューメ状態を tail merge(統合)する最適化を追加します。これにより、重複するサスペンションコードを削除し、コードサイズを削減します。
WebAssembly browser-advanced サンプルを現在のランタイム/モジュール設定期待値と静的Webアセット処理に合わせるための修正です。サンプルがツリー内WebAssemblyビルド下で正しく実行できるようにするための変更です。
cDAC(Component Debugger Access Compliance)の一部として、IDacDbiInterface::GetStackParameterSize API のマネージド実装を追加するPRです。ExecutionManager コントラクトを通じて、コードブロックのスタックパラメータサイズを取得する機能を実装し、DEBUG時にはレガシーDAC検証も行います。
JITコンパイラのループクローニング機能を一般化し、ループ解析の適用範囲を拡大します。主な改善は:
JIT コンパイラのアサーション伝播(Assertion Propagation)ロジックを改善し、O1K_LCLVAR をローカルアサーション伝播専用に制限し、グローバルアサーション伝播では VN ベースのオペランド(O1K_VN など)を使用するようにしました。これにより SpanHelpers.SequenceEqual などの定数フォールディングが より積極的に適用され、一部のコードパターンでループアンローリングが改善されます。
VEX 2バイトエンコーディングにおける制約を活用して、可換命令のオペランドを動的に入れ替え、より小さいエンコーディングを優先的に生成する最適化を実装しました。VEX 2バイトエンコーディングではREX.Rはオンオフ可能ですがREX.Bはオフである必要があるため、op1は拡張レジスタ[XMM0, XMM15]をエンコード可能ですがop2は[XMM0, XMM7]のみに制限されます。可換命令でこのシナリオに該当する場合、オペランドを入れ替えることで2バイトエンコーディングを実現します。
// 最適化により以下のように変換
// Before: vpand xmm3, xmm3, xmm8 (size=5, 3バイト VEX)
// After: vpand xmm3, xmm8, xmm3 (size=4, 2バイト VEX)
CoreCLR インタープリタのデバッグ情報ハンドオフにおいて、IL-to-native オフセットマップが空の場合に null ポインタを ICorJitInfo::setBoundaries に渡すように修正しました。事前割り当てされたバッファを常に使用するのではなく、マップエントリが生成されない場合は null を渡すことで、ランタイムのアサーション (iOffsetMapping == 0) == (pOffsetMapping == 0) の失敗を解決します。
単純なメソッド(例:コンストラクタ呼び出しと即座の return)でマップが空になる場合があります。
WebAssembly RyuJIT コンパイラのアンワインド情報(unwind info)を拡張し、各funcletのVirtual IP(VIP)範囲を記録するようにしました。従来はフレームサイズのみを記録していましたが、各funcletの開始VIPと終了VIPを追跡し、ULEB128エンコーディングで { frameSize, startVirtualIP, (endVirtualIP - startVirtualIP) } として出力します。
LimitArrayPoolWriteStreamの破棄契約を厳密化し、ユーザーコードがバッファリングストリームを破棄した場合にInvalidOperationExceptionをスローするように変更。フレームワーク側のクリーンアップは新しいinternalメソッドReturnAllPooledBuffers()で一元管理し、ArrayPool.Sharedへの誤アクセスを防止する。
ランタイムの非同期呼び出しthunks(タスク返却型)に対して、継続処理のキャッシング最適化を適用するPRです。#127973と同様の最適化をタスク返却パスに拡張し、スループットの改善とコードサイズの削減を実現します。サンプルコードはありません。
非同期仮想呼び出しのテストカバレッジを拡張するPRです。src/tests/async/override/override.csに対して、待機された仮想ディスパッチと汎用仮想非同期オーバーライドのテストケースを追加します。
Android環境でのDSA関連の証明書/CRLテストの間欠的な失敗を修正するテスト専用の修正。手作業で実装されたASN.1エンコーディングをリプレースし、RFC 3279 DER形式のDSA署名とAsnWriter + BigIntegerを使用して、正しいDER形式を確保します。
Copilot CLI/VS Code/Claude Codeで正しく検出されるよう、.github/agents/配下の2つのカスタムエージェントファイルに.agent.mdサフィックスを追加するファイル名変更です。Copilot CLIはエージェントディレクトリ内の.agent.mdファイルのみを自動検出するため、サフィックスが欠落していた2つのファイルは読み込まれていませんでした。この変更により、@extensions-reviewerと@system-net-reviewへの@-mentions参照が正常に機能します。
CoreCLR JITフォルダ(src/coreclr/jit/**)向けのGitHub Copilot指示ファイルを追加し、JIT PRのレビューガイダンスをカスタマイズするもの。JIT改善のPRに対して不要なテスト追加の要求を削減することを目的としています。
BSD sysctl呼び出しでTCP/UDP接続情報を取得する際のバッファ割り当てロジックを改善しました。リトライ時にestimatedSizeではなく、倍にされたtmpEstimatedSizeを使用することで、バッファサイズと実際に必要なサイズのミスマッチを防ぎます。
CoreCLRインタープリタコンパイラの非同期サスペンドデータ修正ロジックにおいて、非同期呼び出しの戻り値が後でグローバル変数に昇格される可能性を考慮し、不正なアサーションを削除しました。PR #128403で誤って追加されたアサーションを修正します。
JIT Methodical テスト (refany/lcs.il) が無効なILを出力していた問題を修正します。テスト内で整数値(ceqの結果)とオブジェクト参照(System.Type)を誤って比較していたため、JIT内部で無効なIRが生成されていました。
修正により、GetTypeFromHandleの結果ペアを先に比較してから次のペアを比較する正しい評価順序に改めます。
cDAC(Compact Data Access Component)のメソッドテーブルユニットテストから、無効な状態を構築していたテストケースを削除し、有効なテストケースを修正するものです。グローバルシングルトンのContinuation EEClassがnullまたはゼロである状態で非メタデータContinuation MethodTableを検証しようとするテストは、矛盾した無効なMethodTableを構築するため、削除またはシングルtonEEClassを追加して修正されました。
cDAC(Compact Data Access Component)の Thread.GetContext メソッドに Frame-walk フォールバック機能を復元しました。データターゲットが GetThreadContext を実装していない場合、スレッドの Frame チェーンをウォークしてスレッドコンテキストを導出します。これは以前削除されたネイティブ側の実装と同等の処理を cDAC に取り込むものです。
macOS SecureTransport PALにおいて、SafeDeleteSslContext.SslSetConnectionで割り当てられたGCHandleがリークしていた問題を修正します。GCHandleの所有権をSafeSslHandleに移行し、ネイティブSSLContextが完全に解放されるReleaseHandle()内でのみ解放することで、ライフタイムを正しく管理します。
ILLinkのRoslyn分析ツールからRequiresUnsafeAnalyzerとUnsafeMethodMissingRequiresUnsafeAnalyzerを削除し、対応するコードフィックスを整理しています。これはRoslynの新しい分析機能へ機能移行するための変更です。
非同期プロファイラーテストのシングルスレッドランタイム(WASM等)への対応を実施しました。テストをマルチスレッド対応不要なテストと必須なテストに分割し、タスクIDとマーカーフレームのマッピングを使用した堅牢性向上、Native AOTの失敗修正、メタデータイベントからwrapper IPを削除(rundownイベントでの構築に変更)を行いました。結果として、CoreCLRとNativeAOTで全テスト実行可能、CoreCLR WASM シングルスレッド構成で48個中38個のテストが実行可能になりました。
.NET Frameworkにおけるアセンブリの遅延署名(delay-signed)とパブリック署名(public-signed)に関するNGEN(Native Image Generator)の動作の違いを明確化するドキュメント更新です。NGEN がこれらのアセンブリをどのように処理するかについての既知問題を追加しています。
非同期関数の終了時にスレッドローカルストレージ(TLS)アクセスを回避するため、非同期コンテキストの復元パスでキャプチャされたThreadオブジェクトをローカル変数として使用するよう変更しました。JITと言語ランタイムの非同期ヘルパー呼び出し機構を拡張し、同期復元時のTLSアクセスを排除することで、将来的なスレッドアクセスの最適化を可能にします。
cDAC(Compact Data Access Components)の管理側実装にCheckContext機能を実装し、スタックポインタの範囲検証をサポートします。同時にネイティブDAC側からDbgSkipStackCheck設定による検証スキップ機能を削除し、セキュリティと一貫性を向上させます。
JITの全局アサーション伝播機能を強化し、PHIノードと値番号(VN)を活用して、常にtrueになるisinst/chkcastキャストをコンパイル時に折り畳むことを可能にしました。複数の分岐で異なる型のオブジェクトを生成していても、すべてが共通の基底クラスを継承している場合、冗長なキャストチェックを削除します。
サンプルコード:
static void Test(int len)
{
object bc;
if (len > 100)
bc = new DerivedClass1();
else
bc = new DerivedClass2();
if (bc is BaseClass) // コンパイル後は常にtrueとして最適化される
Console.WriteLine("bc is a BaseClass");
}
マネージドデバッグのスタックウォーク機能が非Windows platforms で正常に動作するよう、DacDbiInterfaceImpl::GetContext に E_NOTIMPL フォールバック機能を復元しました。ICorDebugDataTarget::GetThreadContext が E_NOTIMPL を返すプラットフォームで、Thread の Frame chain をウォークして REGDISPLAY から レジスタコンテキストを再構築します。
このフォールバックは以前の変更で削除されており、今回の修正によって復元されます。
CoreCLRデバッガーの非同期スタックウォーク機能において、CordbAsyncStackWalk::PopulateFrame()がnull DiagnosticIPを持つcontinuation(例:#127973で導入されたValueTaskContinuation)に遭遇した際のクラッシュを修正します。DiagnosticIPがnullのcontinuationをスキップするようにすることで、null アドレスに対するGetNativeCodeInfoForAddr呼び出しを回避します。
STRESS_TAILCALLモードでJIT importerが名前付きintrinsicを明示的なテイルコールとしてマークすることにより、GT_KEEPALIVE等の非CALL IRにインポートされるintrinsicで不正な状態が発生する問題を修正しました。この状態により後続の「GC Polls挿入」フェーズでアサートが発生していました。修正内容は、呼び出し先がCORINFO_FLG_INTRINSICフラグを持つ場合、stress-tailcall昇格をスキップすることです。
Android固有の長時間実行X509Chain単体テストを削除するフォローアップPRです。#128284で追加された不要なAndroid専用ストレステスト BuildChainRepeatedly_DoesNotExhaustGlobalReferences をテストスイートから削除します。
#128464で特定されたパターンに従い、同一の分岐内容を持つ冗長な#if/#elseプリプロセッサブロックを削除するコードクリーンアップです。複数のC++ヘッダーファイルとC#ソースファイル全体で、条件分岐の両側が同じコードを持つ#if/#else/#endif構造を除去しています。
JIT コンパイラのgtSplitTree関数を改善し、ツリー分割時に生成される一時ローカル変数により正確なクラスハンドルメタデータを伝播させることで、後続のdevirtualization最適化がより正確な型情報を利用できるようにします。結果として、不要な仮想呼び出しが排除され、生成コードサイズが削減されます。
Wasm CoreCLR環境で失敗するExpressionsUnwrapeExternallyThrownRuntimeWrappedExceptionテストをスキップするため、[ActiveIssue]属性を追加しました。PlatformDetection.IsBrowserとPlatformDetection.IsCoreCLRの条件ゲートを使用して、ブラウザ環境のCoreCLR実行時のみテストを無効化します。
[Theory, ClassData(typeof(CompilationTypes))]
[ActiveIssue("https://github.com/mono/mono/issues/14925", TestRuntimes.Mono)]
[ActiveIssue("https://github.com/dotnet/runtime/issues/128164", typeof(PlatformDetection), nameof(PlatformDetection.IsBrowser), nameof(PlatformDetection.IsCoreCLR))]
public void ExpressionsUnwrapeExternallyThrownRuntimeWrappedException(bool useInterpreter)
WebAssemblyのRyuJITコード生成で、GT_BITCASTノードの被演算子がcontained状態の場合の処理を実装しました。これにより、スタックローカル変数のbitcastを独立した演算子ノードなしで直接生成できるようになります。
CollectionHelpers.ValidateCopyToArgumentsメソッドの冗長な条件付きコンパイル指令を削除しました。両方の分岐で同じArgumentNullException.ThrowIfNull(array);呼び出しが存在していたため、#if NET / #else / #endifディレクティブを削除して処理を統一しました。
PR #127644で0x/0Xプレフィックスのサポートが追加されましたが、CONFIG_VAL_MAXLENが16のままだったため、0xFFFFFFFFFFFFFFFFのような18文字のフル幅64ビット16進値が拒否されていました。このPRは定数を18に増やし、プレフィックス+16桁の16進数値を受け入れるよう修正します。
// RhConfig.h
#define CONFIG_VAL_MAXLEN 18 // "0x" prefix + 64-bit uint in hex
ILLinkのMarkStepにおいて、Debug builds/testsで DependencyKind.DisablePrivateReflectionRequirement がアサーション失敗の原因となっていた問題を修正します。このDependencyKindを型およびメソッドマーキングの許可リスト(_typeReasons、_methodReasons)に追加し、linkerが DisablePrivateReflectionAttribute をroot化する際にDEBUG検証をスキップさせないようにします。
cDAC(Compact Diagnostic Access Component)の RuntimeTypeSystem コントラクトを拡張し、DacDbiImpl.IsValidObject メソッドを実装しました。新しいグローバルポインタ ContinuationSingletonEEClass を追加し、MethodTable/EEClass クエリ用の新しいAPI(GetClassPointer、IsCanonicalMethodTable、IsContinuationWithoutMetadata)を IRuntimeTypeSystem コントラクトに追加しています。これにより、デバッガがランタイムオブジェクトの有効性を適切に検証できるようになります。
SIMD内在関数のフォールバック実装をリファクタリングし、スカラー型分類ロジックをScalar<T>に集約化します。Shuffle/ShuffleNative実装を統一し、コード重複を削減し、新しい型(char、Half)やベクトル幅(nint/nuintシャッフルオーバーロード)の追加を容易にします。
NativeAOT TypeLoaderのRuntimeMethodHandleキャッシュが、async-variant bitをキーに含めていなかったため、同じメソッドのasync/non-async変種が同じキャッシュエントリにエイリアスされ、誤ったメソッド変種が解決される問題を修正します。async-variant bitをハンドル識別に含めることで、キャッシュの誤りを防ぎます。
// 修正前: asyncフラグがキーに含まれていない
RuntimeMethodHandleKey key = new RuntimeMethodHandleKey(declaringTypeHandle, handle, genericMethodArgs);
// 修正後: asyncフラグがキーの識別に含まれる
RuntimeMethodHandleKey key = new RuntimeMethodHandleKey(declaringTypeHandle, handle, genericMethodArgs, isAsyncVariant);
SVE scatter テストのセットアップロジックで、生成されたインデックス値がoutput bufferの長さを超えることによるIndex Out of Bounds例外を修正するテスト修正です。SveScatterVectorBases.templateのMakeDistinctメソッドにおいて、重複排除時のインデックス調整処理を修正し、インデックス値を常に配列の有効範囲[0, OutElementCount)内に保つようにしました。
ReadyToRunテストプロジェクトにcrossgen2プロジェクトへのプロジェクト参照を追加し、ローカルでのビルド・実行時に最新のcrossgen2の変更が確実に反映されるようにしました。
プラットフォーム固有のTFM(例:net11.0-windows)を対象とするライブラリで、コンパイラ生成ドキュメントXMLを使用する場合、XMLドキュメントコメントの配置が一貫していないことを検出・修正するRoslyn アナライザ「PlatformDocAnalyzer」を追加します。このアナライザは、部分的なソースファイルに分割された型のドキュメント配置規約を強制し、プラットフォーム非依存ビルドの規定ドキュメントとの一貫性を検証します。
cDAC(Common Data Access Contract)Thread契約にOSスレッドハンドルを追加し、レガシDacDbi実装でIDacDbiInterface::GetThreadHandleとGetThreadAllocInfoをcDAC対応データを使用して実装しました。新しい公開契約は導入されていません。
WebAssembly RyuJIT バックエンドの Packed SIMD (v128/0xFD-prefix) 命令セットに対するエミッター レベルのサポートを追加します。SIMD 命令テーブル、新しい命令フォーマット (IF_V128/IF_LANE/IF_MEMARG_LANE) および対応する記述子型を実装し、DEBUG のみのエミッター ユニット テストで新しいエンコーディング パスの動作検証を可能にします。
WebAssemblyターゲットにおいて、メモリ管理の正確性を確保するため、ライトバリア機構を実装しました。JITが期待する呼び出し規約の不一致を修正し、新たにFCDECL2_RAW/FCIMPL2_RAWマクロを導入してWasm用のインラインアセンブリでライトバリア処理を実装しています。
cDAC DAC-DBI層でGetObjectFieldsを実装し、ネイティブインターフェースの署名をCOR_TYPEIDからUINT64(メソッドテーブルポインタ)に変更しました。RuntimeTypeSystemコントラクトとECMAメタデータデコーディングを使用してフィールドオフセットとフィールド型の解決を行います。
PR #127943による副作用として、VMPTRがIPC層だけでなくDBI/DAC/EE全体で little-endian として伝播されていた問題を修正します。VMPTRを host endianness のラッパーに変更し、IPC層ではPortable<VMPTR>として little-endian をワイヤ上で保持しながら、アクセス時に host endianness に変換する設計に改めます。
dotnet-pgo のトレース処理において、Reflection.Emit や IL スタブキャッシュで使用される "minimal" MethodTables が生成する BulkType ETW イベントを適切に処理できるようにする変更です。これまで無効な TypeDef トークン(rid 0 など)が有効なものとして扱われ、メタデータアクセス時に BadImageFormatException が発生していた問題を修正します。
JIT の Common Subexpression Elimination (CSE) ロジックを修正し、マルチレジスタ値を持つ非SIMD構造体型の式について CSE を禁止します。これらの値は常にスピルされ、正確性のためには既存のストア先を DNER(Do Not Eliminate Register)として扱う必要があるため。
Socket が無効化されたハンドルの後に閉じられる場合に発生する無限のリリーススピンウェイトを修正します。SafeSocketHandle でハンドル無効化後の状態遷移ロジックを改善し、不要なスピンウェイトを削減します。
SafeSocketHandleからSocketを構築する際に、ハンドルの実際のブロッキング状態を読み取ってSocket.Blockingプロパティを正しく初期化するように変更しました。これにより、既存のソケットハンドルからSocketオブジェクトを作成する場合の状態不整合を防ぎます。
CLR インタープリターの非同期メソッド呼び出しで、戻り値が使用されない場合の継続処理の復帰時に、ライブ変数を誤って上書きするバグを修正します。戻り値が未使用の場合、スタックオフセットが他のテンポラリ変数と共有されることがあり、復帰時に継続戻り値を書き込む際に既存のライブ値が破壊される問題を解決します。
ValueTaskSourceベースのValueTaskを待機する際に、キャッシュされた継続(continuation)を再利用することでメモリ割り当てを削減する変更です。#127973の考え方を、thunkではなく実際のAwaitが使用される場合に適用します。実測値として、ベンチマークでGen0 GC回数が15/secから2/secまで削減されました。
非常に小さい stackalloc バッファを C# collection expressions([0, 0, 0, 0] など)に置き換え、それらの stackalloc のためだけに必要だった unsafe 修飾子を削除するリファクタリングです。スタックベースのバッファ動作は維持しながら、コード安全性を向上させます。
// 変更前
unsafe void Example()
{
Span<int> buffer = stackalloc int[4];
}
// 変更後
void Example()
{
Span<int> buffer = [0, 0, 0, 0];
}
ReadyToRun(R2R)コンパイラの依存関係分析を拡張し、ジェネリック仮想メソッド(GVM)呼び出しの実装を動的に発見・コンパイルする機能を追加します。GVMDependenciesNodeをNativeAOTから共有ソースに移動し、ReadyToRunでも利用可能にします。型マーカーノード(InheritedVirtualMethodsNode)を導入し、アプリケーションで使用される型に対するGVM実装の解決を行います。
CoreCLR-on-WASM「ノーワークロード」モードにおいて、公開時のネイティブ再リンク機能をエンドツーエンドで実装し、Wasm.Build.Testsの追加テストカバレッジをCoreCLRで有効化するもの。ランタイムパックのペイロード調整、ビルドパイプラインの再設計、テスト基盤の拡張を含む。
System.Text.JsonにC#の共用体型(union-like shapes)のサポートを追加します。ユニオン型のシリアライゼーション/デシリアライゼーション、カスタム分類器API、ソース生成対応を実装しています。新しいメタデータ、属性、コンバーターインフラストラクチャを導入し、リフレクションとソース生成の両方で対応します。
プリミティブ値型の概念を削除し、JIT/TypedReference/arglistの関連実装をクリーンアップするランタイム内部の大規模リファクタリングです。GetVerifierCorElementTypeを廃止してGetInternalCorElementTypeに統一し、列挙型とプリミティブ型を明確に区別するようにMethodTableのカテゴリフラグを再構成します。TypedReferenceは通常のbyref様値型として扱われ、CEE_ARGLISTはJITで実際のRuntimeArgumentHandle構造体を生成するようになります。
JITコンパイラの比較演算最適化ロジックを統合する変更です。複数の後順序(post-order)比較変換をまとめてfgOptimizeRelationalComparison関数で一元化し、コード構造を簡潔にします。変更はゼロディフ(生成されるコードに影響なし)です。
x64プラットフォームにおいてMath.BigMulのパフォーマンスを改善するPRです。JITコンパイラがx64固有の乗算命令を活用して、より効率的なコード生成を行うようにします。mulxサポートを含まないバージョンとして提出されており、AVX2非対応ハードウェアでの動作確認が目的です。
xarch JITにおいて、GT_INTRINSICで表現されるSystem.Math組み込み関数がEVEXレジスタを利用できるよう、不必要なレジスタ制限を削除しました。また、Math.AbsをSIMDノード経由で表現するよう改善し、マスクのCSE機会を増やしています。
ループ不変式コード移動(LICM)の際にメモリ依存性の追跡に誤りがあり、ループ不変ではない式が誤ってループ外にホイストされてしまう問題を修正しました。これは無声の不正な機械語コード生成につながる可能性があります。問題は二重ループ構造で、値番号付けは不変だがメモリ依存性がある式が内側ループの下にある場合に発生します。
Marshal interop ヘルパーの AccessViolationException に関するコメントを明確化するドキュメント更新。従来の誤解を招く表現を修正し、互換性動作を正確に説明するよう改善しました。
TAR アーカイブ解析時の PAX 拡張属性の検証を強化。PAX メタデータから読み込まれるサイズ値が負の値である場合、InvalidDataException をスローするように変更。これにより、不正な TAR アーカイブが受け入れられるのを防ぎます。
Windows環境でのTarファイル処理におけるシンボリックリンク関連のバグを修正します。System.Formats.Tarライブラリの内部実装を改善し、Windows固有のパス処理問題に対応しています。
NativeAOT実行時にCOMインターフェースパラメータのMarshalAsメタデータ内のIidParameterIndexの解析に失敗し、marshaldescriptorブロブに未読バイトが残ってアサーション例外が発生する問題を修正します。パーサーがIUnknown、IDispatch、Interface型に対するオプショナルなIidParameterIndexペイロードを適切に消費するようにします。
xarch JITコンパイラのFMA(積和演算)およびAVX-512 TernaryLogic命令について、不要な遅延フリー(delay-free)マーキングを削除する変更です。これらの命令は完全に並べ替え可能(fully reorderable)であるため、特殊なシナリオを除いて遅延フリー制約は不要です。
ILLink単体テストおよびトリミングテストの実行時に、Debug構成のツールを使用するようにAzure Pipelines定義を修正します。これにより、ILLink内部のアサーション(assert)を有効にしてテストを実行できるようになります。
EventSourceLoggerTestのTrim/AOT安全性を実現するため、JsonConvert.SerializeObjectによる複雑なペイロードのシリアライゼーションをJsonTextWriterベースの手動実装に置き換えました。これにより反射ベースのJSON生成を排除し、IL2026抑制を削除できます。
GC regions + large pages有効時のメモリ破損バグを修正するバックポート。コンパクション後にheap_segment_usedウォーターマークが古い値のままだと、decommit_regionが不足した範囲しかクリアせず、ダーティメモリが再利用されてヒープ破損/クラッシュが発生する問題に対応しています。
ValueTaskContinuationが ExecutionContext の保存・復元を不要とするよう最適化しました。将来的には JIT がコンテキスト参照がないことを証明した場合、continuations が保存・復元をスキップできるようにする基盤を整備しています。
CoreCLR JITのIndirectCallTransformer実装内部フィールドをリネームするリファクタリングです。主にコンパイラとトランスフォーマー関連のフィールドにm_プリフィックスを付与し、命名規則の一貫性を向上させました。また複数のメンバーをコンストラクタ初期化からクラス内デフォルト初期化に変更しています。
clrjit プロジェクトに対して、コンパイラの警告抑制フラグ (-Wno-unused-function, -Wno-tautological-compare, -Wno-unused-value) を削除し、コードの警告を修正する変更。JIT 関連の複数のファイルで未使用の変数・関数や冗長な比較に対する警告を明示的に対応して、コード品質を向上させることが目的。
EmsdkPackageVersionのハードコード化された値を廃止し、依存関係フロー(dependency flow)から自動更新されるプロパティ値に変更します。以前のビルド問題の回避策として硬直的に設定されていた値(10.0.0)を、MicrosoftDotNetApiCompatTaskPackageVersionプロパティから動的に取得するようにします。
Unix(Linux、macOS、BSD等)プラットフォームにおいて、リンク時のデッドコード排除を全体的に有効化するため、ネイティブビルド設定を更新しました。既に使用されていた -ffunction-sections に加えて -fdata-sections を追加し、リンカフラグ(Apple向けは -Wl,-dead_strip、他のELF形式向けは -Wl,--gc-sections)を Release / Checked / RelWithDebInfo ビルドに設定することで、未参照のコードセクションだけでなくデータセクションも排除できるようにしました。Debug ビルドはシンボル保持とインクリメンタルリンクのため変更を避けています。
cDAC(Common Data Access Component)のHelix テスト環境において、debuggeeプロジェクトの参照DLLがシンボル検索パスにコピーされていないため、クロスプラットフォームのWindows dumpでメタデータ読み込みが失敗する問題を修正します。従来は<DebuggeeName>.dllのみをコピーしていましたが、ProjectReferenceから生成されたDLL(例:Trampoline.dll)も対象に含めます。
ARMV7L(32-bit ARM)固有のCMakeプリプロセッサ定義を削除します。廃止予定のホスト/ターゲットプラットフォーム定義を整理し、CMakeビルド構成をシンプル化します。
組み込みDIサービス(IServiceProvider、IServiceScopeFactory、IServiceProviderIsService、IServiceProviderIsKeyedService)のキー付きサービス検査動作を修正しました。これらのサービスはnullキーに対してのみ利用可能と扱われるようになり、キー付き解決(keyed resolution)の実際の動作と一致させました。
PhysicalFilesWatcherでFileSystemWatcherのIncludeSubdirectoriesを無条件に有効化していた問題を修正しました。Linuxでは不要な再帰監視がinotify watch descriptorの過剰消費につながるため、実際にサブディレクトリ参照が必要な場合のみ有効化するよう改善します。これにより、systemdから起動されたアプリケーションなど、ルートが/の場合のパフォーマンス低下を防ぎます。
Android(およびiOS/tvOS/MacCatalyst)において、*.localhostサブドメインのDNS解決時にbionic getaddrinfoがループバック以外のアドレス(link-local IPv6やグローバルルーティング可能なIPv6)を返す問題を修正しました。RFC 6761 §6.3に基づき、OSリゾルバーが非ループバックアドレスのみを返す場合に、プレーンなlocalhostへのフォールバック動作を追加実装しました。同期・非同期両方の解決パスで対応しています。
CI パイプラインモニタースキルのデータベース内の失敗情報から GitHub Issue やコメントを自動生成するための Python スクリプトを追加します。デフォルトはドライラン mode で動作し、--go フラグを明示的に渡すことで実際の gh コマンドを実行します。ビルド ID ごとにスタンプファイルを生成して重複コメント投稿を防止します。
JITコンパイラの条件式最適化を改善し、SELECT(cond, cns, cns)パターン(条件は異なるが真偽両ケースで同じ定数値を返す)を直接その定数値に変換します。これにより、不要な条件分岐と比較演算を削除し、生成されるアセンブリコードを簡潔化します。
例:0.0.Equals(value)のような比較は、条件の結果に関わらず定数を返す場合、その定数に直接置換されます。
環境変数の設定キー変換をカスタマイズできる機能を追加します。デフォルトではアンダースコア2つ(__)をコロン(:)に変換しますが、新たにVariableNameTransformationデリゲートで任意の変換ロジックを指定できるようになります。また、ドット(.)を含むキーを環境変数から設定する場合用にColonAndDotTransformationプリセットが提供されます。
// アンダースコア3つで`.`、2つで`:`に変換
builder.AddEnvironmentVariables("Logging__",
EnvironmentVariablesConfigurationSource.ColonAndDotTransformation);
JITコンパイラの中間表現(IR)一貫性チェックを強化し、GT_RETURNノードが正しく配置されていることを検証するデバッグアサーションを追加します。GT_RETURNはBBJ_RETURNブロックにのみ存在し、かつそのブロック内の最後のステートメントである必要があります。
ARM32など大規模なコンポジット コンパイルで、async メソッドと resumation stub が離れすぎて reloc のオフセットが収まらなくなる問題を解決します。ReadyToRun (crossgen2) コード レイアウト時に resumation stub を対応する async メソッド直後に配置し、オフセットを小さく保つことで、reloc の失敗を防ぎ、iキャッシュの局所性を向上させます。
WASM Browser SDK MSBuildターゲットにおいて、ネストされた発行(nested publish)時のboot JSON生成をスキップするための修正。ネストされた発行でVFSコンテンツエントリを含まないboot JSONが生成され、その後の外側のビルドでインクリメンタルビルドが誤作動してVFSコンテンツを含まないJSON状態のままになることでDirectoryNotFoundExceptionが発生していた問題を解決。
ProcessOutputLine.ToString() が型名を返していた問題を修正し、Content プロパティの内容を返すようにしました。これにより Console.WriteLine(line) などでの出力が期待通りになります。デフォルト初期化されたstruct の場合は string.Empty を返し、null を返さないようにしています。
await foreach (var line in process!.ReadAllLinesAsync())
{
Console.WriteLine(line); // 型名ではなく実際の出力を表示
}
WebAssembly RyuJIT コンパイラの finally ブロック呼び出しコード生成を実装しました。これまで未実装だった BBJ_CALLFINALLY ブロックの処理を、finally funclet への間接呼び出しを行う実装に置き換えています。finally が正常系で呼び出される必要がある場合に使用されます。
.NET 10.0のリリースブランチにおいて、dotnet-optimizationの依存関係をLKG(Last Known Good)バージョンにダウングレードします。サービシングブランチではoptimizationデータパッケージが生成されないため、意図しない場所へbitが流れていた問題を解決します。ダウングレード対象は.NET 10.0.0で使用されていた安定版です。
System.Text.Jsonテストをプロジェクト除外対象に追加する変更です。outerloopsテストの実行を正常化するために必要な対応となります。
DAC/DBI インターフェースの RCW キャッシュ済みインターフェースポインタ照会 API をコールバック ベースの列挙 API に変換します。GetRcwCachedInterfacePointers(配列を返す)からEnumerateRcwCachedInterfacePointers(コールバック型)に切り替え、cDAC 実装パスを追加します。
Mono AOT プロファイラーのバッファリサイズ処理におけるバグを修正。必要なサイズが現在のサイズの2倍を超える場合、1回の倍化では不足するため、必要なサイズに達するまでループでバッファサイズを倍化する処理に変更しました。
JITコンパイラの定数畳み込み(constant folding)ロジックをリファクタリングし、巨大なgtFoldExprConstメソッドを複数の小さな専門化されたヘルパー関数に分割します。動作は変わらず(32ビットxarchの軽微な修正を除く)、コード可読性の向上とネイティブコンパイラのインライン最適化の改善を目指しています。
JIT ループ正規化処理を拡張し、複数のバックエッジを持つ自然ループに対して単一の「ラッチ」ブロックを作成する機能を追加します。このラッチブロックはループヘッダーへの無条件分岐となり、すべてのバックエッジソースがここを経由するようにリダイレクトされます。これにより、ダウンストリーム最適化が単一の正規バックエッジ形状に依存できるようになります。
ToFrozenDictionaryで中間Dictionary<,>を構築する際、ソースコレクションのカウント情報を利用して事前にサイズを設定することで、不要なリサイズと再ハッシュを削減します。これにより、ConcurrentDictionary<,>、SortedDictionary<,>、ImmutableDictionary<,>、ReadOnlyDictionary<,>、配列、List<KVP>などのソースからFrozenDictionaryを構築する際のパフォーマンスが向上します。
Android の X509 チェーン PAL における JNI グローバルリファレンス(GREF)のメモリリークを修正します。AndroidCryptoNative_X509ChainGetCertificates が返すグローバルリファレンスが、マネージド証明書の構築後に解放されていなかったため、try/finally ブロックで確実に解放するようにしました。
R2R(Ready2Run)生成時のレイアウト問題を2つ修正します。
win-x86レグでのOOM問題を解決するため、composite mode時のCrossGen2並列度を制御する新しいMSBuildプロパティを追加しました。HugeArray、HugeFieldなどの大規模メソッドがparallel compilationで過度なネイティブメモリを消費していたため、jit64_3テストではcomposite mode時のみparallelismを2に制限することで、ビルド時間への影響を最小限に抑えながら問題を解決しています。
managed cDAC/DacDbi API の GetSymbolsBuffer メソッドを実装し、モジュールからメモリ内シンボルストリームを取得する機能を追加しました。Loader コントラクトを利用して PDB バイト情報を管理し、ダンプデバッグ時のシンボル取得をサポートします。
SslStreamのサーバー側ClientHello処理を改善し、ServerOptionsSelectionCallbackデリゲートがsupported_versions拡張機能を通じて広告されているTLSバージョン(特にTLS 1.3)を正確に受け取れるようにします。これにより、SNI選択時にクライアントがサポートするすべてのプロトコルバージョンが正しく処理されます。
デバッガーのスタックウォーク機能をcDAC(Compact DAC)で実装するPRです。レガシーなIPC構造体(DebuggerIPCE_*)を新しいDebugger_*に名前変更・再構成し、Frame::GetStubFrameType()を追加することで、GetCountOfInternalFrames/EnumerateInternalFramesの実装を可能にします。cDAC側にIStackWalkの3つの新メソッド(GetFrames、IsExceptionHandlingHelperInlinedCallFrame、GetDebuggerEvalData)を実装し、テストを伴う形で提供されます。
R2Rdump(Ready2Run形式のダンプツール)を32ビットプラットフォームおよびWebAssembly対応で修正するPRです。32ビット環境でのfixupオフセット識別の不具合を解決し、WebAssembly環境でCoreDisToolsを不要に読み込まないようにします。また、WasmファイルのR2Rシンボル逆アセンブリにおいてシンボリック検索機能を追加します。
COM source-generatorが[MarshalAs(UnmanagedType.Interface)] out objectパラメータのIidParameterIndex属性を無視していた問題を修正しました。この変更により、実行時IIDを使用したQueryInterface呼び出しによって、ネイティブ呼び出し側に正しいインターフェースポインタを返すようになります。
[GeneratedComInterface]
[Guid("...")]
partial interface IActivationFactory
{
void GetActivationFactory(
in Guid iid,
[MarshalAs(UnmanagedType.Interface, IidParameterIndex = 0)] out object factory);
}
ARM/ARM64アーキテクチャのR2Rイメージ生成時、Relocation.GetSizeメソッドに2つのリロケーションタイプ(THUMB_BRANCH24とARM64_BRANCH26)の処理が欠落していたため、NotSupportedExceptionが発生していた問題を修正しました。これらのリロケーションタイプはReadValue/WriteValueでは既に対応していましたが、GetSizeに追加することで、PEObjectWriterがリロケーション解決時に正しいサイズを報告できるようになります。
CoreCLR インタープリタの float/double から u1(uint8)/u2(uint16)への変換動作を JIT コンパイラの動作と一致させるパッチです。負の値の変換時に、これまでは uint32_t を経由して飽和変換(saturation conversion)を行っていましたが、int32_t を経由する署名付き変換に変更することで、正しい値に変換されるようになります。
例: (ushort)-4567.0f は従来は 0 でしたが、修正後は 60969(-4567 の符号なし16ビット表現)に変換されます。
NegotiateStream.ReadAsync で、フレームボディの読み込み失敗時に内部バッファ状態が不整合のままになり、後続の Read 呼び出しが stale(ゼロ埋めされた)バッファ内容を返す不具合を修正。フレームヘッダ読み込み後、ボディ読み込み前に _readBufferCount が割り当てられていたため、ReadAllAsync で例外が発生した場合、後続の呼び出しがバッファ内の 0 を EOF と区別できずに返していた。
Apple mobile + CoreCLR環境でXSLT APIテストが失敗する問題を解決するため、[ConditionalClass]属性を使用してテストをスキップする仕組みに変更しました。基底クラスXsltApiTestCaseBase2の静的コンストラクタが読み取り専用のアプリバンドルデータに書き込みを試みることで発生していた問題に対応しています。
cDAC(Common Diagnostics Access Component)の DacDbi API を拡張し、型ハンドルまたはオブジェクトアドレスから DebuggerIPCE_ExpandedTypeData を生成する TypeHandleToExpandedTypeInfo および GetObjectExpandedTypeInfo を実装します。また、System.Object メソッドテーブルを認識する IRuntimeTypeSystem.IsObject() コントラクトヘルパーを追加し、ELEMENT_TYPE_OBJECT と ELEMENT_TYPE_CLASS を区別できるようにします。
Arm64プロセッサにおけるPointer Authentication (PAC)のJIT支援を実装するPRです。PAC(Armv8.3+)はReturn-Oriented Programming (ROP)攻撃を軽減するセキュリティ機能で、リターンアドレスを暗号学的に署名することで制御フローを保護します。本実装ではプロローグでpaciaspを使用してリンクレジスタ(LR)を署名し、エピローグでautiaspを使用して認証します。無効な署名はSIGILLで実行を失敗させます。デフォルトでは無効ですが、DOTNET_JitPacEnabled=1で有効化できます。
デバッガ通知の回帰バグを修正したPull Requestです。例外処理のPass 1終了後、StackFrameIteratorの状態が古くなっており、NotifyExceptionPassStartedでFuncEvalFrame/DebuggerU2MCatchHandlerFrameの検出が失敗していました。修正では、マネージフレームから明示的フレームへの遷移時に挿入されるNATIVE_MARKER_FRAMEをスキップして次のフレームに進め、NotifyOfCHFFilter通知が正しく発火するようにしました。
Android ARM(armeabi-v7a)のCoreCALRサポートを再有効化し、softfp ABI呼び出し規約に対応させるプルリクエストです。Android ARMはfloating-point引数と戻り値をコアレジスタ/スタック経由で渡す必要があるため、ARM_SOFTFP定義を追加し、NativeAOT/Crossgen2のAndroid ARM32ビルド時にarmel ABI を適用するようにしました。また、Crossgen2とILCompilerのAndroid target引数を一元化し、--targetos:android --targetarch:armから自動的にsoftfp(armel)ABI に正規化される仕組みを実装しました。
.NET 10で導入されたGCヒープサイズ回帰の修正を release/10.0 ブランチに復元するバックポート。重いピンニングシナリオでのリージョンベースGCのパフォーマンス低下を改善しながら、大きなプラグの再配置時にフロントパディングが無限ループを引き起こす問題を修正しています。
CoreCLR Apple mobile環境において、System.Text.Json.TestsとSystem.Collections.Concurrent.Testsをテスト実行対象に復活させるPRです。プロジェクトレベルの除外設定を削除し、既知の失敗テストには[ActiveIssue]アノテーションを追加して対応しています。
RyuJITコンパイラから単一IG(Instruction Group)制限を削除し、JITコード生成の柔軟性を向上させるPRです。主な変更は:(1) IG番号の順序外比較をIG リストの走査により改善、(2) 単一IG制限の回避のためだけに使用されていた相対ジャンプ(+/- <instr count>でエンコード)を削除します。
SVE(Scalable Vector Extension)命令セットが利用可能な場合、Vector<T>を参照渡しで扱うように変更し、128ビットHFA(Homogeneous Float Aggregate)として扱われることを防ぎます。同時にHFA認識ロジックを改善し、固定サイズ型のHFAタイプ判定を集約化した中央関数で一元管理するようにリファクタリングされています。
インターフェース メソッド ディスパッチの実装を、キャッシュベースのセルから汎用のディスパッチ ヘルパー呼び出しに移行します。NativeAOT環境において、インターフェース ディスパッチ セルを2ポインタ構造(キャッシュされたMethodTable+ターゲットメソッドアドレス)に統一し、メタデータ(インターフェース型とスロット情報)をアウトオブライン化します。初回のディスパッチでは遅延解決ヘルパー(RhpResolveInterfaceMethodFast)が呼ばれ、セル内に結果をキャッシュします。異なるthisでのディスパッチはグローバルハッシュテーブルにキャッシュされます。
ILTrim テストの Attributes.BoxedValues テストケースが予期せず成功するようになったため、期待失敗リストから削除するPRです。テストハーネスは期待失敗リストに登録されているが実際には成功するテストに対してエラーを発生させます。
複数のテストプロジェクト(.csproj)から不要になったアナライザー抑制(suppressions)を削除するPRです。Arcade修正と追加の分析により、これらの抑制は不要になったとのことです。
cDAC RuntimeTypeSystemコントラクトを拡張し、GetFieldDescStaticAddressとGetFieldDescThreadStaticAddressにunboxValueTypesパラメータを追加しました。これにより、値型の静的フィールド/スレッド静的フィールドのアドレス計算時に、ボックス化された値をアンボックスするかどうかを呼び出し側で選択できるようになります。この機能を使用して、非レガシーパスでDacDbiImpl.GetCollectibleTypeStaticAddressを実装します。
自己完結型単一ファイルアプリ(IncludeAllContentForSelfExtract=trueで公開)のSystem.Private.CoreLib.dllバインディング処理を最適化しました。システムディレクトリでの検索失敗時、TRUSTED_PLATFORM_ASSEMBLIES(TPA)全体をスキャンする代わりに、バンドル抽出ディレクトリを直接参照するよう変更。これにより、スタートアップ時のメモリ割り当てを削減します。
ボックス化されたインターフェース呼び出しをデバーチャル化する際、JITが一時的なスタックローカルコピーを作成していた問題を修正します。UnscopedRefなどを介して内部マネージドポインタを返すメソッドの場合、返却されたbyrefが一時コピーにエイリアスされ、フレーム終了後にダングリングポインタになる安全性上の問題がありました。修正後は常にヒープボックスを保持し、ボックス+MTサイズのアドレスでアンボックス化されたエントリを呼び出すよう変更します。オブジェクトのスタック割り当て最適化によって、非エスケープなヒープボックスは既にスタックに昇格されるため、前の最適化は安全なケースで復元されます。
#126509で導入されたトランジェント-IL P/Invokeの呼び出し規約検出を修正するPR。Swift呼び出し規約を使用するトランジェント-IL P/Invokeでは、MethodDesc::IsILStub()がfalseを返すため、コンテキストMDが渡されず、Swift呼び出し規約検出に失敗していた問題を解決します。
JIT の async state machine lowering において、不変ノード(invariant nodes)と LCL_VAR が async 呼び出しを跨いでリフトされないよう最適化します。これらのノードを使用箇所の直前に移動することで、spill locals の生成を削減し、LCL_ADDR defs がリフトされないことを保証します(#128152 の前提条件)。
WebAssembly/coreclrのビルド構成を変更し、生成されたcallhelper実装ファイル(callhelpers-interp-to-managed.cpp、callhelpers-reverse.cpp、callhelpers-pinvoke.cpp)を新しいlibcoreclr_gen_static静的ライブラリに分離しました。これにより、coreclr全体を再構築することなく、libcoreclr_staticと新しく生成されたcallhelperソースのみでの再リンクが可能になります。
CoreCLR JIT/EE インターフェースの CorInfoType 列挙型から、レガシーな CORINFO_TYPE_STRING、CORINFO_TYPE_REFANY、CORINFO_TYPE_VAR を削除し、文字列を CLASS、型付き参照を VALUECLASS として再分類するクリーンアップです。JIT/EE版GUID も更新されています。
JITコンパイラの書き込みバリア除去最適化をGT_STORE_BLKノードに拡張しました。これまでGT_STOREINDのみだった最適化をSTORE_BLKにも適用し、VN/アサーション解析によってブロック書き込み先がGCヒープ上にないことが証明できた場合、GTF_IND_TGT_NOT_HEAPフラグを設定して高速なCpObj/SIMD InitBlkパスを有効化します。
WebAssembly JITコンパイラでfunclet(例外処理などの独立したコード断片)へのポインタ生成とfuncletのインデックス呼び出しをサポートする機能を追加します。リロケーションアディテンド機構を活用してfuncletを親メソッドのシンボルからのオフセットで識別し、WasmObjectWriterでこのアディテンドを処理することで、funcletに順序付きインデックスを割り当てる対応を実現します。
TlsFrameHelper.csのdotnet/yarpでの修正内容をruntime側に同期するPRです。内部的な識別子とコメントのタイプ修正のみが対象で、パーサーの動作は変わりません。
ガベージコレクション(GC)のコンパクション後にheap_segment_usedウォーターマークが古い状態のままになり、ヒープ破損につながる問題を修正します。compact_phase終了時に、heap_segment_usedをmax(used, plan_allocated)に更新することで、後続のGCサイクルでメモリ破損を防ぎます。
CI失敗スキャン機能において、既知のビルドエラー(KBE: Known Build Error)の重複検出ロジックを拡張し、KBE JSONスキーマの厳密化を実施しています。異なるプラットフォームまたはランタイム変種で同一テストクラスに対して報告された既知ビルドエラー、およびKBEラベルを欠いた既存のエリアチーム追跡者を適切に検出できるようにします。
Mono の --full-aot モードにおいて、MonoAotIncompatible マークされたテストが minifullaot/llvmfullaot ビルドで DLL を読み込む際にプロセスを中止させる問題を修正。MonoAotIncompatible=true なプロジェクトを自動的に除外する規則を src/tests/Directory.Build.targets に一元化し、複数のプロジェクトファイルの重複コードを排除。
System.Runtime.Loader.Tests が Apple mobile simulator/macCatalyst の CoreCLR ビルドで失敗していた問題を解決するため、プロジェクト参照の条件を TargetOS == ios/tvos から TargetsAppleMobile に変更しました。これにより、ILLink がアグレッシブなトリミング中に System.Runtime.Loader.Test.Assembly* を正しく解決できるようになります。
<ProjectReference Condition="'$(TargetsAppleMobile)' == 'true'"
Include="System.Runtime.Loader.Test.Assembly\System.Runtime.Loader.Test.Assembly.csproj" />
ZIP および TAR リーダーで使用される SubReadStream の実装を強化し、startPosition + maxLength が long.MaxValue を超える場合のオーバーフロー時に例外をスローするようにしました。従来は静かにラップアラウンドが発生していた問題を修正します。
ObservableCounter<T>、ObservableGauge<T>、ObservableUpDownCounter<T>における単一値コールバック呼び出し時の配列割り当てを排除するパフォーマンス最適化。ObservableInstrument<T>.Observe(MeterListener)がパターンマッチングを使用して組み込み型の_callbackに直接アクセスし、単一値コールバックを配列ラッパーをスキップしてMeterListener.NotifyMeasurementに直接ディスパッチします。
IValueTaskSource でバックされた ValueTask が runtime async callable thunk を通して呼び出されるときのメモリ割り当てを削減します。従来は ValueTask が中断した場合に毎回割り当てが発生していましたが、キャッシュされた ValueTaskContinuation インスタンスを再利用することで、中断時の割り当てを排除します。
JIT のコンパイラにおいて、ローカル変数の "DoNotEnregister" (DNER) フラグの設定をliveness解析から分離し、LSRA(Linear Scan Register Allocation)と lowering フェーズに移行するリファクタリング。これにより、liveness の複数実行時における sticky な DNER の問題を解決し、特に非同期関数における不要な DNER マーク付けを削減します。
ILTrimのカスタム属性処理を強化する変更です。CustomAttributeNodeがカスタム属性値blobをデコードして依存関係を検出し、型名文字列を再エンコードして古い型フォワーダー参照を正規化します。これにより、トリミング後の陳腐化した型名を防ぎます。
AMD64 APX(Advanced Performance Extensions)の新しい条件付き命令 CTESTcc と CFCMOVcc をJITコンパイラに導入します。これらの命令により、CCMP reg, 0 を1バイト小さい CTEST reg, reg に最適化できます。CFCMOVはJIT段階での最適化は未実装です。
LINQ に FullJoin オペレータを追加する実装です。Enumerable、Queryable、AsyncEnumerable に対応し、承認済みのAPI形状(単一のオプション IEqualityComparer<TKey>? comparer = null パラメータ)を使用しています。Full outer join セマンティクスを .NET の LINQ 表面積でサポートします。
EqualityComparer<T>に新しいファクトリメソッドCreate<TKey>オーバーロードを追加し、キーセレクタとオプショナルなキーコンパラーを指定して等値比較器を構築できるようにしました。プロパティ値による比較など一般的なシナリオに対応します。
// 使用例
var comparer = EqualityComparer<Person>.Create(p => p.Name);
var comparer2 = EqualityComparer<Person>.Create(p => p.Age, EqualityComparer<int>.Default);
ILVerifyが不正形式の例外処理(EH)句を処理する際に発生していたIndexOutOfRangeExceptionを修正します。診断ツールは例外をスローするのではなく、意味のある検証エラーを報告すべきという原則に基づいています。EH句の境界値が無効な場合、新しいEHClauseOutOfRange検証エラーを報告するようになりました。
GC トリミング時に最若世代(youngest generation)に保持する割合を制御する新しい設定オプション GCTrimYoungestKeepPercent を追加します。メモリフットプリント最適化のための GC レイテンシーレベルと起動時間のバランスを取ることが目的です。
使用例:
DOTNET_GCLatencyLevel=0
DOTNET_GCTrimYoungestKeepPercent=0xF
WebAssembly RyuJIT バックエンドにおける制御フロー深度の計算と Portable Entry Point (PEP) 呼び出しの引数評価順序を修正します。if/end ブロック生成時に追加される制御フロー深度をカウントするヘルパーを導入し、PEP 呼び出しでは PEP を最後の引数として評価してから関数インデックスをロードするよう修正しています。
DacDbi APIの4つの実装をマネージドcDACに追加します。GetSimpleType、ResolveAssembly、ResolveExactGenericArgsToken、GetGenericArgTokenIndexをRuntimeTypeSystemコントラクト経由で実装し、ジェネリック型コンテキストAPI処理を簡素化します。各実装は既存の#if DEBUGレガシークロスチェックパターンでゲートされています。
未使用の書き込みバリア形式 WBF_NoBarrier_CheckNotHeapInDebug と対応するJITヘルパー CORINFO_HELP_ASSIGN_REF_ENSURE_NONHEAP を削除する変更です。このヘルパーは gcIsWriteBarrierCandidate によって生成されることがなく、すべてのコンシューマーが到達不可能なデッドコードパスであるため、削除しても機能に影響はありません。
JIT コンパイラの式の畳み込み処理をリファクタリングし、二重 NOT/NEG 演算の最適化を fgMorphSmpOp から gtFoldExpr に移動しました。これにより不要なノードの早期削除が可能になり、測定可能なスループット改善が得られます。gtFoldExpr を単項/二項ノード向けのヘルパー関数に分割し、最適化ロジックを一元化しています。
JITコンパイラの値番号(Value Numbering)管理において、O2K_CHECKED_BOUND_ADD_CNSとO2K_VN_ADD_CNSの2つの演算子を統合しました。O2K_VN_ADD_CNSは「X+CNS」の形式を、Xの値番号とCNS定数に分解して表現するようにし、アサーション伝播時のホットループ処理を効率化しています。
ヒープセグメント取得APIをメモリ割り当てを回避するために、GetHeapSegments(配列を返す)からEnumerateHeapSegments(コールバック経由で列挙)へ再設計しました。DAC/DBI、cDAC、契約サポートおよびテストを含む実装を追加しています。
WebAssembly ライブラリモード(RID=browser-wasm、OutputType=Library)のビルドで、WASM ワークロードのインストールを不要にする変更。ライブラリプロジェクトは SelfContained や PublishTrimmed をデフォルトで有効にすべきではないという設計方針に基づいている。
cDAC(Compact Diagnostic Access Component)がランタイム起動時に早期にアタッチされた場合、サブモジュール(特にGC)の契約記述子アドレスがまだnullであるため、初期スキャンで見落とされる問題を修正します。Flush() メソッド時にペンディング中のサブ記述子を再解析し、動的に設定されたサブ記述子を取得できるようにします。
IDE0036ルール違反(修飾子の順序が正しくない)を修正しました。C#のコーディング標準に従い、修飾子の順序を適切に並べ替えています。
Wasm RyuJITにおいて、emitDispIns()が呼び出される際にemitCurIGに依存する代わりに、渡されたパラメータのigを優先して使用するように修正しました。コードジェネレーション完了後にemitDispIns()が呼び出されるシナリオで、emitCurIGが設定されていない可能性があるため、より堅牢な実装に改善しています。
IL Scannerが Runtime async メソッド内で async バリアント(サンク)のみをレポートしていた問題を修正。async バリアントが thunk である場合、JIT は元の task 返却バリアントに切り替える可能性があるため、両バリアントをレポートするよう変更し、JIT がコンパイル時に最適なバリアントを選択できるようにします。
RISC-V64アーキテクチャでReady2Run (R2R)コンパイルを使用する際に発生していたランタイムエラー(SIGSEGV、NRE)を修正します。AUIPC命令の即値フィールドを置換する処理を、既存の値にOR演算を行う方式から置換方式に変更することで、リロケーション処理を正確に行うようにしました。
例外の要求元アセンブリチェーンがネイティブコードで構築される際に、プラットフォーム固有の改行コード(Windows: \r\n、Unix: \n)を使用するように変更しました。これにより、マネージド側のToString()オーバーライドでReplaceLineEndings()呼び出しが不要になります。
Android CoreCLRで無効化されていたSystem.Net.Http.Functional.Testsを再度有効化するPR。テストはAndroid Helix キュー(x64-linux、arm64-win)で合格し、30分のデフォルトタイムアウト内に完了することを確認。ただし以前と比べてテスト実行速度が低下しており、根本原因は未特定の状態。
WebAssembly Browser SDK のビルドターゲットにおける MSBuild インクリメンタルビルド対応を改善しました。ConvertDllsToWebcil と GenerateWasmBootJson タスクを複数のより小さなターゲットに分割し、Inputs/Outputs メカニズムを適用することで、入力に変更がないノーオプリビルド時にこれらの高コストな処理をスキップできるようになりました。
release/8.0ブランチでSystem.Security.Cryptography.Xmlパッケージの自動生成を無効化します。これは他のサービシング/パッケージプロジェクトと揃えるもので、プロジェクトはパッケージ化可能なままですが、ビルド時に自動的にパッケージを生成しなくなります。
string.IndexOf メソッドの範囲検証ロジックを修正し、整数オーバーフローを防止します。従来の count + startIndex > Length という検証式を count > Length - startIndex に変更することで、startIndex + count が int.MaxValue を超える場合でも正しく ArgumentOutOfRangeException をスローするようにしました。同様の修正を IndexOf(Rune, int, int, StringComparison) にも適用しています。
release/9.0-stagingからrelease/9.0へのマージPRです。依存関係の更新、WebAssemblyデバッガーテストパイプラインの削除、JITループクローニングの修正とリグレッション対策、Unix環境でのX509チェーンハンドリング用CRLキャッシュの改善が含まれます。
R2Rコンパイル済みメソッドがジェネリック インスタンス化引数を使用して呼び出される際、署名キー計算がジェネリック コンテキスト引数を考慮していなかったバグを修正します。HasGenericContextArg()チェックを追加し、署名キーに隠し引数を含めることで、マネージコードからR2Rコード経由での呼び出し時の署名不一致を解決します。
WebAssembly環境のcorerun.jsにおいて、R2R/Webcilモジュール読み込み時のエラー検出を改善します。__stack_pointerが利用不可の場合に明示的なチェックを追加し、インスタンス化失敗時にwasmパスとエラーメッセージをログ出力するようにしました。リリースビルドのcorerun.jsを使用してR2Rモジュールを読み込もうとした際の失敗モードが改善されます。
Linux上でインタープリタが動作している際のヒープダンプ生成時にcreatedumpがSIGSEGVで異常終了する問題を修正します。Thread::m_pInterpThreadContextフィールドをDAC(Debugger Assist Code)対応ポインタ型に変更し、ターゲットプロセスのアドレスをホストアドレスとして誤読する問題を解決します。
cDAC と legacy DAC の HRESULT 不一致時の DEBUG アサーション出力を改善するPR です。Debug.ValidateHResult で不一致を検出した際に、HRESULTs の値のみでなく、その原因となった例外の詳細情報(型・メッセージ・スタックトレース)を表示できるようにしました。これにより、デバッグ時の問題の根本原因を容易に特定できます。
このPRはWebAssemblyターゲットでのReadyToRun (R2R) / Crossgen2テスト実行をサポートするため、テストハーネスとツール群を更新しています。主な目的は、Wasmターゲット特有の出力形式(.wasmファイル)の処理、テスト実行フローの改善、およびNode.js実行環境のデフォルト化です。
テスト実行例:
./build.sh clr+libs -rc debug -c release -os browser
./src/tests/build.sh skipmanaged browser
export CORE_ROOT=/path/to/Core_Root
export RunCrossGen2=1
/path/to/test.sh
tiered compilation環境で、古いtier層のフレームスタック上に存在する場合にDebugInfo_2.GetMethodVarInfoが誤ったIP-to-codeOffsetオフセット計算を行う不具合を修正します。修正前はMethodDesc.NativeCode(最新コンパイルtier)を基準としていたため、変数位置情報が空リストになっていました。修正後はICodeVersionsコントラクト経由で特定NativeCodeVersionを解決し、legacy DAC動作(ExecutionManager::GetNativeCodeVersion(address).GetNativeCode())と一致させます。
JIT の範囲解析でロジカル右シフト(GT_RSZ)に対する型ベースの上限境界の復元。範囲チェック排除の最適化機会が喪失する回帰を修正しました。
public static int M(int i)
{
ReadOnlySpan<int> vals = [0, 1];
return vals[i >>> 31]; // 範囲チェックが正しく排除される
}
Mono MiniFullAOT ビルドにおいて、AOT モジュール badendfinally.dll.so が生成されないまま badendfinally テストがスケジュールされ、aot-only モードでのクラッシュが発生していた問題を修正します。既存の AOT 非互換テストパターンを適用して、Mono minifullaot ビルド時にこのプロジェクトがビルドされないようにします。
release/8.0ブランチにおいて、Mono WebAssemblyデバッガーテストスイートのCI実行を無効化するPRをバックポートしたものです。Azure PipelinesのジョブやHelixの送信パイプラインを削除することで、CI不安定性の問題(#128130)を解決します。
release/9.0ブランチへのバックポート。Mono WASM/ブラウザデバッガーテストをCI から無効化・削除する変更。環境やICU差分によるCI失敗に対応するため、デバッガーテストのHelix投入・ビルド・パイプライン統合を完全に廃止します。
release/8.0-stagingからrelease/8.0へのマージにより、CoreCLR(DAC/デバッグ、JIT)、暗号化ライブラリ(OpenSSL CRL キャッシング)、テストインフラストラクチャ、および依存関係のサービシング更新をもたらします。主な改善はデバッグ/DAC診断の高速化、OpenSSL CRLのメモリ内MRUキャッシング、テストツール/インフラの刷新です。
CI Outer-Loop Failure Scannerのワークフローとプロンプトをリファクタリングし、セキュリティスキャン認証エラーを修正するとともに、Issue/PRの生成フローを決定的で一貫性のあるプロセスに改善しました。
NativeAOTのILC(Intermediate Language Compiler)が、XML記述子で指定されたジェネリック型のメソッドシグネチャを解決できなかった問題を修正します。例えば System.Void Method(T) のような型パラメータを参照するシグネチャをILLinkと同様に正しく処理できるようになります。
<type fullname="MyGenericClass`1">
<method signature="System.Void GenericMethod(T)" />
</type>
JITコンパイラのGenTreeヘルパー関数におけるマルチレジスタ処理の最適化。重複するマルチレジスタ分類チェックを削除し、GetRegisterDstCount()を直接的に既知のマルチレジ形状(呼び出し、コピー/リロード、HW組み込み、マルチレジスタローカル)を処理するように リファクタリング。ARM64でのスループット向上を期待できます。
cDACシグネチャ契約を拡張し、vararg cookie(可変長引数クッキー)のデコーディングをサポートする新しいDacDbi APIを追加します。GetVarArgArgsBaseとGetVarArgSignatureメソッドにより、varargシグネチャの引数ベースアドレスと生シグネチャポインタ/長さを取得できるようになります。
WebAssemblyインポートサンク内で構造体の戻り値に必要な隠れた返却バッファ引数が不足していたバグを修正しました。ReadyToRun AOTツールチェーンの間接呼び出しで無効なWasmコードが生成される問題を解決しています。
X25519DiffieHellman に対して、他方の公開鍵をバイト列として受け取る DeriveRawSecretAgreement メソッドを追加します。これにより、X25519DiffieHellman インスタンスを作成する必要がなくなり、一般的な利用シーンでのメモリ割り当てを削減できます。
// 新しいAPI
public byte[] DeriveRawSecretAgreement(byte[] otherPartyPublicKey);
public int DeriveRawSecretAgreement(ReadOnlySpan<byte> otherPartyPublicKey, Span<byte> destination);
Roslyn アナライザーが関数ポインタ型(delegate*<...>)に対して null (Top) を返していた問題を修正し、NativeAOT の動作に合わせて SystemTypeValue としてモデル化するようにしました。これにより、Type.get_Assembly の短絡評価を防ぎ、適切な警告が発行されるようになります。
illink(IL Trimmer)がstatic virtual実装を誤ってトリミングする問題に対応するPRです。System.Private.CoreLibのトリミングルートを更新し、System.Runtime.InteropServicesにトリミング回帰テストを追加して、Marshal.StructureToPtr / Marshal.DestroyStructureで[MarshalAs(UnmanagedType.ByValArray)] DateTime[]を含む構造体を扱う際のトリミング後の検証失敗を防ぎます。
ILC(Intermediate Language Compiler)が汎用型上のランタイム非同期メソッドをコンパイルする際にクラッシュする問題(#127179)のテストを追加します。非同期汎用メソッドが非同期汎用メソッドを呼び出す場合、ILCスキャナーが生成した情報とJITの期待値がミスマッチする問題を検証するリグレッションテストです。
JITのmorph処理において、GT_FIELD_ADDRの暗黙的なnullチェックを親のstore命令に折り畳む際に、store値のside effectsが不正に再順序化される問題を修正しました。store値にside effectがある場合、base objectが明らかにnull-safeでない限り、nullチェックの折り畳みを拒否するようにしました。これにより、例外やグローバル書き込みなどのside effectが正しい順序で実行されるようになります。
Complex<T>汎用構造体を新たに実装し、既存の非ジェネリックComplexの完全なAPI表面をミラーリングします。制約はIFloatingPointIeee754<T>, IMinMaxValue<T>です。ComplexとComplex<T>間の双方向変換、パース・フォーマット、数学関数(三角関数、対数、べき乗など)、汎用数値インターフェース実装を含みます。コード重複を避けるため、Complexの長いメソッドはComplex<double>に委譲します。
Complex<float> z = Complex<float>.FromPolarCoordinates(2.0f, MathF.PI / 4);
float mag = z.GetMagnitude();
Complex<float> w = z * 3.0f + new Complex<float>(1.0f, -1.0f);
// 型間変換が双方向で機能
Complex c = Complex.CreateChecked(new Complex<double>(3, 4));
Complex<float> cf = Complex<float>.CreateChecked(new Complex(3, 4));
cDAC(Common Data Access Component)の型メタデータ処理を再構築するもので、DataType enum を Abstractions から Contracts アセンブリに移動し、Target.GetTypeInfo() の API を DataType ベースから文字列ベースに変更します。これにより、型記述子スキーマを Contracts に集約し、Abstractions は抽象 Target API に専念できるようになります。
変更の要点:
Target.GetTypeInfo(DataType) → Target.GetTypeInfo(string typeName) に置き換えDataTypeTargetExtensions.GetTypeInfo(this Target, DataType) 拡張メソッドで互換性を維持Target.FieldInfo.Type フィールドを削除、TypeName (文字列) を唯一の識別子に統一ContractDescriptorTarget の型ストレージを Dictionary<string, Target.TypeInfo> に単一化NativeAOT環境下で、dependent handle(従属ハンドル)のセカンダリオブジェクトへのアクセスを、CoreCLRのグローバルヘルパー関数からIGCHandleManagerインターフェース経由に変更しました。これにより、standalone GC有効時にハンドルマネージャーの抽象化を一貫して使用できるようになり、ハンドルの所有者がstandalone GCの場合でも正確にセカンダリオブジェクトにアクセスできます。
PKCS#8秘密鍵エクスポート時のバッファリサイズロジックの修正。MLKem、MLDsa、SlhDsa、X25519DiffieHellmanクラスで、CryptoPool.Rentがリクエストサイズより大きなバッファを返した場合に、次の再試行で実際に取得したバッファサイズに基づいてリサイズするように修正。これにより、TryExportPkcs8PrivateKeyCoreに毎回同じサイズのバッファが渡される問題を解決します。
CoreCLR内部のリソース管理パターンを、レガシーなHolder/Wrapper/SpecializedWrapperから統一されたLifetimeHolder<Traits>パターンへ移行するPR。HModuleHolder、ResetPointerHolder<T>、CoTaskMemHolder<T>、StubHolder<T>、ExceptionHolderの5つのホルダーを新パターンに移植し、対応するコールサイトをそれぞれ更新。例外処理マクロ(EX_RETHROW、GET_EXCEPTIONなど)のセマンティクスも新パターンに統一。
release/8.0ブランチの内部コミットをマージするPRです。System.Formats.Tarの抽出処理のセキュリティを強化し、Windows上でのシンボリックリンク検証とPAX拡張属性の負の値チェックを追加、MsQuic Schannel依存関係をバージョンアップします。
.NET 9.0向けのセキュリティ強化PRです。System.Formats.Tarの圧縮ファイル抽出時に、Windowsのシンボリックリンクターゲット検証とPAX拡張属性のサイズ検証を厳格化し、パストラバーサル攻撃を防ぎます。あわせてMsQuic Schannel依存関係をバージョンアップします。
HttpListenerのTLS実装に関する説明コメントを追加するドキュメント更新です。管理対象のHttpListener TLSコードパスが現在実質的に到達不可能である理由と、CA5359の抑制理由を明確化するコメントを追加しました。
NativeAOTにおけるTLSアクセスの最適化で、リンカーによる命令の再最適化(リラクゼーション)とJIT GC状態管理の不一致を修正します。JITが遅延的にGC状態を更新する仕様が、リンカーが予定より早くレジスタを上書きする場合に不正な動作を引き起こしていたため、特定の命令パターンでGC状態を先制的に更新するよう改めます。linux-x64とlinux-arm64に対応します。
ConstructorInfo.GetGenericArguments()の動作を修正しました。CLRではコンストラクタはジェネリックメソッドではないため、このメソッドは常に空配列を返すべきですが、以前はNotSupportedExceptionをスローしていました。抽象基底クラスConstructorInfoにオーバーライドを追加することで、すべてのサブクラス(CoreCLR、Mono、NativeAOT、MetadataLoadContextなど)に統一的に対応しました。
未使用であった ICorDebugProcess11 インターフェースとその関連型(ICorDebugMemoryRangeEnum、COR_MEMORY_RANGE)を削除します。このインターフェースの唯一のメソッド EnumerateLoaderHeapMemoryRegions は使用されていなかったため、デバッグAPI表面を簡潔にするための整理です。
minidump収集パフォーマンス向上のための3つのDAC改善をrelease/10.0にバックポートします。DACインスタンスキャッシュの実装変更(SHashへの置き換え)、デバッガパッチキャッシュの追加、およびオプトイン環境変数DOTNET_EnableFastHeapDumpsによるHEAP2列挙パスの有効化により、大規模.NETアプリケーション(多数のスレッド・深いスタック)でのダンプ収集時間を大幅に短縮します(測定値:SHash導入で約9.5倍高速化、パッチキャッシュで55s→7s削減)。
大規模な.NETアプリケーション(多数のスレッド、深いスタック)のミニダンプ収集パフォーマンスを改善する3つのDAC最適化をbackportします。DacInstanceManagerのハッシュテーブル実装をSHashに置き換え、デバッガパッチのキャッシング機能を追加し、環境変数DOTNET_EnableFastHeapDumpsにより高速ヒープダンプ列挙を有効化します。測定結果として、深いスタック(2.5k フレーム)の50スレッド環境でミニダンプ収集が約9.5倍高速化、ヒープダンプが55秒から約7秒に短縮されました。
Native AOT関連のドキュメントを更新し、初心者にとって理解しやすくするための改善を実施しました。メタデータの概要章を新規追加し、既存の設計ドキュメント間のクロスリンク強化、デバッグワークフローの説明拡充などが含まれています。
Single-File Bundle機能に対して、実際にバンドルを生成せずにバンドルに含まれるファイルと除外されるファイルを事前計算するための新しい公開API Bundler.ComputeBundleContents() を追加しました。これにより、SDKはビルド段階でバンドル メンバーシップを事前に判定でき、ビルド増分性をサポートできるようになります。
public sealed class BundleContents
{
public FileSpec Host { get; }
public IReadOnlyList<FileSpec> IncludedFiles { get; }
public IReadOnlyList<FileSpec> ExcludedFiles { get; }
}
public class Bundler
{
public BundleContents ComputeBundleContents(IReadOnlyList<FileSpec> fileSpecs);
public string GenerateBundle(BundleContents bundleContents);
}
ARM64向けのPointer Authentication Code (PAC) Return (RET)命令エンコーディングを追加するPRです。AUTIB、PACIB、RETAA、RETABなど12種類のPAC関連命令のエンコーディングを実装し、セキュリティ機能の強化に対応しています。
WebAssembly(browser)ターゲット向けのクロスプラットフォームビルドを有効化し、build.cmd clr+libs -os browserでwasm JIT (clrjit_universal_wasm_*)、crossgen2、およびSystem.Private.CoreLibのwasm形式R2R出力を生成できるようにする変更です。
GCC(GNU Compiler Collection)のバージョンをv15からv16にアップデートする変更です。ドキュメント、パイプライン設定、およびテストファイルが更新されています。
スレッドローカルスタティック変数初期化時の競合状態を修正するPRです。TLSインデックスメタデータとTLSIndex→MethodTableマップの更新時に、VolatileStoreを使用して発行/可視性保証を強化し、複数スレッドからの並行アクセス時に部分的に発行された状態が観測されないようにします。これはmacOS arm64でのGetThreadLocalStaticBaseクラッシュの問題に対応しています。
cDAC(Compact Data Access Component)デバッガ機能にSetDebugStateを実装します。デバッガ制御スレッド状態をThreadStateNoConcurrencyから新しいVolatile<DebuggerControlledThreadState>フィールドに分離し、読み取り-修正-書き込みレースを回避しながらThread契約を通じて公開します。
インタープリタで実行される非同期メソッドがawaitで中断された際に、デバッガが局所変数と引数の値を取得できるようにします。従来、JIT経路でのみ対応していた非同期デバッグ情報の報告をインタープリタ経路にも実装し、ICorDebugAsyncFrame::GetArgumentがインタープリタフレームでCORDBG_E_IL_VAR_NOT_AVAILABLEを返す問題を解決します。
Unix環境(デスクトップインタプリタ)で静的なDbgTransportTargetインスタンスが破棄される際、mscordbi.dylibに対してDbgDllMain(DLL_PROCESS_DETACH)が呼び出されないため、埋め込まれたRSLockが初期化されたままとなり、デバッグビルドで破棄アサーションが失敗していた問題を修正します。新しいcLockAllowLeak属性を導入し、シャットダウンパスが保証されない静的ライフタイムロックのアサーションをバイパスする仕様に変更します。
1024を超えるCPUを搭載したUnixシステムにおいて、スレッドアフィニティ設定時の未対応ケースを修正します。前回のPRで見落とされていた箇所を補完し、GCToOSInterface::SetThreadAffinity()で動的割り当てされたCPUセットを使用するように更新します。
TPA(Trusted Platform Assembly)アセンブリの読み込み失敗時に、実際のエラー情報(ファイルパス、エラーコード、原因)をFileNotFoundException.FusionLogプロパティに格納するよう改善しました。これまでは「ファイルが見つかりません」という汎用メッセージのみで、具体的な失敗原因が不明でした。
改善例:
// 変更後の例
// FusionLog に以下のような詳細情報が追加される:
// "Failed to open file 'C:\path\to\TpaLibLocked.dll'.
// The process cannot access the file because it is being used by another process. (0x80070020)"
cDAC(契約ベースのデータアクセスコンポーネント)にインタープリタ実行サポートを追加し、診断ツールがインタープリタフレームを含むスタックの正確なウォーク、インタープリタプリコードの解決、解釈メソッドのメソッド情報取得、およびレガシーSOS DAC インターフェイス経由でのインタープリタコード公開を可能にします。
AndroidでIPv6を使用したlocalhostサブドメインの名前解決が失敗する問題を修正しました。Androidのデフォルト/etc/hostsが::1をip6-localhostにマップしているため、RFC 6761フォールバック時に"localhost"のIPv6解決に失敗していました。修正により、IPv6解決失敗時に"ip6-localhost"への再試行を追加し、Androidで正常に動作するようになりました。
CorInfoImpl.ReadyToRun.csファイルのCRLF改行をLFに統一し、#126904で導入されたビルド破壊を修正するPRです。CRLFによるチェックアウト時の不要な変更報告を防ぎます。
Deflate64Fuzzerによる検査で発見されたArgumentOutOfRangeExceptionの修正。System.IO.Compressionライブラリの圧縮解凍処理において、不正な入力データに対する境界値チェックを改善し、エッジケースでの予期しない例外発生を防止します。
Linux上でCPUホットプラグが有効な場合、ランタイム初期化時にsched_getaffinity用のcpu_set_tメモリ割り当てが失敗する問題を修正しました。現在のCPU数ではなく、システムで許容される最大CPU数に基づいてアフィニティマスクを適切にサイズすることで対応しています。
minipalにminipal_get_cpu_max_possible_count()ヘルパー関数を追加し、/sys/devices/system/cpu/possibleから最大可能CPU数を取得します。
Azure Pipelines の Cache@2 タスクがディスク容量不足でキャッシュアップロード時に失敗する問題を対応します。sccache キャッシュはパフォーマンス最適化のため、失敗時にビルド全体が失敗しないように continueOnError: true を設定して、エラーを警告に変更します。
linux-musl-x64 coreclr buildにおいてsccacheコンパイラキャッシングを有効化するCI設定変更。linux-x64での実績(約9分/leg短縮、ヒット率97.59%)と同等の高速化を目指す。sccacheはmusl/glibc両対応の静的リンク済みバイナリであり、キャッシュキーにosSubgroupを含めることでmusl/glibc間のキャッシュ分離を実現。
ARM64でスタックに割り当てられたベクトルとマスクのロード/ストア命令生成時に、アドレッシングがスタックポインタベースの場合に失敗していた問題を修正しました。フレームポインタベースのアドレッシングのみを想定していたアサーションを削除し、コードジェネレーションで適切なレジスタを選択するように改善しました。
CoreCLR JITインポートロジックの未完成なクリーンアップ。impAppendStmtとimpStoreStruct関数から、戻りバッファ(retbuf)処理に関連する到達不可能/デッドコードを削除します。これは#105023からの残件対応です。
CoreCLR ビルドパイプラインの sccache NuGet パッケージ取得方法を変更します。MSBuild の PackageDownload アイテムから明示的な dotnet package download コマンドへの移行により、パイプライン設定をより自己完結させ、MSBuild restore フェーズへの依存を排除します。
DAC/DBI インターフェースから使用されていない2つのメソッド AreGCStructuresValid と IsWinRTModule を削除します。両メソッドは単純な定数値を返すのみで、実装価値がなく、呼び出し箇所も最小限であるため削除対象としました。
Compiler::gtInitializeStoreNodeメソッドが、SIMD/Maskローカルストア操作をすべてのプラットフォームで一貫して処理するように改善されました。これまではx86でのみ特別な処理が行われており、x64ではマスクストアが意図通りに処理されていませんでした。
ThreadPool.UnsafeQueueUserWorkItem<TState>に対してruntime asyncの特殊化ケースを追加し、IValueTaskSource.OnCompletedに渡された継続をスレッドプールに転送する際にワークアイテムの追加割り当てを避けるための最適化を実装しました。これによりASP.NET platform-jsonプラットフォームにおいてasync1とruntime asyncの間のRPSギャップを削減します。
CoreCLR デバッグスタックウォーク経路から未使用の CHAIN_ENTER_MANAGED チェーン機構と関連フィールドを削除するクリーンアップです。IPC スタックウォークフレームデータから chain ペイロードと quicklyUnwound フィールドを除去し、シムスタックウォークロジックを簡素化しました。
docs/design/specs/Memory-model.md内の不正確な名前空間参照を修正するドキュメント修正です。System.Threadの誤記を正しいSystem.Threading.Threadに修正しました。
具体的には以下の3つのAPI参照を修正:
System.Thread.VolatileRead → System.Threading.Thread.VolatileReadSystem.Thread.VolatileWrite → System.Threading.Thread.VolatileWriteSystem.Thread.MemoryBarrier → System.Threading.Thread.MemoryBarrierlinux-riscv64 プラットフォームのインタプリタテスト実行時に発生していた問題を修正するPRです。clang-21のデフォルト設定変更に対応し、RISC-V命令セット拡張を明示的に制限するとともに、プロログオフセット計算の符号エラーと不適切なアサーションを修正しました。
R2RDump ツールに Webcil (WebAssembly-wrapped .NET assemblies) ファイルの読み込みと解析機能を追加します。同時に WebAssembly バイトコード完全ディスアセンブラ (WasmDisassembler) を実装し、メタデータ抽象化を改善して PE ファイルに依存しないセクション読み込みに対応しました。
CLRインタープリタのデバッガ統合における2つのアサーション失敗を修正しました。DispatchMethodEnterでのコントローラーカウント処理とインタープリタのINTOP_DEBUG_METHOD_ENTER命令の検証を改善し、スレッドアフィニティなMethodEnterコントローラーやデバッガブレークポイント設定時のテスト失敗を解決します。
runtime-async非同期デバッガーのタイムスタンプ計測を修正し、新たに作成されたcontinuation チェーンが、現在実行中のcontinuationのタイムスタンプを継承せず、中断時に新しいタイムスタンプを取得するようにしました。これにより、async チェーン内のすべてのタイムスタンプが同じになる問題を解決しています。
TAR アーカイブ読み込み時のセキュリティを強化するため、PAX拡張属性ブロックおよびGNU LongPath/LongLink データセクションの最大サイズを1MBに制限します。これにより、不正形式のアーカイブからの過度なメモリ割り当てやDoS攻撃を軽減します。
WebAssemblyのbrowser_wasmプラットフォームにおいて、CoreCLR outerloop CI での Priority1 ランタイムテスト実行を有効化します。マルチスレッド機能を持たないブラウザ環境やインタープリタの制限により失敗するテストを条件付きスキップまたは除外して、テストを安定化させます。
現在の成果:
AsyncOperationとManualResetValueTaskSourceCore<TResult>の完了シグナリングメカニズムを改善し、理論的なレース条件を排除して保持されるオブジェクト参照を削減します。完了検出をセンチネル値ベースに統一し、キャプチャしたコンテキストと状態をより早期にクリアすることで、メモリリークやオブジェクト参照の長期保持を防止します。
Android プラットフォームでの TCP 接続失敗に起因するテストの不安定性を解決するため、SelectPoll_InfiniteTimeSpan_Ok テストを UDP ソケットを使用するように変更しました。テストの目的である "infinite timeout" 引数の妥当性検証は保持したままです。
このPRはcDAC(Component Data Access Contract)を介してIXCLRDataProcess::GetRuntimeNameByAddressを実装し、スタブの種類分類(StubKind)と名前解決機能を追加します。スタブ(CallCountingStub、VSD_DispatchStubなど)にアノテーションを付与し、Precodeスタブの解決にも対応します。
Composite BuildモードでのReadyToRun(R2R)コンパイル時に、非同期サンク(async thunks)とレジューメーション スタブのコンパイルを有効化します。問題は、Composite Imageの型を参照するMutableModuleトークンを発行していたが、MutableModuleトークンがCoreLib以外を参照することが明示的にブロックされていたこと。解決策として、ExternalReferenceTokenManagerを使用して必要なトークンをMutableModuleに追加し、ILStubとしてサンク(thunk)をコンパイルします。ジェネリック メソッドの署名発出時の問題も修正しており、インスタンス化情報がストリップされた場合に所有型を強制的にエンコードするようになりました。
crossgen2での静的仮想インターフェイスメソッド呼び出し時に、制約付き型での実装解決に失敗した場合、デフォルトインターフェイスメソッド(DIM)の実装をインターフェイス上で検索するフォールバック処理を追加しました。これにより、Perf_DateTimeCultureInfo.ToStringテストで約25倍の高速化が実現されています。
JITの範囲チェック最適化パスにおいて、キャスト操作を通じたより正確な範囲伝播を実現するための改善です。GetRangeFromAssertions内でのキャスト処理をより正確にし、GetRangeFromTypeにTYP_INTサポートを追加することで、範囲解析の精度を向上させています。
CoreCLR パイプラインの sccache ローカルキャッシュサイズを3.5GBに制限し、ローリングビルド時のキャッシュ復元・保存のオーバーヘッドを削減します。デフォルトの10GB制限では、古いエントリが蓄積して6~7GBまで増加し、キャッシュの転送に約3分のオーバーヘッドが発生していました。LRU削除により、作業セットサイズ(~3GB)に近い状態を維持します。
CoreCLR JIT コンパイラの大域的アサーション伝播と範囲解析を拡張し、両方のオペランドが任意の値番号(VN)である符号付き比較(VN <relop> VN)に対応します。これにより、リレーショナルファクトをチェーン化することで追加的なブランチ折畳みが可能になります。
例えば if (x > 10 && x < 100) の後に if (y > x) がある場合、JIT は y > 11 という推論を行い、その後の return y > 0; を常に真として最適化できます。
string型のRune関連ヘルパーメソッドのパフォーマンスを向上。BMP(Basic Multilingual Plane)Rune入力に対してはchar オーバーロードへの委譲、非BMP Runeに対しては直接UTF-16サロゲートペア比較を実装。Trim関連メソッドもTrimHelperを用いて最適化。
Wasm AOT コンパイル(Crossgen2)において、関数本体の ULEB128 長プレフィックスを ObjectData に直接エンコードする仕組みに統一しました。従来は SectionWriter/ObjectWriter で動的に長プレフィックスを挿入していましたが、これを廃止し、JIT と同じ方式(#127773 で導入)に合わせています。
非同期呼び出し時の継続状態キャプチャにおいて、戻り値変数がライブローカル変数として継続オブジェクトに保存されていた問題を修正。これにより未初期化データがコピーされ、GCの不整合クラッシュを引き起こしていた。戻り値メタデータを専用に追跡し、再開パスで明示的に復元することで解決。
WebAssembly(Browser)上のCoreClrランタイムでSystem.Linq.Expressions.Testsが実行されるようになります。このテストスイートは以前は無効化されていましたが、調査により5,670件のテストすべてがRelease CoreClrで成功することが確認されたため、再度有効化するものです。
TryWriteSignificandおよびTryHashヘルパーメソッドにおいて、安全でないコード(unsafe)の使用を削減するリファクタリング。型安全性を向上させながら同等の機能を維持する変更。
SListがMSVCにおいて空ベースクラス最適化を受けていないために2ポインタサイズの容量を無駄に消費していた問題を修正。EMPTY_BASES_DECLマクロをminipalに一元化し、CoreCLRとNativeAOT両者で共通利用できるようにしました。これによりSListのメモリフットプリント(特にヘッドのみのリスト)が削減されます。
CoreCLRのGetOsPageSize()ラッパーを削除し、すべてのコールサイトを#127328で導入された標準APIminipal_getpagesize()に統一するPR。WASMの16KBページサイズなど、プラットフォーム間でのページサイズ意味論の一貫性を確保します。
Mono AOT コンパイル時に nint/nuint 型のオーバーロードを持つ Crc32 と ArmBase 組み込み関数のディスパッチが失敗する問題を修正します。simd-intrinsics.c の型チェックロジックを改善し、MONO_TYPE_I/U に対応させることで、tvos-arm64 での System.Private.CoreLib.dll AOT プリコンパイルをブロック解除します。
cDAC(CoreCLR Diagnostic Data Access Contract)の署名デコーディング統一化の第2段階。RuntimeSignatureDecoderを導入し、System.Reflection.Metadata の SignatureDecoder に合わせた API を提供しつつ、CoreCLR 固有の内部署名要素型(ELEMENT_TYPE_INTERNAL / ELEMENT_TYPE_CMOD_INTERNAL)に対応。Signature契約と StackWalk契約(GC参照スキャン)で統一的に署名をデコードするようにリファクタリング。
Arm64 SVE2命令セットに対応した新しいハードウェア組み込み関数を追加します。CreateWhileGreaterThan*(ベクトルの末尾から始まるマスクビット)とCreateWhileReadAfterWrite*(ポインタ値に基づくマスク生成)の2つのイントリンシクファミリーを実装します。これらは既存のCreateWhileLess*イントリンシクをベースにしており、Linux-arm64でjitstressテストに合格しています。
WebAssembly上のReadyToRun (R2R) イメージにおいて、文字列キーによるプリジェネレーテッドコード thunk の検出を可能にする end-to-end インフラストラクチャを追加します。新しいR2R fixup READYTORUN_FIXUP_InjectStringThunks (0x39) により、R2R コンパイル済みコードと WASM インタープリタ間の相互運用性を実現します。
osx-arm64プラットフォームの高速マシン上で、非同期継続のcDAC(Compact Data Access Component)ダンプテストが不安定に失敗する問題を修正します。Task.Delay(1)をawait時に使用していたため、タイマーが継続チェック前に発火してしまい、AsyncDispatcherInfo型がロードされないまま進行していました。Task.Yield()に変更することで、マシン速度に関わらず確実に非同期サスペンションを保証します。
新しいRoslyn 5.7.0で導入されたコンパイラエラーCS9361に対応するため、X25519DiffieHellmanCng.DeriveRawSecretAgreementCoreメソッドのstackalloc式を修正しました。アセンブリ全体に[SkipLocalsInit]が設定されている環境では、初期化されていないstackallocはunsafeコンテキストが必須となります。メソッド全体をunsafeにするのではなく、stackallocの割り当てだけを最小限のunsafeブロックでラップし、scoped修飾子で参照安全性を保持します。
scoped Span<byte> publicKeyBuffer;
unsafe
{
publicKeyBuffer = stackalloc byte[PublicKeySizeInBytes * 2];
}
sccache のAzure Pipelines キャッシュキーから buildConfig (Debug/Release) を削除し、PR ビルドがローリングビルドのキャッシュを再利用できるようにしました。これにより、PR のネイティブコンパイルレッグで 33-46% のビルド時間削減 が期待されます。
Enumerable.Min/Maxのベクトル化実装における最終的な還元処理を最適化しました。Vector128<T>アキュムレータをスカラループからシャッフルベースの水平還元に変更することで、特に小さい要素型(byte/short)で大幅な性能向上を実現しています。
JITコンパイラのGenTree::IsPow2関連関数における符号拡張の問題を修正しました。IsIntegralConstUnsignedPow2が符号拡張された値を渡していたため、実際には符号なし整数として機能していませんでした(例:1 << 31がpow2として認識されない)。新たにUnsignedIntegralValueメソッドを追加してゼロ拡張リテラルを提供し、複数の関数で使用することで修正しました。
X509 CRLビルダーのDSA署名テストにおいて、手書きのASN.1エンコーディングを廃止し、フレームワークの標準APIを使用するよう改善したPRです。EncodeUnsignedIntegerのバグ(先頭ゼロと高ビットが設定されたバイトがある場合のエンコーディング不正)を修正し、代わりにAsnWriterとDSASignatureFormat.Rfc3279DerSequenceを活用することで、Android環境でのテスト失敗率(~0.46%)を排除します。
Directory.GetFilesなどのディレクトリ列挙API(Windows版)を最適化し、ワイルドカードパターンをNtQueryDirectoryFileに直接渡すことで、マネージド側でのフィルタリング処理を削減します。大規模ディレクトリで選別的なパターンマッチを行う場合、例えば140,000ファイルから"A14881*.jpg"に該当する4ファイルを検索する際、従来は全ファイル列挙が必要でしたが、この変更により4~10エントリのみの処理に削減されます。
JITコンパイラのVisitOperandUsesとGenTreeVisitorをリファクタリングし、大規模なswitch文をオペランドの種類(リーフ/単項/二項/特殊)の高速チェックに置き換えました。これによりGT_LZCNTなど以前処理されていなかったノードの処理漏れが解決され、新しいノード種が導入される際の堅牢性が向上します。
Windows環境でCNG(Cryptography Next Generation)キープロバイダと相互運用するためのX25519DiffieHellmanCng実装を追加します。Curve25519/CNG blob処理の共有ロジックをX25519WindowsHelpersとして抽出し、コード重複を削減しながらCNGベースの楕円曲線暗号操作を実現します。
ブラウザ環境でのWebAssembly(WASM)実行時における初期メモリフットプリントを削減するための変更です。CoreCLRランタイムのビルド設定とネイティブホストの構成を最適化しています。
CounterGroup.OnTimerメソッドでの毎回のポーリング時に新規割り当てされていたDiagnosticCounter[]スナップショットバッファの再利用を実装しました。カウンターセットはEventSource構築時に固定されることが多いため、インスタンス毎のバッファを再利用し、必要に応じて動的に拡張し、破棄されたカウンターのスロットをクリアします。
cDAC(Component Data Access Contract)側の DacDbi 型/配列レイアウト API を実装し、このために必要な RuntimeTypeSystem 分類 API を追加しました。具体的には IsObjRef() および GetInternalCorElementType() メソッドの実装を含みます。
JIT morphing処理のMorphAddrContextスレッドスルーハックを削除し、未morphification状態のアドレスツリーに対するfgMarkAddrModeForFieldAddrプリウォークで置き換えました。新たにGTF_FLD_TGT_NONFAULTINGフラグを導入し、null-check省略判定を明示的に処理することでコード生成の意図を一層明確にします。
ILLink trimmerおよびNativeAOT compiler、Roslyn analyzerにtypeof(T).Assembly.GetType(string)パターンの理解を追加しました。このパターンを解析することで、対象型を解決でき、偽の警告を回避できます。特にライブラリテストで一般的なパターンです。
新たにAssemblyValueを導入し、Type.AssemblyとAssembly.GetType(...)を内部関数として扱い、型の具体的な解決が可能になります。
cDAC DBI実装のGetTypeHandleメソッドのバグを修正します。TypeDef/TypeRefの検索がロードされた型に解決されない場合、従来はnull/ゼロのハンドルで成功を返していましたが、今後はCORDBG_E_CLASS_NOT_LOADEDエラーを返すようネイティブDAC動作に合わせました。
CI失敗検知ワークフローのプロンプトを改善し、既知ビルドエラー(KBE)の誤検出や不正なJSON形式を削減することを目的とします。6段階の事前確認フロー、厳密なKBE本体チェック、そしてシグネチャ検証ルールを導入し、過去の実行で見られた以下の問題に対処します:
ErrorMessageがテストの[PASS]/[SKIP]行と誤マッチするKnown Build Error ラベル付けされたIssueJIT PGO (Profile-Guided Optimization) インストルメンテーションで、ハンドルヒストグラム検査と値検査が同じ BasicBlock::bbHistogramSchemaIndex フィールドに書き込みを行い、スキーマインデックスの競合が生じていた問題を修正しました。仮想呼び出しと SpanHelpers 特殊な組み込み(Memmove、SequenceEqual など)が同じ基本ブロックに存在する場合、ハンドルヒストグラム計測が誤ったスキーマエントリを読み込み、DEBUG ビルドではアサーション失敗、リテールビルドでは不正な IR(nullptr 子ノードを持つ)が生成されていました。
ci-failure-scan agentic workflow のモデルを claude-sonnet-4.6 から claude-opus-4.6 に切り替えました。ワークフロー定義ファイルとそのコンパイル済みロックファイルの両方を更新して、設定を同期させています。
PR #127788で導入されたXSLT APIテストスイートのiOS/CoreCLR向け[ActiveIssue]アノテーションの分散配置を元に戻す変更です。複数の派生テストクラスに分散していた個別のアノテーションを削除し、共有基底クラスXsltApiTestCaseBase2に一元化します。これにより、テストコードの保守性を向上させます。
GitHub Agentic Workflows(agentic-workflows)における Copilot PAT(Personal Access Token)の認証管理を、ワークフロー別のインライン実装から共有ワークフローインポート(pat_pool.md)へ移行しました。gh-aw v0.71.5で修正されたバグ(engine.env式で参照されるジョブがneeds:に組み込まれずCOPILOT_PAT_0が常に選択される問題)に対応し、PAT プール健全性監視ワークフロー(validate-pat-pool.yml)も追加しました。
CoreCLR debugger IPC event構造体をプラットフォーム中立的にするためのリファクタリングです。ポインタ型フィールド(VMPTR、LsPtr)を64ビットに拡張し、多くのIPC event フィールドを Portable<> ラッパーでエンディアン独立性を確保します。同時に、未使用のレガシーIPC event型およびデバッガインターフェースメソッド(ログスイッチ更新、GCハンドル情報、SQLファイバー接続通知など)を削除します。
JIT コンパイラの SELECT から relop への変換時に、型変更と条件式の評価値(0または1)のチェックに関する問題を修正しました。条件式が整数型の場合、戻り値の型(長整数など)に合わせるため CAST を挿入し、条件式が比較演算の結果でない場合は最適化を適用しないようになります。
ARM64アーキテクチャで、未知のサイズを持つ型(TYP_SIMDやTYP_MASKなど)のSpillTempsをUnknownSizeFrameに割り当てる機能を実装しました。既存のスロット再利用システムをこれらの特殊な型に対応させています。
cDAC(Component Data Access Contract)でDacDbiImpl.GetPartialUserStateをネイティブC++実装から管理コード実装に置き換えるPR。IThread契約を使用してスレッド状態フラグをCorDebugUserStateにマッピングし、デバッガがスレッド状態を正確に把握できるようにします。
WebAssembly SDK のビルドターゲットで、ディレクトリプロパティの文字列連結をMSBuild の組み込みパス正規化関数に置き換えました。末尾のセパレータの有無に関わらず正しくパスが結合されるようになり、パス構築の堅牢性が向上します。
Linux ARM64環境でのハードウェアイントリンシック機能のテストパイプラインを追加します。既存のOSX ARM64パイプラインはSVE(Scalable Vector Extension)をカバーしていないため、新たにLinux ARM64専用のパイプラインを導入。このパイプラインはARM64 JITソースファイルの変更時のみトリガーされ、プレミアムなマシンプール資源の効率的な利用を実現します。
devcontainerのDockerfileを更新し、ハードコードされたapt-get installリストの代わりに、ビルド時にリポジトリのeng/common/native/install-dependencies.shスクリプトをダウンロード・実行して必須パッケージをインストールするよう変更しました。これにより、新しいcodespaceでのランタイムビルドが可能になります。
CoreCLRテストビルドスクリプト(build.cmdとbuild.sh)のヘルプテキストと使用方法ドキュメントを更新しました。OS対象指定オプション、WASM アーキテクチャ、CoreCLR選択オプションなどの記述が不足していた箇所を補完し、Unixスクリプトのパス例のエスケープ表記を修正しました。
DispatchProxyが汎用型引数を持つインターフェース(例:IFoo<TInternal>)をプロキシする際、内部型の汎用引数に対するIgnoresAccessChecksToAttributeが不足していたため、TypeLoadExceptionが発生する問題を修正しました。EnsureTypeIsVisibleメソッドを改善して、汎用型引数を再帰的にチェックするようにしました。
プリミティブ数値型のIBinaryInteger<T>実装におけるTryRead/TryWrite{Big,Little}Endianメソッドで、MemoryMarshal.GetReference、Unsafe.ReadUnaligned、Unsafe.Addなどの unsafe 操作をSpanのインデクサとBinaryPrimitivesヘルパーで置き換えることで、unsafe コードの使用を削減します。
JITコンパイラにおける lvLiveInOutOfHndlr プロパティの不正な使用を修正します。このプロパティに依存する箇所で lvTracked チェックを追加し、未追跡(untracked)のローカル変数について正しく保守的に処理するようにします。例外ハンドラのセマンティクスと正確性に関わる修正です。
GCブリッジとNativeAOTランタイム内の静的解析の警告を修正するPRです。メモリ割り当て不一致、null参照解除の可能性、無効なハンドルクリーンアップの3つの問題を修正しています。ランタイム内部の低レベルな実装の改善で、公開APIへの影響はありません。
cDAC(Compact Debugger Access Component)のレガシーフォールバック機能において、CDAC_NO_FALLBACK=1が設定されている際にレガシーDAC(Debugger Access Component)へのフォールバックを許可するAPIのallowlistから3つのメソッドを削除しました。これにより、no-fallback実行時の制限がより厳密になります。
ThreadTasks(単一エントリの列挙型TT_CleanupSyncBlock)をThreadStateに統合し、独立したm_ThreadTasksフィールドを削除するリファクタリング。ThreadStateに未使用のビット(0x00000020)が存在し、すでにInterlockedOr/InterlockedAndによる原子的な操作に対応していたため、冗長な実装を整理したもの。
Linux x64 CoreCLR ネイティブビルドのPRパイプラインに対して、sccacheをコンパイラキャッシュとして導入します。Azure Pipelines Cacheタスクを使用してsccacheのストレージディレクトリをビルド間で永続化し、ビルド後に統計情報を出力することで、PR CI時のビルド時間を短縮できます。
PR #127016で導入されたcalli署名キャッシュ機構により、iOS arm64でのCoreClrクラッシュが発生していました。MethodDescの共有キャッシュスロットに対して、インタープリタ-ネイティブ呼び出しパスとIL Stubの新しいコード両方が書き込みを行うことが原因です。修正ではCInterpreterJitInfo::GetCookieForInterpreterCalliSigのキャッシュ機構を削除し、毎回GetCookieForCalliSigで計算するようにPR #127016以前の動作に戻しました。
cDAC x-plat dump テストの Helix 送信時に発生する 2 つの問題を修正しています:
MemoryStream の 2 GB 上限により、大きなペイロードの ZIP 圧縮でアップロード失敗修正として、ZipDirectory でダンプディレクトリを事前に ZIP ファイルとして作成し、<PayloadDirectory> の代わりに <PayloadArchive> で既存 ZIP をアップロードする方式に変更。同時に x-plat テストから macOS をスキップします。
HttpClient.MaxResponseContentBufferSizeが自動Brotli解凍時に解凍後のレスポンスサイズに対して正しく適用されることを検証する機能テストを追加しました。既存のLoopbackサーバーインフラを活用し、高圧縮率のBrotliコンテンツでバッファサイズ制限が実装される動作を確認します。
System.Collections.BitArrayのコンストラクタから unsafe コードを削除し、Unsafe.As<bool, byte>による型再解釈を廃止。代わりにMemoryMarshal.AsBytesで取得したReadOnlySpan<byte>を使用してSIMD操作を行うよう変更しました。
System.Linq.MaxMinのunsafeコードを安全なコードに置き換えるPRです。LoadUnsafeと参照操作をspan基準のVector*.Create(ReadOnlySpan<T>)に変更し、Vector256/512をVector128に圧縮することでスカラーループの効率を向上させます。インライナー予算対策として複数の[AggressiveInlining]アトリビュートを追加しています。
JIT(Just-In-Time)コンパイラの非null アサーション伝播を改善し、PHI(PHI関数)値に到達するエッジアサーションを検査することで、??=演算子による統合後の冗長なnullチェックを削除します。
class Program
{
Inner? _inner;
[MethodImpl(MethodImplOptions.NoInlining)]
public int Invoke(int n) => (_inner ??= new Inner()).Do(n);
}
上記のようなコードで、不要なnullチェック命令(cmp byte ptr [rax], al)が削除されます。
UnixプラットフォームにおけるOpenProcess関連APIの使用箇所を削除し、これらのAPIをPAL(Platform Abstraction Layer)から廃止するリファクタリングです。デバッガのリモートデータ取得処理において、OpenProcess/OpenProcessMemoryの呼び出しをインライン化し、PAL抽象化を廃止することで、プラットフォーム固有の実装を削除しています。
xUnitの[ActiveIssue]属性は基底クラスから派生クラスに継承されない仕様により、#127464で基底クラスXsltApiTestCaseBase2に設定された[ActiveIssue(IsAppleMobile, IsCoreCLR)]が機能せず、469個のXSLTテストが依然として実行されてTypeInitializationExceptionを発生させていました。このPRは、[ActiveIssue]属性を具体的な派生テストクラスに直接設定することで、AppleMobileプラットフォーム上でのテストスキップを正しく機能させます。
Reverse P/Invoke IL スタブの引数イテレーション処理を修正。ArgIterator ではなく PInvokeArgIterator を使用し、構造体マーシャリングのリバースコールバック時の引数解析の正確性を向上させます。
WebAssembly RyuJIT コードジェネレータで、reverse P/Invoke および UnmanagedCallersOnly 属性によるアンマネージドエントリポイントのサポートを追加しました。これにより、WASM shadow スタックポインタが明示的な引数として渡されない場合のプロローグ生成に対応し、以下のようなコードのコンパイルが可能になります:
[UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })]
static int uco () {
return 42;
}
JITコンパイラのSELECT最適化をクリーンアップして統一し、将来の変換追加を容易にするためのリファクタリングです。SELECT変換の呼び出しをHIR内の他の箇所からも可能にしています。本PRは機能上の変更はなく(zero-diff)、その後の改善の基盤となることを目指しています。
WebAssembly向けcoreCLRローダーにおいて、ダウンロード再試行をデフォルトで有効化し、再試行シーケンスを改善しました。すべての初回ダウンロードがキューに登録されるまで再試行を遅延させることで、起動時の再試行ストームがダウンロードスロットを枯渇させるのを防ぎます。
JITのIf-conversion最適化フェーズにおいて、EH(例外処理)領域の境界チェックが誤って削除されていた問題を修正します。Fuzzlyn生成のテストケースで、ThenブロックがTry領域の開始地点である場合に BBF_DONT_REMOVE アサーション失敗が発生していました。PR #125347 で IfConvertCheckFlow が簡略化された際に BasicBlock::sameEHRegion チェックが不適切に削除されたため、これを復元します。
WASM環境でのメモリ管理に対応するため、GCのOS抽象化レイヤー(GCToOSInterface)をUNIX実装から分離し、WASM専用実装を導入しました。WASMでは仮想メモリ機能(mmap/decommit)が実質的に利用できないため、posix_memalign/freeベースの実装に切り替え、新たにnever_decommit_pフラグを導入してdecommit不可の意図をコード上で明確化しています。
WebSocketのクローズハンドシェイク中に、HTTP/2上で並行するReceiveAsyncとCloseAsyncの呼び出しによる単一コンシューマー違反を修正しました。RFC 6455 7.1.1の"クライアントがサーバーのTCPクローズを待つ"ステップを_receiveMutexの背後で保護することで、同じストリームからの並行読み取りを防止し、Http2Stream.TryReadFromBufferのDebug.Assert(!_hasWaiter)失敗を解決します。
bool型のインライン関数が末尾呼び出し(tail call)を含み、戻り値が末尾呼び出しとは別のブロックにある場合、インライナーが挿入する正規化キャスト(int→ubyte→int)を末尾呼び出し検証で適切に処理するよう修正しました。正規化キャストは末尾呼び出しの場合、呼び出し元関数がインライン化されなかった場合にはmorphの後の段階で挿入されるため、安全に無視できます。
未知サイズのローカル変数(TYP_SIMDとTYP_MASK型)を処理するためのUnknownSizeFrameを実装しました。ARM64アーキテクチャでは、x19レジスタをこのフレーム内のローカル変数のアドレッシング用に予約し、SVE メモリ転送命令を更新してベクトル長の倍数(またはマスクの場合はVL/8)に対応させています。
dotnet/diagnostics PR #5821によるSOS テストクラスの分割に伴い、既存のclassFilter: SOSがマッチしなくなった問題を修正します。xunit v2の-classフィルタはワイルドカード非対応のため、代わりに正規表現対応の-methodフィルタを使用し、methodFilter: SOS*に切り替えることで、SOSプレフィックス付きの全クラスのメソッドにマッチさせます。
Azure Linux 4をライブラリのHelix extra-platforms キューセット(linux_x64)に追加し、CoreCLR内部ループテストの実行対象OSを拡張します。Azure Linux 4はまだGA版ではないため、opt-inカバレッジの拡張に留まり、GA対象プラットフォーム定義には変更を加えていません。
cDAC記述子オブジェクトライブラリがMSVC でコンパイルする際、デフォルトの vc140.pdb ではなく、ターゲット固有の決定的なPDBを生成するように修正しました。これにより、静的ライブラリ(例: Runtime.ServerGC.lib)にアーカイブされたオブジェクトファイルが後続のNativeAOT発行時にリンクエラー LNK4099 を引き起こすことを防ぎます。
.NET Runtime 9.0のブランディング情報をバージョン9.0.16から9.0.17に更新するパッチリリース用の変更です。中央集約されたバージョン定義ファイルのProductVersionとPatchVersionをインクリメントします。
.NET 8.0.28 サービシングリリースに向けて、リポジトリのバージョンメタデータを更新します。ProductVersion を 8.0.27 から 8.0.28 に、PatchVersion を 27 から 28 に変更し、ファイルバージョンコンポーネントの一貫性を保ちます。
CryptographicOperations.FixedTimeEqualsに新しいスカラーオーバーロードを追加しました。バッファを単一バイト値と比較する際に、比較用スパンを生成する必要がなくなり、特にWindows X25519の共有秘密ゼロチェックのような定時間比較処理が簡潔になります。
// 新しいオーバーロード
public static bool FixedTimeEquals(ReadOnlySpan<byte> source, byte value)
モバイル環境専用のCI失敗スキャンワークフロー(mobile-scan.md)をプラットフォーム非依存の汎用CI外部ループ失敗スキャナー(ci-failure-scan.md)に置き換えます。複数の外部ループパイプラインをカバーし、失敗分類(ビルド破損 vs テスト失敗 vs インフラ)と対応アクション(追跡Issue、Known Build Error、テストスキップPR、製品修正PR)を拡張します。
StringBuilder.MoveChunks(StringBuilder source) という新しい公開APIを追加します。このメソッドは、ソースのStringBuilderのチャンク チェーンを新しいStringBuilderインスタンスにO(1)で転送し、ソースをドレイン(空)にします。これにより、Roslyn等のコンシューマーがコピーなしで不変ビューを保持しながら、元のStringBuilderを解放できます。
namespace System.Text;
public partial class StringBuilder
{
public static StringBuilder MoveChunks(StringBuilder source);
}
string.Format で CompositeFormat を使用する際、フォーマット穴がない場合にブレース エスケープ({{ → {、}} → })が無視される問題を修正しました。高速パスが未解析の元の形式文字列を返していたため、エスケープされたブレースが適切に処理されていませんでした。
Android向けに追加されたCoreClrインプロセスJSON形式クラッシュレポーター機能をiOS、tvOS、MacCatalystに拡張します。Apple固有のシステムメタデータ(OSバージョン、システムモデル、システム製造業者)抽出とucontext_tからのレジスタ抽出(x86_64/arm64対応)が追加されます。
System.IO.Compression テストスイートの RoundTrip_AllWindowLogs テスト(Deflate/ZLib/GZip variants)が、Apple モバイル(iOS/tvOS/MacCatalyst)および Android プラットフォームで常に OperationStatus.DestinationTooSmall を返す問題に対応するもの。モバイル CI での問題をブロック解除するため、該当プラットフォーム上でこのテストを一時的にスキップします。
JIT コンパイラの算術ヘルパー関数を集約・統一し、重複コードを削減する内部リファクタリング。bitset および hashbv 関連の実装を整理し、bitsetasshortlong.h に機能を統合しています。
JsonSerializer.Deserializeで既存のUtf8JsonReaderを使用する際、JsonExceptionが報告する行番号とバイト位置情報が不正確になる問題を修正します。スコープ付きリーダー作成時に元のリーダーの位置情報(_lineNumberと_bytePositionInLine)をキャプチャし、トークンタイプごとに値トークンの直前を指すようにリワインドして、JsonReaderState経由でスコープ付きリーダーに渡すことで、正確な位置情報の追跡を実現します。
String.FastAllocateStringをJIT intrinsicとしてマークし、RyuJITで最適化を行うPRです。結果を非nullとして追跡し、ARR_LENGTH(FastAllocateString(len))をlenに折り畳み、グローバルアサーションstring.Length(result) == lenArgを出力します。これにより、文字列連結後のインデックスアクセスなどで不要な境界チェックが削除されます。
int Foo()
{
string a = "aaa";
string b = "bbb";
string c = a + b;
return c[3]; // このPRでこの境界チェックが削除される
}
System.Randomに汎用の数値生成API (NextInteger<T>()、NextBinaryFloat<T>()) を追加します。IBinaryInteger<T>とIBinaryFloatingPointIeee754<T>を実装する任意の型に対応し、一般的な型には高速パス、その他は棄却サンプリングで対応します。
// 使用例
Random random = new();
int value = random.NextInteger<int>();
int ranged = random.NextInteger<int>(0, 100);
double floatValue = random.NextBinaryFloat<double>();
TensorPrimitives.IndexOfMax および関連メソッドのインデックス計算バグを修正するPRです。特に小さい要素型(byte、ushortなど)において、正しいインデックスが要素型の最大値を超える場合に不正なインデックスが返されていた問題を解決します。新しい IIndexOfMinMaxOperator インターフェースを導入し、要素サイズ(1/2/4/8バイト)に応じた専用のベクトル化実装を提供することで、水平集約による正確なインデックス検索を実現しています。
ImmutableSortedSet<T>.SetEqualsメソッドを最適化し、不要な中間SortedSet<T>の生成を排除してメモリアロケーションとGCプレッシャーを削減しました。パターンマッチングにより互換性のあるソート済みセット間で直接比較を実施し、デュアル列挙子による線形スキャン(O(n))で従来のO(log n)*.Contains()ルックアップを置き換えています。
Objective-C相互運用性の診断に対応する新しいObjectiveCMarshal cDACコントラクトと、RuntimeTypeSystemコントラクトへのIsTrackedReferenceWithFinalizer APIを追加しました。これにより、追跡参照オブジェクトのタグ付きメモリポインタを取得し、追跡参照とファイナライザーを持つ型を識別できます。
// ObjectiveCMarshal コントラクト API
TargetPointer GetTaggedMemory(TargetPointer address, out TargetNUInt size);
// RuntimeTypeSystem コントラクト API
bool IsTrackedReferenceWithFinalizer(TypeHandle handle);
ビルドパイプラインで使用されるコンテナイメージ mcr.microsoft.com/dotnet-buildtools/prereqs のダイジェスト値を一括更新するPRです。Renovate Botによる自動依存関係更新で、41個のコンテナイメージダイジェストが新しいバージョンに更新されています。
ConcurrentDictionary_Generic_Tests<TKey,TValue>.NonRandomizedToRandomizedUpgrade_FunctionsCorrectlyテストが、aggressive trimming設定(NativeAoT、Apple mobile)環境で内部型ConcurrentDictionary<,>+Tablesへのリフレクションが失敗し、TypeLoadExceptionが発生する問題を修正します。テストをPlatformDetection.IsBuiltWithAggressiveTrimmingでゲートすることで、該当環境でのスキップを実装します。
LoopbackServer.Connectionのバッファリサイズ戦略を固定サイズ増加(+4000バイト)から指数関数的増加(×2)に変更し、大規模ペイロード処理時のO(n²)コピーを削減します。ReadToEndAsyncとReadLineBytesAsyncの両メソッドでArray.Resizeを使用した効率的なバッファ管理を実現します。
WebAssembly(Wasm)RyuJIT コンパイラの出力パイプラインを更新し、各JIT生成関数/funcletに長さプリフィックスを含めるようにしました。これにより、ホスト側でのコード解析が不要になり、funclet分割がより簡潔になります。
新しいコンパイラバージョンに対応するため、System.Private.CoreLibとランタイム内の複数のファイルから[RequiresUnsafe]属性の使用を削除しています。新コンパイラでは[RequiresUnsafe]属性をソースコードで使用することが禁止され、代わりにunsafe修飾子を直接使用する必要があります。
Fuzzlyn週末実行時の障害を自動的にトリアージするGitHub Copilot Skill「fuzzlyn-triage」を追加します。このスキルは障害アーティファクトのダウンロード、SuperPMIを用いた再現可能なコンテキストの抽出、jitdumpの生成、および詳細な分析結果と再現用ファイル(repro.mc、jitdump.txt、issue.md)をzipで出力することで、JIT障害の初期トリアージを自動化します。
Renovateのコンテナイメージダイジェスト更新を個別のPRではなく、単一のPRにグループ化する設定を追加しました。groupNameとgroupSlugをパッケージルールに指定することで、複数のダイジェスト更新を一つの単位で管理できるようになります。
System.Threading.Tasks.Tests を NativeAOT でビルド・実行する際に、AsyncProfilerTests が期待する非同期イベント(EventSource イベント)が正しく発行されないため、テスト失敗が多数発生していた問題に対応します。プロジェクトファイルで EventSourceSupport を true に設定し、NativeAOT ビルド時に EventPipe サポートを有効化することで、ランタイムの非同期イベント追跡機能を動作させるようにします。
#127300でExInfom_hThrowableが削除されて以降、アクティブな例外ディスパッチ中にThreadm_LastThrownObjectHandleが更新されなくなり、DACのGetThreadDataが古いハンドルを返していました。この修正により、デバッガがアクティブなディスパッチ中の例外を正しく報告できるようになります。
#127300の変更により、例外ディスパッチ中のm_LastThrownObjectHandleが古い状態になり、デバッガコマンド(!PrintException、!Threads、!clrstack -a)が失敗していました。本修正は、ExInfo トラッカーに格納されているアクティブな例外を優先し、フォールバックとしてm_LastThrownObjectHandleを使用するように変更しています。
LoggingEventSourceの静的フィールド初期化順序の問題を修正しました。OnEventCommandが型初期化中に再入呼び出しされる際、ParseFilterSpecがnullセパレータ配列を参照してFilterSpecを誤解析する問題を解決しています。静的フィールドs_semicolonとs_colonの初期化をInstanceより前に移動することで、再入呼び出し時に確実に初期化済みの状態になるようにしました。
NativeAOT環境でのGC情報処理において、ハードウェアフォルトスタックウォーク時にexecutionAbortedフラグを保持するよう、GetCodeOffsetデバッグ検証時のMethodInfo変更を回避する修正です。例外ディスパッチ中のGC発生時にGCルート報告が正確に行われるようにします。
Linux上でのCRL(証明書失効リスト)処理時のメモリ問題を軽減するため、OpenSSL CRL処理に境界付きのインメモリMRU(Most Recently Used)キャッシュを導入するバックポート。.NET 11 Preview 3で導入された機能をrelease/8.0-stagingブランチに適用します。
CRLを繰り返し検証するプロセスで、OpenSSL+glibcの小サイズアロケーション動作により予約メモリが蓄積されていた問題を、GC協調的なプルーニング機能を持つインメモリキャッシュで軽減します。
Linux上でのCRL処理による過度なメモリ使用量問題を解決するため、CRL用のメモリ内MRU(Most Recently Used)キャッシュを実装しました。本変更により、リビジョン確認を頻繁に行うプロセスでは同じCRLを繰り返しロードせず、glibc メモリアリーナの断片化による見かけ上のメモリリークを軽減します。.NET 11 Preview 3で導入された本機能をrelease/9.0-stagingにバックポートしたものです。
PAL(Platform Abstraction Layer)からCreateProcessW実装を削除するクリーンアップです。CreateProcessWはWindows固有のプロセス生成APIであり、.NET Coreでは既に使用されていないため、PAL実装とそれに関連するテストコードを削除しました。この変更により、Windows専用のプロセス管理ロジックが排除されます。
シェルスクリプト基盤のテスト(LongProcessNamesAreSupportedおよびProcessNameMatchesScriptName)で、孫プロセス(sleep)を含むプロセスツリー全体を適切に終了するよう改善しました。従来はシェルのみを終了しており、睡眠プロセスが残ったままになり、テスト親プロセスの標準出力/標準エラーパイプが開いたままになる問題を修正しています。
CoreCLR WASM ランタイムの JS ローダーに実装されていなかった invokeLibraryInitializers API を実装しました。この API は Blazor の JS initializer hooks (beforeStart/afterStarted) を実行するために必要であり、実装がないと CoreCLR WASM 上で Blazor アプリが起動時にクラッシュしていました。
ReadyToRun(R2R)コンパイル時の非同期再開スタブ(async resumption stub)fixupの処理を修正するPRです。これまで直接コンパイル済みメソッドノードに追加されていたfixupを、既存のprecode fixupパイプラインを通すように変更しました。これにより、fixupの重複排除と失敗したコンパイルパスでの不適切なコミットを防ぎます。
private void AddResumptionStubFixup(MethodWithGCInfo compiledStubNode)
{
AddPrecodeFixup(_compilation.SymbolNodeFactory.ResumptionStubEntryPoint(compiledStubNode));
}
CounterGroupのタイマー実装をDateTime.UtcNowからStopwatchに変更しました。DateTime.UtcNowはNTP同期により時刻がジャンプする可能性があり、EventCounter購読者に報告される経過時間が不正確になるため、単調性を持つStopwatchを使用することで問題を解決します。この変更はEventCounter、PollingCounter、IncrementingPollingCounter、IncrementingEventCounterなど、CounterGroupを間接的に使用するすべてのカウンター型に影響します。
cDAC(Common Data Access Component)のTraverseVirtCallStubHeap SOS API を実装し、ネイティブDAC と同じ動作を実現します。VirtualCallStubManager のローダーヒープ(Indcell / CacheEntry)をトラバースする機能を追加し、既存のTraverseLoaderHeapCoreローダーヒープトラバーサル構造を再利用しています。
WebAssembly、iOS、tvOSのCoreClrビルドから、これらのプラットフォームでは使用できない/不要なGCモード(サーバーGCとバックグラウンドGC)を削除することで、バイナリサイズを最適化します。corerun.wasmの計測結果では、生バイナリで7.2%(325,686バイト)、Brotli圧縮後で**6.2%(82,556バイト)**のサイズ削減を実現しています。
WebAssembly (WASM) 環境における calli クッキーの繰り返しの計算を避けるため、キャッシング機構を実装しました。HelloWorld での計測結果、キャッシュは 51.4% のヒット率を達成し、計 35 回のアクセスのうち 18 回がキャッシュから取得されています。
ILLinkのTypeMap処理におけるトリミングバグを修正しました。TypeMapHandler.MarkTypeMapAttributeがAnnotations.MarkInstantiatedを直接呼び出していたため、完全な処理パイプライン(ProcessTypeおよびProcessInstantiated)がスキップされ、TypeMapおよびTypeMapAssociationエントリが誤ってトリミングされていました。修正によりMarkRequirementsForInstantiatedTypesを呼び出すことで、全処理パイプラインが実行され、型のインスタンス化順序に関わらず外部のTypeMapおよびプロキシTypeMapAssociationエントリが適切に保持されるようになります。
Android CoreCLRにおいて、ネイティブクラッシュ、中止、混合管理/ネイティブ障害の診断を改善するため、opt-inのin-proc crash reporterを実装しました。JSON形式のクラッシュレポートを生成し、createdumpの出力と互換性のあるスキーマを採用しています。レポートはDOTNET_DbgMiniDumpNameで指定した場所に*.crashreport.jsonファイルとして出力されます。
有効化には以下の環境変数が必須です:
DOTNET_EnableCrashReport=1
DOTNET_DbgMiniDumpName=/data/data/<package>/files/dotnet_crash_%p
Mono JITコンパイラのヘルパー関数内で、基本ブロック情報用に作成されたハッシュテーブル(offset_to_bb_hash)がメモリ解放されていなかったメモリリークを修正しました。冗長モード(cfg->verbose_level >= 2)でのディスアセンブリコード出力時に、ネイティブオフセットと基本ブロック番号のマッピング用ハッシュテーブルにg_hash_table_destroyを追加して、確保したメモリを適切に解放します。
RyuJIT コンパイラの instruction group (IG) 生成を strict な layout order の制約から解放する変更です。現在は igNum の順序が linked list の順序(最終的なレイアウト順序)と厳密に一致していますが、本変更により epilog と funclet prolog を表すIGについて、レイアウト順序外での生成を可能にします。これは "before/after [in layout order]" という抽象化API を導入し、実際の順序判定は linked list に委譲することで実現されています。
最終的な目標として、単一IG prolog の制約を完全に削除することを目指しています。
CoreCLR JIT morphing処理において、特定のパターン変換時にValue Numbering (VN)を保持し、正規化されたツリー構造を生成するようにしました。具体的には、MOD->AND強度削減パターンでVNを保存し、SUB->ADDパターンで定数を第2オペランドに配置する正規形を生成します。
未処理例外のスタックトレースに表示されるSystem.Environment.CallEntryPointヘルパーフレームを非表示にするための修正です。前回のIssue #126222で意図された変更が実際には反映されていなかったため、CoreCLRの例外スタックトレース取得ロジックを更新して、CallEntryPointメソッドのフレームをスキップするようにしました。
JIT範囲解析(RangeCheck::BetweenBounds)における符号付き整数オーバーフロー問題を修正しました。下限定数(lcns)がINT_MINの場合、-lcnsの否定がC++の未定義動作となり、不正な「範囲内」判定とそれに伴う誤った境界チェック除去が発生する問題を解決します。
ImmutableHashSet.SetEqualsの正確性の問題を修正します。異なる比較子を持つ2つのセットを比較する際、Countチェックが比較子の検証ブロック外に配置されていたため、誤ってfalseを返していました。修正により、比較子が異なる場合は最適化パスをバイパスし、適切なセット比較にフォールバックします。
// 修正前は false を返していた(ただし正しくは true)
var main = ImmutableHashSet.Create(StringComparer.OrdinalIgnoreCase, "a");
var other = ImmutableHashSet.Create("a", "A");
Console.WriteLine(main.SetEquals(other)); // true が返るべき
TypedReferenceを返すメソッドをインタープリタからJIT経由で呼び出す際にクラッシュが発生する問題を修正しました。TypedReferenceを2つの8バイト整数値として特別に扱うことで、戻り値の型分類を正しく処理します。
Android arm32(32ビット)のテスト実行をdotnet/runtimeのCI/CDパイプラインから無効化するPRです。Android arm64(64ビット)のテストカバレッジは引き続き有効のままとなります。
Mobile Platform Failure Scannerワークフローの改善により、モバイルプラットフォーム障害の処理方法をより明確で予測可能にしました。従来は混在したPR、Issue、重複コメントが生成されていましたが、今後は各障害に対して「テスト属性修正用のドラフトPR」または「製品バグ・ネイティブクラッシュ・インフラ問題用のTracking Issue」のいずれかに統一されます。
gtTreeHasLocalStoreがローカル変数の定義をすべて適切に処理できていなかった問題を修正します。特にretbuf定義などを見落としていたため、既存の低レベルヘルパーVisitLocalDefNodesを活用して、ローカル定義の検出をより堅牢にします。
非同期メソッド呼び出しの再開時にExecutionContextの復元をJITコード/インタプリタからディスパッチャーに移動するリファクタリング。これにより、再開パス上のTLSアクセスとヘルパー呼び出しが削減され、レジスタ割り当てが改善される。
cDAC(Common Data Access Component)のLoader契約における内部実装の改善。ローダーヒープを文字列キーの辞書から列挙型キーの辞書に変更し、タイプセーフ性を向上させ、メモリ効率とルックアップパフォーマンスを向上させます。
リポジトリの area label を area-assemblyloading から area-AssemblyLoader に統一するリネーム変更です。これにより、他の area label(例:area-AssemblyLoader-mono)と使用されているケーシング規約に合わせます。
高パフォーマンスな非同期プロファイラーを実装するPRです。Runtime Async (AsyncV2) の非同期メソッド実行を低オーバーヘッドで追跡する新しい AsyncProfilerBufferedEventSource を導入し、スレッド単位のバッファード事象送出と集中型フラッシュ調整を活用します。従来のTPLイベントプロファイリングと比較して約4~40倍のパフォーマンス向上を実現し、ETLファイルサイズを約10倍削減します。
ProcessStartInfo.KillOnParentExitをLinuxおよびAndroidに対応させるPRです。LinuxではシステムコールのPR_SET_PDEATHSIGに対応した専用の長時間生存スレッドを使用してfork+execを実行し、親プロセス終了時に子プロセスにSIGKILLを送信する仕組みを実装しています。
WebAssembly(WASM)用RyuJITコンパイラのGC情報エンコーディング/デコーディング機能を有効化するPRです。EMIT_GENERATE_GCINFOをWASMで有効にし、GC情報の生成・エンコードをWASM固有の実装で対応させます。これにより、読み取り専用(R2R)リリースの対象となるS.P.CoreLibをWASM向けに正式サポートします。
PR #125630で導入されたMSBuild item Updateを使用した簡略化を revert。MSBuildの Update がターゲット内で正常に動作しない問題を修正し、依存関係フローの問題を解決します。ResolvedFileToPublish と IntermediateAssembly の交差を計算して、TrimmerSingleWarn=false メタデータを確実に適用します。
WebAssembly環境ではファイナライザーが専用スレッドではなくメインスレッドでインライン実行されるため、Threadオブジェクトのファイナライズ時にSetCleanupNeededForFinalizedThreadのIsFinalizerThread()アサーションが誤発火していました。本PRでは、WASM環境での不要な呼び出しをガード化し、同時にWebAssemblyでSystem.Threading.Threadテストを有効化します。
cDAC(Compact Data Access Contract)の DacDbiImpl に対して、ReJIT/SOS向けのコード版ノード検索API 3つを実装しました。既存の CodeVersions および ReJIT コントラクトを活用し、レガシーDAC DBI APIの機能をcDACで提供します。
デバッガインターフェース層(DAC/DBI)から未使用のGetAppDomainObject APIを削除するクリーンアップPRです。GetRawExposedObjectHandleForDebugger()が常にNULLを返していたため、このAPIは実質的にno-opでした。ネイティブCOM契約(IDL + 抽象インターフェース実装)とマネージドcDAC投影層の両方から削除されます。
CoreCLR JITのfgMorphSmpOp関数を修正し、POST-ORDER処理の開始時に交換可能(commutative)な演算子と比較演算子のオペランド順序を正規化するようにしました。これにより、定数が予測可能な位置に配置され、POST-ORDER最適化の一貫性が向上します。
インタープリタでP/Invoke呼び出し時に管理↔非管理遷移イベントが二重報告される問題を修正します。#126509によるP/Invoke処理の変更後、transient ILがILStubではなくP/Invokeメソッド自体に属するようになったため、遷移イベントが2回報告されていました。P/Invokeメソッドから遷移を行う場合のプロファイラ通知を抑制することで、regressed profiler testを修正します。
NativeAOT の環境変数パーサ(RhConfig::Environment::TryGetIntegerValue)が 16 進値の 0x/0X プレフィックスに対応していなかったため、DOTNET_GCHeapHardLimit=0xC0000000 のような設定値がパースに失敗していた問題を修正します。CoreCLR の strtoul 相当の動作に統一し、Collect_Aggressive_LargePages テストが NativeAOT で失敗する問題を解決します。
uint32_t startIndex = 0;
if (!decimal && cchResult >= 2 && buffer[0] == '0' && (buffer[1] == 'x' || buffer[1] == 'X'))
{
startIndex = 2;
if (startIndex == cchResult)
return false; // プレフィックスのみでパース失敗
}
for (uint32_t i = startIndex; i < cchResult; i++)
NativeAOT GC stack walkでユニバーサルトランジション(universal transition)フレームからスタートした場合、スクラッチレジスタが不正にGCルートとして報告される問題を修正しました。フレームのアンワインド後、ActiveStackFrameをクリアすることで、管理者フレームのスクラッチレジスタがpost-call GC情報から報告されるのを防ぎます。これにより、古いスタンプ状態(コードポインタなど)がGCオブジェクトとして誤認識される問題を解決します。
WebAssemblyでのEH(例外処理)サポート向けに、JITがfunclet(例外処理コード)の順序をEHクローズの順序に対応させる変更。これにより、Wasmホストがオフセットデータに依存せずにfuncletをEHクローズと関連付けることが可能になります。フィルタ付きのEHクローズの場合、フィルタfuncletは必ずcatch funcletの前に配置されます。
ARMv7(Android Unity IL2CPPなど)でSystem.Collections.Frozen.Hashingのchar*からuint*へのキャスト時に発生するアンアライン32ビット読み取りによるSIGBUSクラッシュを修正します。ToFrozenSet<string>(StringComparer.Ordinal)を長さ≥4の文字列で呼び出す際の問題を解決します。
修正内容:
char*からuint*への直接デリファレンスをUnsafe.ReadUnaligned<uint>()に置き換え、アンアライン読み取りを安全に処理GetHashCodeOrdinalIgnoreCaseAsciiにも適用NativeAOT ILCompiler でコンパイルエラー(unresolved external symbol DotNetManagedContractDescriptor)を解決するため、ManagedDataDescriptorProvider を compilationRoots に常に追加するように変更しました。これまでは --debug オプション有効時のみの追加でしたが、デバッグ情報の有無に関わらず無条件に追加するようにしました。
Windows x86環境において、RestoreContextSimulated内でHandleThreadAbort()が呼び出される際にm_RedirectContextInUseがまだtrueのままであるという問題を修正しました。この状態でGC redirectが発火するとMarkRedirectContextInUse()がアサーション失敗を引き起こしていました。修正により、x86 SEHパスとRtlRestoreContextパスが共通の中止チェックコードパスを共有するようになり、再入可能性ウィンドウが排除されます。
JITコンパイラのGenTree::TryGetUseメソッドから不要な大規模なswitchステートメントを削除するリファクタリング。既存のオペレータ分類ヘルパー(OperIsLeaf、OperIsSpecialなど)を活用して、コードの簡潔性を向上させます。ARM64のGT_SELECT_{INC,INV,NEG}ノードを真の条件付き/特殊ノードに再分類しています。
FEATURE_AUTO_TRACE機能を完全に削除するPRです。AutoTraceはEventPipeを経由したDiagnostic Serverの自動ストレステスト用インフラストラクチャであり、環境変数DOTNET_AutoTrace_N_TracersとDOTNET_AutoTrace_Commandで制御されていました。デフォルトでは有効化されていませんでした。
CoreCLR ネイティブアセンブリバインダーおよび AssemblySpec から、使用されていない/到達不可能な WinRT ContentType プランビングを削除するクリーンアップ。3つのコミットに分割され、各ステップで不要になったコードを段階的に除去しています。
CI パイプラインモニターの追跡対象パイプライン一覧に runtime-coreclr jit-cfg(Control Flow Guard)を追加するドキュメント更新です。
R2R(Ready-to-Run)のneedsIndirectionCellArg条件を判定するifdef チェーンをリファクタリング。条件をより明示的にし、アーキテクチャごとの動作をドキュメント化して可読性を向上。
cDAC(Compact Data Access Component)のGetUserString DEBUG検証ロジックにおけるアサーション失敗を修正しました。検証ブロックが null 終端に依存した文字列構築を行っていたため、バッファ内の意図的に非 null 終端なデータを誤って読み込んでいました。長さ指定の文字列構築 new string(char*, 0, length) に変更することで、バッファの内容に関わらず安全に検証できるようにします。
WebAssembly版RyuJITでレジスタに割り当てられた構造体型ローカル変数を読み込む際のアサーション失敗を修正しました。問題は、ローカル変数の読み込み時に、消費側ノードのIR型ではなくローカル変数のレジスタストレージ型を使用することで解決されます。
Renovateが生成するコミットメッセージのトピックを「container image dependencies」から「container image digests」に変更し、Docker イメージのピン留め更新に関するPRタイトルをより正確にします。デフォルトのRenovate用語である「dependencies」は曖昧であり、「digests」の方がレビュワーと マージ担当者にとってより明確です。
CrossGen2がR2R (Ready-to-Run) コンパイル時に6GiBのリージョンを確保することで、テストで設定されている3GiB の GCHeapHardLimit を超過し、GCヒープ初期化に失敗する問題を修正します。Collect_Aggressive_LargePages テストをR2R/CrossGen2 環境では無効化することで問題を回避します。
インタプリタ内で一時停止したスレッドをスタックウォークする際、StackFrameIterator::Initがインタプリタコードを指すIPを含むCONTEXTで初期化できるよう改善します。従来はこの場合にアサーション失敗が発生していましたが、呼び出し側で所有するInterpreterFrameをスキップするよう要件を明確化し、その検証をアサーションで強制することで解決します。
DNNE (C# Native Interop)のバージョンを2.1.1から2.1.2に更新するパッチリリースです。#127414の修正に対応しています。
JITコンパイラのレジスター定義をアーキテクチャ別に整理し、汎用的なregister.hから各プラットフォーム固有の定義をsplitして個別ファイル化しました。これにより他のプラットフォーム実装との一貫性を向上させています。
macOS上でのruntime-diagnosticsパイプラインのcDAC dump-testレグが無効化されていた状況を解決するため、osx_arm64とosx_x64をデフォルトのcdacDumpPlatformsリストに再追加し、macOSのカバレッジを復活させるPRです。
cDAC(Component Data Access)のダンプテスト において、前回のPRで過度にヒープダンプに変換されたいくつかのテストを、フルダンプに戻す修正です。CCW、RCW、BasicThreadsの3つのダンプターゲットがフルダンプに切り替えられました。
GS(Guard Stack)フレームにおいて、マルチレジスタ構造体パラメータのコピー時に、スピル時の狭い幅の書き込みとコピー時の広い幅の書き込みのミスマッチによるストア・フォワード・スタッシュを回避します。SIMD命令を使用した広幅コピーを避け、整数レジスタサイズのコピーを強制することで最適化します。
cDAC(Compact Data Access Contract)スタックウォーク機能の第1段階として、GC参照スキャニングとスタックウォーカーの修正を実装します。これにより、遷移フレーム経由のGCルート列挙、GCRefMap/署名ベースのスキャニング、例外フレーム状態追跡が可能になります。本PRは5部構成の予定の第1部です。
ExInfo構造体の冗長なGCハンドルベースのm_hThrowableフィールドを削除し、既存のm_exception OBJECTREFフィールドへの直接ポインタの使用に統一します。これにより例外スロー時の割り当て/解放のオーバーヘッド(~5個のインターロック操作)とポインタ間接参照を削減し、NativeAOTのアプローチに合わせます。
NativeAOT向けのcDAC(Common Data Access Contract)データディスクリプタインフラストラクチャを追加し、診断ツール(cDAC reader、SOS)がNativeAOTランタイム状態をCoreClRと同じコントラクトベースのメカニズムで検査できるようにします。スレッド情報、MethodTable、メモリアロケーション、GCデータなどのランタイム構造体オフセットと、ILCコンパイル時に生成されるマネージド型レイアウト副記述子により、デバッグツールの相互運用性を実現します。
配列マーシャリング(LPArray、固定配列、SAFEARRAYコンテンツ処理)ロジックをネイティブコード(olevariant.h/cpp)から管理コード(StubHelpers.cs)に移行するPRです。これによりolevariant.cpp全体をWindows専用化でき、WASMでのマーシャリングロジック削除時の対応が容易になります。併せて、従来のSAFEARRAY向けに設計されたVTHACK_*定数を削除しています。
アセンブリロード失敗時の例外診断を改善し、依存関係の欠落や無効性の際に、ロード失敗をトリガーした要求元アセンブリのチェーンを追跡・表示するようにしました。これにより複雑な依存関係のシナリオでも開発者はロード失敗の原因を特定しやすくなります。
例:
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