#127618 Fix ChaCha20Poly1305 IsSupported test on Azure Linux 4
Azure Linux 4でOpenSSLビルドのChaCha20-Poly1305暗号が再度有効になったことに対応するため、ChaCha20Poly1305のIsSupportedテスト期待値を更新します。Azure Linux 3では無効のままですが、Azure Linux 4以上では有効となるよう区別します。
dotnet/runtimeにマージされたPull RequestをAIで日本語要約
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
この月にマージされた 696 件を新しい日から順に並べています。タイトルをクリックするとその日のページの該当箇所へ移動します。Bot が作成した 44 件はタイトルのみにして、各日の最後にまとめています。
Azure Linux 4でOpenSSLビルドのChaCha20-Poly1305暗号が再度有効になったことに対応するため、ChaCha20Poly1305のIsSupportedテスト期待値を更新します。Azure Linux 3では無効のままですが、Azure Linux 4以上では有効となるよう区別します。
CoreCLR JIT/GC ストレステスト調査ドキュメントにおいて、「ユニーク スタック トレース」GC ストレスフラグ値を誤った 0xF から正しい 0x10 に修正しました。これにより、ドキュメントと実装の gcenv.h で定義されている GCSTRESS_UNIQUE = 16 (0x10) の値が一致するようになります。
.NETランタイムのバインダーコンポーネントから、呼び出されていない不要なコード(ApplicationContext::GetApplicationName()メソッドと関連フィールド)を削除するメンテナンス変更です。これらは宣言・定義されていながら、バインダー内のどこからも呼び出されていないデッドコードでした。
GCのデバッグ検証を強化するPRです。x86プラットフォームでのGCルート報告の穴を塞ぎ、GCHeap::Promoteにおけるデバッグ時の検証を改善しています。オブジェクトポインタがfind_objectブックキーピング範囲外にある場合でも、インテリアポインタでないルートについてCObjectHeader::Validate()を呼び出すことで、メモリ破損の問題をより確定的に再現・診断できるようにしています。
Windows x64デバッグにおいて、CET対応ハードウェア上でInterpreterブレークポイントを使用する際のクラッシュを修正します。Interpreterブレークポイントは合成的なソフトウェアコールバックであり、ベクター例外ハンドラー(VEH)コールバックではないため、fIsVEH=FALSEをFirstChanceNativeExceptionに渡すことで、不要なSendSetThreadContextNeededの発火を防ぎます。
ILCompiler の入力ファイル読み込み時に BadImageFormatException を黙って飲み込む長年のハック(corert#2785 対応)を削除し、直接的な割り当てに置き換えています。このワークアラウンドは CoreCLR テストツリーにネイティブ DLL が混在するシナリオに対応していましたが、現在はそのシナリオが存在しないため不要になっています。
typeSystemContext.InputFilePaths = _command.Result.GetValue(_command.InputFilePaths);
GC/API/GC/GetTotalAllocatedBytes.TestAnotherThreadテストが32ビット環境でOutOfMemoryExceptionにより断続的に失敗する問題を修正しました。32ビット環境でのスレッド作成負荷を軽減し、ARM上でテストが実行されるようにしました。
System.Text.Jsonに4つの新しい公開APIを追加し、IAsyncEnumerable<TValue>をJSON Lines (JSONL)形式で直接シリアル化できるようにします。topLevelValuesパラメータをtrueに設定することで、従来のJSON配列形式(デフォルト)の代わりにJSONL形式(\n区切りの行形式)で出力できます。既存のDeserializeAsyncEnumerableと同じAPIパターンを採用しています。
// 例: JSONL形式でシリアル化
public static Task SerializeAsyncEnumerable<TValue>(
Stream utf8Json, IAsyncEnumerable<TValue> value,
bool topLevelValues = false, JsonSerializerOptions? options = null,
CancellationToken cancellationToken = default);
cDAC dump テストのデバッギー アプリケーションが、SDK バンドルの crossgen2 ではなく、ローカルでビルドした crossgen2 を使用して ReadyToRun (R2R) コンパイルされるようにします。ランタイム更新時に型が削除または変更されると、SDK の crossgen2 が存在しない型を参照する R2R サンクを出力し、TypeLoadException または実行時の null グローバルを引き起こすという問題を解決します。
DataContractSerialization ライブラリの DCS ユーティリティ(UniqueId、XmlBufferReader)から unsafe コードを削除し、安全なコードに置き換える変更です。JIT 側での最適化により、パフォーマンス改善が期待されています。
JITのValue Numbering (VN) レベルで2つの代数的恒等式を追加し、整数型の最適化を強化しています。
(a - x) + x == a(及び可換バリアント)a - (a - x) == xこれらは非オーバーフロー整数型に対してのみ適用され、VN等価性の検出と下流の最適化を可能にします。
Wasm32環境のArgIterator.ForceSigWalk()メソッドに関連する2つのバグを修正しました。名前付き引数がなく隠し引数(this、retbuf、ジェネリックコンテキストなど)のみが存在するメソッドで、引数スタックサイズの計算に誤りがあり、GCRefMapBuilderが0長度のフェイクスタックを生成してIndexOutOfRangeExceptionが発生していた問題を解決しています。
CI パイプラインモニタリングスクリプトの skip_reason メッセージを改善し、テスト結果がゼロの場合の原因をより明確にしました。最も一般的な原因であるキャンセルされたレグ(cancelled leg)を明示することで、トリアージとレポーティングの効率化を図っています。
Apple mobile CoreCLR上でSystem.Private.Xmlテストスイートを実行可能にするPRです。テストプロジェクト除外設定を削除して、このライブラリのテストを有効化しました。ローカルテストは全て成功しています。
cDAC(Compact Diagnostic Access Component)の RuntimeTypeSystem コントラクトに新しい GetGCDescSeries API を追加し、GC ポインタ実行情報を列挙できるようにしました。これにより、動的に作成された continuation 型の pretty-printing が可能になり、WebApp3 テスト失敗の修正につながります。オプションの numComponents パラメータで配列型に対応し、通常の GCDesc 配置と value-class 繰り返し配置の両方をサポートします。
cDAC(Compact Data Access Contract)のDacDbiImpl.GetModuleSimpleNameをILoaderコントラクトを使用して実装し、レガシーDAC委譲への依存を排除します。モジュール名取得をコントラクトベースのアプローチに統一し、ダンプベースのテストで検証を追加します。
Wasm RyuJIT スタックファイアの LIR セマンティクス修正。スタック化処理中に導入された一時変数が、同じルートツリー内で過度に早く解放・再利用されることで無効な LIR が生成される問題を修正しました。
修正前は、NOMOVE操作を含む複雑な式の処理時に、一時変数がルートツリーの全オペランド処理前に解放され、後で再利用されると store/read の順序が反転する問題が発生していました。修正後は、全ルートツリーの処理完了まで一時変数の解放を遅延させることで、一時変数間の干渉を防止します。
On-Stack Replacement(OSR)機能に関する設計ドキュメントと実装コメントを、最近の仕様変更に合わせて更新するPRです。パッチポイントヘルパーが継続アドレスを返すようになったこと、Tier0からOSRコードへのジャンプベースエントリ、およびターゲット固有のカリー保存処理の変更を反映しています。
Process クラスに新しい同期API ReadAllLines(TimeSpan? timeout = default) を追加します。このAPIは、stdout と stderr からインターリーブされた行を同時に読み取り、ProcessOutputLine インスタンスをyieldする単一スレッドのマルチプレックス実装で、デッドロックを回避します。
using Process process = Process.Start(startInfo);
foreach (ProcessOutputLine line in process.ReadAllLines())
{
if (line.StandardError)
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(line.Content);
Console.ResetColor();
}
ilasm round-trip テストを新しいマネージド ilasm(Core_Root の managed-ilasm/ サブフォルダに配置)を使用して実行するためのインフラストラクチャを追加します。マネージド ilasm とネイティブ ilasm の両方で round-trip 検証を実行できるようになります。このPRではCI での実行は有効化されていません。
WebAssembly RyuJit コンパイラにおいて、Ready-to-Run (R2R) 形式のマネージド呼び出しを適切に処理するためのコード生成修正。特に、PEP (Portable Entrypoint) 呼び出し規約を使用するマネージド呼び出しで、追加のPEPパラメータを正しく渡すための lowering ロジックの実装と、helper 呼び出しのコード生成修正を含みます。
lowering 変換では、PEP を保持する一時ローカル変数を導入し、これをマネージド呼び出しの最終パラメータとして追加し、呼び出し対象を *pep に書き直します。
XmlSerializerのストリーミングトランスポート経由でのXMLフラグメント逆シリアル化時に、トップレベル終了要素後の不要な読み取りを避ける回避策を実装しました。デフォルト有効のUseXmlSerializerReadEndElementWorkaroundAppContextスイッチにより、ブロッキングやタイムアウトを防ぎながら、複数ルート要素の逆シリアル化に対応します。
ImmutableHashSet<T>.SetEqualsメソッドを最適化し、不要な中間HashSet<T>の生成を排除しました。パターンマッチングとカウント事前チェックにより、Count不一致やImmutableHashSet/HashSetの同型比較時にゼロアロケーションを実現します。特に100,000要素規模で最大200万倍のスピードアップを達成しています。
JIT の if-conversion フェーズを改善し、明示的な else ブロックがない場合でも、JTRUE ブロック内の無条件ストア操作を else 値として扱うようにしました。これにより、以下の2つのコードパターンが同等の IR を生成され、後続の最適化が有効になります。
// パターン1: else なし
bool First(int tMinLeft, int tMinRight)
{
bool leftCloser = false;
if (tMinLeft < tMinRight)
{
leftCloser = true;
}
return leftCloser;
}
// パターン2: else あり
bool Second(int tMinLeft, int tMinRight)
{
bool leftCloser;
if (tMinLeft < tMinRight)
{
leftCloser = true;
}
else
{
leftCloser = false;
}
return leftCloser;
}
PR #127225で有効化したandroid-arm向けのCoreCLRランタイムパック生成を無効化するリバート。android-armがCI環境でSystem.DateTime.get_Now()内でSIGSEGVクラッシュを発生させているため、根本原因の調査中に変更を取り消します。
cDAC(Component DAC)のEnumerateAssembliesInAppDomain機能をレガシー委譲スタブから管理実装に置き換えました。ILoaderコントラクトを使用してアセンブリ列挙ロジックを実装し、ネイティブC++実装(dacdbiimpl.cpp)と動作を統一します。
OpenSSL上で動作するX25519DiffieHellmanOpenSslの実装を追加します。既存のEVP_PKEYハンドルをラップし、ハンドルの検証と秘密鍵の有無を判定する機能を提供します。
QUIC ストリームのシャットダウンパスにおいて、不要な例外割り当てを削減するパフォーマンス最適化です。ストリーム開始タスクソース(_startedTcs)が既に完了している場合、OperationAborted 例外の作成をスキップして、不要なメモリ割り当てと例外処理のオーバーヘッドを回避します。HTTP/3 サーバーシナリオの高頻度シャットダウンイベントパスに対する最適化です。
Compiler::gtNewSimdCvtNodeにおける非AVX-512経路で、Vector{128,256,512}.ConvertToInt32(Vector*<float>)が入力値に対して誤った結果を生成するuse-before-def バグを修正しました。具体的には、float.MinValue入力時に部分的なゼロが混在した結果ではなく、正しく飽和値-2147483648が返されるようになります。
MSBuildが空のファイルリストに対してSystem.IO.File.GetLastWriteTime(...)を呼び出すのを防ぐ修正です。fresh test run(キャッシュが存在しない新規実行)時にIL-CG2 "done"ファイルがまだ存在しない場合に、テストビルドパイプラインの失敗を回避します。
DeadThreadsテストが高い頻度でスレッドを生成するため、GCストレス実行時に頻繁なGCによって実行が遅延し、OOMまたは過度なページングが発生する問題を解決するため、このテストをGCストレス互換テストセットから除外します。
cDAC(Compact Debugging Access Component)の MetaDataImportImpl に4つのメタデータ API を新規実装し、デバッガの no-fallback モード対応を実現しました。以下のメソッドを実装:
EnumTypeDefs / EnumMethods:型定義とメソッドの列挙GetExportedTypeProps / FindExportedTypeByName:エクスポート型の検索と属性取得すべての実装は既存パターン(HResult 返却、FillEnum インフラ、DEBUG 検証)に従い、legacy DAC との parity 検証も付与しました。
WASM などのポータブルエントリポイント(FEATURE_PORTABLE_ENTRYPOINTS)を使用するプラットフォームで、インタープリタコード解決を有効にする変更です。従来の InterpreterPrecode メカニズムに依存していた EventPipe/ETW の IP-to-メソッド解決が WASM で機能しないため、ポータブルエントリポイント経由で解釈メソッドのバイトコードアドレスを解決できるよう汎化しました。これにより、WASM 上のサンプリングプロファイラが管理メソッドに対してサンプルを正確に帰属させられるようになります。
ILTrimの複数のTokenBasedNodeサブクラスがカスタム属性依存関係をマークしていなかったため、トリミング時にメタデータテーブル上のカスタム属性が無視されていました。ParameterNode、GenericParameterNode、GenericParameterConstraintNode、ManifestResourceNodeにCustomAttributeNode.AddDependenciesDueToCustomAttributesの呼び出しを追加し、カスタム属性と参照される型・コンストラクタの依存関係を正しく保持するように修正しました。
macOS Apple Silicon上の圧縮された自己完結型単一ファイルアプリで発生する散発的なAccessViolationExceptionを修正。問題の原因は、FlatImageLayout::LoadImageByCopyingPartsでMAP_JITメモリのRW → RWXへの保護遷移が不可靠だったため。修正では、Apple SiliconでPAGE_NOACCESSからリザーブし、各セクションを最終的な実行保護で直接コミットすることで、信頼できない遷移を回避。
EventPipeのCPUサンプリング間隔をDOTNET_EventPipeThreadSamplingRate環境変数で設定可能にする変更です。デフォルト1msはWASM/ブラウザ環境では速すぎるため、この設定値(ミリ秒単位)でオーバーライド可能にしました。0を設定するとプラットフォームのデフォルト値を使用します。
JIT設定オプション/アクセサの名前をJitDasmWithAddressからJitDisasmWithAddressに変更し、対応する設定キー文字列も更新する。これは命名の一貫性と正確性を向上させるための変更です。
WASM上のCoreClR インタープリタで double/float.ConvertToInteger<TInteger> が正しく動作するように修正。JIT動作と同じ方式でこのメソッドを intrinsic として展開し、マネージドコードの CreateSaturating へのフォールバックを回避します。これまで小さい整数型で不正な結果が返される問題が発生していました。
JIT コンパイラのパフォーマンススコア計算において、マクロ定数 PERFSCORE_MEMORY_* を強く型付けされた PerfScoreMemoryAccessKind enum クラスに置き換えました。None、Read、Write、ReadWrite の enum メンバーを定義し、複数のエミッターバックエンド(ARM64、x86/x64、RISC-V、LoongArch64)でメモリアクセス種別の追跡を更新しています。
Apple mobile(iOS/tvOS)プラットフォームでStackTraceライブラリのテストを有効化するPRです。CoreCLRアプリバンドルにデバッグシンボル(.pdbファイル)を保持することで、スタックトレース情報の取得を改善し、テストスイートを実行可能にします。なお、行番号表示に関する既知の制限は#124087で追跡中です。
Apple mobile プラットフォーム(iOS/tvOS)上の CoreCLR で、テストアセンブリが .app バンドル内のファイルとして展開される場合、ResourceAssemblyLoadContext が組み込みリソースを見つけられず失敗する問題を解決します。ResourceAssemblyLoadContext.Load に AppContext.BaseDirectory からのフォールバック読み込み機能を追加し、Apple mobile での System.Runtime.Loader.Tests テスト実行を可能にします。
AMD64 APX(Advanced Performance eXtensions)実装のJITコンパイラにおける複数のエンコーディングバグ修正と、機能ゲーティング設計の改善です。IMUL命令のREX2エンコーディング修正、CMOV NDD形式の無効化、条件付きチェーニングの制御の厳格化、DIV/IDIV命令のREX2/EVEXプリフィックス対応不足による無効化を含みます。
System.Net.Quicで使用するMsQuicネイティブライブラリのバージョンをrelease/10.0ブランチで更新します。MicrosoftNativeQuicMsQuicSchannelVersionを2.4.16から2.4.18にアップグレードします。
DOTNET_GCLargePages=1が有効な場合のGCヒープ破損問題を修正します。ラージページが有効な場合、GCはOS レベルのデコミットをスキップしていますが、メモリ内容をクリアせずにブックキーピングのみ更新していました。この結果、リージョンが再利用時にゼロ化されず、ヒープ破損が発生していました。修正は、論理的にデコミットされたメモリをクリアすることで、リージョンの適切なゼロ化を保証します。
DAC/DBI(Debugging Access Component/Debugging Breakpoint Interface)がインタープリタコードを指すCONTEXTからStackFrameIteratorを初期化する際に、InterpreterFrameが重複して処理される問題を修正します。ResetRegDisp関数で所有するInterpreterFrame*をCONTEXTの第1引数レジスタから読み込み、ProcessCurrentFrame実行前にm_crawl.pFrameをスキップすることで、ダブルカウントを防ぎます。
Type サブクラス(例:MetadataLoadContext の RoType)が Nullable<T> を正しく識別できるよう、新しい公開仮想メソッド Type.GetNullableUnderlyingType() を追加しました。Nullable.GetUnderlyingType() がこの仮想メソッドに委譲されます。Enum.GetUnderlyingType() → Type.GetEnumUnderlyingType() の既存パターンに従います。
public virtual Type? GetNullableUnderlyingType()
{
throw new NotSupportedException(SR.NotSupported_SubclassOverride);
}
LINQ join convenience overloads(Join、GroupJoin、LeftJoin、RightJoin)を復活させ、同時にビルド破損を修正するPRです。以前の先制PR(#121998、#121999)で追加されたこれらのオーバーロードが#126624で削除されたため、本PRで再導入します。System.Linq.AsyncEnumerableのテストビルド破損は、ジェネリック型推論が不十分だったAsync対応のセレクタレスオーバーロード呼び出しを明示的にすることで修正されました。
breaking-change-docスキルのワークフロー手順とヘルパースクリプトを改善し、バージョン検出の曖昧性を低減、PRコメントの重複を削除、PR担当者への@メンション通知を追加します。
CoreCLRインタープリタで停止しているスレッドに対するデバッガ関数評価(func-eval)サポートを初期実装します。ネイティブコンテキストハイジャッキングを避け、既存の保留中評価ハッシュテーブル(ProcessAnyPendingEvals)に評価要求をキューイングし、InterpBreakpointハンドラから実行します。これにより、インタープリタと例外発生時の評価で共有ディスパッチパスが再利用されます。
複数の await が共通のコンテキスト処理ロジックを持つ場合、JIT が共有ブロックへのジャンプを通じてそのロジックを完全に共有できるようにする最適化です。新しい finish-suspension ヘルパーメソッドを追加し、複数の suspension epilog を共有ブロック経由でルーティングすることで、生成コードサイズを削減します。
private static async Task Foo()
{
await Bar();
await Bar();
await Bar().ConfigureAwait(false);
await Bar().ConfigureAwait(false);
}
x86のJITコンパイラが浮動小数点型からlong/ulong型へのキャストをハードウェアアクセラレーションする機能を追加しました。AVX-512とAVX10.2を活用することで、オーバーフロー発生時以外のすべてのキャストがハードウェア命令で処理されるようになります。これまではCORINFO_HELP_DBL2LNGなどのヘルパー関数呼び出しが必要でしたが、新しい実装により関数呼び出しなしでインライン化された命令列で処理されます。
サンプルコード(double→long AVX-512):
// 従来: ヘルパー関数呼び出しによる処理
double value = 123.456;
long result = (long)value; // CORINFO_HELP_DBL2LNG呼び出し
// 新実装: AVX-512命令によるインライン処理
// vmovsd, vcmpordsd, vcmpge_oqsd, vcvttpd2qq, vpblendmqなどで直接処理
JITコンパイラの最適化を強化し、span.Slice(span.Length - cns) パターンで発生する冗長な境界チェックを削除します。値番号付け(VN)の恒等式拡張と範囲チェック(RangeCheck)のアサーション推論改善により、BinaryPrimitives.ReadInt32BigEndian 内の長さチェックなども折り畳み可能になります。
生成されるアセンブリコードが大幅に削減され、例示コードでは stackalloc や冗長な境界チェック呼び出しが完全に除去されています。
IBinaryInteger<T>.TryReadBigEndian の実装から unsafe コードを削除し、安全な同等物に置き換えました。Unsafe.ReadUnaligned、Unsafe.Add、MemoryMarshal.GetReference の使用を BinaryPrimitives.ReadXxxBigEndian と span インデックスに置き換えています。JIT は既存の長さチェックにより、結果のバウンズチェックを削除することが期待されます。
DAC/DBI(デバッグ)インターフェース内の IDacDbiInterface::GetAssemblyInfo API を削除し、単一の CordbAppDomain を想定することでデバッガー右側(RS)コードパスを簡潔化します。この変更により、フレーム単位での AppDomain トークン処理が不要になり、キャッシュされた AppDomain を直接使用するようになります。
デバッガのブレークポイント後に実行が再開される際、デバッガが修正したスレッドコンテキスト(IP や SP など)が無視されていた問題を修正します。この変更により、インタープリタはコンテキスト変更を検出し、ResumeAfterCatchException を発生させることで、修正されたコンテキストから正しく実行を再開できるようになります。
GenTree::OperConsumesFlagsメソッドがTARGET_AMD64でもGT_CCMP(条件付きコンパレア)を正しく処理するよう修正しました。従来はTARGET_ARM64のみでGT_CCMPを処理していましたが、GT_CCMPは両アーキテクチャで生成されているため、AMD64での処理を追加します。これにより、フラグ消費ノードとしての正確な認識が可能になり、命令スケジューリングやレジスタ割り当てが改善されます。
#elif defined(TARGET_AMD64)
static_assert(AreContiguous(GT_JCC, GT_SETCC, GT_SELECTCC, GT_CCMP));
return (GT_JCC <= gtOper) && (gtOper <= GT_CCMP);
#endif
ManagedWebSocket.EnsureBufferContainsAsyncメソッドの不要なコード削除。PR #69272でループがStream.ReadAtLeastAsyncに置き換えられた際に放置された死んだブランチと古いコメントを削除するクリーンアップです。動作変更なし。
CoreCLRインタープリタのデバッグ時にスタックウォーク中に不正な行番号が報告される問題を修正します。JITの行番号マッピング方式に合わせるため、以下の改善を実施:
nop命令のみに限定call命令直後に削除されるIL命令がある場合、nop命令を挿入してリターンアドレスのマッピングを正確化iOS/tvOS シミュレータ向けの CoreCLR ビルドで Aggressive Trimming テスト除外ルールが機能していなかった問題を修正。TargetOS の明示的リストチェック(ios/tvos/maccatalyst)では iossimulator/tvossimulator をカバーしていなかったため、Trimming に敏感なテストが実行されて NullReferenceException で失敗していました。修正により、既存の TargetsAppleMobile プロパティを使用することで、すべての Apple モバイルターゲットに対して一貫したテスト除外を適用します。
CRC32/CRC64ベクトル化ヘルパーの安全でないコード(ref byte + Vector128.LoadUnsafe + Unsafe.Add)を、安全なコード(ReadOnlySpan<byte> + Vector128.Create(span) + Slice)に置き換えました。最新のJITボーンズチェック除去がこのループパターンの安全性チェックを処理するため、パフォーマンス低下は予想されていません。
P/Invokeの一時的IL(transient IL)に関連する回帰問題を修正。x86スタック引数のサイジング動作を改善し、PInvokeImportWorkerがSuppressGCTransition下で協調モード呼び出し元に対応できるようにしました。
ARM64プラットフォームにおいて、SME(Streaming SVE)は搭載されているがSVEは搭載されていない環境(例:macOS Virtualization.FrameworkのApple M4)で発生していたSIGILL(不正命令例外)クラッシュを修正します。
シグナルコンテキスト処理でCONTEXT_GetSveLengthFromOS()がSVE rdvl命令を実行していましたが、SME専用プラットフォームではこの命令がサポートされていないため例外が発生していました。本修正では、カーネルが提供するシグナルフレーム内のsve->vl値を直接読み込むことで、rdvl実行を回避します。
ILLink の MemberActionStore から不要となった _featureCheckValues キャッシュを削除するクリーンアップ。CodeRewriterStep が SweepStep より前に実行されるようになった (#127090) ため、機能属性値を事前にキャッシュしておく必要がなくなりました。属性は CodeRewriterStep 処理時にも存在するようになります。
大ページ(large pages)を使用する場合の仮想メモリ割り当て解除の処理を改善しました。大ページは部分的な割り当て解除ができないため、割り当て解除をスキップして、代わりにメモリをOSに返却し、メモリ統計の正確性を向上させます。また、大ページコードパスのテストを容易にするため、GCLargePages=2モードを追加し、小ページを使用して大ページの動作を模擬できるようにしました。
依存関係グラフにPropertyMetadataNodeとEventMetadataNodeを追加し、プロパティのアクセッサ(getter、setter)およびイベント(adder、remover、raiser)を複数回分析することで生じていた重複警告を削除します。
Android ARM32(armeabi-v7a)向けの CoreCLR ランタイムパック本番サポートを有効にするPRです。最小APIレベルが24に引き上げられたため、ARM アーキテクチャの制限を解除し、CI パイプラインで android_arm プラットフォームのサポートを追加します。
On-Stack Replacement (OSR)トランジション時のpatchpointから不要なunwind呼び出しを削除する変更。前のPR(#123645)のフォローアップであり、JITコンパイラのpatchpoint処理を最適化して、OSR遷移時の呼び出しオーバーヘッドを削減します。
cDAC(Common Data Access Component)と従来のDacDbi APIに新しいスタックウォーク関連API(IsLeafFrameとGetContext)を追加するPRです。スレッドコンテキストの取得とリーフフレームの判定をサポートし、GetThreadContextを実装しないデータターゲットへのネイティブDAC フォールバック動作を削除しています。
R2R(Ready2Run)コンパイル時に、リターン値の型変換(covariant returns)に関連するサンク(thunk)の生成をスキップしないよう修正しました。これにより、CI内のcovariant return テストが正常に動作するようになります。
HttpHeaders.Remove()とHttpHeaders.Contains()が、そのコレクションに属さないwell-known headerまたは無効なheader名に対して例外をスローする代わりにfalseを返すように動作を変更します。これにより、呼び出し元が事前にどのコレクションを使用すべきかを知らずに、別のheader collectionにフォールバックできるようになります。
cDAC JIT通知テーブルの新しい契約実装を追加し、レガシーDAC フォールバックを削除しました。新しい ICodeNotifications 契約(c1)は、Windows上での遅延割り当て(ICLRDataTarget2::AllocVirtual)をサポートし、約24KBのメモリコスト削減を実現します。テーブル容量は1000スロット(コンパイル時定数)で、スロット0に長さ情報を格納します。
Microsoft.Diagnostics.Runtime (ClrMD) を 4.0.722401 (最初の安定版リリース) に更新しました。この更新により、クロスビットネス環境(32ビットホストで64ビットダンプを読み込む場合など)でのアドレス拡張ハンドリング問題が修正されます。これにより、以前回避されていたクロスビットネスダンプテストを実行できるようになります。
Haiku プラットフォームでの .NET ランタイムネイティブコンポーネントのビルド対応。pthread robust-mutex API のフィーチャー検出と Haiku リンカー動作の調整を CMake で実装し、ランタイムが Haiku 環境で正常にビルド・動作するようにします。
JIT最適化として、CONST - x(内部的にADD(NEG(x), CONST)で表現)を、xの範囲情報に基づいてXOR(x, CONST)に変換する処理を追加しました。また、アサーション伝播における値番号ベースの畳み込み最適化にGT_NOTを対応させています。
例:255 - x(byte型)はx ^ 255に、-1 - xは~xに変換され、より短い機械語コードが生成されます。
cDAC(Compact Diagnostic Access Component)のダンプテスト基盤を改善し、フルダンプの代わりにヒープダンプを使用するように切り替えます。ClrMDにシンボルパスを提供することで、System.Private.CoreLibとデバッギープロジェクトのメタデータを解決できるようにし、ダンプ分析の信頼性を向上させます。
非同期メソッド実行の一時停止(suspension)時のコンテキスト処理を最適化するため、JIT生成コードからの単一呼び出しで完了する2つのランタイムヘルパー FinishSuspensionNoContinuationContext と FinishSuspensionWithContinuationContext を追加します。従来は複数の呼び出しでコンテキスト処理を実装していたため、コード生成サイズ削減とパフォーマンス向上を実現します。
// 新しいヘルパーメソッド(内部実装)
internal static void FinishSuspensionNoContinuationContext(
ref Continuation continuation,
bool hasExecutionContext,
ExecutionContext currentContext,
SynchronizationContext syncContext);
internal static void FinishSuspensionWithContinuationContext(
ref Continuation continuation,
bool hasExecutionContext,
ExecutionContext currentContext,
SynchronizationContext syncContext);
Apple Network Frameworkを使用するTLS/WebSocketsシナリオでピア証明書チェーンハンドルが欠落/無効な場合のクラッシュを修正します。NullReferenceExceptionを防ぐため、リモート証明書抽出時に安全にnullケースを処理するようにしました。
Enumerable.Sum()のベクトル化された符号付き整数合計処理において、unsafe ポインタ操作を安全なSpan.Sliceベースのループパターンに置き換えました。オーバーフロー検査を各イテレーション後ではなく最終段階で実施することで、パフォーマンスを向上させています。オーバーフロー発生は稀であり、発生時の例外コストが大きいため、早期終了より遅延チェックが有効との考えに基づいています。
BigIntegerの右シフト操作(RightShiftSelf)をリファクタリングし、unsafe参照演算の代わりにspan slicingとVector*.Create/CopyToを使用する安全なAPIに置き換えました。左シフト操作(LeftShiftSelf)も同様に更新されています。
WebAssembly ローダーの download() → create() ライフサイクルを修正し、2段階で初期化できるように再構築しました。ダウンロード状態をトラッキングして、download() 実行後の create() が不要な再初期化を行わない仕様に変更し、HTTP キャッシュのみを使用するプリフェッチモード(download(true))も新たに実装しています。
WebAssembly SDK パック(Microsoft.NET.Sdk.WebAssembly.Browser.targets など)のファイル変更時に、ブラウザライブラリテストが CI で確実にトリガーされるよう、パス評価ルールを修正します。
System.Runtime.Intrinsics.Arm API を拡張して nint/nuint オーバーロードを追加する承認提案を実装します。スコープは ArmBase + Crc32 に限定されます。同時に、JIT の GenTreeHWIntrinsic の補助型追跡を CorInfoType から var_types へリファクタリングし、既存の JIT 型プラッシングとの整合性を向上させます。
Emscripten v5へのアップグレードに向けた準備作業。wasm-ldリンカフラグの構文修正、wasm-optの非トラッピング浮動小数点変換サポート追加、LLVM SIMDイントリンシクの標準化、そしてClangの新しい警告への対応を含む。これらはブラウザ/WASI向けネイティブビルドインフラストラクチャとMono WASM実行時を新しいEmscripten/LLVM/wasm-optツールチェーンと互換性を持たせるための内部実装の変更です。
Nullable.GetUnderlyingType(typeof(T)) パターンのtrim/AOT dataflowモデリングを改善し、新しい値の種類 NullableUnwrappedGenericParameterValue を導入しました。これにより、nullable型から unwrap されたジェネリックパラメータが正しく追跡され、typeof(Gen<>).MakeGenericType(Nullable.GetUnderlyingType(typeof(T))) が不正なジェネリック化を防ぎ、適切なNativeAOT警告(IL3050)を生成するようになります。
OptionsBuilderに流暢なAPI(fluent API)スタイルの新しいValidateオーバーロードを追加します。このオーバーロードは、IValidateOptionsを実装するバリデータ型を登録し、オプション型の検証を行えます。
// 使用例(推測ではなく、一般的なパターン)
optionsBuilder.Validate<MyValidatorType>();
ControlFlowBuilder.CopyCodeAndFixupBranchesのブランチ固定化ロジックにおいて、InstructionEncoderオペコードと直接的なCodeBuilderオペランド書き込みを混在させた場合に、BlobBuilderチャンク境界でバイトをスキップしてしまい、後続のオペランドを破損する問題を修正しました。
チャンク境界(256バイトチャンクのデフォルトでローカルオフセット255)に短分岐プレースホルダが配置された場合、CopyCodeAndFixupBranchesの特殊ケース処理によりsrcBlobOffsetが誤って進行し、次のチャンク開始時に最初のバイトがスキップされていました。
RequiresDynamicCodeAnalyzerが静的に既知のEnum型に対するEnum.GetValues(Type)呼び出しで不要な警告を出しているため、ILCのインtrinsic処理に合わせて修正しました。型引数がSystemTypeValueで静的に既知の場合、IL3050警告を抑制します。
case IntrinsicId.Enum_GetValues:
{
foreach (var value in arguments[0].AsEnumerable())
{
if (value is not SystemTypeValue)
return false;
}
return true;
}
PR #124400で追加されたruntime-async crossgen libraries テスト用のパイプラインレグを削除します。runtime-asyncがデフォルトで有効になったため、明示的なUseRuntimeAsync=trueマトリックスは不要になりました。
WebAssemblyでReadyToRun (R2R)コードの読み込みと実行をサポートするための包括的な実装です。WebCIL v1画像でのR2Rヘッダーディスカバリー、リロケーション処理、ポータブルエントリポイント対応、およびWasm向けランタイム関数テーブルの再ロケーション生成を追加しています。
NativeAOTの外部TypeMapトリミングにおいて、配列型トリムターゲットの精度を向上させるため、配列型そのものの到達可能性に基づいて条件付きを行うように改善。従来はSomeType[]がトリムターゲットであっても要素型SomeTypeが到達可能なだけでMapエントリが保持されていたが、本変更により配列型自体またはテンプレートベースのランタイム構築可能性に基づいて判定する。
private static TypeDesc GetEffectiveTrimTargetType(TypeDesc trimmingTargetType)
{
while (trimmingTargetType is ParameterizedType parameterized && !trimmingTargetType.IsArray)
trimmingTargetType = parameterized.ParameterType;
return trimmingTargetType;
}
Utf8JsonWriter.WriteStringValueでバッファサイズ計算の誤りによるIndexOutOfRangeExceptionを修正しました。非常に大きな文字列(最大166,666,666文字まで)をシリアライズする際に発生していた問題に対応しており、エスケープ時の最大バイト数を事前計算して正確に算出するようにしました。
cDAC(動的に静的なデータを提供するコンポーネント)のno-fallback mode(レガシーDAC不在時)において、診断ツール(SOS、ClrMD)がメタデータにアクセスできるようにするため、System.Reflection.Metadata.MetadataReaderをIMetaDataImport/IMetaDataImport2/IMetaDataAssemblyImport COM インターフェースにマッピングする管理コード COM ラッパーを実装しました。レガシー DAC が存在する場合は、実装されていない約45メソッドのフォールバックとデバッグ検証に使用されます。
ビルドツールのコンテナイメージ依存関係(mcr.microsoft.com/dotnet-buildtools/prereqs)を特定のダイジェスト値にピン固定する自動更新です。Renovate Botによる定期メンテナンスで、ビルド環境の再現性と安定性を確保するための変更です。
JITの低レベル化時のストア合体(coalescing)ロジックをリファクタリングし、隣接する定数書き込み(GT_STORE_LCL_FLD)をINDIRECT/STORE_BLKで使用されていた既存の合体ロジックで処理できるよう拡張する。新機能はJitEnableStoreLclFldCoalescingフラグで制御可能(デフォルト有効)。
s390xアーキテクチャのコード生成ヘッダファイルから重複する命令定義を削除し、欠落していたカンマを追加する修正です。
クロスアセンブリのvararg P/Invoke呼び出しで、スタブ生成時にメソッド実装フラグ(PreserveSigなど)を呼び出し元モジュールではなく定義元モジュールのメタデータから取得するよう修正しました。修正前はBadImageFormatExceptionまたはスタック破損の原因になっていました。
// Assembly A で定義
[DllImport("msvcrt.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static unsafe extern int _scprintf(string format, __arglist);
// Assembly B から呼び出し(修正前は失敗)
_scprintf("%d\n", __arglist(42));
armel(ARM EABI)インタープリタに対してランタイム非同期サポートを追加します。これにより、インタープリタモードで非同期メソッドが正常に動作するようになります。また、armelでの関数呼び出し時のスタックサイズに関する問題も修正しています。
テスト: async/async/async.shをRunInterpreter=1で実行済み。
JIT最適化のRBO(Redundant Branch Optimization)ドミネータウォーク処理において、空のBBJ_ALWAYSブロックチェーンの作成後に早期終了してしまうバグを修正しました。比較対象のブロックを正規化(副作用のないブロックをスキップ)することで、不正なブロック比較を防ぎます。その結果、不必要な条件分岐が削除され、コード生成が改善されています。
"unsafe削除"の取り組みで導入されるSpan.SliceやVector.Createなど、[Intrinsic]属性が付与されたメソッドの呼び出しが、JITインライナーの時間予算に負の影響を与えてコード品質が低下している問題を解決します。本PRは、これらのintrinsic型のメソッドをインラインする際の予算チェックを緩和し、小規模メソッドと同様の扱いをすることで、回帰を防ぎます。
Enumerable.FillIncrementing<T>のベクトル化フィル処理を、安全なSpan<T>.Sliceループパターンを使用するように書き直しました。Unsafe.*およびMemoryMarshal.GetReferenceを排除し、JITが境界チェックを削除できる形状を維持しています。
ブラウザ(WebAssembly)をターゲットする場合にSystem.Diagnostics.StackTrace.TestsでStackTraceLineNumberSupportを有効化し、スタックトレースのファイル/行番号情報をサポートします。これにより、CoreCLR+browserでPDB情報に依存するテストが[ActiveIssue]でスキップされずに実行できるようになります。
Marvin.ComputeHash32OrdinalIgnoreCaseメソッドに[MethodImpl(MethodImplOptions.NoInlining)]属性を追加します。これにより、JITインラインバジェット増加(#118641)で発生していた部分的なインライン化による性能低下を防ぎます。既に同じ属性がMarvin.ComputeHash32に存在しており、OrdinalIgnoreCaseバージョンにも同じ対策が必要でした。
DateTime.UnixEpochを使用する形にコードをリファクタリングしました。Unix エポック(1970年1月1日UTC)を表す定数値の記述を標準化することで、コードの可読性と保守性を向上させています。
SIMD定数処理の改善で、O2K_CONST_VECがTYP_SIMD32/64型の全ての定数に対応するようになりました。TYP_SIMD16より大きい値に対してはヒープ割り当てを行うことで、より多くのSIMD定数シナリオをサポートします。
Generic MemoryMarshal.Read/Write/TryRead/TryWrite<T> APIが将来caller-unsafe属性でマークされるため、プリミティブ型の使用をすべてBitConverterスパン相当の安全なAPIに置き換え、ダウンレベルTFM向けのBitConverterスパンポリフィルを追加します。これは複数ライブラリとSystem.Private.CoreLibにわたる移行の一環です。
Haiku OSでclang(GNU toolchain付き)を使用したランタイムビルドが可能になります。このPRにより、Haiku固有のGNU toolchainを用いたclangコンパイラでのランタイム構築が実現されました。clang + Haiku GNU toolchainの組み合わせでランタイムビルドが成功することが確認されています。
cDAC(Contract-based Diagnostics Access Component)において、GetModuleForAssemblyメソッドをレガシー委譲スタブから契約ベースの実装に移植しました。ネイティブC++実装(dacdbiimpl.cpp)のpAssembly->GetModule()呼び出しに相当する処理を、ILoader.GetModuleHandleFromAssemblyPtr → ILoader.GetModuleを使用して管理コードで実装しています。
ランタイムの非同期サスペンド/レジューム機構を最適化するPRです。TLSアクセス回数の削減、書き込みバリアの除去、ホットパスのキャスト削減により、サスペンション負荷の高いベンチマークで約17%のパフォーマンス改善を実現しています。主な最適化は以下の通りです:
Thread.CurrentThreadをスタック割り当てのRuntimeAsyncStackStateにキャッシュUnsafeを使用した不要なキャスト削減x64 上の浮動小数点 SIMD Vector256/Vector512.Sum の JIT IR 生成を最適化し、V128 水平リダクション処理の重複を排除します。フルな SIMD 幅での permute+add シーケンスを実行してから 128-bit レーンを単一の V128 に統合する設計に変更し、コード量を削減しながら機能を保証します。
RegularExpressionAttributeTests.Validate_MatchingTimesOut_ThrowsRegexMatchTimeoutExceptionのフレーキーなタイムアウトテストを修正します。正規表現エンジンのパフォーマンス向上により、1msのタイムアウト内に処理が完了してしまう場合があり、期待されるRegexMatchTimeoutExceptionではなくValidationExceptionが発生していました。テスト入力を28文字から100文字に増やすことで、指数関数的なバックトラック(O(2^n))を確実にタイムアウトさせます。
ネイティブスタック引数サイズ追跡機能をx86アーキテクチャのみに制限する最適化です。FEATURE_DYNAMIC_METHOD_HAS_NATIVE_STACK_ARG_SIZEマクロを廃止し、関連APIと管理フィールドを直接TARGET_X86ゲートに変更することで、x86以外のアーキテクチャにおける不要な管理オーバーヘッドを削減します。
_bitsがuint[]からnuint[]に移行した後、BigIntegerの5つのIBinaryInteger<BigInteger>メソッド(LeadingZeroCount、PopCount、TrailingZeroCount、RotateLeft、RotateRight)がプラットフォーム依存の結果を返していた問題を修正します。このPRはプラットフォーム非依存の32ビット語セマンティクスを復元し、_signパスと_bitsパスの両方に対応します。
ReflectionXmlSerializationReaderのバグを修正し、フィールドバック型のXxxSpecifiedメンバーがデシリアライゼーション時に正しく設定されるようにしました。従来はGetMethod("set_X")でプロパティセッターのみを検索していたため、フィールドバック型のSpecifiedメンバーはnullとなり、XMLに要素が存在してもfalseのままでした。本修正により、リフレクションパスとILGenパスの動作を統一し、既存のキャッシュデリゲート基盤を活用しています。
iOS/tvOS/MacCatalyst向けのSystem.Runtime ハイブリッドテストプロジェクトで、trim と AOT アナライザーを無効化します。これらのアナライザーは新たに有効化されたものですが、全てのテストがまだ対応していないため、extra-platforms での障害を防ぐための措置です。
ARM/ARM64スカラーCRC32更新パスを、ポインタベースのループからSpanスライシングループパターンに書き換えました。BinaryPrimitives.ReadUInt64LittleEndian/ReadUInt32LittleEndianを使用し、JITが自動的に境界チェックを削除できるようにしました。
while (source.Length >= sizeof(ulong))
{
crc = System.Runtime.Intrinsics.Arm.Crc32.Arm64.ComputeCrc32(crc, BinaryPrimitives.ReadUInt64LittleEndian(source));
source = source.Slice(sizeof(ulong));
}
HashCode.AddBytesメソッドを、JITが境界チェックを除去できる安全なSpan.Sliceループパターンに書き直しました。従来のUnsafe APIベースのポインタ走査(Unsafe.ReadUnaligned、Unsafe.Add、Unsafe.IsAddressLessThan)を、BitConverter.ToUInt32とReadOnlySpan<byte>.Sliceを用いた安全なループに置き換えています。JITはこのループ形状(while (data.Length >= CONST) { ...; data = data.Slice(CONST); })を認識して自動的に境界チェックを除去するため、生成コードは前の unsafe 実装と同等です。
// 従来の unsafe ベース → 安全な Span.Slice ベースへ
while (value.Length >= sizeof(int) * 4)
{
_v1 = Round(_v1, BitConverter.ToUInt32(value));
_v2 = Round(_v2, BitConverter.ToUInt32(value.Slice(sizeof(int) * 1)));
_v3 = Round(_v3, BitConverter.ToUInt32(value.Slice(sizeof(int) * 2)));
_v4 = Round(_v4, BitConverter.ToUInt32(value.Slice(sizeof(int) * 3)));
_length += 4;
value = value.Slice(sizeof(int) * 4);
}
NumericsHelpers.DangerousMakeOnesComplementメソッドをリファクタリングし、unsafe操作を排除しつつJITの最適化を活用する安全なSpan.Sliceループパターンに統一しました。Vector<N>.LoadUnsafe/StoreUnsafeとUnsafe.AddをVector<N>.Create(span)とvector.CopyTo(span)に置き換え、JITが自動的に境界チェックを削除するループ構造を採用しています。
while (data.Length >= Vector<N><nuint>.Count)
{
Vector<N><nuint> complement = ~Vector<N>.Create(data);
complement.CopyTo(data);
data = data.Slice(Vector<N><nuint>.Count);
}
WebAssembly SDK ビルドロジックから公開 MSBuild プロパティ WasmWebcilVersion を削除し、webcil バージョンを常に内部プロパティ _WasmWebcilVersion で決定するようにしました。これにより、webcil バージョンの決定ロジックが一元化されます(CoreCLR の場合は 1、それ以外は 0)。
ネイティブコンパイラプロパティを CppCompilerAndLinker に正規化する変更。VMR(Version Manifest Resolver)からgccを渡すための対応で、NativeAOT基盤で公開的に使用されている命名規則に統一する。
JIT のプロファイル再構築時に、OSR(On-Stack Replacement)エントリでエッジ数と後続ブロック数の不一致を許容するように改善しました。PGO エッジプロファイルデータを組み込む際、PropagateOSREntryEdges がエッジ数の厳密な一致をアサートしていましたが、スパニングツリー走査中に一部の BBJ_LEAVE ターゲットが見落とされる場合に失敗していました。この場合、PropagateEdges と同様に、等確率ヒューリスティックスにフォールバックするよう修正しました。
PGO(Profile Guided Optimization)ストレスモード下でのアサート失敗を修正するため、fgopt.cppのフロー グラフ最適化における3つのプロファイル重み不整合の問題に対処しています。具体的には、ブロック圧縮時の重み不一致検出、条件分岐のマージ後の尤度設定、プロファイル重みのクランプ検出の3つを修正しています。
WebAssembly環境においてDateTime型のマーシャリングがタイムゾーン依存となっていた問題を修正しました。ToJS(DateTime)がnew DateTimeOffset(value)を使用していたため、ローカルタイムゾーンのオフセットが適用されていました。一方、ToManaged側は常に.UtcDateTime(offset=0)を返すため、ラウンドトリップ時にDateTime値がローカルUTCオフセット分シフトしていました。Emscripten 5.0.6がTZ環境変数を正しく処理するようになったことで、UTC以外のタイムゾーンで問題が露出しました。
修正内容:new DateTimeOffset(value)をnew DateTimeOffset(value.Ticks, TimeSpan.Zero)に変更し、Ticksを常にUTCとして解釈するようにしました。
// 変更前
new DateTimeOffset(value)
// 変更後
new DateTimeOffset(value.Ticks, TimeSpan.Zero)
ilasmパーサーの診断出力を統一し、AsmParse::error()が-ERR(エラー許容)モード下でAsmParse::warn()と同じ動作をするよう修正。エラー出力は常にstderrに送られ、OnErrGoが有効な場合は診断出力が抑制されます。
Monoデバッガーのワイヤープロトコルに新しいVM コマンド CMD_VM_GET_SYSTEM_INFORMATION を追加します。このコマンドにより、デバッガークライアントがランタイムからプロセッサーアーキテクチャとOSページサイズなどのシステム情報をクエリできるようになります。
ビルドスクリプト(eng/build.sh)において、commコマンドとsortコマンドのロケール照合順序をCロケールに固定することで、システムのロケール設定に依存しない一貫した動作を実現します。これにより、Ubuntu 26.04などの新しいディストリビューションで発生する「input is not in sorted order」エラーを防止します。
ヒープダンプ生成時のメモリ領域列挙ロジックを簡潔化し、HEAP2パスをデフォルトとします。従来の低速な列挙パスと環境変数ベースの回避策を廃止し、LoaderAllocatorを通じた統一的な領域列挙に統合します。これにより、JitManager、SystemDomain、AppDomain、Assembly、Module、LoaderAllocatorからのメモリ領域が効率的に列挙されます。
SystemdNotifier コンストラクタから NOTIFY_SOCKET 環境変数のクリア処理を削除し、AddSystemdLifetime 内の ISystemdNotifier DI ファクトリに移動しました。公開パラメータなしコンストラクタが純粋な読み取り操作になり、環境変数はホスティングが実際に構成される場合にのみ更新されるようになります。
CoreCLR browser WASM ローダーにおいて、ユーザー提供の out/err オーバーライド(dotnet.withModuleConfig() 経由)が Emscripten の print/printErr に橋渡しされていない問題を修正します。Mono ランタイムは既にこの機能を実装していましたが、CoreCLR にはその相当機能がありませんでした。本変更により CoreCLR の動作が Mono と一致するようになります。
ブラウザ環境でのPromise-to-Taskマーシャリング中に発生した例外の処理を改善します。CLR実装が例外を無視していた問題を修正し、Mono実装と同様にランタイムを終了するようにします。例外が発生するとManagedタスクが永遠にハング状態になり、GCHandle/プロキシの状態が破損するため、この修正は重要です。
System.Reflection.Metadataの内部実装を整理するクリーンアップPRです。カスタムUTF-8ヘルパーをEncoding.UTF8標準APIに置き換え、未使用の内部API(Hash.Combine(bool, int)など)を削除し、PEヘッダ書き込みと埋め込みPDB解凍コードパスを簡素化しています。
Mono WASM テストアセットの Blazor/AspNetCore パッケージを 11.0.0-preview.4 にアップデートしました。WBT(Web Based Tests)カバレッジをターゲット SDK/ランタイムバージョンに合わせるための変更です。
JITの間接呼び出し(CT_INDIRECT)処理において、gtCallMethHndフィールドが初期化されずにスタジアムデータを保持することで、gtIsRecursiveCall()が誤った正の判定をし、再帰的末尾呼び出しの検出が誤動作する問題を修正します。結果として、無限ループに陥るコード変換が発生していました。
QUIC ストリームの優先度制御機能を System.Net.Quic に追加します。API承認済みの設計(#90281)に基づき、QuicStream.Priority プロパティ(byte)と DefaultPriority 定数(0x7F)を実装します。
namespace System.Net.Quic;
public partial class QuicStream
{
public const byte DefaultPriority = 0x7F;
public byte Priority { get; set; }
}
X25519 Diffie-Hellman鍵交換の公開APIを実装します。Windows 10+ (CNG)、Apple macOS/iOS/tvOS (CryptoKit)、OpenSSLをサポートします。鍵のインポート/エクスポート(Raw/SPKI/PKCS#8/PEM形式)と共有秘密導出の機能を提供します。
// 使用例
using var x25519 = X25519DiffieHellman.Create();
byte[] publicKey = x25519.ExportRawPublicKey();
byte[] sharedSecret = x25519.DeriveRawSharedSecret(otherPartyPublicKey);
BlobBuilder.LinkSuffixがリンク済みの接尾辞チェーンを持つ空の宛先ビルダーにリンクされた場合、既にリンクされたコンテンツを失う問題を修正しました。本変更により、接尾辞チェーン全体が保持され、バイト順序と全コンテンツが正しく保持されるようになります。例:11-22(修正前は22-00になる場合がありました)。
element.LinkSuffix(tail); // element: 0x11, tail: 0x22
emptyPrefix.LinkSuffix(element); // 結果: [0x11, 0x22]
JITコンパイラの冗長分岐最適化を拡張し、Value Number (VN)による論理式簡略化を活用して、支配的分岐の比較演算を削除できるようにしました。支配的述語が被支配述語を直接意味しない場合でも、(pB AND pA)をVN空間で簡略化して単一の関係演算子(relop)または定数に変換できれば、被支配側の比較を修正して削除できます。
例:if ((x >= 100) && (x <= 100)) S; → if (x == 100) S;
JIT のアサーション伝播機能を拡張し、SIMD ベクトル定数(Vector64/128/256/512)の等値性/不等号チェックを認識して、ガード後のコード内でベクトル定数を伝播できるようにしました。これにより、ベクトル定数を使用する一般的なガード・パターンでより多くの定数畳み込み最適化が可能になります。
if (vec == Vector128<int>.Zero)
{
// JIT がこのスコープ内の vec の使用すべてを Vector128<int>.Zero として定数伝播
}
xplat dump テストの OOM 問題を、Helix ペイロードを分割することで修正します。従来は全プラットフォーム(linux-x64、linux-arm64、windows-x64、windows-x86、windows-arm64)のダンプを単一の MemoryStream ベースの ZipArchive に圧縮していたため、合計サイズが byte[] の ~2GB 制限を超えて OutOfMemoryException が発生していました。
WebAssembly on CoreCLRのWasm.Build.Testsスイートで、ローカルおよびHelix環境での per-app ネイティブリリンク機能を有効化します。CoreCLR WBTレーンがBrowserWasmApp.CoreCLR.targetsを駆動するためのインフラストラクチャ(テンプレートインストール、EMSDK提供、環境変数ブリッジ、Helixペイロード)を追加し、ネイティブリリンクのエンドツーエンド動作を実現します。
.NET クラッシュダンプの検査用開発ツール cdac-dump-inspect を追加しました。ClrMD と cDAC(契約ベースのデータアクセス)を使用して、WinDbg/SOS なしにダンプから契約記述子、スレッド、スタック情報を検査できます。
使用例:
./src/native/managed/cdac/scripts/cdac-dump-inspect.ps1 descriptor <dump-path>
./src/native/managed/cdac/scripts/cdac-dump-inspect.ps1 threads <dump-path>
./src/native/managed/cdac/scripts/cdac-dump-inspect.ps1 stacks <dump-path>
cDAC(Component Data Access Control)バックアップパスにおいて、COM相互運用関連のDacDbi API GetObjectForCCW と IsRcw の実装を追加します。既存のcDACコントラクトに基づいており、BuiltIn COM と ComWrappers の両シナリオに対応したダンプベースの統合テストも合わせて提供します。
Android向け.NETのランタイムをMonoからCoreCLRへ移行するため、サポート対象のAndroid最小APIレベルを21から24(Android 7.0 Nougat)に引き上げます。このAPIレベル以上が保証されることにより、API 21~23専用の互換性ワークアラウンド実装が削除でき、コードベースが簡潔になります。
SymCrypt 1.9.5のリリースに伴い、Azure Linux 3 VM(AzL3)向けのQUICおよびHTTP/3テストスキップ条件を削除します。これまでMsQuicの互換性問題によりAzL3での実行がゲートされていましたが、更新されたSymCryptイメージにより問題が解決されたため、テスト実行を再度有効化します。
LibraryImportDiagnosticsAnalyzerとDownlevelLibraryImportDiagnosticsAnalyzerがStringMarshalling設定時に診断を報告しない回帰を修正。また、生成される内部[DllImport]スタブがStringMarshalling.Utf16設定時にCharSet = CharSet.Unicodeを省略し、転送型(例:StringBuilder)の実行時マーシャリングが不正になる問題を解決。
System.Net ストレステストの Docker Compose ランナースクリプトをインフラストラクチャ変更に対応させる修正です。最近のイメージ変更による破損を解決するテスト基盤のみの変更で、プロダクトコードへの影響はありません。
macOSにおけるリモートアンワインド処理で、HP libunwindのunw_get_proc_info_in_range()APIを明示的に使用するように修正しました。CMakeの機能検出がシステムlibunwindの能力を報告するため、実際に使用するHP libunwindの能力と不一致が生じていた問題を解決します。
AddGeneratedComClassFixerコード修正が、クラスを[GeneratedComClass]に変換する際に冗長な[ComVisible(true)]属性を削除していない問題を修正しました。別ファイルの部分宣言に存在する属性も対象に含まれます。
変換前:
[ComVisible(true)]
class C : I { }
変換後(修正後):
[GeneratedComClass] partial class C : I { }
JIT の BlendVariableMask リライト処理におけるエッジケースを修正します。具体的には、インポート時に BlendVariable が BlendVariableMask にアップグレードされた後、rationalize フェーズで元の形式にダウングレードされる際の問題に対応しています。
マスク粒度が pblendvb 命令と互換性がない場合の不正なブレンド書き換えと、EVEX 埋め込みマスク最適化において ConvertVectorToMask から生成されたマスクを考慮せず無駄なマスク生成が行われる問題を修正しています。
Mono のネイティブクラッシュハンドラが crash chaining 有効時に、事前インストールされたシグナルハンドラを SIG_DFL にリセットしてしまう問題を修正しました。この変更により、Sentry などのサードパーティツールが Mono より前にシグナルハンドラをインストールして、ネイティブクラッシュを適切にキャプチャできるようになります。
アセンブリバージョン競合時のFileLoadExceptionメッセージを改善するPR。バインディング失敗時に既にロードされているアセンブリの詳細情報(バージョン、パス)を例外メッセージに含めることで、ユーザーがバージョン不一致の原因をより容易に診断できるようになります。
改善例:
// 改善前
Could not load file or assembly 'LibA, Version=2.0.0.0'...
// 改善後
A different copy of assembly 'LibA' is already loaded.
Loaded assembly: 'LibA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
from 'C:\repos\helloworld\bin\Debug\net10.0\LibA.dll'
SpanArr インラインアレイ型をIL(InvalidCSharpInlineArray.il)からC#(InlineArrayValid.cs)に移行するプルリクエストです。C# 12+のインラインアレイ機能を活用して、保守負荷を低減しながら言語進化を実証します。100個のSpan<object>要素を持つref structとして定義されています。
CoreCLR テスト用の PlatformDetection.cs で、WASM マルチスレッド検出の反射(リフレクション)ベースの回避策を削除し、SDK 11.0.100-preview.3 で利用可能になった RuntimeFeature.IsMultithreadingSupported API を直接使用するように更新しました。
ProcessWaitStateでプロセス終了を待機中にキャンセルが発生した際、_canceledフラグの設定とシグナル送信の間にレース条件が存在していた問題を修正しました。_canceledをSignalCore()呼び出し前に設定することで、リーピングスレッドが常に正しいキャンセル状態を観察できるようにします。
JITコンパイラのoptVisitReachingAssertionsメソッドを更新し、到達不可能なブロックに由来するSSA PHI引数を許容するように改善しました。これまで保守的に処理を中止していたケースを回避し、より効率的に解析できるようになります。
PR #127146で導入された「キャスティングロジックにおける正規型(canonical types)の処理」機能を全面的に削除するリバートです。この変更により、正規型に関連する複数のコンポーネントが削除され、NativeAOTコンパイラの型システムがより簡潔な状態に戻されます。
Blazor WASM フレームワークアセットの CopyToOutputDirectory 動作を MSBuild プロパティで設定可能にする変更です。#126407 での変更によって library-tests が回帰していた問題を解決します。デフォルトは Never(static web assets ミドルウェア経由で obj/fx/ から提供)のままで、テスト環境では PreserveNewest に設定することで、bin/ から直接実行するテストをサポートします。
System.Net.Mime名前空間のMediaTypeNamesクラスにVideoネストされたクラスを追加し、一般的なビデオMIMEタイプの定数を提供します。Mp4、Mpeg、Ogg、QuickTime、WebMの5つのビデオコンテナフォーマット定数が追加されます。これらはWebアプリケーションで最も広く使用されるビデオMIMEタイプです。
public static class Video
{
public const string Mp4 = "video/mp4";
public const string Mpeg = "video/mpeg";
public const string Ogg = "video/ogg";
public const string QuickTime = "video/quicktime";
public const string WebM = "video/webm";
}
PR #126547でWriteBarrier FCallがネイティブ(FCall)からマネージドコードに変換された後、x64データブレークポイントのデバッガアンウインドロジックが不正な動作をしていました。本修正により、デバッガがCastHelpers.StelemRefのJITヘルパーで停止するのではなく、ユーザーコードまで正常にアンウインドするようになります。
cDAC(Compact Data Access Component)のDacDbiImplにSetCompilerFlagsメソッドを実装し、デバッガアセンブリ制御フラグを設定できるようにします。ILoaderコントラクトを使用してフラグを更新し、Edit and Continue(EnC)が有効化できない場合はCORDBG_S_NOT_ALL_BITS_SET成功HRESULTを返します。
Unix名前付きパイプ(Unixドメインソケット)のファイルシステム権限を強化するため、PipeOptions.CurrentUserOnly使用時にソケットファイルのモードを明示的にユーザーのみ(0600)に設定します。ディスク上のエンドポイント権限を「現在のユーザーのみ」という意図に合わせ、リグレッションテストを追加しています。
LSRA(線形スキャン・レジスタアロケータ)でレジスタ割り当て時の競合解決ロジックを修正しました。BuildDef(tree, SRBM_REG)が固定レジスタへの定義で、そのレジスタに既存のインターバルが割り当てられている場合、定義レジスタの変更を避けることで、暗黙的なスピルが正しく発生するようにしています。
IJW(C++/CLI)リバースP/Invokeにおいて、17個以上のby-refパラメータを持つマネージド関数をネイティブコードから呼び出す際に発生していたOverflowExceptionを修正しました。
根本原因はStubSigBuilder::EnsureEnoughQuickBytesがバッファサイズを1回だけ2倍にしていたため、カスタム修飾子が保持される場合(PR #106000によるRegression)にシグネチャが512バイトを超えるとバッファオーバーフロー(CQuickBytesのインラインバッファ:256→512バイト)が発生し、引数カウント情報が破損していました。
JITコンパイラのスパン範囲チェック最適化を改善し、ループ内でのSpan操作における冗長な境界チェックを削除します。ループバック辺のPhi引数に対して、追跡されたVNがADD(boundVN, cns)経由でチェック済み境界式と一致する場合の認識を強化することで、ループ内での繰り返される範囲チェックを削除します。
int Sum(ReadOnlySpan<int> data)
{
Vector128<int> sum = default;
while (data.Length >= Vector128<int>.Count)
{
sum += Vector128.Create(data);
data = data.Slice(Vector128<int>.Count);
}
int result = Vector128.Sum(sum);
foreach (var t in data)
result += t;
return result;
}
Async OSR(On-Stack Replacement)の再開処理を最適化するPRです。従来、OSRメソッド内での再開はパッチポイントヘルパーを経由していましたが、このヘルパーのオーバーヘッドは10~20倍でした。本変更により、Tier0コードから直接OSRコードへのジャンプで再開し、パッチポイントヘルパーを完全に迂回します。
主な最適化内容:
GT_FTN_ENTRY(現在のコンパイル関数の入口アドレス)とGT_NONLOCAL_JMP(指定アドレスへの直接ジャンプ)という新しいIRノードを導入GT_NONLOCAL_JMPを生成し、OSR再開時にパッチポイント経由ではなく直接ジャンプ// 実行例:10,000,000回のawaitループの場合
// 最適化前: 6357.1 ms
// 最適化後: 457.1 ms (約13.9倍の高速化)
WebAssemblyのRyuJIT向けに、例外処理(EH)のアンワインド報告とアンワインド可能なフレーム実装を追加しました。Virtual IPスキームを導入して、EH領域と呼び出しサイトに一意のVirtual IP範囲を割り当て、ランタイムのスタックウォーキングと例外処理を可能にするための基盤を構築しています。
cDAC(Common Data Access Context)デバッガー契約にMarkDebuggerAttachPendingとMarkDebuggerAttached APIを実装します。これらのAPIはg_CORDebuggerControlFlagsへのターゲットメモリ書き込みを通じてデバッガー制御フラグを設定します。また、ファイバーモード関連の不要なコードを削除しています。
source-build-reference-packagesリポジトリがsource-build-assetsに名称変更されたため、VMR/source-buildシナリオ対応として中間依存関係を更新します。新しいリポジトリから生成された新しいパッケージバージョンに対応するため、バージョンとSHAも更新されます。
UInt128 の除算アルゴリズムを128ビット値に特化した実装に最適化。BigInteger除算で使用されていた汎用的な処理を廃止し、128ビット範囲に限定した高速な除算ロジックに置き換え。DivRemを中核実装として、除算と剰余を同時に計算することで不要な乗算を排除。
System.IO.StringParserの数値解析メソッドからunsafeなポインタベースのコードを削除し、安全なspanベースのint/long/uint/ulong.Parse呼び出しに置き換えました。NumberStylesとCultureInfo.InvariantCultureを使用して、割り当てなしのまま安全性を向上させます。
UseSystemd() が ProtectProc=invisible で設定されたサービスで暗黙的に失敗する問題を修正。$SYSTEMD_EXEC_PID 環境変数(systemd v248+)を主要な検出方法として使用し、古いsystemdバージョン向けに /proc/{ppid}/comm をフォールバックとして保持します。また、NOTIFY_SOCKET に基づいて notifier を登録する仕組みを導入し、より堅牢な systemd サービス検出を実現します。
Edit-and-Continue (EnC) パスで Async v2 メソッドバリアント対応を実装するもの。EEClass::AddMethodDesc/EEClass::AddMethod を拡張して、非同期メタデータ(フラグと代替署名)を処理し、EnC メソッド更新ロジックが非同期メソッドバリアントを考慮するようにしました。
System.ServiceModel.Syndication ライブラリを trimming と NativeAOT に対応させるため、外部リンカー抑止ファイルをコード内アノテーションに置き換えます。Activator.CreateInstance() が使用される箇所に DynamicallyAccessedMembers を追加し、リフレクション依存の API に RequiresUnreferencedCode / RequiresDynamicCode アノテーションを付与します。
PrecodeMachineDescriptorのStubPrecodeブロック初期化ロジックにおける2つのコピペバグを修正します。契約バージョン3(PrecodeStubs_3)がStubBytes/StubIgnoredBytesフィールドを正しく読み込み・設定し、Fixupプリコードデータを破損させないようにします。
cDAC(Compact Data Access Component)の RuntimeInfoOperatingSystem 列挙型に Apple 値を追加し、Apple プラットフォーム(macOS/iOS/tvOS/MacCatalyst)を他の Unix ターゲットから区別できるようにしました。これにより、Apple ARM64 の特殊な呼び出し規約(スタック引数のアライメントが Linux ARM64 と異なる)を正しく処理できるようになります。
ILTrim テスト基盤のメンテナンス。期待される失敗リストから、現在パスしているテストを削除し、テストスイートの失敗期待値の正確性を保つ。
dotnet/runtime リポジトリの CI 分析およびVMRコードフロー分析スキルをローカル実装から dotnet/arcade-skills マーケットプレイス プラグインへ移行しました。ローカルの PowerShell スクリプトと参照ドキュメントを削除し、Copilot および Claude の設定を更新して dotnet-dnceng@dotnet-arcade-skills プラグインを有効にしました。
ComWrappers.TryGetComInterfaceDispatchメソッドの論理条件バグを修正しました。OR演算子(||)をAND演算子(&&)に変更することで、COMオブジェクトのvtableがランタイム提供のIUnknown/IReferenceTrackerTarget実装と一致しない場合にのみ、"tagged interface"フォールバックパスを実行するようにしました。
複数のテストプロジェクトのトリマビリティ(Trim互換性)を改善するPRです。以前無効化されていたトリミング分析ツール(Trim Analyzer)を再度有効化し、生成された警告に対して標的化された抑制/アノテーションを追加するとともに、トリム非推奨APIをトリム友好的なAPIに置き換えています。主な変更は、EnableTrimAnalyzerフラグの有効化、DynamicallyAccessedMembers属性の追加、Enum.GetValues(typeof(T))からEnum.GetValues<T>()への移行です。
System.Diagnostics.Process テストにおけるトリミング警告を修正するため、トリムアナライザが静的解析できない obj.GetType().GetField(...) および assembly.GetType(...) パターンを、アナライザが解析可能な Type.GetType("FullName, AssemblyName") パターンに置き換えました。併せてテストプロジェクトのトリムアナライザを再有効化します。
FileSystemGlobbing テストから未使用の FileSystemOperationRecorder を削除するリファクタリング。このユーティリティはリフレクションを使用して匿名オブジェクトを辞書に変換していましたが、収集した Records リストはテストで一度も読まれていませんでした。削除により、トリミング警告(IL2075)を解消し、テストユーティリティコードを簡潔化できます。
Processクラスに4つの新しい静的APIを実装しました:Run、RunAsync、RunAndCaptureText、RunAndCaptureTextAsync。これらは標準出力/標準エラーの自動キャプチャ、タイムアウト、キャンセレーション対応など、一般的なプロセス実行シナリオを簡潔に実装できます。
サンプルコード:
// 出力をキャプチャして実行
var result = Process.RunAndCaptureText("dotnet", "--version");
Console.WriteLine(result.StandardOutput);
// タイムアウト付きで非同期実行
await Process.RunAsync("myapp.exe", timeout: TimeSpan.FromSeconds(30));
// ProcessStartInfoを使用した実行
var psi = new ProcessStartInfo("cmd.exe") { ... };
Process.Run(psi);
.NETFramework(NET481)の垂直ビルド時に、PNSE(Platform-Specific Non-Emulated)アセンブリの XML ドキュメント生成処理が失敗する問題を修正します。UseCompilerGeneratedDocXmlFileが有効な場合、ローカルターゲティングパック(FrameworkList.xml)が存在しない .NET Framework ビルドで net11.0 の内部ビルドが失敗していました。修正により、ターゲティングパックの存在確認を追加して、その場合は PNSE doc-source の自己参照 ProjectReference をスキップするようにしました。
x86アーキテクチャにおけるDAC/DBIスタックウォークの回帰問題を修正しました。Environment.CallEntryPointをUnwindStackWalkFrameでスキップすることで、x86の「1フレーム先行アンワインド」が不正なフレームポインタを計算し、ICorDebugStackWalk列挙が失敗する問題を解決します。フレームはデバッガUIからはkRuntimeEntryPointFrame分類とGetFrameWorkerのS_FALSE戻り値により非表示のままです。
Microsoft.Extensions.Logging.Abstractions アセンブリにおいて、以前のバージョンで利用可能だった *.Internal 名前空間の型(NullScope、TypeNameHelper、FormattedLogValues、LogValuesFormatter)を [Obsolete(error: true)] + [EditorBrowsable(Never)] の互換性shimとして復元する変更です。これにより、これらの型に依存する既存のコードが TypeLoadException で失敗するシナリオに対応します。新しい非obsoleteなパブリックAPIは追加されません。
OpenSSLの非推奨RSA APIに対するガード条件を削除し、Linux bionic arm64でのMono ビルド失敗を修正するPRです。CMakeの設定時に非推奨APIをプローブする際の検出ロジックを簡略化し、現在のすべてのOpenSSLバージョンで該当APIが存在することを考慮して、ガード条件を安全に削除しました。
Windows SDK v10.0.28000.0以降でCONTEXT_UNWOUND_TO_CALLマクロが定義されるようになったため、CoreCLRのクロスコンパイルヘッダで重複定義エラーが発生していた問題を修正します。ARM64クロスコンパイルセクションでのマクロ定義を#ifndefでガードすることで、既に定義されている場合の重複を回避します。
NativeAOT の dataflow 解析で、ローカルメソッド内の MakeGenericType/MakeGenericMethod 呼び出しが正しく処理されていない問題を修正します。コンパイラが生成したローカルメソッド内の呼び出しは、親メソッドとは異なる型定義を持つため、ランタイム依存関係が正しくマッチングされていません。
MakeGeneric<Atom>();
// ローカルメソッド内の MakeGenericTypeSite が SearchDynamicDependencies でマッチしない
static object MakeGeneric<T>() => Activator.CreateInstance(typeof(Gen<>).MakeGenericType(typeof(T)));
class Gen<T>;
struct Atom;
Browser + CoreCLRの組み合わせ時にWasmTriggerPublishApp未実装により除外されていた6つのテストプロジェクトを再度有効化します。ビルドエラーが解決されたため、exclusionを削除し、プロジェクトレベルではなくテストレベルでスキップを管理するようにしました。
ILLinkerのパイプライン実行順序に関するバグを修正しました。到達不可能なメソッド本体内にのみ存在するアセンブリ参照が、SweepStepで保持される一方で参照先アセンブリが削除されるという矛盾が生じていました。CodeRewriterStepをSweepStepよりも前に実行することで、SweepStepが最終的に変換されたメソッド本体を正しく処理するようになりました。
Dependency InjectionコンテナのValidateScopes/ValidateOnBuild機能において、キー付きシングルトン(ImplementationInstance)がキーなしのスコープド登録と誤分類される問題を修正しました。登録順序に依存する誤検出(「Cannot consume scoped service ... from singleton ...」)が発生していました。
修正により、ResultCache.None(...)がserviceKeyを保持し、キャッシュキーを(serviceKey, serviceType)のペアから構築するようになり、キー付きとキーなしのコールサイトが同じキャッシュIDを共有しなくなります。
services.AddScoped<IService, ScopedService>();
services.AddKeyedSingleton<IService>("Key", new KeyedSingletonService());
services.AddSingleton<OtherSingleton>();
// ValidateScopes=trueで正しく検証されるようになった
services.BuildServiceProvider(new ServiceProviderOptions
{
ValidateScopes = true,
ValidateOnBuild = true
});
SafeProcessHandleに5つの新しい公開メソッドを追加します:WaitForExit、TryWaitForExit、WaitForExitOrKillOnTimeout、WaitForExitAsync、WaitForExitOrKillOnCancellationAsync。これにより、Processを経由せず直接SafeProcessHandleからプロセス終了を待機できるようになります。Windows/Unix双方で実装され、Unixではプロセス終了シグナル情報も報告されるよう拡張されました。
// 使用例
SafeProcessHandle handle = /* ... */;
// 同期待機
if (handle.TryWaitForExit(TimeSpan.FromSeconds(5)))
{
int exitCode = handle.GetExitCode();
}
// 非同期待機
await handle.WaitForExitAsync();
ILTrimで未実装だった-x(XMLディスクリプタ)コマンドラインオプションを実装しました。ILCompiler.CompilerのTrimmingDescriptorNodeを再利用し、ILTrim環境用に条件付きコンパイルで適応させています。これにより、XML形式のトリミング設定ファイルがILTrimで処理されるようになります。
source-build-reference-packagesリポジトリがsource-build-assetsにリネームされたため、VMR/source-buildシナリオでの参照を更新しました。これに伴い、新しいリポジトリから生成されたパッケージバージョンも更新されています。
Windows x64プラットフォームにおけるアンワインド情報テーブル(UnwindInfoTable)のパフォーマンスを改善するバックポート。エントリをバッファに蓄積してから一括フラッシュすることで、pRtlAddGrowableFunctionTableとpRtlDeleteGrowableFunctionTableの操作コストを償却し、内部のRUNTIME_FUNCTIONテーブル作成のオーバーヘッドを削減します。
Kerberos認証フローをテストするため、NegotiateAuthenticationのEnterpriseテストスイートを追加します。実際のKDC(Key Distribution Center)に対してクライアント/サーバー間の認証ハンドシェイク、保護レベル、wrap/unwrapシナリオをテストする新しいテストケースを実装しています。
ReadyToRun対応アプリケーションをデバッグ時にデバッガハングを引き起こす問題を修正します。DebuggerController::BindPatchでGetCodeRegionInfoを呼び出す際に、既に利用可能なDebuggerJitInfoとMethodDescを渡すことで、不要なHashMap::LookupValueルックアップと連鎖的なGCモード遷移を回避し、キャッシュされたCodeRegionInfoをそのまま利用できます。
Installer Helix テストの実行条件をスコープ化し、インストーラー関連のパス変更時のみ実行するように変更しました。以前は CoreCLR および Libraries PR で毎回 5 つの Helix ジョブが実行されていましたが、インストーラーテストは JIT・GC・ライブラリコード変更の影響を受けないため、不要な実行を削減します。例外として osx_arm64 は coreclr.containsChange も含める条件を保持し、シングルファイル関連の問題検出を強化します。
Continuationクラスの小規模なフィールドアクセッサメソッドに[MethodImpl(MethodImplOptions.AggressiveInlining)]属性を追加し、JITインライニング判定を改善するPRです。Unsafe操作を含む intrinsic-heavy なコードは見た目は大きく見えますが、実際には数命令しか展開されないため、明示的にアグレッシブインライニング対象とすることで、ホットパスでのパフォーマンスを向上させます。
JITコンパイラのパッチポイント関連コードをリファクタリング。doesMethodHavePartialCompilationPatchpointsメソッドを削除し、その機能をdoesMethodHavePatchpointsに統合。また、BBF_PATCHPOINTフラグをBBF_OSR_PATCHPOINTに改名してOSR(On-Stack Replacement)パッチポイント専用であることを明確化。
OpenBSD環境でのメモリリソース制限の取得を修正しました。OpenBSDがRLIMIT_ASを持たないため、代わりにRLIMIT_DATAを使用するよう変更しました。また、ファイル内の不要なホワイトスペースをクリーンアップしました。
OpenBSD環境でのCoreClrの例外処理(exception/seh.cpp)に関連する問題を修正します。#124911に関連した改善となります。
CounterSampleCalculator_ElapsedTime テストの不安定性を修正しました。このテストは QPC(クエリ パフォーマンス カウンター)と DateTime.Now(システムクロック)という異なるクロックソースで経過時間を比較していたため、CI 環境の負荷下で 0.3s のトレランスを超える誤差が発生し、稀に失敗していました(0.01%の頻度)。修正により、両方の測定に Stopwatch を使用して同じクロックソース(QPC)を共有するようにしました。
cDAC(Contracts Data Access Component)のDacDbiImplにGetCompilerFlagsメソッドを実装しました。ILoader.GetFlagsを使用してキャッシュされた結果ビット(JitOptimizationDisabled、EditAndContinue)を読み取り、ネイティブDACの動作と一致させます。
.NET 11上でMicrosoft.Extensions.Hosting v2.2.0.0など古いIHostBuilder実装を読み込む際に発生するTypeLoadExceptionを修正します。v3.0で追加されたUseServiceProviderFactory(Func<HostBuilderContext, IServiceProviderFactory<TContainerBuilder>>)オーバーロードが古いアセンブリに存在しないため、型ローダーが実装の不完全性を検出していました。
Wasm RyuJitにおけるReadyToRun(R2R)コンパイルのバグを修正します。最適化コンパイル時にEH(例外処理)を含むメソッドがインライン化され、ホスト側にリロケーションが記録された後、funcletが原因でベイルアウトし、その後のminopts再コンパイルが成功する際に古いリロケーション情報が残される問題を解決します。
funcletベースのimplReadyToRunUnsupported()呼び出しをコード生成前に移動させることで、このような不整合な状態の発生を防ぎます。
WebAssemblyにおけるネイティブリリンクパイプラインの修正。PR #126901で導入されたリリンク生成ソースがWASM固有のcallhelperを適切にアクセスできるようにするため、TERMINATE_R2R_STACK_WALK定義をWASM専用ヘッダに移動し、必要なヘルパーマクロ(NOINLINEなど)をインクルードパスに追加しました。
System.DirectoryServices.Protocols のローカルテストがMono環境で間欠的に失敗する問題に対応するため、当該テストをMono上では無効化し、CoreCLRのみで実行するように制限しました。リソース枯渇が原因と推定されています。
AssemblyNameParser.TryParseProcessorArchitectureのswitch式に存在する重複したmsilアームを削除します。第2のアームは到達不可能なデッドコードであり、第1のアームが常にマッチするため、削除しても動作に変化はありません。
Browser (WebAssembly) の Debug ビルドにおいて、MetadataUpdaterSupport のデフォルト値が誤ってfalseに設定されていた問題を修正します。トリミング有効時(PublishTrimmed=true)に、Debug ビルドではメタデータ更新のサポートをデフォルトで有効に保つよう条件を変更します。
x64 JITコンパイラのレジスタアロケータを更新し、パッチポイントを含むメソッドではフローティングポイントカリー保存レジスタの割り当てを禁止します。OSRメソッドではこれらのレジスタが復元されないため、将来のアンワインダーなしの遷移に対応するための変更です。パッチポイントはTier0メソッドにのみ出現するため、パフォーマンスへの影響は限定的です。
NativeAOT コンパイラにおいて、MakeGenericType のデータフロー分析時に正規型(__Canon / __UniversalCanon)を用いた制約検証を正しく処理するように修正します。従来は正規型を通常のジェネリック制約として扱っていたため、制約チェックで不正と判定され、不要にコンパイルがスキップされていました。正規型をワイルドカード的に扱うことで、有効なジェネリック生成を適切にルート化・コンパイルできるようになります。
cDAC(Common Data Access Contract)の ObjectHandle IData 型をリファクタリングしました。従来は ObjectHandle フィールドのアドレスではなく、そのアドレスフィールドの値を期待していたため、読み込み時に余分なポインタ読み取りが必要でした。本変更により、ObjectHandle コンストラクタパラメータが OBJECTHANDLE フィールドのアドレスになり、他の IData と一貫性を持つようになりました。これにより ObjectHandle フィールドを強型で宣言でき、ReadDataField<ObjectHandle> を直接使用できます。
cDAC(Common Data Access)における COM相互運用性を改善するPR。StrategyBasedComWrappersの ad-hoc なインスタンス化を削除し、プロセス全体で単一のシングルトンインスタンスを共有するよう統一。また、ClrDataAppDomain.IsSameObjectのバグ(常にS_FALSEを返していた)を修正。
cDAC(Common Data Access Component)の管理レイヤーで IXCLRDataMethodDefinition インターフェースの5つのAPI(GetName、HasClassOrMethodInstantiation、StartEnumInstances、EnumInstance、EndEnumInstances)を実装しました。ネイティブDAC相当の動作をcDACコントラクトを活用して実現し、レガシーDAC互換性検証とメタデータフォールバック機能を備えています。SetCodeNotificationのみ実装が保留されています。
dump-based cDAC統合テストにおいて、複数の場所に重複していたランタイムバージョンリスト("local"と"net10.0")を一元管理するためにリファクタリング。private static readonly string[] RuntimeVersionsフィールドを追加し、TestConfigurationsとGetDumpSource()の両メソッドで共用することで、新しいランタイムバージョンの追加時に編集が必要な箇所を1ヶ所に統一。
EncryptedXml.DecryptDocument()処理時にKeyInfo/RetrievalMethod要素のURI属性が欠落している場合、不適切なNullReferenceExceptionが発生していた問題を修正。Utils.ExtractIdFromLocalUriに null/empty チェックを追加し、適切なCryptographicExceptionをスロー(エラーメッセージ: SR.Cryptography_Xml_UriRequired)するように変更しました。
修正前の動作:
var doc = new XmlDocument { XmlResolver = null };
doc.LoadXml("<root><EncryptedData xmlns='http://www.w3.org/2001/04/xmlenc#'>" +
"<KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'><RetrievalMethod/></KeyInfo>" +
"<CipherData><CipherValue>AA==</CipherValue></CipherData></EncryptedData></root>");
new EncryptedXml(doc).DecryptDocument(); // NullReferenceException が発生
NativeAOT publish時にNuGetパッケージのサテライトアセンブリ(リソースDLL)が公開ディレクトリに漏出し、ILCへの--satellite:引数渡しに失敗する問題を修正。SDKがAssetType='resources'条件でサテライトをResolvedFileToPublishに配置していたが、タスク側がPostprocessAssembly=trueメタデータを条件としていたため、サテライト分類ロジックが死コード化していたのが根本原因。
Apple mobile CoreCLR(iOS/tvOS/watchOS)上で正常に動作するテストから、ActiveIssue属性を削除するクリーンアップを実施。これらの属性は、プラットフォーム固有の既知の問題を記録していましたが、テストが実際には合格しているため、属性が不要になりました。同時にtests.proj内の関連する除外設定も削除されています。
.NET 10で静的ライブラリのデッドコード削除により失われたMetaDataGetDispenserエクスポートをsinglefilehostで強制的に保持するための修正。Unix/macOSではリンカフラグを追加し、Windowsでは既存の.defファイル設定を活用。エクスポートが存在することを検証するリグレッションテストも追加します。
cDAC(コンテナー化されたDAC)に IsDiagnosticsHiddenOrLCGMethod を実装しました。新しく IRuntimeTypeSystem.IsDiagnosticsHidden コントラクトAPIを追加し、IL-stub、wrapper-stub、非同期サンク(async-thunk)メソッドの検出をサポートします。これにより、ネイティブVMとの完全な機能パリティが達成されます。
browser-wasm + CoreCLR(インタプリタ)環境での12のライブラリテストスイートを有効化するPRです。スイート全体の除外ではなく、個別の失敗テストに[ActiveIssue]属性を付与することで、75,272個のテストの実行を実現します。これにより、テストカバレッジの拡大とプラットフォーム固有の問題の可視化が図られています。
ILTrim(IL トリミング ツール)のメタデータ保持ロジックを改善し、アクセサーメソッドが到達可能な場合、プロパティおよびイベントのメタデータ行を保持するようにしました。同時に、型が削除されたときの PropertyMap/EventMap テーブル関連付けの誤りを修正しています。これにより ILLink の既存動作との整合性が向上します。
CoreCLRの旧来のセンチネルベースのSList実装をNativeAOTスタイルの設計に統一するもの。センチネルノードを廃止し、空リストはNULLで表現し、traits-based next-pointerアクセスに変更。CoreCLRとNativeAOTで共有のsrc/coreclr/inc/slist.hを用いる統一実装となる。
// Mode制御による柔軟な操作許可
template <typename T> using SList = SList<T, SListTraits<T, SListMode::Thin>>; // デフォルト: 頭操作のみ
template <typename T> using SListTail = SList<T, SListTraits<T, SListMode::Tail>>; // tail追跡対応
部分的にジャンプスレッディングされたブロックにおいて、残っているすべての前置ブロックが同じSSA定義をPHIにもたらす場合、PHI定義を削除し、そのブロック内のPHI使用に対するSSA/VN情報を更新します。特に、曖昧な前置ブロックが1つだけ残る場合に有効です。
ARM64、LoongArch64、RISCV64のOn-Stack Replacement (OSR)機能を改善し、Tier0関数で保存されたCallee-Saveレジスタの値をOSR関数のプロローグで復元する仕様に変更しました。これにより、Tier0からOSRへの遷移時にスタックアンワインドが不要になり、単純なジャンプで実行できるようになります。目標はASP.NETベンチマークで報告されている#120865の修正です。また、AltJitが生成したパッチポイント情報のVM保存サポートも追加しました。
ConfigurationBinder ソースジェネレータの診断サプレッサーを修正し、IL2026/IL3050 AOT警告を正確に処理します。2つの問題に対応しています:
Some.Method(c.Get<MyOptions>()))で、FindNodeが正しいノードを特定するようgetInnermostNodeForTie: trueを追加[InterceptsLocation]属性をスキャンし、実際に インターセプトされた呼び出しサイトのみを抑制するよう変更(#96643への対応)Trim/AOT解析器をライブラリテストプロジェクトでデフォルトで有効化し、既存の警告が存在するプロジェクトに対しては一時的にオプトアウト設定を追加する変更です。これは #126862 への対応です。現在、Trimで19,858件、AOTで12,728件の警告が報告されています(重複カウント含む)。
DNNE (Do Not Name Exports) NuGetパッケージの依存関係をバージョン2.0.5から2.1.1に更新するPull Requestです。この更新により、DNNE 2.1.0で対応されたARM64ビルド失敗の修正(#126673)を取り込みます。
cDAC(Compact Data Access Contract)を通じて、DacDbi APIのGetModuleDataおよびIsModuleMappedを実装しました。ILoaderコントラクトを拡張して、DomainAssembly↔Moduleのナビゲーションと"is mapped"クエリをサポートします。これにより、デバッガがモジュールに関する詳細情報を取得できるようになります。
Native AOT環境で、基底メソッドがTaskを返し派生メソッドがTask<T>を返す共変戻り値型のオーバーライドをサポートするための実装です。CoreCLRランタイムの非同期処理修正(#125900)をNative AOTの型システムに統合し、戻り値を破棄する非同期サンク(ReturnDroppingAsyncThunk)を導入して仮想/インターフェースメソッド解決に組み込みます。
global.jsonのsdk.paths機能を利用して、ローカルの.NET SDK(.dotnet/ディレクトリ)をSDK解決時に優先させるように設定を更新しました。C# Dev Kitなどのエディタ体験の向上と、ランタイムリポジトリでの開発効率の改善が目的です。ホストSDKへのフォールバックも保持されています。
Mono.Linker.Tests(illink内の最後のMSTestプロジェクト)をxUnitに変換し、dotnet/runtimeの他のテストインフラストラクチャと統一します。プロジェクト設定、テスト属性、アサーション、動的スキップ機構をMSTestからxUnitに移行しました。
muxerにAOT(Ahead-of-Time)コンパイルされたSDKをネイティブで呼び出すロジックを追加しました。解決されたSDKディレクトリにdotnet-aot共有ライブラリが存在する場合、muxerはそれをロードしてdotnet_executeエントリポイントを呼び出します。AOTライブラリがない場合や期待されるエントリポイントがない場合は、既存のマネージドSDKパスにフォールバックします。
非可変長引数(non-varargs)P/Invokeの実装方式を、IL stubから一時的IL(transient IL)に変更します。この変更により、P/Invoke毎のDynamicMethodDesc 1個を削除し、ポータブルエントリポイント向けのインタープリター回避策とSwift関連の対応を削除します。P/Invokeメソッドはティアード・コンパイルの対象外のままです。
WebAssemblyアプリケーション構築時にフレームワークアセット(.wasm、.jsファイル等)をbin/wwwroot/_framework/にコピーすることを廃止します。dotnet runは静的Webアセットミドルウェアを使用してobj/などのソースロケーションからファイルを直接提供するため、物理的なコピーは不要です。変更により、ビルド出力の_framework/ディレクトリが約178ファイルから2ファイルに削減されます。
ObjectToIdCache.RemoveAt()の後方シフト削除アルゴリズムに、線形探査時の要素移動判定バグを修正。ラップアラウンドした探査チェーン内で削除時に空きスロットを埋めるべき要素が移動されず、次のシリアル化で同じオブジェクトが新しいIDを取得し、IsReference=trueラウンドトリップが破綻するバグを解決します。
cDAC(Compact Data Access Contract)フレームワークに ISOSDacInterface13::TraverseLoaderHeap を実装します。Loader コントラクト経由でローダーヒープをトラバースするための新しいデータ型とAPI を追加し、SOS デバッガがコントラクト層からヒープブロックを列挙できるようになります。
Trimming Analyzerがフィールドアクセス式内のメソッド呼び出しに対する診断を報告していない問題を修正しました。例えば、type.GetInterfaceMap(@interface).TargetMethodsはIL2072警告を出さないのに対し、type.GetInterfaceMap(@interface)は正しく警告を出していました。根本原因はTrimAnalysisVisitor.VisitFieldReferenceがフィールドの実例操作をフィールド処理前に訪問していなかったことです。修正により、プロパティ参照やイベント参照と同じ方式で実例を訪問するようになります。
JIT グローバル morphの処理時に、HWIntrinsic ノードが fgMorphHWIntrinsic を通らない場合に morphed フラグが正しく設定されていない問題を修正しました。特に vector↔mask 変換を含む folding やノード変換の処理パスで、明示的に morphed フラグを設定するようになります。
PR #124967で誤ってコミットされたCRLF行末が混在していたImmutableArray_1.csファイルを、一貫性のあるLF行末に正規化する修正です。これによりWindows環境(core.autocrlf=true)でファイルが常に変更状態と判定される問題を解決します。
デバッガーでMainの最後の行からステップ実行すると、マネージドコードのEnvironment.CallEntryPoint(ソース情報を持たないランタイムヘルパーフレーム)で停止してしまう問題を修正します。TriggerSingleStepの既存のIsInteropStubチェックを拡張してg_pEnvironmentCallEntryPointMethodDescも認識し、ここでシングルステップを無効化してプロセスを自然に終了させます。
ManagedWebSocket.SendFrameLockAcquiredNonCancelableAsyncで同期完了した書き込みと同期フォルトFlushAsyncの組み合わせの場合、例外処理の一貫性を修正しました。修正前は生のストリーム例外が呼び出し元に渡されていましたが、修正後は他のエラーパスと同様にWebSocketException(ConnectionClosedPrematurely)でラップされるようになります。
System.Net.WebSockets内の4つのEnum.HasFlag呼び出しをビット演算(value & flag) != 0に置き換えています。これはリポジトリ全体で使用されている標準的なパターンに統一し、JITの最適化に依存しない実装を採用しています。動作変更なし。
Guid.EatAllWhitespaceのホワイトスペーススキャンを、手動のforループから#111439で追加された新しいベクトル化済みヘルパーIndexOfAnyWhiteSpaceに置き換えました。パフォーマンス向上が期待できます。
StartAndForget_StartsProcessAndReturnsValidPid テストが useProcessStartInfo: false の場合に間欠的に失敗していた問題を修正。RemoteExecutor が Arguments プロパティを設定するのに対し、テストが ArgumentList を使用していたため、dotnet が不正な引数で起動されていました。ProcessStartInfo.Arguments を文字列リストにマッピングして Process.StartAndForget(string, IList<string>?) オーバーロードに渡すようになりました。
Zstandard形式のデータ解凍時に、圧縮データが64KBバッファの境界で終了する場合、バッファが満杯になってAvailableSpanが空になり、ファイルからの読み込みが0バイトとなる例外が発生する問題を修正しました。ReadおよびReadAsyncループに_buffer.EnsureAvailableSpace(1)の呼び出しチェックを追加し、バッファ内のデータをシフトして新しいデータの読み込み領域を確保します。
JITの冗長分岐削除(jump threading)機能を改善し、PHIベースのブロックを通じたジャンプスレッディングを有効にします。PHIの使用箇所がブロックとその直後の後継ブロック内で完全に解決可能な場合、スレッディングを実行します。また、後継ブロックのSSA/VN使用箇所を適切に書き換え、SSA状態の一貫性を保ちます。特に、ローカル変数のフィールド使用に対して正しいVN更新を確保する修正が含まれています。
ブラウザランタイムのTypeScript型定義において、アセット関連の型を公開APIエントリーポイントから適切に再エクスポートする変更です。これまで型定義は存在していましたが、パブリックAPIサーフェスから一貫して再エクスポートされていませんでした。MonoおよびCoreCLRの両ランタイムで、トップレベルの型エクスポートファイル経由でこれらの型が利用可能になります。
libtests(ライブラリテスト)のCI/CDパイプラインを最適化し、Windows実行を削除してinterpmode1での実行に統一することで、パイプライン全体の実行時間を短縮する変更です。STJ.Tests(System.Text.Json Tests)では、interpmode1が約15分で実行可能であるのに対し、interpmode3は1.5時間以上かかるため、より高速なモードでのテスト実行に変更されました。
インタープリタモードでの非同期継続再開時に、GCに報告されていなかったインテリアポインタによるGCホールを修正しました。AsyncHelpers_ResumeInterpreterContinuationWorkerが受け取るインテリアポインタが正しくGC保護されていなかったため、InterpMode=1での予期しないクラッシュが発生していました。
Apple mobile CoreCLRシミュレータ上で失敗する3つのテストプロジェクト(System.Reflection.Emit.Tests、System.Reflection.Emit.ILGeneration.Tests、System.Dynamic.Runtime.Tests)をライブラリテスト実行から除外します。
Apple mobile (iOS/tvOS/MacCatalyst) CoreCLR環境におけるSystem.ComponentModel.Composition.Tests (MEF) の実行をサポートするため、テスト分類を変更し、ILLink descriptorを追加して積極的なトリミング下でも必要なアセンブリが保持されるようにしました。
iOS環境のメタデータ更新サポート判定を、NativeAOT条件から積極的なトリミング(Aggressive Trimming)条件に変更します。これにより、Apple モバイルプラットフォームでサポートされていないテストに対してActiveIssue属性の使用を回避できます。
Apple モバイルプラットフォーム(tvOS、iOSSimulator、MacCatalyst)の Debug CoreCLR Smoke ジョブを無効化し、対応する Release ジョブで EnableAggressiveTrimming と EnableAdditionalTimezoneChecks を有効化します。これにより、CI が顧客に提供される Trimmed ライブラリビルドパスをテストできるようになります。
CoreCLR JITコンパイラの終了処理パスから_DbgBreakCheck呼び出しを削除します。このWindows固有の「JITデバッガー起動」ダイアログ動作を廃止しますが、INS_BREAKPOINTを介した既存のJitHaltブレークポイント出力機能は維持します。
ILTrimが委譲型(delegate)のBeginInvokeとEndInvokeメソッドペアの追跡に対応しました。.NETランタイムは両メソッドが共存することを要求しますが、ILTrimはこの依存関係を追跡していなかったため、一方のみが呼び出される場合に不正な形式のアセンブリが生成されていました。本修正により、委譲型でいずれかのメソッドが保持される場合、ペアとなるメソッドも自動的に保持されるようになります。
WebAssembly (WASM) ReadyToRun import thunkの生成ロジックをInterpreter呼び出し規約とTransitionBlockに準拠するよう改善しました。これにより、DelayLoad_MethodCallをWASM上で実装でき、スタブ実装から実装へ移行します。主な変更は、ArgumentIteratorとTransitionBlockを用いたオフセット計算、モジュール修復RVAの伝達、WASM32呼び出し規約モデルの更新です。
Linux上のGCメモリリセット処理で、複数のmadvise()助言フラグをビット演算で結合して単一の呼び出しに渡していた問題を修正しました。madvise()はビットマスクではなく単一の定数を期待するため、カーネルバージョンに応じてEINVALエラーが発生するか、意図しない操作(カーネル≥5.18でMADV_DONTNEED_LOCKED)が実行されていました。修正により、MADV_DONTDUMPとMADV_FREE(またはPOSIXフォールバック)を別々のmadvise()呼び出しで実行するようにしました。
// 修正前: 無効な値(24)をmadvise()に渡す
madviseFlags = MADV_DONTDUMP | MADV_FREE; // 16 | 8 = 24
madvise(address, size, madviseFlags);
// 修正後: 個別に呼び出す
madvise(address, size, MADV_DONTDUMP);
madvise(address, size, MADV_FREE);
モバイルプラットフォーム(iOS、tvOS、MacCatalyst、Android)のビルド失敗を自動検出・分類・修復するGitHub Agentic Workflowを追加します。毎日スケジュール実行され、Azure DevOpsのビルド失敗をトリアージして、インフラ関連はIssueに、コード関連はドラフトPRで報告します。安全性のため、すべての書き込み操作は権限スコープの制限されたsafe-outputsジョブを通じて実行され、PRは最大2個、Issueは最大2個、コメントは最大5個に制限されています。
PR #125512で導入されたRandomAccess.Read/WriteベースのI/O実装をリバートし、元のInterop.Sys.Read/Write実装に戻します。同時に、stdin/stdoutがシーク可能なファイルにリダイレクトされた場合の動作を検証する回帰テストを追加します。
ILScannerのデバッガメッセージ改善。アサーション時にスキャナーの失敗メッセージとして例外で使用される完全なメッセージをアサートに含めるように変更されました。
cgroup実装がmacOSおよびFreeBSDなどの非Linuxプラットフォームでコンパイル・リンクされていたため、これらをLinux/Android専用にゲーティングする変更です。cgroupはLinux固有のメカニズムであり、他のプラットフォームでは機能していないデッドコード(返り値が0/false)となっていました。
JsonElementの4つのメソッド(GetByte、GetSByte、GetInt16、GetUInt16)で、インライン例外発行をThrowHelper.ThrowFormatException()に統一する内部コード整備。既存パターン(#61746)との一貫性を確保し、JITコンパイルの最適化を向上させます。
SortedSet<T>.TreeSubSet.Clear()メソッドの性能を最適化するPRです。BreadthFirstTreeWalkでアイテム収集時にList<T>の初期容量をCountに指定してヒープ再割当を削減し、末尾要素の削除を繰り返すwhileループを逆順のインデックスベースのforループに置き換えています。
PublishTrimmed および PublishAot で、TypeMap 属性の trim ターゲットとして配列型(例:typeof(Foo[]))を指定した場合のクラッシュと無音削除を修正します。ILLink では TypeDefinition cannot be resolved from 'Mono.Cecil.ArrayType' という NotSupportedException でクラッシュ、ILCompiler では条件判定ミスにより TypeMap エントリが無音削除されていました。
// 修正前:クラッシュまたは無音削除
[assembly: TypeMap<TestTypeMap>("Key", typeof(SomeTarget), typeof(Foo[]))]
// 修正後:Foo[] → Foo に正規化して処理
// TypeMap エントリは要素型 Foo が到達可能なときに存在
VtableIndexStubGeneratorをString Writerパターンに移行するリファクタリング。COM相互運用性コード生成の内部実装を改善し、より保守性の高い文字列生成メカニズムへの段階的な移行に貢献します。
ClientWebSocketクラスの_stateフィールド上の古いXML doc commentを削除しました。このコメントはInterlockedがenum型をサポートしていなかった時代の説明であり、#104558でクラス制約が削除され_stateがInternalState型に変更されたため、不要になっていました。
cDAC dump統合テストにおいて、ホストのポインタサイズとダンプアーキテクチャが異なる場合(クロスビットネス、例:32ビットホストが64ビットダンプを読み込む)のテストをスキップする機能を追加しました。ClrMDのClrDataAddressトランケーション問題(microsoft/clrmd#1423で修正中)がまだサポートしていないため、テスト失敗を回避するものです。
SIMD命令vcvtps2ph(単精度浮動小数点を半精度に変換)のエンコーディングをRM(Register-Memory)からMR(Memory-Register)に修正します。これにより、特定のシナリオで発生していた無効な結果の生成を防ぎます。
x86/x64アーキテクチャのJITエミッタにおけるパフォーマンススコア(perfscore)モデリングをクリーンアップ・拡張するPRです。複数の命令でメモリレイテンシーの処理が不完全であった、EA_64BYTEなどの大きいオペランドサイズへの対応がなかった、SIMD操作の高コストが考慮されていなかった等の問題を修正します。
メモリとインストラクション特性を分離して計算し、一貫性のある方法で統合するようにリファクタリング済みです。
cDAC(Compact Data Access)ベースの DacDbiImpl に4つのスレッド関連APIを実装します。GetThreadObject、HasUnhandledException、GetCurrentCustomDebuggerNotification、および GetCurrentException を Thread コントラクトを使用して実装し、ダンプベースのテストにより新しいAPIがコントラクト提供のスレッド状態と一貫性のある値を返すことを保証します。
BlobBuilder.ReserveBytesが返すバイト領域をゼロクリアする修正です。プール再利用されたバッファから古いデータが露出する非決定的な動作とデータリークの可能性を排除します。Array.Clearを追加して予約領域を初期化し、呼び出し元が再利用バッファの古いデータを観察しないようにします。
PR ビルドにおけるライブラリテストの Helix キュー ファンアウトを削減することで、CI 実行時間を短縮する変更です。複数の OS バージョン/ディストリビューション上でテストを実行していた構成を、PR ビルドでは最小限の OS セットに絞り、追加 OS での検証は定期ビルド(1 日 2 回)で実施するように変更します。
JITのLinear Scan Register Allocator (LSRA)で、def-use競合を解決する際にuse側のレジスタ割り当てを変更する慣行を廃止し、代わりに明示的なコピーを挿入する方式に変更します。これにより、LSRAとコード生成間の曖昧な暗黙的契約を排除し、より堅牢な実装にします。同時に、GT_CATCH_ARGのコード生成バグとマルチレジスタ定義の問題を修正します。
ImmutableArray<T>、ImmutableArray<T>.Builder、ImmutableList<T>.NodeのIndexOfメソッドにおける上限検証を修正しました。startIndexの上限チェックを< Countから<= Countに変更し、Array.IndexOfの動作(count == 0の場合にindex == Countを許可)に合わせました。これは#124560で修正されたLastIndexOfの同様の問題に続くフォローアップです。
MemoryExtensionsクラスに効率的なホワイトスペース処理メソッドを追加します。新しいメソッドContainsAnyWhiteSpace、IndexOfAnyWhiteSpace、LastIndexOfAnyWhiteSpaceを導入し、IsWhiteSpaceメソッドをSearchValues.WhiteSpacesを利用する形に最適化しました。
PR #126222でアプリケーションエントリポイントをネイティブCallDescrWorkerInternalからマネージドEnvironment.CallEntryPoint(UnmanagedCallersOnly属性付き)に移動した際、例外ハンドリング中のデバッガー通知が不正なタイミングで発生し、ハンドルされない例外の伝播が破損していた問題を修正します。Environment.CallEntryPointのフィルター句についてのみデバッガー通知を抑止し、プロファイラーとETW通知は維持します。
TEST_DATA_CONSISTENCY関連の未使用コードとDacDbi APIの廃止インターフェースを削除し、親フレームチェックをコールサイトにインライン化してランタイムの保守性を向上させます。
xarch(x86/x64)プラットフォームでF16C命令を利用したSystem.Half ↔ floatの明示的変換の最適化を追加します。前回のABI関連問題を解決し、AVX2対応ハードウェアで動作する初期実装です。JITがHalf.op_Explicitをnamed intrinsicとして認識し、vcvtph2ps/vcvtps2ph命令に展開することで、関数呼び出しから直接的なHW命令に変換されます。
変更内容:
System.Halfと明示的な変換演算子に[Intrinsic]属性を追加NI_System_Half_op_Explicitを追加ValueTask.csのValueTaskSourceNotifier型のモディファイア順序を修正し、IDE0036スタイルルール違反を解決するビルドエラーを修正しました。
cDAC(Compact Data Access Component)のClrDataModuleにGetMethodDefinitionByTokenの完全な実装を追加し、従来のDAC(Debugging Access Component)への完全な委譲から脱却させました。これにより、cDACの"no-fallback"カバレッジを拡大し、レガシーDAC依存性を減らします。
createdumpがalternate signal stack(sigaltstack/SA_ONSTACK)上でのクラッシュ時に、ネイティブスタック展開が不完全になる問題を修正します。libunwindのunw_is_signal_frameを使用してシグナルトランポリンフレームを検出し、スタックポインタ(SP)の単調性チェックを緩和することで、展開がシグナルトランポリンを越えて元のスタックに戻れるようにします。これにより、ダンプに元のスレッドスタックメモリが完全に含まれるようになります。
createdumpがalternate signal stack上でのクラッシュ時にネイティブスタックの元のスレッドスタックをキャプチャできない問題を修正しています。信号トランポリンフレームを検出するためにunw_is_signal_frameを使用し、スタックポインタ(SP)の単一の低下を許容することで、unwinder が元のスタックへ遷移してメモリをダンプに含めることができるようになります。
createdumpがシグナルハンドラ用の代替スタック(SA_ONSTACK)上で発生したクラッシュの場合、ネイティブスタックアンワインドに失敗する問題を修正します。libunwind の unw_is_signal_frame を使用してシグナルトランポリンフレームを検出し、スタックポインタの減少を許容することで、元のスタックへの復帰とメモリ取得を可能にします。
修正により、シグナルハンドラ経由のクラッシュダンプに元のスレッドスタックメモリが含まれるようになります。
createdumpがalternate signal stack上でのクラッシュ時に元のスレッドスタックをキャプチャできない問題を修正します。シグナルトランポリンフレーム検出時にスタックポインタ(SP)の単調性チェックを緩和し、元のスタックメモリをダンプに含めることで、minidumpの完全性を確保します。
xarch(x86/x64)アーキテクチャにおけるSIMDと浮動小数点演算のJIT命令コスティングを現代のコードジェネレーション特性に合わせて更新しました。従来のコスティングは32ビット時代のx87 FPUベースであり、ハードウェア組み込み命令はcostEx=1, costSz=1で統一されていたため、CSEなどの最適化が働きにくい状況を改善します。大多数の浮動小数点命令は最小4サイクル、多くのSIMD操作は汎用命令より著しく多くのコードジェネレーションバイト数を消費するため、より正確な最適化判定が可能になります。
cDAC(Component Data Access)経由でデバッガー関連の4つの新しいDacDbi APIを追加します:RequestSyncAtEvent、SetSendExceptionsOutsideOfJMC、GetDebuggerControlBlockAddress、EnableGCNotificationEvents。これらはデバッガー側の簡単な操作と状態照会をサポートし、対応するデータディスクリプタと単体テストも含まれます。
cDAC(CoreCLR Data Access Contract)のコントラクト バージョン管理スキームを整数型(例:1、2)から文字列識別子(例:"c1"、"c2")に変更します。この変更により、複数のプラットフォームが異なるプレフィックス(例:NativeAOT用の"n1")を使用する際に、整数値の範囲衝突を回避できます。変更はネイティブ記述子生成、ビルドツール、マネージド読み取りパイプライン全体に及びます。
cDAC(Compact Data Access Component)の DacDbi レイヤーにおける2つの正確性の問題を修正します。ValueType検出をMethodTableフラグと一致させ、汎用変数チェック(HasTypeParams)の戻り値を厳密なBoolean値に正規化します。
WebAssembly (WASM) における ReadyToRun (R2R) ネイティブエントリポイントと PortableEntryPoint の相互運用性を改善するPRです。R2Rコンパイル済みコードからインタープリタコードへのthunk生成、calling convention調整、スタックウォーク終了処理の実装が主な変更です。
WasmTestOnChromeおよび関連するWASM CI ジョブで、gen-debug-dump-docs.pyがbrowser/wasiターゲットの相関ペイロードに存在しないため、Helix post-commandの実行に失敗していた問題を修正します。非Windows CoreCLRターゲット向けのHelixPostCommand条件にbrowserとwasiを除外する条件を追加します。
.NETランタイムがHaiku OSで使用するsetRegisterの呼び出し方式に合わせるため、llvm-libunwindのHaiku固有パッチを適用します。.NETではsetRegisterを3引数で呼び出し、最後の引数として"location"(レジスタの位置情報)を渡します。既知の位置情報がない場合は0を渡すため、UnwindCursor.hppの最近のHaiku固有呼び出し箇所を更新しました。
CORINFO_HELP_ARRADDR_STヘルパー呼び出しのJITインライン化を再適用し、古いCastHelpers.WriteBarrier FCCall実装を、JITが展開可能な新しい管理型のRuntimeHelpers.WriteBarrier内在関数に置き換えます。これにより、配列要素の代入時のWrite Barrier操作がより効率的にインライン化されるようになります。
HTTP/2接続でWindows認証(NTLM/Negotiate)の401チャレンジを受け取った場合、SocketsHttpHandlerが自動的にHTTP/1.1にダウングレードして認証を再試行する機能を追加しました。ブラウザと同様の挙動を実現し、SignalRやその他のクライアントがHTTP/2でWindows認証を利用できるようになります。
ErrObjectTests.ClearテストをiOsを含む全プラットフォームで確定的に実行するよう修正しました。テストがP/Invoke エラー状態に依存していたため、Apple mobileでの予期しないP/Invoke活動により競合状態が発生していた問題を解決します。
PR #122649で導入されたSystem.HalfのFP16/AVX10v1アクセラレーション機能を完全に取り消します。Half型の内部実装をFP16ネイティブサポートから従来の「通常の構造体/float経由」の動作に戻し、JIT、VM、CoreLibにおけるHalf固有の特別扱いをすべて削除します。
DAC/DBI(デバッガアクセスコンポーネント/デバッガバイナリインターフェース)ネイティブインターフェースからGetCachedWinRTTypesとGetCachedWinRTTypesForIIDs APIを削除します。これはWinRT型キャッシュ機能の廃止に伴う内部インターフェースのクリーンアップです。
System.Text.RegularExpressionsの包括的なXMLドキュメンテーションをソースコードに逆ポート(backport)し、コンパイラ生成XMLドキュメントを公式ドキュメントの単一の情報源とします。新しいAPI(RegexOptions.AnyNewLine、NonBacktracking、GeneratedRegexAttributeメンバー)がLearn.microsoft.comで正しく表示されるようにし、dotnet-api-docsリポジトリでの個別パッチ適用を不要にします。
ブラウザ向けCoreCLR JavaScriptローダーの2つの問題を修正します:
loadBootResourceCallbackに渡されるintegrityパラメータが常にundefinedになっていたバグを修正し、代わりにアセットマニフェストから取得したhashフィールドを使用ネイティブ暗号PALの未使用マクロHAVE_EVP_MACを削除し、同等の条件チェックg_evpMacHmac != NULLをその唯一の呼び出し箇所にインライン化する変更です。HMAC作成ロジックは変更されません。
CLR→COM late-bound IL stubのキャッシュ方式を変更し、シグネチャのみでなくMethodDescをキーに含める修正です。複数のメソッドが同じシグネチャを持つ場合、DispIdAttributeなどのメタデータに基づいた動作が異なるメソッド間で誤ってstubが再利用される問題を解決します。
cDAC(Common Data Access Component)のContractRegistryにTryGetContractメソッドを追加し、コントラクトが見つからない場合の制御フローを例外に依存しない設計に改善するもの。従来のGetContractは見つからない場合にNotImplementedExceptionをスローしていたが、一部のAPIではS_OKを返すなど異なる動作が必要なため、呼び出し側が例外ベースではなく戻り値で処理できるようにした。
// 使用例
if (contractRegistry.TryGetContract<IReJIT>(out var contract, out string? reason))
{
// コントラクトが利用可能
}
else
{
// コントラクト未対応 - カスタム動作を実行
}
browser-wasm CI の カバレッジギャップを修正するPRです。src/native/package.json や package-lock.json などの npm 設定変更が、実際に npm run rollup を実行する browser-wasm CoreCLR ビルドを トリガーしていませんでした。この問題により、Dependabot PR が serialize-javascript v7 への更新時に CI を通過してしまい、マージ後に crypto is not defined エラーで破損していました。
System.Runtime.CompilerServicesに承認済みのUnion型サポートAPI(UnionAttributeとIUnionインターフェース)を実装します。コンパイラがUnion型を認識するための属性と、ランタイムでUnionの値にアクセスするためのインターフェースを提供します。
[Union]
public struct Pet : IUnion
{
public Pet(Cat value) => Value = value;
public Pet(Dog value) => Value = value;
public object? Value { get; }
}
PR #125673でLibrary出力プロジェクトのTrimmerRootAssemblyアイテム作成がスキップされたため、tvOSのRelease Library テスト時にILLinkによりテストアセンブリが完全にトリムされてしまう問題を修正します。RootEntireIntermediateAssemblyターゲットを変更し、メタデータ更新ではなくRemove+Includeを用いて、SDKが提供しないLibraryプロジェクトでも常にRootMode=allのTrimmerRootAssemblyアイテムが作成されるようにします。
CoreCLR browser-wasm アプリケーション向けの完全なネイティブ再リンク・パイプラインを実装します。これにより、NativeFileReference を通じてカスタムネイティブコードを含めながら、CoreCLR 静的ライブラリから dotnet.native.wasm を再リンクできるようになります。Emscripten ベースの構築パイプラインで、スタブ的な WasmBuildApp / WasmTriggerPublishApp ターゲットに置き換わります。
cDAC(Common Data Access Component)のRuntimeTypeSystemコントラクトにRequiresAlign8フラグの実装を追加しました。このフラグはメソッドテーブルが8バイト境界での配置を必要とするかどうかを示します。実装は既存のDacDbiImplを通じて公開され、DEBUG時には従来のDAC実装との相互検証を行っています。
クロスプラットフォーム cDAC ダンプテストの命名を改善し、テスト結果にホストプラットフォームとダンプソースプラットフォーム両方が表示されるようにしました。
Helix ワークアイテム名が CdacXPlatDumpTests_windows_x64 から CdacXPlatDumpTests_host_linux_arm_dumps_windows_x64 に変更され、個別の xUnit テスト表示名が GetModule_Succeeds(config: local/r2r) から GetModule_Succeeds(config: local/r2r, target: windows/x64) に変更されます。
macOS 15以上でNativeAOT ビルドが間欠的に失敗する問題を修正しました。Swift自動リンク ライブラリ(swift_Builtin_floatなど)がXcode SDKパス配下に移動したため、xcrun --show-sdk-pathで SDK パスを解決し、-isysrootによるパス再マッピングを活用することで対応します。これまでmacOS デスクトップターゲットはSDK解決に参加していませんでしたが、iOS系プラットフォームと同じメカニズムを適用することで問題を解決します。
COM イベント用の IL スタブが P/Invoke として誤分類されていた問題を修正します。GCStress における P/Invoke の特殊処理が COM イベント スタブに誤って適用されていたため、スタブを専用のタイプとして正しく分類することで対応しました。
NativeAOT ランタイムの GC probe hijack フレーム で volatile な引数レジスタを保存・復元するように改善し、GC スタックウォーク時にレジスタが生きた GC 参照を保有している場合の保存位置の喪失を防止します。これにより CrossGen2 の GC promotion 時に発生していた AV を修正します。また JIT の interface lookup ヘルパーのキルセット更新と PHI ベース jump threading の回帰修正も含まれます。
Windows上でロングパスサポートが有効になっていない場合、ビルド後半で診断困難なエラーが発生する問題に対して、ビルドスクリプト(eng/build.ps1)の早期段階でロングパスサポートを検証するチェック機能を追加するものです。HKLM:\SYSTEM\CurrentControlSet\Control\FileSystemレジストリキーを確認し、260文字を超えるパスを作成できるか事前検証を行い、ロングパスサポート未有効な場合は早期終了して対応方法を提示します。
Mono から EventPipe 診断サーバーの TypeScript 実装を CoreCLR ブラウザランタイムパスにポートします。ネイティブ EventPipe がブラウザ上の JS/TS 診断サーバーを駆動できるよう、JS トランスポート(直接実行)と WebSocket トランスポート(dotnet-dsrouter 経由)の両方をサポートし、クロスモジュール交換を通じてネイティブコードと統合します。現在の段階ではエンドツーエンド動作は未実装です。
cDAC(データアクセスレイヤー)の段階的な実装進捗を測定するため、レガシーDAC へのフォールバックを制御する新しいテスト基盤を導入します。LegacyFallbackHelperという粒度の細かい許可リストを実装し、CDAC_NO_FALLBACK=1設定下で特定のメソッドのみフォールバックを許可しながら、その他の未実装API はブロックします。runtime-diagnostics CI パイプラインに統合し、すべてのフォールバック試行(許可・ブロック両方)をメソッド名・ファイル・行番号付きで stderr に記録します。
update-os-coverage スキルのドキュメントにおける jq コマンドの例を修正し、コンテナイメージタグの存在確認がより明確で スクリプト化しやすくなるようにしました。欠落タグの場合に明示的に失敗するよう改善されています。
RISC-V JIT コード生成における instGen_MemoryBarrier メソッドが、barrierKind パラメータを無視して常に fence rw,rw (最も重い命令) を生成していた問題を修正しました。RISC-V の fence 命令は先行・後続命令の順序制御(読取、書込、またはその両方)をビット単位で制御可能なため、より細粒度の barrier variant を使用してパフォーマンスを改善します。
ReadyToRun(R2R)出力の詳細な単体テストを可能にするため、新しいILCompiler.ReadyToRun.Testsプロジェクトを追加します。このプロジェクトはRoslyn経由でC#ソースをインメモリコンパイル、out-of-procでcrossgen2を実行し、ILCompiler.Reflection.ReadyToRunライブラリを使用してR2Rイメージのメタデータを検証します。また、R2RリフレクションライブラリにCrossModuleInliningInfoSectionを追加し、インライニング情報の解析とメソッド名解決機能を拡張します。
ARM64 SVE命令のmov/movprfx処理をコード生成ロジックからemit関数にリファクタリングするもの。埋め込みマスク操作に対して述部付きmovprfx(ゼロイング/マージ)を活用できるようにし、条件付き選択の偽引数情報を新しいmoptオプション(デフォルト: INS_SVE_MOV_OPTS_UNPRED)経由でemitInsSve_Movヘルパーに渡すようにしました。
JITのx86-64アーキテクチャにおける、SIMD命令の逆アセンブル出力を修正するPRです。レジスタ間のSIMD拡張/縮小命令で、ソースとターゲットのレジスタサイズが誤って表示されていた問題を解決します。例えば、vpmovsxbw zmm1, zmm1と表示されていたものを正しくvpmovsxbw zmm1, ymm1と表示するようになります。また、埋め込みラウンディング制御({rd-sae}など)が逆アセンブル出力に含まれていなかった箇所も修正します。
parallelsuperpmi.cppのプラットフォーム固有コードをリファクタリングし、分散していた#ifdef TARGET_UNIXガードを削除してコード可読性を向上させました。POSIX経路でのCtrl+C信号処理を実装し、Win32/PAL APIの使用を排除し、代わりにPOSIX標準API(fork/execv、waitpid、open/close)を使用するように整理しました。
MetadataLoadContext.CoreAssemblyプロパティのnullability注釈を削除し、非null確定型に変更します。コア アセンブリの解決をMetadataLoadContext構築時の前処理として実行し、解決失敗時は例外をスローするように変更することで、このプロパティが常に非nullであることを保証します。
ProcessクラスにStartAndForget静的メソッドの2つのオーバーロードを追加します。プロセスを起動してPIDを取得し、終了を待たずに即座にすべてのリソースを解放する"fire-and-forget"シナリオに対応します。UseShellExecuteが有効な場合と標準ストリームのリダイレクトが指定された場合はInvalidOperationExceptionをスローします。
// 新しいAPI(リソースリークなし、自動クリーンアップ)
int pid = Process.StartAndForget("myapp", args);
FixedWindowRateLimiterのRetryAfterメタデータが、ウィンドウ全体の期間ではなく次のウィンドウまでの残り時間を正しく返すように修正しました。Issue #92557の対応となります。
ただし、この実装ではキューは考慮されていません。
Linux上のOpenSSL SslStreamにおいて、証明書検証をハンドシェイク後からハンドシェイク中に移行し、検証失敗時に適切なTLSアラート(bad_certificate、unknown_ca、certificate_expired、certificate_requiredなど)を送信するように変更しました。これにより、Windows実装と動作が統一されます。
#126938で導入されたLoongArch64 JIT パフォーマンススコア計算のWindows ビルド破損を修正します。insMemoryAccessKindに誤ったレイテンシ値が割り当てられていた問題を、正しいメモリアクセス種別の値に修正しました。
TimeZoneInfo.ConvertTimeがDateTime.MinValue/DateTime.MaxValue近傍の日時を正のオフセット/負のオフセットの時間帯間で変換する際に誤った結果を返していた問題を修正しました。
根本原因は、中間のUTC値が負のティック数(DateTimeの範囲外)になる場合、SafeCreateDateTimeFromTicksがそれをDateTime.MinValue(ティック数=0)にクランプしていたため、その後に宛先オフセットを加算すると精度が失われていたことです。修正により、TryLocalToUtcが生のティック数を返すように変更し、ConvertTimeが中間段階のクランプを避けて最終結果を計算するようにしました。
release/8.0-stagingブランチにおいて、System.Net.Quicが依存するWindows用MsQuic (SChannel) NuGetパッケージをバージョン2.4.16から2.4.18にマイナーバージョンアップします。本変更はdotnet/runtime#126945の同等パッチです。
release/9.0-stagingブランチにおいて、MsQuic(Schannel)ライブラリのバージョンを2.4.8から2.4.18にアップデートするマイナーバージョン更新です。プロダクトコードの変更はなく、外部ライブラリの依存バージョン更新のみとなります。
System.Diagnostics.Processに行単位のストリーミング出力APIを追加します。新しいProcessOutputLine値型とProcess.ReadAllLinesAsyncメソッドにより、標準出力と標準エラーを非同期的にインターリーブして反復処理できるようになります。
using Process process = Process.Start(startInfo);
await foreach (ProcessOutputLine line in process.ReadAllLinesAsync())
{
if (line.StandardError)
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(line.Content);
Console.ResetColor();
}
前回のコミット(fa5f840e)で導入されたserialize-javascriptと@rollup/plugin-terserのバージョンアップを元に戻すリバート変更です。アップデート後のビルドが失敗していた問題(crypto is not definedエラー)を解決するためのリバートです。
CoreCLR DAC デバッグインターフェイスの GetObjectFields メソッドで、実行時に動的に生成される Continuation サブタイプのフィールド列挙時にアクセス違反が発生していた問題を修正します。TypeHandle を UpCastTypeIfNeeded() でアップキャストしてから ApproxFieldDescIterator を構築することで、動的に生成されたタイプを基底クラスに正規化し、AV を回避します。
CircularBufferBucketsの最小容量制限を1から2に引き上げ、防御的なバグ修正を実施します。capacity == 1かつインデックス範囲が負から非負にまたがる場合(例:begin = -1, end = 0)にCalculateScaleReductionが無限ループする潜在的な脆弱性を事前に防ぎます。現在の使用箇所では既にminBuckets >= 2が強制されており、この変更により将来のコーラーが誤ってこの問題をトリガーできないようにします。
obsolete(廃止予定)なIDacDbiInterface APIを削除し、RCW キャッシュ型クエリパスを簡素化するリファクタリング。具体的にはNGEN/ReJit/従来のRCWインターフェース型列挙に関連する未使用APIを削除し、不要なDAC呼び出しを回避します。
Issue トリアージの自動ラベル付けヒューリスティックを更新し、アセンブリ読み込み、ホスト、および相互運用性に関するIssueを正しいarea-*ラベルへルーティングするようにしました。マークダウンのみの変更です。
System.Security.Cryptography.Xmlコンポーネントに対して、悪意のある深くネストされたXML構造やXML爆弾攻撃に対する防御を強化する変更です。複数の再帰的コード経路に設定可能な再帰深度制限(デフォルト64)を導入し、EncryptedXmlで危険な変換アルゴリズムをデフォルトで無効化します。
System.Net.Quic が使用する MsQuic (Schannel) パッケージのバージョンを 2.4.16 から 2.5.7 に更新します。この変更により、ランタイムと関連テストが MsQuic 2.5.7 を使用するようになります。
System.Diagnostics.Processに非同期API ReadAllTextAsync(CancellationToken)とReadAllBytesAsync(CancellationToken)を追加し、stdoutとstderrの完全な非同期多重読み取りを実現します。新しいAPIはストリームベースの非同期読み取りを使用した多重化ヘルパーで実装されています。
LoongArch64アーキテクチャにおいて、JITコンパイラのemitter::getInsExecutionCharacteristics()メソッドを実装し、命令のレイテンシとスループット情報に基づくパフォーマンススコア(perfscore)の計算をサポートします。3A6000プロセッサの命令レイテンシおよびスループットベンチマークデータに基づいています。
GCLargePages が有効な場合に、誘発された Aggressive GC でのデコミット処理がメモリを実際には解放しないながらも GC ブックキーピングを更新する問題を修正します。影響を受けたメモリを明示的にクリアして、古い参照が後で観察されないようにします。
AppDomain廃止に伴い、マルチAppDomain対応のレガシーコード(DomainAssembly型、関連するDAC/DBIインターフェース、デバッガー実装)を削除し、単一AppDomainモデルに統一するランタイムとデバッグAPI層の大規模リファクタリングです。DomainAssemblyを削除してAssembly/Moduleで直接管理するよう簡素化し、デバッガーとDAC/DBIレイヤーの契約を更新します。
PR #122373で導入されたNativeAOT非互換なリフレクションコードをテストから削除し、Native AOTテストの互換性を復旧するテスト専用の修正です。日本語カレンダーテストの基盤クラス(CalendarTestBase)でICU固有のJapaneseCalendar最小サポート日付(エラティック)を計算する際のリフレクション使用方法をNativeAOT対応にリファクタリングします。
RyuJITのWASM コードジェン中で、構造体戻り値のtype erasure時にアサーション失敗を引き起こしていた問題を修正しています。mis-sized struct return処理を、実際に戻り値ノードがTYP_STRUCT型の場合のみに限定することで、非構造体型の値を構造体型テンポラリに不正に変換する処理を防ぎます。修正前はGT_IND(ubyte型)をTYP_STRUCT型のローカル変数に格納しようとしていたため失敗していました。
System.DirectoryServices.Protocolsテストの実行を外部LDAPサーバーに依存しないようにするため、LDAP、LDAP+STARTTLS、LDAPSをサポートする簡易的なインメモリLDAPサーバーを追加しました。既存テストで検証されていた機能に限定した実装となっており、必要に応じて機能拡張が可能です。
GCC Release ビルドでの CoreCLR Unix cgroup メモリ使用量コードの失敗を修正しています。asprintf に null 文字列を渡すことによる -Werror=format-overflow= エラーを防ぐため、s_memory_cgroup_path が null の場合の早期リターンガードを追加しました。
ValueTaskがIValueTaskSourceで一時停止するたびに新しいValueTaskSourceNotifierラッパーオブジェクトを割り当てていた問題を解決します。スレッドローカルキャッシュされたValueTaskSourceNotifierインスタンスを再利用することで、await時の割り当てを削減します。
cDAC(Common Data Access Component)で IXCLRDataModule2.SetJITCompilerFlags を実装し、Loaderコントラクトの「デバッガー情報ビット」経由でモジュールのトランジェントフラグを更新できるようにしました。これにより、デバッガはJITコンパイラフラグを動的に制御できます。
ILLinkの型フォワーダー処理を改善し、linkアクション(トリミング対象)でルート化されたアセンブリが、参照先のフォワーダーアセンブリを不必要に保持しないようにしました。SweepStep.AssemblyReferencesCorrectorが型参照を実装アセンブリに直接書き直すため、フォワーダーアセンブリの保持は不要です。この修正により、トリミングされた出力のサイズが削減されます。
PR #123727で導入されたRuntimeAsyncTask::DispatchContinuationsのデバッガ/TPLインストルメンテーション追加による約7%のパフォーマンス低下を回復するため、インストルメンテーション版と非インストルメンテーション版を分離しました。DispatchContinuationsを2つのメソッド(通常版と計測版)に分割し、メソッド開始時と継続完了後に静的フラグをチェックして必要に応じてインストルメンテーション版に切り替える仕組みを実装しています。
Azure DevOps CI パイプラインの監視、テスト失敗の分類、週次レポート生成を自動化する ci-pipeline-monitor Copilot CLI スキルを追加しました。現在は20以上のJITパイプラインを監視していますが、今後他のパイプラインへの拡張を予定しています。
Deflate、ZLib、GZipの圧縮・解凍について、Spanベースのストリームレスな新しいAPIを追加します。BrotliEncoder/BrotliDecoderのパターンに従い、DeflateEncoder/DeflateDecoder、ZLibEncoder/ZLibDecoder、GZipEncoder/GZipDecoderクラスを導入。インスタンスベースのAPI(Compress()、Decompress()、Flush())とスタティックのワンショットAPI(TryCompress()、TryDecompress())、およびGetMaxCompressedLength()を提供します。
System.Half型をFP16 ISA(AVX10v1)で加速するためのドラフトPR。JITに新しいTYP_HALF型を導入し、System.Halfの演算・変換・プロパティをAVX10v1スカラー命令にマッピングする。x86/x64アーキテクチャにおいて、Half値をXMM浮動小数点レジスタで受け渡しするABI変更を含む。
WebAssembly boot configurationの生成時に、キャッシュ検証メカニズムとして使用されるintegrity属性が不足していた問題を修正するバックポート。boot config内のアセット定義で、integrityフィールドを正しくhashフィールドにリネームします。この修正により、WebAssemblyリソースリクエストの整合性チェックが適切に機能するようになります。
OpenSSL 3.0以降でHMAC実装をEVP_MAC APIに移行し、非推奨となったHMAC APIの使用を廃止します。古いOpenSSLバージョンとの互換性を維持しながら、OpenSSL 3.0のネイティブAPIを活用します。
UCO(Unmanaged Code Origin)関連のMethodDesc グローバル変数をDAC(Data Access Component)からアクセス可能にするための変更です。デバッガーのスタックウォーク機能がこれらのグローバル変数に安全にアクセスできるようにするために、dacvars.h に変数の登録を追加し、複数のソースファイルで不要な重複定義を削除しています。
MetadataLoadContextから読み込まれたAssemblyオブジェクトに対して、その元のMetadataLoadContextを取得するための公開API MetadataLoadContext.GetLoadContext(Assembly) を追加します。MLC経由で読み込まれたアセンブリの場合は関連するコンテキストを返し、ランタイム読み込みアセンブリの場合はnullを返します。
ILTrim テストのうちメインブランチで失敗するテストケースをベースライン(期待値)に追加するパッチです。PR #123040 の影響を受けたテストをカバーしています。
JITコンパイラのValue Numbering (VN)処理における性能最適化。関数アプリケーション(func-app)VNチャンクのメモリレイアウトにおけるエレメント stride を一度だけコンストラクタで計算・キャッシュし、以降の呼び出しで再計算を避けることで、TP(スループット)を改善します。
area-Hostとarea-System.Runtime.InteropServicesラベルをdotnet/runtimeリポジトリのエリア所有者ドキュメントとポリシーボット自動化から復元する変更です。これらのラベルは誤って削除されていたため、再度追加することで、これらのラベルが付与されたIssueやPRで適切な通知がトリガーされるようにしています。
JIT コンパイラの assertion-propagation における定数畳み込みを改善するPR。値番号(VN)オペランドが現在のIRオペランドと一致しない場合(前の最適化変換が原因)の範囲情報導出を改善しました。これは #126907 のフォローアップ修正です。
x86ターゲットにおける非同期フレームのジェネリック型引数トークン読み込みの問題を修正しました。CordbAsyncFrame::LoadGenericArgsがCORDB_ADDRESS(常に8バイト)を使用して読み込んでいたため、x86の4バイトポインタ読み込み時に隣接メモリのゴミデータを取得し、EnumerateTypeParametersがE_INVALIDARGエラーを返していました。SIZE_T(ターゲットのポインタサイズに合致:x86では4バイト、x64では8バイト)に変更することで解決します。
AVX512のマスク関連内部intrinsicsをHW_Category_SpecialからHW_Category_SimpleSIMDに再分類し、HW_Flag_SpecialCodeGenフラグを追加することで、CSE(Common Subexpression Elimination)とループホイスティングを可能にする変更です。これにより、ExtractMostSignificantBitsなどの操作で不要なEVEX命令の使用を避け、より小さく高速なVEX命令の生成が可能になります。
Thread Environment Block (TEB) ポインタをDAC/cDACのThreadデータコントラクトから削除します。消費者(SOS、ClrMDなど)はOS thread IDを介してデバッガのネイティブAPIからTEBを取得するよう変更されます。これはバイナリレイアウト互換性を維持しつつ、TEB参照を廃止化する内部実装の整理です。
SubjectAlternativeNameBuilderに Registered ID (OID) を追加するためのAddRegisteredId(string)メソッドを新規実装しました。この変更により、Subject Alternative Name (SAN) の構築時にregisteredIDエントリが必要なシナリオに対応できるようになります。
cDAC(Compact Data Access Compact)ダンプテストのビルド構成をRelease から Checked ランタイムに変更します。これにより CLR ランタイムアサーションが有効になり、ダンプテスト実行時に cDAC データディスクリプタおよびコントラクト実装の問題をより早期に検出できます。ライブラリは Release のまま保持されます。
.NET 8.0向けのセキュリティ強化リリースです。XML暗号化処理における過度な再帰/危険なトランスフォーム、およびメールアドレス解析におけるCR/LF インジェクションに対する防御を実装しています。
このPRは、release/9.0向けのセキュリティ強化アップデートをマージするもので、以下の3つの主要な変更を含みます:
System.Security.Cryptography.Xmlへの再帰深度制限機能の追加EncryptedXmlのCipherReference処理に対する安全なトランスフォーム実装のホワイトリスト化System.Net.Mailのアドレス解析におけるCR/LFインジェクション対策の強化CoreCLR インタープリターのCI/テストインフラストラクチャの調整を行うPRです。インタープリター実行の遅さに対応するためタイムアウト値を拡大し、macOS x64上でのSwift相互運用性テストを無効化しています。
.NET Framework上でのFileSystemWatcher信頼性の問題により、ResolveFileProvider_WithMissingParentDirectory_WatchTokenFiresWhenFileCreatedテストが不安定になっていた問題に対応しています。本PRでは、このテストを.NET Frameworkでスキップし、タイムアウト実装をモダン化してCI失敗を解決します。
根本原因は、I/O競合下で.NET FrameworkのFileSystemWatcherが親ディレクトリ作成イベントを取り落とすため、ChangeTokenが発火せずテストがハングするというものです。.NET上では504回の並列実行で0回の失敗となっており、.NET Framework特有の問題と確認されています。
iOS/tvOS/MacCatalystプラットフォームの共通する制約条件(静的リンク、fork()廃止、ビルドツール廃止、ハイブリッドグローバライゼーション、コンソール信号廃止など)を統一するため、新しい umbrella変数 CLR_CMAKE_TARGET_APPLE_MOBILE を導入しました。これにより、11個のCMakeファイルにおける約30個の重複したプラットフォーム条件判定を削減し、将来的な不整合を防ぎます。また、MacCatalystに対するsendfile除外設定の漏れも修正されています。
新しい公開API Process.ReadAllText() と Process.ReadAllBytes() を実装しました。これらのメソッドはプロセスのstdoutとstderrの両方を同時に読み取り、デッドロックを回避するためにプラットフォーム固有の多重化処理(Windowsはオーバーラップド I/O、Unixはpoll(2))を使用します。タイムアウト制御をサポートしており、両方のストリームがリダイレクトされており、かつ非同期モードでアクセスされていないことが要件です。
using Process process = Process.Start(startInfo);
(string stdout, string stderr) = process.ReadAllText(timeout: TimeSpan.FromSeconds(30));
(byte[] stdoutBytes, byte[] stderrBytes) = process.ReadAllBytes();
インタープリター実行時の非同期メソッド戻り値が継続オブジェクトに書き込まれる際、GC書き込みバリアが不正に省略される問題を修正しました。
修正前は、戻り値の型自体がGC参照を含むかのみをチェックしていたため、System.Objectやstringのようにインスタンス内にGCポインタがない参照型の場合に書き込みバリアが追加されていませんでした。修正後は、参照型の戻り値は常にSetObjectReferenceを通じて書き込むようになり、値型のうちGC参照を含む場合のみmemmoveGCRefsを使用します。
x86でランタイム非同期フレーム(runtime async frames)に対して、デバッガに報告されるスタックポインタを調整するバグ修正。ICorDebugManagedCallback2::Exceptionコールバック(特にDEBUG_EXCEPTION_CATCH_HANDLER_FOUND通知)で、例外ハンドラ検出時にICorDebugFrameがnullになっていた問題を解決します。
JITコンパイラのエイリアス追跡機能を改善し、プロモーション済みローカル変数への書き込みを正しく処理するようにしました。これにより、ARM64での不正なコード生成(#126414で報告)を防ぎます。プロモーション済み構造体フィールドローカルへの書き込みは親のプロモーション済みローカルへの書き込みとして扱われ、親ローカルへの書き込みはすべてのプロモーション済みフィールドローカルへの書き込みとして扱われるようになります。
dotnet/runtime リポジトリの GitHub Copilot による code review プロセスに System.Net に特化したレビュー機能を追加します。25,366件のエキスパートレビューコメント(5,579個の PR から抽出)に基づいており、System.Net の HTTP、Sockets、Security、QUIC、Common、Interop の 6 つのサブエリアに対応した構造化レビューチェックリストとガイダンスを実装しています。
パラメータ化されたコンストラクタを持つクラスのデシリアライゼーション失敗時に、JsonExceptionのメッセージに誤った型情報が表示される問題を修正します。修正前は親クラスの型が表示され、修正後は実際に変換に失敗したプロパティの型が正しく表示されるようになります。
// 修正前:ParameterizedNormalClass(string text)でText: {}が渡される場合
// "The JSON value could not be converted to ParameterizedNormalClass..."(誤り)
// 修正後:
// "The JSON value could not be converted to System.String..."(正しい)
WebAssembly RyuJIT コードジェネレータで、構造体ローカル変数のレジスタ型が直接表現できない場合のアサーション失敗を修正します。BitConverter.ToBFloat16 と Vector<T>.op_Multiply で発生していたコードジェン時のアサーション失敗に対応します。
WebAssembly/CoreCLR環境でのテスト実行を改善するPR。browser-wasm/CoreCLR構成に対するテスト除外設定を削除し、以前失敗していた2つのテストスイートの実行を再度有効化します。
トリミングされた自己完結型ライブラリ形式のアプリ公開時に、SDKが中間アセンブリを常にRootMode="EntryPoint"でルート化することでIL1034エラーが発生する問題を修正します。ライブラリプロジェクト(OutputType=Library)ではエントリーポイントルートを指定しないようにターゲットを更新しました。
<ItemGroup>
<TrimmerRootAssembly
Include="@(IntermediateAssembly->'%(Filename)')"
RootMode="EntryPoint"
Condition="'$(OutputType)' != 'Library'" />
</ItemGroup>
RISC-V環境でJITコンパイラのツリーダンプ表示を改善し、GT_CASTノードに対してGTF_ADDRMODE_NO_CSEフラグを表示できるようにする変更です。デバッグ時にアドレスモード最適化の詳細を確認しやすくなります。
変更前:CAST long <- uint と表示
変更後:CAST long <- uint に N フラグを追加して表示
JIT のif-conversion 処理を簡略化するゼロ差分変更。Then/Else パスに空のブロックやチェーンされたブロックが存在しないという前提に基づいて、複数ブロックの流れ追跡を単一の直接フロー確認に統合します。
CustomReflectionContext クラスとその全公開/保護メンバーに対して包括的なXML ドキュメンテーションを追加し、IntelliSense サポートを提供するバックポート PR です。dotnet-api-docs から runtime リポジトリへのドキュメンテーション追加であり、ランタイム動作には影響なし。
ドキュメント内のラベル名を area-crossgen2-coreclr から area-ReadyToRun に統一するための更新です。エリア所有権管理ドキュメントとIssue自動振り分けのキーワードマッピングを修正し、ラベル名の一貫性を保ちます。
System.Formats.Tar領域のarea leadを変更し、ドキュメントの区域所有権リストを現在の保守担当者と一致させるための更新です。area-System.Formats.Tarラベルのarea leadを@jeffhandleyから@karelzに変更します。
リポジトリローカルスキル(repo-local skills)が自身のフォルダ外のファイルを参照できるようにするため、skill-validator の検証ワークフローを更新するPR。--allow-repo-traversal フラグを追加し、ドキュメントリンクをリポジトリルート相対パスまたは明示的な相対パスに更新しました。
プラグインスキルと異なり、リポジトリローカルスキルはすでにリポジトリの一部であるため、フォルダ外のドキュメントやスクリプトへのアクセスを許可することで、エージェントが追加のターンを重ねずに必要なパスを探索できます。
Release ビルド構成の検出をケース非依存にして、JavaScript のミニフィケーション動作を Release で正しく適用できるようにしました。ビルド時の設定検出ロジックを修正し、Configuration 値の大文字小文字を区別せずに比較するようになります。
CoreCLR WebAssemblyビルドに対してWebcil V1形式での出力をデフォルトで有効化します。MSBuildのWebcilバージョン設定をWebcil変換タスクに伝播させることで実現しています。
HTTP/3相互運用性テストで使用されているquic.tech:8443エンドポイントを削除するPRです。このサーバーがCI環境から一貫してタイムアウトしており、複数のプラットフォーム(AzureLinux、Windows 11、Windows Server 2022/2025)で100%の失敗率を示していたため、テスト対象から除外するものです。
WebAssembly(wasm)CoreCLRインタプリタでSystem.Runtime.Testsの44個のテストを有効化するため、不要な[ActiveIssue]および[SkipOnPlatform]属性を削除しました。マルチスレッド機能を必要とするテストについては、イシュー判定から機能検出(PlatformDetection.IsMultithreadingSupported)へ変更しています。
ILLink Roslyn アナライザーのデータフロー分析が、デフォルトパラメータ値を持つデリゲート型を処理する際に Debug.Assert で失敗する問題を修正しました。
delegate ParallelQuery<int> Operation(int start, int count, Operation source = null);
Roslyn がデリゲートのデフォルトパラメータ初期化子の操作ブロックを生成する際、その OwningSymbol が予期される IMethodSymbol/IFieldSymbol/IPropertySymbol ではなく INamedTypeSymbol になるため、アナライザーがこれを処理できていませんでした。
JIT コンパイラの SIMD/MASK 値に対する「per-element mask」の検証ロジックを強化し、より多くの最適化パスで正しく適用するための修正です。IsVectorPerElementMask ヘルパーの拡張により、マスク要素数の不一致を防ぎながら、より安全な最適化を可能にします。
Microsoft.CSharp.Tests.csprojのMSBuildプロパティ関数呼び出しが閉じ括弧を欠いていたため、修正しました。修正前は$(Features.Replace('strict', '')と記述されており、MSBuildがこれをプロパティ関数として解析できず空文字列に評価されていました。その結果、Directory.Build.propsから継承されたnullablePublicOnlyを含むすべてのコンパイラ機能が意図せず削除されていました。修正後は$(Features.Replace('strict', ''))となり、strictのみを削除しつつ他の機能を保持するようになります。
JIT の BOUNDS_CHECK(0, length) 削除最適化を改善しました。BOUNDS_CHECK(0, length) は (uint)0 < (uint)length をチェックし、これは length != 0 と意味的に等価です。本修正により、支配的な length != 0 アサーションが live である場合に、この冗長なチェックを削除できるようになります。これは null/empty チェック後の span/array アクセスで一般的なパターンです。
static bool TryStripFirstChar(ref ReadOnlySpan<char> span, char value)
{
if (!span.IsEmpty && span[0] == value)
{
return true;
}
return false;
}
上記のコードでは、IsEmpty チェック後の span[0] アクセスに対する bounds check が削除されます。
runtime-diagnostics パイプラインのcDAC/DACテストレグをSOS(デバッガ拡張機能)テストのみに限定するCI設定変更です。EventPipeモニタリングやdotnet-countersなど、DAC実装に依存しないテストを除外し、パイプラインのブロッキング問題を解決します。
Native AOT環境でのテスト失敗を修正するため、TarReader_SparseFileTests.WriteSparseEntry内のリフレクションベースの内部メンバアクセスを[UnsafeAccessor]に置き換えました。トリマーがリフレクションメタデータを削除することで発生していたNullReferenceExceptionを解決します。
cDAC(Compact Data Access Component)テストの簡潔化に関するクリーンアップです。BumpAllocatorが自動的にHeapFragmentsを保存するよう改善され、テスト内での二段階プロセス(アドレス計算と別途のAddHeapFragment()呼び出し)が不要になりました。これに伴い、AllocateAndAdd()ヘルパーの統合要求への対応として、テストコード全体から二重呼び出しのパターンを排除しています。
JIT ループクローニングにおいて、ダウンカウントループの条件生成が不十分だったバグを修正します。ダウンカウントループで初期値が配列長と等しい場合、不正に高速パスが実行される可能性がありました。初期値が配列長より厳密に小さいことを常に検証する必要があります。
ComInterfaceGeneratorとVtableIndexStubGeneratorで、ユーザーが宣言した[GeneratedComInterface]インターフェースのメソッドにpartialまたはvirtual修飾子を付与した場合、生成されるスタブコードに無効な修飾子がコピーされていた問題を修正します。生成されたコードからpartialとvirtualキーワードをフィルタリングして、有効なC#を生成するようにしました。
// 以前は無効なコードが生成されていた例
[GeneratedComInterface]
[Guid("...")]
internal partial interface ICalculator
{
public virtual partial int Subtract(int a, int b);
}
HttpClientBuilderExtensions.AddTypedClient<TClient, TImplementation>のXMLドキュメントコメントに含まれる2つのタイポを修正しました。
Windows Server 2022以前のバージョンにおいて、ApplyControlToken(SSL_SESSION_DISABLE_RECONNECTS)がSchannel内部のセッションキャッシュとの競合状態により、TLS再開が無効化されてもセッションIDがClientHelloに埋め込まれる問題を修正します。修正後は、セキュリティコンテキストを削除してInitializeSecurityContextを再実行し、新しいClientHelloを生成することで問題を回避します。この対応はWindows 11未満(ビルド22000未満)に限定されています。
GSSAPI初期化時のstderr ログ出力を削除し、エラーハンドリングを例外ベースに変更するPRです。libgssapi_krb5.so.2がオプションまたは利用不可な環境(チゼル化されたコンテナなど)における動作を改善します。
ARM32プラットフォームでTestStackOverflowLargeFrameMainThreadテストが確実に失敗するため、スキップ条件にArchitecture.Armを追加する修正。大フレームメソッド(65KB/フレーム)がARM32で実行される際、JITがスタックページを調査する方法の制限により、ガードページフォルトが実行時の検出ウィンドウ(signal.cppの2ページ)外で発生し、SIGABRT(終了コード134)ではなくSIGSEGV(終了コード139)が生成されることが原因。
// 変更前
if (((RuntimeInformation.ProcessArchitecture == Architecture.Arm64) || ... ||
(RuntimeInformation.ProcessArchitecture == Architecture.LoongArch64)) && ...)
// 変更後
if (((RuntimeInformation.ProcessArchitecture == Architecture.Arm64) || ... ||
(RuntimeInformation.ProcessArchitecture == Architecture.LoongArch64) ||
(RuntimeInformation.ProcessArchitecture == Architecture.Arm)) && ...)
ZipArchive.Update モードで既存のZIPを開く際、データディスクリプタ(general purpose bit flag bit 3)を持つエントリが上書きされてアーカイブが破損する問題を修正しました。非シーク可能なストリームで作成されたアーカイブやJavaのZipOutputStream、Azure SDKなどで作成されたアーカイブが影響を受けます。.NET 10で導入された PR #102704 の最適化による回帰です。
ConfigurationIgnoreAttributeを新たに追加し、設定バインディング時に特定のプロパティを明示的にスキップできるようにしました。リフレクションベースのバインダーとソースジェネレータの両方を更新して、無視されたプロパティをバインディング対象から除外します。
[ConfigurationIgnore]
public string IgnoredProperty { get; set; }
5年前のiltrim hackathonで開発されたIL-levelトリマーのプロトタイプをdotnet/runtimeに統合します。ILCompiler.TypeSystem、DependencyAnalysisFramework、System.Reflection.Metadataを活用し、Mono.Linker.Testsインフラストラクチャ上に構築されています。約14,000行から7,000行に削減され、テストの32%が現在パスしています。
インタープリタが開放型仮想デリゲート(open virtual delegate)のコンパイル済みターゲットを呼び出す際のSIGSEGV(セグメンテーション違反)を修正しました。インタープリタの呼び出しハンドラが、解決されたターゲットがコンパイル済み(targetIp == NULL)である開放型仮想デリゲートを検出した場合、これまでは汎用パスでGetTarget()を呼び出していましたが、開放型デリゲートの場合null が返されて引数スロットが破損していました。修正により、コンパイル済みターゲットを持つ開放型仮想デリゲート用の専用パスが追加され、memmoveを使ってデリゲートオブジェクトを除去しながら引数をシフトします。V128引数の16バイトアラインメントも保持します。
Crossgen outerloop ビルドにおいて、異なるディレクトリに存在する同名の .csproj ファイル(finally.csprojとTarget.csproj)がMergedTestRunner内で重複するアセンブリ名を生成し、MSBuildの競合解決によって参照が静かに削除される問題を修正しました。MergedTestRunner.targetsにおいて、extern alias とアセンブリ名の導出ロジックを%(Filename)から%(RelativeDir)%(Filename)(非英数字を_で置換)に変更し、ファイルシステム上の位置情報を含めることで一意性を保証します。
ObjectDataInternerをリファクタリングし、プラグ可能なIObjectDataDeduplicatorインターフェースを導入することで、デデュプリケーション戦略を抽象化します。これにより、NativeAOT(メソッドボディの折畳み)とReadyToRun(コピーされたメソッドILの折畳み)の両方で統一されたデデュプリケーション基盤を共有できるようになります。
release/9.0 stagingブランチの変更をrelease/9ブランチにマージするリリース統合PR。System.Net.WebSocketsのプロトコル検証強化、System.Net.Quicのテスト環境対応、ビルド基盤のアップデートを含みます。
DAC(Debugging Assist Code)のDefaultCOMImplテンプレートクラスにおける2つの参照カウント管理バグを修正し、cDACの互換性回避策を削除するPRです。また、ClrMDを最新版(4.0.0-beta)にバージョンアップし、cDACでCLRDATA_REQUEST_REVISIONを直接実装しています。
Dynamically Accessed Members (DAM) 注釈の基底型不一致警告を削除します。基底型での警告は不要です。なぜなら派生型の構築時に警告が生成されるため、穴は生じないからです。この変更により、そのような型の静的メソッド使用が可能になります。併せて、ILLink の分岐削除時の IL オフセット追跡バグを修正します。
Renovateの設定を更新し、コンテナイメージダイジェストのピニング更新時に、より具体的なコミットメッセージタイトル「Pin container image dependencies」を使用するようにしました。従来の汎用的な「Pin dependencies」から変更されます。
EvictionCount_NotOvercounted_WhenEntryAlreadyRemovedテストにおける競合状態を修正するPR。バックグラウンドのScanForExpiredItemsタスクがテストの明示的なTryGetValueおよびCompact操作と競合し、エントリがConcurrentDictionaryから削除されても_accumulatedEvictionsがまだインクリメントされていない状態でGetCurrentStatisticsが呼ばれることで、エビクション数の過小計測が発生していた問題を解決。ExpirationScanFrequencyをTimeSpan.MaxValueに設定することで、バックグラウンドスキャンを事実上無効化する。
CoreCLR JIT インターフェースのデバッグ時デバーチャライゼーション処理において、非同期バリアントに関する TODO コメントを削除し、対応する仮の例外処理を削除します。非同期デバーチャライゼーションサポートが修正されたため、この例外処理は不要になりました。
dotnet/runtime に GitHub Actions ワークフローを追加し、.github/skills/ および .github/agents/ 配下のファイル変更時に skill-validator check を実行してスキルとエージェント定義の構造的妥当性を検証します。AOT コンパイル済みバイナリを使用するため .NET ランタイムは不要です。現在 11 個のスキルと 2 個のエージェントが定義されており、マージ前に不正な frontmatter やフィールド欠落などの問題を検出できます。
AOTコンパイラツール(ilc/crossgen2)でスタックトレースの行番号情報を生成できるようにする変更です。共有MSBuildプロパティでStackTraceLineNumberSupportを有効化し、デバッグ体験を向上させます。
JITの冗長分岐排除(redundant branch elimination)機能を拡張し、PHI値を使用するブロックを通じたジャンプスレッド化をサポートしました。PHIの使用がスレッド化されるブロックとその直後の後続ブロック内で完全に追跡できる場合に、SSA/VN使用箇所を書き換えて安全にスレッド化を行う機能を実装しています。
ARM64 JITコードジェネレータで、Vector64/Vector128.ToScalarが64ビット整数型(long/ulong)を扱う場合、umov(ベクトル要素抽出)ではなくfmov(ベクトル↔汎用レジスタ間の移動)を発行するように変更しました。他の要素型については既存の動作を保持します。
HandleToObject メソッドにおいて、ハンドルがnullでないことを確認するアサーションを追加します。この変更により、以前は暗号的な IndexOutOfRangeException が発生していた状況で、より明確なエラー情報を提供するようになります。
CoreCLR JITの値番号付けインフラストラクチャから未使用の「shared-static」関数属性を削除し、値番号付け関数メタデータとそれに関連するテーブルを簡略化します。
crossgen/crossgen2テストの実行時にasync/covariant-returnテストプロジェクトをスキップするための変更。#126755でcrossgen2がasync メソッドの共変戻り値型処理に対応するまでの一時的な対応です。
1024個を超えるCPUを搭載したLinuxマシンでのランタイム初期化失敗に対応するPR。sched_getaffinityの固定サイズのcpu_set_tを動的に割り当てられたCPUセット構造に変更し、任意の数のCPUをサポート。GCのヒープ上限は1024個に保ったまま、CPU関連のデータ構造を動的化。MAX_SUPPORTED_CPUS定数をMAX_SUPPORTED_HEAPSに名称変更してコード意図を明確化。
iOS デバイス(arm64)CI ジョブを runtime.yml の3つの iOS スモークテスト(Mono AOT、NativeAOT、CoreCLR)に復元します。デバイスキューの信頼性の問題により導入されていた iossimulator_arm64 ワークアラウンドを置き換えます。
.gitignoreを更新し、C# Dev Kit拡張機能が生成するキャッシュファイル(.lscache)とダンプファイルをGitの追跡から除外するパターンを追加します。
MacCatalystにおけるプロセス生成機能を改善し、macOSで利用可能なposix_spawnによる高速パスを有効化するもの。従来MacCatalystはプロセス生成の実装がなく、初期化されていないchildPidを返す回帰状態にあった。posix_spawnを活用することでパフォーマンス向上とMacCatalyst上での正しい動作を実現する。
OpenSSLの非推奨なRSA APIを削除し、EVP_PKEYベースのAPIへの移行を完了します。RSA型とRSA_*メソッドをEVP_PKEYへ置き換え、証明書生成とキー検証パスを更新します。ビルドはOpenSSL 3.0以降で非推奨APIの廃止に対応しています。
Call ノードが持つ冗長なフィールド gtCallAddr を削除し、すべてのコール型で gtControlExpr に統一する変更です。これまで gtCallAddr と gtControlExpr はコール型ごとに使い分けられていましたが、目的は同じ(コール対象の保持)であったため、これを整理して実装の複雑性を低減します。間接呼び出しでは常に有効ですが、ヘルパー呼び出しとユーザー呼び出しでは nullptr となる場合があります。
ARM64プロセッサの新しい暗号化命令セット(SHA3、SM4、およびSVE拡張機能のSVE_AES、SVE_SHA3、SVE_SM4)に対する命令セット検出とサポートを追加します。ランタイム、JIT、Ready2Run(R2R)ツールチェーン全体で、これらの機能を一貫して認識・制御できるようにします。
AVX10 CPUID bit検出のバグを修正しました。CPUID leaf 7 sub-leaf 1の結果を読み込んだ後、別のCPUID問い合わせでcpuidInfoが上書きされてしまい、AVX10ビット(EDX[19])がスタックデータを読んでいました。修正により、leaf 7 sub-leaf 1が有効な間にAVX10ビットをキャッシュし、後続のleaf 0x24検出でキャッシュされた値を使用するよう変更しました。
BoxedLayoutTypeMarshaler<T>経由でDestroyStructureが呼ばれるblittable型で、無条件にNativeMemory.Clearを実行していたため、無効なポインタ(例:(IntPtr)1)に対してNullReferenceExceptionが発生していた問題を修正しました。blittable型の場合はFreeCoreとNativeMemory.Clearをスキップ、非blittable型はネストされたクリーンアップ後の二重解放防止のためNativeMemory.Clearを実行するよう改善しています。
Arm64プラットフォーム上の IndexOfAnyAsciiSearcher の性能を最適化するPRです。Count、IndexOf、LastIndexOf の専用APIのコード生成をArm64向けに改善し、ExtractMostSignificantBits の代わりにこれらを使用するように更新しました。IndexOfAny スタイルの検索を使用するワークロードで5~50%のパフォーマンス向上が期待できます。
XUnitWrapperGeneratorで、[Theory] + [MemberData]属性を持つテストが条件付きスキップ属性([SkipOnPlatform]等)でラップされる場合、ConditionalTestのelse分岐でtestArgumentsループ変数がスコープ外になり、コンパイルエラーCS0103が発生する問題を修正します。
dotnet/runtimeのコードレビュー自動化ワークフローで約20%の実行がタイムアウトする問題を修正します。分析結果から、GPT-5.4サブエージェントの無限ハングが93%のタイムアウトの原因であることが判明。SKILL.mdを修正し、GPT-5.4をブロック、GPT-5.3-codexを推奨、サブエージェント数を4から3に削減、レビュー投稿後の即座の終了を実装します。
dotnet/runtimeのコードレビュー自動化スキル(SKILL.md)のトークン使用量を削減するため、低価値なコンテンツを除去し、API承認検証手順を独立ファイルに抽出しました。スキルサイズを約29%削減(68.9KB → 48.7KB)し、20分のタイムアウト問題を緩和します。すべてのレビュールールと手順は保持されます。
STA-thread テストハーネスにおいて、結果がアクション実行後にのみ TestPassed に設定されるよう修正しました。以前は、失敗時に結果が誤って上書きされていました。
libraries-pgo パイプラインから instrument_if_optimizing Helix シナリオを削除し、非常に遅い JIT インストルメンテーションモード(最適化中のインストルメンテーション)がライブラリテストで実行されないようにします。共有シナリオ定義は coreclr テストでは継続して利用可能です。
AssemblySpecHashクラスがコードベース内で呼び出されていないため、削除しました。クラス定義をassemblyspec.hppから、メソッド実装(~AssemblySpecHash、CompareSpecs)をassemblyspec.cppから削除します。INITIAL_ASM_SPEC_HASH_SIZEマクロはAssemblySpecBindingCacheで使用されているため保持されます。
dotnet/runtime のリポジトリメンテナンス関連の文書化とリポジトリオートメーション設定を更新するドキュメント変更です。エリアオーナーの整理、エリアラベルの廃止・統合、担当者(Lead)の更新を反映しています。
Windows上で子プロセスが親プロセス終了時に自動的に強制終了されるProcessStartInfo.KillOnParentExitプロパティを実装しました。Windows Job Objects (JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE)を利用して、プロセス作成時に子プロセスをジョブオブジェクトに割り当てることで実現しています。
.NET SDK が OpenTelemetry に移行したことに伴い、dotnet インストーラーの第三者ライセンス通知(THIRD-PARTY-NOTICES.TXT)を更新し、OpenTelemetry .NET の Apache 2.0 ライセンス情報を追加しました。これにより、インストーラーの TPN ファイルが CLI の OpenTelemetry ベースのテレメトリ実装と整合性を持つようになります。
Windows 11 ARM64 Helix マシン上で Directory_Delete_MountVolume と Directory_ReparsePoints_MountVolume テストが確定的に失敗する問題を修正します。
根本原因: ARM64 Helix マシンの E:\ ドライブ(Azure リソース/一時ディスク)は DriveInfo の検査(固定、NTFS、Ready)には合格しますが、GetVolumeNameForVolumeMountPoint で ERROR_INVALID_PARAMETER (87) を返します。ボリューム GUID がないドライブはボリュームマウントポイント操作をサポートしていません。
修正内容: ドライブ選択時に GetVolumeNameForVolumeMountPoint での成功確認を追加し、マウントポイント操作に対応したドライブのみを使用するようにフィルタリングします。
Marshal メソッドのマーシャラーキャッシュを ConditionalWeakTable から RuntimeType の汎用キャッシュインフラに移動し、相互運用パフォーマンスの回帰を改善します(#126608の修正)。検証処理をキャッシュ作成時に一度だけ実行し、レイアウト検証を毎回繰り返さないようにしています。
cDACのスレッド"dead"セマンティクスを修正するPRです。ThreadState.ReportDeadを列挙とIsThreadMarkedDeadで"dead"として扱うように改善しながら、DeadとReportDeadを区別する必要な場合(例:GetThreadOwningMonitorLock)では区別できるようにしています。ランタイム状態ビットからコントラクトフラグへの変換が追加され、マネージドスレッドコントラクトも拡張されています。
Haiku OSのランタイムサポートを追加するPRで、マネージドランタイムライブラリ(System.Private.CoreLib)をHaiku向けにビルドするために必要なコードを実装しています。Haiku OS検出、環境情報取得、ネイティブ相互運用層の初期サポートを提供します。
MSVC コンパイラの既知バグ対応を取り除くリバート PR です。CoreCLR の DAC/DBI 実装において、GetILCodeAndSig 関数周辺に適用されていた最適化無効化プラグマを削除し、元の最適化動作を復元します。
ThreadPool初期化中にFrameworkEventSourceが遅延初期化される際、EventListenerロックを獲得してデッドロックが発生する問題を修正します。FrameworkEventSourceをランタイムの起動パスの早期段階で先制的に初期化することで、ロック競合を回避します。
ARM64 JIT HWIntrinsic コード生成において、マルチ命令展開を含むRMWスタイルのSVE組み込み関数で、非定数即値ジャンプテーブル生成時の命令数計算を修正します。HWIntrinsicImmOpHelperのケースサイズ計算をエミッタの動作(targetReg != op1Reg時の追加移動命令)と一致させることで、jitstressテスト(特にarm64)での失敗を解決します。
cDAC(Compact Data Access Components)の RuntimeTypeSystem コントラクトを拡張し、3つの DacDbi API(HasTypeParams、GetTypeHandle、GetThreadStaticAddress)を実装しました。これらの API は診断ツール(デバッガ、SOS)がジェネリック型情報とスレッドスタティックフィールドのアドレスを取得するために使用されます。
PR #114609で導入されたリグレッションを修正します。ネイティブスレッド上で System.StubHelpers.GetCOMIPFromRCW() がスローパスにフォールバックする際、OLE TLSの初期化後のRCWキャッシュヒットに対して不正に Release が呼ばれていた問題を解決します。スローヘルパーに pfNeedsRelease フラグを返却させることで、RCWキャッシュヒット(借用ポインタ)と新規取得ポインタを区別し、所有権に基づいた適切なクリーンアップを行うようにします。
コール カウンティング マネージャーのデータ構造を SHash からリンク リストに変更します。ハッシュの機能を使用せず、要素の追加・削除・全体反復のみを行うため、より適切なデータ構造への最適化です。
DAC(Debugging Access Component)のGetNativeCodeInfo APIがasync thunkのMethodDescを正しく解決するための修正。async thunkの場合、対応する実装のMethodDesc(async variant)を選択することで、ネイティブコード情報を正確に報告するようになります。このPRは#125900で導入された回帰を修正します。
tvOS向けの FEATURE_CORPROFILER 機能フラグを再び有効化し、Apple モバイルプラットフォーム(iOS/MacCatalyst/Android)間で一貫性を保つ変更です。PR #126550 でtvOSのみプロファイラーが無効化されたことにより、Thread 構造体のオフセットが変わり、asmconstants.h の静的アサーションが失敗していました。tvOSをiOS/MacCatalystと同じ扱いにすることで、構造体レイアウトを正常に戻し、ビルドエラーを解決します。
cDAC管理側リーダー向けの型付きフィールド拡張メソッドを追加し、すべてのIData<T>クラスを新メソッドで統一しました。ネイティブデータディスクリプタ型システムを利用した管理側の型検証を実装しています。
新しいTargetFieldExtensionsには以下のメソッドが含まれます:
ReadField<T> — プリミティブフィールド読み取り(型検証付き)ReadPointerField / ReadPointerFieldOrNull — ポインタフィールド読み取りReadNUIntField — ネイティブ符号なし整数フィールド読み取りReadCodePointerField — コードポインタフィールド読み取りReadDataField<T> / ReadDataFieldPointer<T> — Dataストラクト読み取り(インライン/ポインタ)ReadFieldOrDefault<T> — オプショナルフィールド読み取り(デフォルト値付き)runtime-async=on コンパイラ機能をすべてのビルド構成(Debug、Checked、Release)で無条件に有効化します。従来は Release ビルドのみ、また NativeAOT では riscv64/loongarch64 を除外していた制限を廃止し、統一的に有効化することで、全ビルド構成での非同期機能の動作検証とサポートを強化します。
WebAssemblyのR2R (Ready-to-Run) シナリオで使用する新しいリロケーションタイプ WASM_MEMORY_ADDR_REL_LEB を追加します。このリロケーションは、イメージベースからの相対オフセットをULEB128エンコードで表現し、メモリロード/ストア命令の offset イミディエートとして直接使用できます。
例:
global.get $__image_base
i32.load align=... offset=<reloc>
WebAssembly RyuJIT のfunclet(例外処理の分離コード)のプロロローグ・エピローグコード生成を修正するものです。genEmitStartBlock の呼び出しを funclet prolog IG セットアップ後に遅延させ、エピローグ生成のための BasicBlock をエミッターからコード生成側に戻すようにしました。また、funclet を含むメソッドについて、R2R フェイルオーバーをデフォルト有効化しています(JitWasmFunclets=1 で無効化可能)。加えて、ノード参照の重複収集を防ぐ修正を含みます。
Microsoft.Extensions.*およびSystem.IO.Compressionライブラリ向けのCopilot agentic assetを追加するPRです。専用のレビューエージェント、書き込みスキル、および複数の拡張機能エリア向けのフォルダスコープ命令ファイルが含まれます。これらは実装ガイダンス、検証ポイント、パフォーマンス・セキュリティに関する推奨事項を提供します。
ProcessStartInfo.StartDetached プロパティを新規追加し、親プロセスのセッション/コンソールから独立したプロセスを開始できるようにします。このプロパティはWindows(DETACHED_PROCESSフラグ)、macOS(POSIX_SPAWN_SETSID)、その他Unix(setsid())で異なるメカニズムを使用して実装されています。
使用例:
var psi = new ProcessStartInfo("myserver")
{
StartDetached = true
};
// stdin/stdout/stderr は自動的に NUL/dev/null にリダイレクトされます
Process.Start(psi);
Apple mobile platforms(iOS/tvOS/MacCatalyst)でのテスト失敗に対応するため、Mono AOT IL stripping によって method bodies が変更・削除される環境でのテストをスキップまたは条件付けする変更です。IsMethodBodySupported を拡張して aggressively-trimmed builds を検出し、影響を受けるテストを条件付きで実行します。
ProcessHandlesTestsにファイルハンドル継承動作を検証するテストを追加。InheritedHandlesを使用して子プロセスを生成する際、ハンドルが継承されたかどうかを確認します。本PR内で検討された他の変更(ネイティブPALエクスポート、SafeFileHandleパス解決)は、OSレベルのパス解決がユーザーフレンドリーなパスではなくデバイスパスを返すため、レビュアーのフィードバックに基づいて元に戻されました。
Throw と Thread のヘルパーを Unmanaged Calling Origination(UCO)に変換するリファクタリング。マネージドコード側でスロー処理とスレッド操作を管理するための呼び出し規約を統一し、VM(仮想マシン)レイヤーでの実装を簡潔化するもの。優先度3の改善目標(#123864)に貢献します。
CoreCLR COM相互運用性のコントラクト違反を修正し、ExtensionPointsテストを再度有効化するPRです。ネイティブCOMのクリーンアップ・割り当てフック中にマネージドコード(管理されたIMallocSpy実装など)に合法的に再入可能なパスに対して、コントラクト違反の適切なアノテーションを追加しました。
dotnet/hotreload-utils リポジトリのホットリロード・デルタ生成ツールチェーンをランタイムリポジトリに統合し、外部NuGetパッケージ依存を排除しました。src/tools/hotreload-delta-gen/に5つのプロジェクト(Generator、Generator.Tasks、Generator.Frontend、Generator.Data、Generator.BuildTool)とその共有コードを追加し、eng/testing/hotreload-delta-gen.targetsで従来のNuGet .targetsファイルを置き換えました。ApplyUpdateテスト、WASMホットリロードテスト、Monoサンプルの3つのコンシューマーを更新しました。
cDAC(CoreCLR Diagnostic Access Component)のコントラクト初期化モデルを、26個の個別ファクトリクラスから登録ベースの ContractRegistry API に変更します。これにより、外部ランタイム(NativeAOT、Mono等)の契約サポートを追加する際に、コアリーダーの複数ファイルを修正する必要がなくなります。
新しい登録API(内部実装、将来の外部ランタイム向け):
public static void Register(ContractRegistry registry)
{
registry.Register<IThread>(1, static t => new Thread_1(t));
registry.Register<IRuntimeTypeSystem>(1, static t => new RuntimeTypeSystem_1(t));
}
ChainedRateLimiterのIdleDurationプロパティとReplenishing RateLimiter統合の問題を修正します。
主な修正内容:
IdleDurationの意味論を修正:子要素のいずれかがIdleDuration == nullを報告する場合、nullを返すように変更ChainedRateLimiter内の内部replenishing limiterに対してDefaultPartitionedRateLimiter.Heartbeat()からReplenishment呼び出しを確保RateLimiter.CreateChained(...)への渡されるlimiterに応じて、2つの異なるChained limiter実装を提供WASM CoreCLR ライブラリテストのHelix キューイング圧力を削減するため、約172個の個別テスト作業項目を約21個のバッチ作業項目にグループ化(88%削減)し、総マシン時間を56%削減(437分→195分)します。すべてのテスト結果は同一で、失敗はありません。
baseline buildの手順を簡略化し、main ブランチへの切り替えを廃止して、working branchで直接baseline buildを実行するよう更新しました。これにより、main とworking branchが分岐している場合の不要な作業を削減できます。
CoreCLR DAC(デバッグ支援コンポーネント)のスタックウォーキング機能(IXClrDataStackWalk)において、メモリ安全性の問題を修正します。Windows SDK の CONTEXT 構造体にインラインXSTATE(拡張状態)を含めた大きなバッファをcallerが渡した場合、バッファサイズの検証が正しく機能せず、メモリオーバーラン(読み書きの境界外アクセス)が発生する問題を解決します。
具体的には、GetContextとSetContext2メソッドにおいて、コピー処理のサイズをT_CONTEXTの実際のサイズ(AMD64では0x4D0バイト)に制限し、overflowを防ぎます。
MSBuild設定ファイルの_PrepareTrimConfigurationタスク内で、TrimmerSingleWarnメタデータを適用する際の複雑な交差計算パターンをMSBuildのUpdate機能で直接置き換えることで、コードを簡潔化し、アイテム順序を保持するように改善しました。
.NET 10で導入されたリグレッションを修正するPRです。JITコンパイラがref struct型の静的フィールドへの代入時に、write barrier呼び出しを誤って省略していたため、GCヒープ破損を引き起こしていました。静的フィールドは常にGCヒープ上に存在するため、write barierの追加が必要です。この修正により、DOTNET_HeapVerify=1で実行時の致命的エラーが検出されるようになります。
W3C Context Propagation Level 2で定義されるRandomTraceIdフラグのサポートを追加します。ActivityTraceFlags列挙型に新しいフラグを追加し、トレースIDがランダムに生成されたかどうかを示せるようになります。
SYSLIB1045コード修復ツール(Regexコンストラクタ呼び出しをGeneratedRegexに変換)がバッチ処理で部分的なクラス宣言に対して複数の修正を同時適用する際、重複したMyRegexプロパティ名を生成していた問題を修正しました。根本原因は、複数のフィクサーが修正前の元のコンパイル状態を参照するため、同一の名前が利用可能と判断されていたためです。
DEFAULT_STACK_SIZE マクロの定義を削除します。このマクロは未使用またはレガシーな定義であり、コードの簡潔化を目的としています。
Webcil形式のバージョン1(V1)対応を実装するPRです。先行するPR #126388でWebcil共有ライブラリがバージョン0からバージョン1に更新されたため、WebcilConverter、WebcilReader、およびMonoローダーをV0/V1の両方に対応させます。V0は28バイト、V1は32バイト(TableBaseフィールド追加)のヘッダサイズに対応し、後方互換性を維持しながらV1対応を実現します。
RemoteExecutorがサポートされていないプラットフォーム(NanoServer等のReadyToRun構成)において、RemoteExecutorに依存するテストがPlatformNotSupportedExceptionをスローして失敗する問題を修正しました。テストを適切にスキップするよう、条件付き実行属性で保護しました。
非同期共変戻り値機能に関するNativeAOT対応の状況を追跡するために、テストプロジェクトのコメントを更新しました。汎用的な「NYI(Not Yet Implemented)」記述を、追跡対象の具体的なランタイムIssueへのリンクに置き換えています。
Thread::m_pInterpThreadContext フィールドを Thread クラスの末尾から先頭付近の安定した位置に移動させることで、ビルド構成によって変動していたアセンブリオフセットを固定化します。これにより、アーキテクチャ固有のアセンブリコード(asmconstants.h)におけるオフセット定義の変更を最小限に抑え、ビルド互換性を向上させます。
PEDecoder クラスの const メソッド内で使用されていた8か所の const_cast を削除し、キャッシュフィールドを mutable として宣言することで、const-correctness を改善します。動作やメモリレイアウトに変更はなく、コンパイル時の型安全性向上のみです。
OleTxTests.RecoveryがMSDTC待機時にインターミッテントにハング(20分以上)する問題に対処するため、スキップ属性を削除し、5分のタイムアウト後にEnvironment.FailFastを実行するウォッチドッグスレッドを追加します。これにより、通常のCoreCLR実行時の失敗を検出しつつ、ハング診断用のクラッシュダンプを取得できます。
var testCompleted = new ManualResetEventSlim(false);
var watchdog = new Thread(() =>
{
if (!testCompleted.Wait(TimeSpan.FromMinutes(5)))
Environment.FailFast("OleTxTests.Recovery did not complete within 5 minutes");
});
watchdog.IsBackground = true;
watchdog.Start();
try { /* test code */ }
finally { testCompleted.Set(); }
Windows Arm64環境でWindowsAlternateDataStreamOverwriteテストが断続的にCopyFileExからERROR_INVALID_PARAMETERエラーで失敗する問題に対応します。[ActiveIssue]属性を使用してWindows Arm64プラットフォーム上でのみテストをスキップし、他のプラットフォームではテスト実行を継続します。
正規表現コンパイラのresumeAt=2パス(ループ内のyes-onlyな式条件)に対するテストカバレッジを追加しました。PR #126561の修正に関連して、コードレビューワークフローで特定されたテストの欠落部分を補完します。
Apple モバイルプラットフォーム(iOS/tvOS/MacCatalyst)において、Process.Start() がプロセス起動前に PlatformNotSupportedException をスローするため、Start_Disposed_ThrowsObjectDisposedException テストをスキップするようにしました。このテストは処理済みオブジェクトの場合に ObjectDisposedException の発生を期待していますが、プラットフォーム非対応エラーが先に発生するため、runtime-extra-platforms ビルドで確定的な失敗が発生していました。
Apple プラットフォーム上で ILLink により Swift 相互運用型(SwiftSelf、SwiftError、SwiftIndirectResult)が System.Private.CoreLib から不正にトリミングされる問題を修正します。CreateRuntimeRootILLinkDescriptorFile タスクが corelib.h を処理する際に TARGET_APPLE が定義されていなかったため、Swift 型の保護ルートが生成されず、実行時に TypeLoadException が発生していました。System.Private.CoreLib の MSBuild DefineConstants に TARGET_APPLE を追加することで、Apple プラットフォーム向けビルド時に Swift 型定義が ILLink ディスクリプタに正しく含まれるようになります。
DirectoryNotFoundExceptionの逆シリアライズコンストラクタを変更し、SerializationInfoエントリを線形スキャンするforeachループをGetValueNoThrowによる直接参照に置き換えました。これにより、他の例外クラスのパターンに合わせてコードの効率化と統一化を実現します。
IChangeToken.ActiveChangeCallbacksプロパティのドキュメンテーションを明確化するPRです。特にCompositeChangeTokenのような複合トークンにおいて、ActiveChangeCallbacks == trueがすべての基盤となる変更が確実にコールバックをトリガーすることを意味しないというケースを正確に説明するようにドキュメントを改善しています。
.NET 9.0ランタイムのパッチバージョンを9.0.15から9.0.16へ更新するブランディング変更です。release/9.0ブランチのバージョンプロパティを更新しています。
.NET 8.0のサービシング版バージョンを8.0.26から8.0.27へ更新するためのバージョン情報更新です。release/8.0ブランチのブランディング情報を次のパッチリリースに合わせて整備しています。
perf-build パイプラインに wasm_coreclr と coreclr_r2r_interpreter の2つの新しいビルドタイプを追加し、every-commit perf ビルドパイプラインに含めることで、これらがビルドキャッシュシステム(BCS)に登録、ビルド、アップロードされるようにします。
JITコンパイラに、支配的なブランチ(外側の条件分岐)が支配されるブランチ(内側の条件分岐)の述語に含意される場合に、支配的なブランチを最適化して削除する機能を追加しました。例えば、if (x > 0) if (x > 1) S(); では外側の if (x > 0) を削除できます。
// 最適化前
if (x > 0)
if (x > 1)
S();
// 最適化後(外側の条件は不要)
if (x > 1)
S();
CoreCLR composite R2R-with-interpreter-fallback ビルドに linux_arm64 プラットフォームを追加し、arm64 Cobalt パフォーマンス実行が linux_x64 と同じビルド成果物を利用できるようにします。
リバースP/Invokeにおいて、インタープリタがUMEntryThunkDataをTLS(スレッドローカルストレージ)変数経由で受け取る際の初期化が失敗していた問題を修正しました。前回のコミット(60f1dc1b)でエントリーポイントの最適化により、プレスタブをスキップしてインタープリタプリコードを直接呼び出すようになったため、必要なTLS変数の設定が漏れていました。
GetVersionResilientTypeHashCodeがメモ化なしで再帰的にハッシュコードを再計算していたため、多態的再帰を含むシナリオで指数関数的なパフォーマンス低下が発生していました。本修正ではMethodTableAuxiliaryDataにキャッシュフィールドを追加し、ハッシュコードの計算結果を1度だけ保存することで、重複計算を排除します。
CoreCLR VM/COM相互運用のリソース管理を標準化するため、従来のWrapper<...>ベースのRAIIホルダーを新しいLifetimeHolder、ReleaseHolder、SpecializedWrapper抽象化に統一するリファクタリング。COM相互運用、GC/オブジェクトハンドル、CLRConfig文字列バッファ、ローダー/リソースヘルパーなどの複数の領域で、ボイラープレートコードを削減しながら動作を保持します。
Call Counting Stubsの追跡メカニズムをCodeRangeMapRangeListに移行し、RangeSectionMapから直接Stub種別を識別できるようにしました。これにより、Call Counting Stub Allocatorの反復走査が不要になり、cDACでの効率的な検索が可能になります。同時に、Call Counting Stub Heapの明示的なEnumMemを削除し、他のCodeRangeMapRangeListユーザーと同じ列挙動作に統一しました。
PGO(Profile Guided Optimization)インフラストラクチャをWebAssembly、iOS、tvOS、MacCatalystプラットフォームで無効化し、FEATURE_DYNAMIC_CODE_COMPILEDフィーチャゲート下に移行する変更です。これらのプラットフォームではPGOが意味をなさないため、不必要なコード生成を削減し、ビルドサイズを最適化することを目的としています。
HTTP/SSL ストレステストパイプラインの PR トリガーをファイルパスフィルタとともに独立したパイプラインに分離する変更です。これにより、azp run ... コマンドでの手動実行が正常に機能するようになり、HTTP/SSL 製品コードの変更に対するストレステストの手動実行が可能になります。
キャッシュされたインターフェイスディスパッチスタブにおけるレース条件を修正します。ディスパッチセルのm_pStubとm_pCacheが原子的に更新されていても、呼び出し元とスタブによる非原子的な読み取りにより、キャッシュ成長時にレース条件が発生し、スタブが陳旧したm_pCacheを読み取ってキャッシュサイズが一致せず、マッピングされていないメモリへのアクセスが発生する可能性がありました。
各RhpInterfaceDispatchNスタブに検証ロジックを追加し、m_pCacheロード後に下位2ビットがゼロであることとm_cEntriesが予想されるエントリ数と一致することを確認。不一致の場合は間接セルを通じて再ディスパッチして、現在のスタブとキャッシュペアで再試行します。
ConfigurationBinderが空のJSON配列([])をコンストラクタパラメータ(string[]型など)にバインドする際にArgumentExceptionをスローしていた問題を修正しました。
根本原因: BindParameterでBindingPointを初期化する際に、設定セクションの文字列値("")を渡していたため、空コレクション生成の処理パスがスキップされていました。
修正内容: BindParameterでBindingPointコンストラクタのinitialValue引数を削除し、デフォルト値のnullを使用するようにしました。これにより、プロパティバインディングと同様に空コレクション処理パスが正常に動作します。
cDAC管理単体テストを、生ポインタ/オフセット演算を削減し、型付きビュー(TypedView)を導入して可読性を向上させるようにリファクタリングしました。また、ランタイム型モックをテスト外での再利用を想定して分離構成しています。
PhysicalFileProviderが存在しないルートディレクトリで構築された場合の問題を修正します。FileSystemWatcherが存在しないディレクトリを監視できないため、AddJsonFileで設定ファイルの親ディレクトリが起動時に未作成の場合にWatch()が失敗していました。
本修正では、PhysicalFilesWatcherがルートディレクトリの作成を遅延監視し、ルートが出現するまでFileSystemWatcherの有効化を延期します。PendingCreationWatcherが最も近い既存の親ディレクトリを非再帰的に監視し、中間ディレクトリレベルを通じてカスケード監視します。ルートディレクトリが存在するようになると、メインの再帰的FileSystemWatcherが有効になり、既に存在する監視対象エントリが報告されます。
create_socket 関数がコネクション失敗時にソケットをクローズせずにリソースリークを起こしていた問題を修正しました。この関数は IdealGraphVisualizer グラフ生成時に使用され、デフォルトで 127.0.0.1:4445 に接続します。
IBinaryInteger<TSelf>インターフェースにLog10静的仮想メソッドを追加し、汎用数学API領域を拡張しています。すべてのプリミティブ整数型(byte、sbyte、short、ushort、int、uint、long、ulong、nint、nuint、char、Int128、UInt128)とBigIntegerに最適化された実装を提供します。
dotnet/runtimeの共有Linux ビルドプール設定をUbuntu 22.04からAzure Linux 3に統一するパイプライン構成の更新。#125996で個別のパイプラインファイルがAzure Linux 3に移行済みだったため、共有デフォルトテンプレートeng/pipelines/common/xplat-setup.ymlも同様に更新し、リポジトリ全体で一貫性を取るもの。
cDACレガシー層(IXCLRDataModule COM surface)に、メソッド定義を名前で列挙するための3つのAPI(StartEnumMethodDefinitionsByName、EnumMethodDefinitionByName、EndEnumMethodDefinitionsByName)を追加します。これにより、bpmdなどのデバッグツールがECMA-335メタデータを通じた名前ベースのメソッド検索が可能になります。
TarReader が GNU sparse format 1.0(PAX)エントリに対応しました。これにより、bsdtar で作成されたアーカイブ(macOS/APFS の .NET SDK tarball など)から、内部プレースホルダーパス GNUSparseFile.0/real-file.dll の露出、不正なサイズ報告、破損したコンテンツ抽出が解決されます。PAX 拡張属性 GNU.sparse.major=1 と GNU.sparse.minor=0 が検出されると、実ファイル名を GNU.sparse.name から解決し、拡張サイズを GNU.sparse.realsize から取得し、生データストリームを GnuSparseStream でラップして仮想ファイルコンテンツ(ホールはゼロ、データは正しいオフセット)を提供します。
// Before: entry.Name == "GNUSparseFile.0/dotnet.dll", entry.Length == 512
// After: entry.Name == "dotnet.dll", entry.Length == 1048576
using var reader = new TarReader(archiveStream);
TarEntry entry = reader.GetNextEntry();
entry.DataStream.ReadExactly(content); // correctly expanded virtual file
CoreCLR JITの非同期変換において、複数のawaitが存在する場合に共有のGT_RETURN_SUSPENDブロックを生成し、複数のサスペンション地点が単一のエピログにブランチするよう最適化します。これによりR2R(Ready-to-Run)バイナリサイズが削減されます。
System.Diagnostics.FileVersionInfoの公開APIに対するXML ドキュメンテーションをdotnet-api-docsからソース実装にバックポートするコミットです。すべての公開メンバーに<summary>、<value>、<param>、<returns>タグを追加し、int型プロパティがバージョン情報欠落時にnullではなく0を返すことを正しく記載しています。
サンプル:
/// <summary>
/// Gets the build number of the file.
/// </summary>
/// <value>A value representing the build number of the file or 0 (zero) if the file did not contain version information.</value>
public int FileBuildPart { get; }
IXmlSerializableインターフェースを実装するパラメータなしコンストラクタを持つ値型が、XmlSerializerの生成IL内で適切にボックス化されていなかった問題を修正します。この問題により、XmlSerializationReader.ReadSerializableメソッド呼び出し時にInvalidProgramException例外が発生していました。
修正内容:パラメータなしコンストラクタを持つ値型をインターフェース型として引き渡す際に、box命令をIL生成時に明示的に追加することで、値型の適切なボックス化を保証します。
decimal.Parseとdecimal.TryParseのNumberStyles検証を修正し、AllowHexSpecifierとAllowBinarySpecifierスタイルを正しく拒否するようにしました。UTF-16とUTF-8の両方のパースAPI間で動作を統一し、#126643を解決します。
PR #121999で追加されたGroupJoin オーバーロード(IGrouping を返す)機能をリバートします。このPRは CI 停止中にマージされており、System.Linq.AsyncEnumerable のテストでコンパイルエラーが発生しています。
Windows上でのSafeFileHandle.Typeプロパティの不具合を修正。従来は無効なハンドルに対してFileHandleType.Unknownを無条件に返していましたが、本修正によりGetFileTypeがFILE_TYPE_UNKNOWNを返した際にGetLastErrorをチェックして、実際のエラーが発生している場合は例外をスローするようになります。
PR #126437で削除されたFreeBSD OSPlatform拡張メソッドの残存コードを削除するクリーンアップPRです。TargetInfo.csのPlatformExtensions内で定義されながら使用されていないFreeBSD OSPlatform拡張ブロックを削除し、引き続き使用されているArchitecture.LoongArch64拡張ブロックは保持します。
AzureLinux 3 VMs上でMsQuicがメモリ不足エラー(QUIC_STATUS_OUT_OF_MEMORY)で失敗するため、HTTP/3機能テストを無効化します。既存のQUICテスト側での対策に合わせて、HTTP/3テスト用のサポートゲート条件にIsNotAzureLinux3VMチェックを追加することで、該当環境でのテストスキップを実現します。
SmtpException.GetMessageForStatusが未定義のステータスコード(初期化されていない_statusCodeなど)に対して誤って"Syntax error, command unrecognized."というメッセージを返していた問題を修正しました。未定義のステータスコードと定義済みながらマッピングされていなかったステータスコードを区別し、それぞれ適切なメッセージを返すようになります。
LoongArch64アーキテクチャにおいて、SoftwareExceptionFrame::UpdateContextFromTransitionBlock()内の浮動小数点レジスタコピー処理を修正しました。このPRは例外処理時のレジスタコンテキスト更新で、浮動小数点レジスタが正しく保存・復元されることを確保します。
CoreCLR の System.Private.CoreLib に対して runtime-async=on Roslyn 機能フラグを有効化し、既に src/libraries で有効化されているランタイム非同期機能を CoreCLR 側に合わせます。riscv64、loongarch64、および Mono ランタイムフレーバーは除外されます。
CoreCLR JITの線形コード生成ロジックをリファクタリングし、関数本体(funclet)の反復処理を既存の Compiler::Funcs() / FuncInfoDsc::Blocks() レンジベースの反復子を使用するように変更します。これにより、BBJ_CALLFINALLYブロック後のスキップ処理を廃止し、代わりにコード生成時にBBJ_CALLFINALLYRETブロックをスキップする仕様に統一します。
正規表現コンパイラおよびソースジェネレータにおいて、ループ内の条件式でresumeAtがリセットされない問題を修正。この問題により、コンパイル/ソースコード生成された正規表現での複数マッチの結果が不正確になっていました。EmitExpressionConditionalをループ内で実行される各ブランチごとにresumeAtをリセットするよう更新。
clrfeatures.cmakeのFEATURE_CORPROFILERフラグロジックをリファクタリング。ICorProfilerサポートを、プロファイリングが非サポートのプラットフォーム(Android、iOS、Mac Catalyst、tvOS、WASM)でデフォルト無効化しつつ、コマンドラインからのオーバーライドを可能にします。
XUnitWrapperGeneratorにおけるSkipOnCoreClrAttributeの処理を修正しました。属性で1つのディメンション(例:RuntimeTestModes.InterpreterActive)のみを指定した場合、他のディメンションがAny値のままになり、結果としてfalseのプラットフォーム条件が生成され、スタンドアロンランナーでテスト本体が到達不可能なデッドコードになる問題を解決しています。
WebAssemblyターゲット向けのJITコンパイラに関数レット(funclet)のレジスタ割り当て機能を実装します。関数レットごとに独立したレジスタ割り当て状態(SP/FP/例外レジスタ)、ローカル変数宣言、およびプロログコード生成を追加し、例外処理リージョンが独自のWasmローカルレイアウトで生成できるようにします。
Wasm RyuJit のコントロールフロー最適化パイプラインを更新し、複数エントリポイントを持つ try/catch 領域をマルチエントリループとして一時的にモデル化して、既存の SCC-to-single-entry-loop 変換を活用し、Wasm try_table コード生成に適した単一エントリフォーム に変換します。
ARM64のインターフェース ディスパッチ キャッシュで、2つの独立したロード命令による制御依存関係の間でのロード再順序化により、破損した読み取り(torn read)が発生する競合状態を修正します。並行スレッドがキャッシュエントリを更新している最中に、古い m_pTargetCode(0)を読み取り、その値にブランチしてしまう問題を、単一の ldp 命令とガード条件を用いて解決します。
ProcessStartInfo.InheritedHandlesプロパティを追加し、子プロセスへのハンドル継承を制限できる新機能です。Windows/Unix両プラットフォームで、親プロセスから子プロセスに継承されるハンドルを選別して制御できるようになります。セキュリティと情報漏洩のリスク軽減を目的とした公開API追加です。
Apple の NSString compare:options:range:locale: が特定の Unicode 入力(C1 制御文字 \u0080–\u009F)に対して非決定的な動作をするため、StartsWithNoMatch_StringComparison と EndsWithNoMatch_StringComparison テストが macOS で間欠的に失敗する問題を修正します。既存の [ActiveIssue] 属性が IsAppleMobile(iOS/tvOS)のみをカバーしていた gap を解決し、macOS にも対応させます。
Taskを返すベースメソッドをTask<T>を返すオーバーライドメソッドで共変オーバーライドする場合のサポートを追加するもの。非同期コンテキストでvoidを返すベースとTを返す派生が衝突する問題に対して、Tの結果を無視する特別なvoid返却スロップシンク(return-dropping thunk)を導入し、仮想呼び出しのエラーを解決します。これはIssue #124238に貢献するものです。
Composite ReadyToRun (R2R) 出力で、正常にコンパイルされたメソッドのILボディを最小限のスタブに置換する --strip-il-bodies オプションをcrossgen2に追加します。IL インタプリタフォールバックが不要なシナリオ(iOS/MacCatalyst等のAppleプラットフォーム)において、アセンブリサイズを削減します。
SVE(Scalable Vector Extension)対応のVector<T>に対するハードウェア組み込み関数(HWIntrinsic)のサポートを追加します。空の組み込み関数テーブルを作成し、インポート時にこれらの組み込み関数を認識するためのプランビング処理を実装しています。
Apple プラットフォームのシンボルストリッピング(dsymutil処理)を再度有効化するPRです。Apple の事前構築 Swift ランタイムライブラリに含まれる DWARF デバッグ情報が、ビルドマシンにのみ存在する .pcm モジュールキャッシュファイルへの参照を持つことで dsymutil が標準エラー出力を発生させる問題に対応します。これまでの StripSymbols=false というワークアラウンドを削除し、代わりに dsymutil の Exec タスクで IgnoreStandardErrorWarningFormat="true" を設定して、エラーメッセージを無視しつつ非ゼロ終了コードで実際の失敗を検出するよう改善します。
System.Diagnostics.EventLogライブラリにNullable Reference Types (NRT)のアノテーションを追加し、nullability意図を明確に表現することで型安全性を向上させるPRです。パラメータ、戻り値、フィールド、プロパティに対して?アノテーションを追加し、プロジェクトファイルの<Nullable>disable</Nullable>を削除してNRT検査を有効化しました。
WebAssembly(WASM)上でNode.jsを経由してCoreC LRテストを実行する際、多数のアセンブリロードと深い再帰的例外処理(フィルタ関数)により、V8 JavaScriptコールスタックがオーバーフローしてテストがクラッシュする問題を修正します。Node.jsスタックサイズをデフォルト(約1MB)から8MBに増やすことで解決します。
Utf8JsonWriter.ResetメソッドにJsonWriterOptionsパラメータを受け入れるオーバーロードを追加します。StreamとIBufferWriter<byte>の両方の出力に対応し、リセット時にWriterオプションを再構成可能にします。既存のDispose、CheckNotDisposed、内部シリアライザキャッシュの動作は変更されません。
インタープリタの末尾呼び出し(tailcall)状態管理のバグ修正です。frameNeedsTailcallUpdateフラグがコンパイル済みコードやアンマネージドコード呼び出し後にリセットされずに残ったため、その後の末尾呼び出しでない操作コード(例:INTOP_NEWOBJ)が誤って末尾呼び出しのフレーム更新を実行してしまう問題を修正しました。
ホストモデルのバンドリングAPI(BundlerとTargetInfo)をリファクタリングし、ターゲットOSとアーキテクチャを必須パラメータに変更しました。これまでのホスト環境からのフォールバック推論ロジックを削除し、より明示的で予測可能な動作を実現します。テストユーティリティも対応する変更が加えられています。
ARM64 JITコンプレッシュで、RMW(Read-Modify-Write)セマンティクスを持つHWIntrinsics(非定数イミディエート使用)のコード生成時に、ジャンプテーブルのエントリサイズ計算が実際に出力される命令数と一致していなかった問題を修正しました。RMW操作のmov命令が各ジャンプテーブルの分岐に重複出力されるようになったため、HWIntrinsicImmOpHelperに明示的な命令数を指定する必要がありました。
Mono.Linker.Tests プロジェクトのテストフレームワークを NUnit から MSTest に移行しました。テスト属性、テストケースデータの供給方法、プロジェクト設定、アセンブリレベルの並列化設定を更新し、MSTest ランナーを採用しています。
WebcilファイルをReadyToRun(R2R)として読み込むためのサポートを追加するPRです。Webcil v1ヘッダーにTableBaseフィールドを追加し、WASM実行環境のインポート方法を変更("env"から"webcil"へ)、cDACのWebcil解析をスペック定義の固定オフセットに基づく実装に更新しました。
R2R(Ready-to-Run)コンパイル時にComparer<T>.DefaultとEqualityComparer<T>.Defaultの初期化をIntrinsic化し、リフレクションベースのコンパラー構築を排除する変更です。これにより、R2Rコンパイラが各ジェネリック型の特殊化されたヘルパーを認識し、実行時の解釈を防ぐことができます。
UnsafeMethodMissingRequiresUnsafeAnalyzer.csのコード形式を ILLink.RoslynAnalyzer プロジェクトのコーディング規約に統一する変更です。メソッド呼び出し/宣言前の空白を削除し、K&R形式の波括弧をAllman形式に統一して、プロジェクト全体のコードスタイルの一貫性を改善します。
LINQ の GroupJoin メソッドに新しいオーバーロードを追加します。従来のオーバーロードで必須だった結果セレクターを廃止し、IGrouping<TOuter, TInner> を直接返すシンプルな API を提供します。Enumerable、Queryable、AsyncEnumerable の3つのクラスに対応します。
// 新しいオーバーロード(結果セレクター不要)
var groupedResults = outer.GroupJoin(
inner,
o => o.Id,
i => i.OuterId,
comparer: null); // optional
// 従来のオーバーロード(結果セレクターが必須)
var groupedResults = outer.GroupJoin(
inner,
o => o.Id,
i => i.OuterId,
(o, g) => new { o, Items = g }); // 結果セレクター指定が必要
ドキュメント整理PRの後続対応として、WebAssemblyとFreeBSD クロスビルド関連のドキュメントを更新。Ubuntu 18.04時代の古いガイダンスをAzure Linuxベースの現在の前提条件イメージとdotnet/versions参照に置き換えました。テスト対象はドキュメントのみです。
release/8.0ブランチのMarkdownlintワークフローをNode.js LTSで実行するように更新しました。従来のNode 16ランタイムで動作していたmarkdownlint-cliの失敗を解決するための変更です。
release/8.0ブランチのWebAssembly(WASI + Browser)Helix キュー用コンテナイメージ参照をUbuntu 26.04 WebAssembly前提条件イメージに更新するバックポートです。WASI、Browser WASM、およびBrowser WASM Firefoxのテスト環境を新しいWebAssemblyコンテナベースラインに統一します。
release/9.0 ブランチの WebAssembly(WASI および Browser)テスト実行環境を、Ubuntu 26.04 ベースの公開 WebAssembly イメージに更新します。WASI、Browser WASM、Browser WASM Firefox のテスト環境が新しい Helix キューイメージを使用するようになります。
release/10.0ブランチのWebAssembly(WASI・Browser)Helix テストキューのコンテナイメージバージョンをUbuntu 26.04に更新します。これにより古いUbuntu 22.04/24.04イメージの使用を回避し、公開パイプラインと内部パイプラインの正しいキュー識別子(.Openサフィックス)の使い分けを実現します。
WebAssembly/WASI Helix テストインフラを Ubuntu 26.04 の最新プリレクイサイトイメージに更新し、公開 Helix キュー識別子を .Open サフィックス規約に統一するメンテナンスPRです。Ubuntu 22.04 の「oldest」カバレッジスロットは保持されます。
crossgen2に新しいコマンドラインオプション --rtr-header-symbol-name を追加し、複合ReadyToRun(R2R)イメージの出力シンボル名をカスタマイズできるようにします。デフォルトは RTR_HEADER で、複数のR2Rイメージを直接リンクするカスタムホストでシンボル衝突を回避する必要がある場合に使用されます。
PKCS#12 SafeContentsBag のデコード処理を再帰的な実装から反復的(スタックベース)な実装に変更し、深くネストされた構造でのスタックオーバーフローを防ぎます。深さ3333のネストされたPFXをデコードするリグレッションテストも追加されます。
X86Base のハードウェア組み込み関数テストにおいて、インタープリタ実行時の PlatformNotSupportedException を回避するため、X86Base.CpuId 呼び出し前に X86Base.IsSupported チェックを追加しました。
DirectoryNotFoundExceptionにDirectoryPathプロパティを追加し、FileNotFoundException.FileNameと同じパターンで欠落ディレクトリパスへのアクセスを可能にします。新しいコンストラクタ、ToString()オーバーライド、シリアライゼーションサポートを実装し、ランタイム内の18箇所のスロー箇所でディレクトリパスを渡すよう更新しました。
NativeAOT の依存関係追跡を調整し、外部型マップエントリの trim 対象型が正規形を持つ場合に、その正規形に対応するテンプレート型レイアウトを到達可能な状態で保持するようにします。これにより、外部型マップエントリで保持される trim 対象型が正規形を持つ際に、対応するテンプレートレイアウトも確実に存在するようになります。
Renovateサポートを追加し、コンテナイメージの依存関係を自動的に最新の状態に保つパイプラインを実装します。初期設定ではコンテナイメージのダイジェストピニング(digest pinning)を使用し、pipeline-with-resources.ymlで参照されるイメージの更新を自動化します。Helixイメージも含めてダイジェストピニングに対応しています。
古いSIMD型(Vector2/Vector3)がHWIntrinsicsに移行したため、JITコンパイラに残存していた死活コード(未使用のlowering処理)を削除するクリーンアップです。
ReadyToRun (R2R) コンパイル時に非同期メソッドのインライン化を制限していた制約を削除します。これにより、await を含まない非同期メソッドはコンパイル時にインライン化されるようになります。69個すべての非同期テストが crossgen2 および composite R2R で合格しており、実装の妥当性が確認されています。
Monoランタイムでカスタム属性値を読み込む際に、MONO_TYPE_GENERICINST型に対してm_type_data_get_klass()を無条件に呼び出すことによるクラッシュを修正しました。ジェネリック列挙型インスタンスを含むカスタム属性のデコード時にクラッシュが発生していましたが、この修正によりCoreClrと同じ動作になります。
using System;
using System.Reflection;
using System.Runtime.InteropServices;
var attr = typeof(C).CustomAttributes.Single(d => d.AttributeType == typeof(A));
var arg = attr.ConstructorArguments.Single();
Console.WriteLine(arg.GetType()); // System.Reflection.CustomAttributeTypedArgument
class A : Attribute
{
public unsafe A(B<delegate*<void>[]>.E e) { }
}
class B<T>
{
public enum E { }
}
[A(default)]
unsafe class C { }
LINQ の Join、LeftJoin、RightJoin に対して、resultSelector ラムダを省略できるタプル返却オーバーロードを追加します。これにより、結合結果をシンプルに取得できます。
使用例:
// Before
foreach (var (s, pair) in keys.Join(dict, k => k, p => p.Value, (outer, inner) => (outer, inner)))
Console.WriteLine(s + " : " + pair.Key);
// After
foreach (var (s, pair) in keys.Join(dict, k => k, p => p.Value))
Console.WriteLine(s + " : " + pair.Key);
FEATURE_CORPROFILERのフィーチャーフラグ定義が誤ってFEATURE_DYNAMIC_CODE_COMPILEDブロック内に配置されていたのを修正します。プロファイラーサポートは動的コード生成と独立しており、iOS/Androidなどプラットフォーム間で一貫して扱う必要があるため、フラグを独立した箇所に復元します。
PR #117583で導入されたJIT側のインライン化・イントリンシック処理を取り除き、stelem.ref配列格納とWriteBarrier処理を従来のパターンに戻すRevartです。RuntimeHelpers.WriteBarrier イントリンシックを削除し、CastHelpers.WriteBarrier をFCALL経由のJIT_WriteBarrier_Callable ヘルパーに置き換えます。これにより#126516の問題を修正することが期待されています。
WASI(WebAssembly System Interface)プラットフォーム向けに、getrandom() が利用できない場合の代替手段として getentropy() を minipal/random.c に追加します。wasi-libc は getentropy() を __wasi_random_get() で実装しており、既に C ランタイムで使用されているため、これを活用して RandomNumberGenerator.Fill() が WASI で動作するようにします。CMake のシンボル検出機能を使用することで、WASI に限らず getentropy() を持つ他のプラットフォームにも対応します。
System.Diagnostics.Process の NativeAOT トリミング性を向上させるため、リモートマシン対応をレイジー初期化し、ローカルプロセス列挙用の専用エントリポイントを追加しました。従来、Process.Start("notepad.exe").WaitForExit() のような単純な使用でもリーチング可能性の連鎖により PerformanceCounterLib やリモートレジストリ機能が含まれていたものを、遅延初期化デリゲート技法により分離します。Win-x64 NativeAOT アプリで約 22% (340kB) のコード削減を実現しました。
MethodDescCallSiteをUnboxedCallOp(UCO)に変換し、エントリーポイントでの呼び出しを最適化するPRです。スレッド開始時のRunMainInternalとメソッド呼び出し時のCorHost2::ExecuteAssemblyを対象としており、#123864の優先度3項目を実装しています。
Breaking Change ドキュメンテーション自動化ワークフローをレガシーな PowerShell スクリプト + 従来の GitHub Actions ワークフローから GitHub Agentic Workflow(gh-aw)ベースの実装に移行します。新しいアプローチでは、専用の breaking-change-doc スキルとヘルパースクリプトを使用して、PR の破壊的変更に関するドキュメント生成を自動化します。
OpenBSDがcgroupsをサポートしていないことを明示するための修正です。併せてHAVE_NON_LEGACY_STATFSの問題も修正しています。
update-os-coverageスキルのドキュメントにPrerequisitesセクションを追加し、YAML/ドキュメントのみの変更(Helixキュー・イメージ参照の更新)には repo-wide baseline buildが不要であることを明確化しました。製品コード変更が必要になる場合のみ copilot-instructions.md を参照するよう指示を改善しています。
DependabotがGitHub Actions workflow向けに自動生成される.github/workflows/*.lock.ymlファイルのバージョン更新を行わないようにするため、Dependabot設定に除外パターンを追加しました。これにより、生成されたロックファイルに対する不要なPull Requestの発生を防ぎます。
System.Text.Json ソースジェネレータが汎用型の UnsafeAccessor ラッパークラスを生成する際、型パラメータの制約を伝播していなかった問題を修正します。制約(例:where TResponse : notnull, AuthenticatorResponse)が欠落していると、ダウンストリーム(AspNetCore)でCS0314コンパイルエラーが発生していました。
修正により、生成されるジェネリックアクセサクラスに型パラメータ制約が正しく付加されます:
// 修正後
private static class __GenericAccessors_MyType<TResponse>
where TResponse : notnull, global::AuthenticatorResponse
{
[UnsafeAccessor(...)]
public static extern ... __get_...(PublicKeyCredential<TResponse> obj);
}
UTF-8文字列マーシャリング相互運用テストスイートの前回の書き直しを戻すPRです。xUnit Theory/MemberDataベースのテスト構造をシングルアウターループエントリーポイントに戻し、outerloopの実行失敗を解決します。PR #126366の変更を完全に戻します。
JITコンパイラにおいて、funclet(例外処理や遅延処理のコード領域)とそこに含まれるブロックに対してrange-based forループでの反復処理をサポートするようにしました。これにより、コード可読性と保守性が向上します。
Blazor WASMテストにおいて、遅延したWindows Helix Docker環境でのPlaywrightタイムアウトを削減するため、要素操作前に明示的なWaitForAsync(Visible)呼び出しを追加し、ClickAsyncのタイムアウトをデフォルトの30秒から60秒に増加させました。遅いCI環境でのCSS遷移やレイアウトの再フローが原因で、要素が「安定した」と判定されないことによるタイムアウト例外を回避します。
FEATURE_CORPROFILER ビルド時フラグを導入し、ICorProfiler サポート(PROFILING_SUPPORTED、PROFILING_SUPPORTED_DATA、FEATURE_PROFAPI_ATTACH_DETACH)をオプション化しました。WASM ターゲットでは無意味であるため FEATURE_CORPROFILER を 0 に設定し、プロファイリング機能を完全に無効化します。これにより、非プロファイリング対応ビルドのコードサイズと複雑さを削減できます。
BigInteger.DivRemメソッドのuse-after-return バグを修正します。ArrayPool<nuint>.SharedからレンタルされたquotientBufferが、BigIntegerコンストラクタがその内容をコピーする前に返却される問題がありました。この修正により、バッファの返却前にquotient値がコピーされるようにしています。
Microsoft.Extensions.Caching.MemoryのOpenTelemetryメトリクス名とタグ名をdotnet.cache.*命名規則に統一する変更です。メトリクス計測器名とタグキーをリネームし、複数形から単数形への単位文字列調整も含まれます。
System.Diagnostics.ProcessのProcessNameプロパティとToString()メソッドで、Linux/macOS上で完全なProcessInfoの構築を避けることで パフォーマンスを改善します。また、ProcessInfoを必要としないAPIのみを使用する場合、トリミング時にProcessInfo関連コードを削除できるようにします。
WebCilランタイムの基本再配置スキーム実装です。WasmObjectWriterがPEスタイルの基本再配置をWebcilのrelocセクションに出力し、CoreCLRのWebcilローダーがこれらの再配置を適用するよう更新されました。標準的なイメージベース再配置に加えて、Wasm関数ポインタテーブルベース用の新しい再配置タイプ(wasm32/wasm64対応)が追加されています。
Composite R2R モード(複合ReadyToRun)でのcrossgen2クラッシュを修正します。複数のTypeMapノードが同一のClassCodeを持つ場合、CompareToImplが未実装であるため、依存関係グラフソーターが"Multiple nodes of this type are not supported"例外をスローしていました。本修正では、TypeMapノードにモジュール認識機能を追加し、モジュール単位で一意なノードを生成することで、決定的なソート順序を確立します。
Large Version Bubble(LVB)複合R2Rイメージにおいて、ManifestReferenceAssembliesがReadyToRunAssemblyHeadersよりも多くのエントリを含む場合に、R2RDumpツールがArgumentOutOfRangeExceptionで異常終了する問題を修正します。マニフェストに含まれるバージョンバブルアセンブリ参照が実際のコンポーネントアセンブリ数を上回る場合、イテレーション時にインデックスが範囲外になることを防ぎます。
Helix キュー定義ファイルにおけるOS バージョン参照を自動更新するための新しい Copilot スキル(update-os-coverage)を追加します。このスキルは、コンテナイメージの可用性確認、EOL日付の確認、パイプラインファイル内の参照スキャン、バージョン更新の適用、陳旧化した参照の検証、リリースブランチの確認、および supported-os.json との照合を含む、OS バージョン更新の完全なプロセスを自動化します。
CLR→COM イベント処理と遅延バインディング スタブを、レガシーな「汎用スタブ + CLRToCOMMethodFrame」モデルから IL スタブに移行します。これにより、CLR→COM 動作を既存の IL スタブ インフラストラクチャに統合し、デバッガ/スタックウォーク処理の特殊ケース対応を削減します。イベント処理スタブは基本的な IL スタブ インフラの上に実装され、遅延バインディング スタブは IL スタブ インフラストラクチャの拡張版として実装されます。
PNSE(Platform Not Supported Exception)アセンブリビルドにおいて、IntelliSenseパッケージに依存せず、互換性のある非PNSEシブリングターゲットフレームワークから生成されたコンパイラドキュメントXMLを再利用するようにビルドロジックを更新しました。これにより、PNSEビルドの外部依存性を削減します。
cDAC(コンポーネント化DAC)に ISOSDacInterface5.GetTieredVersions を実装し、ネイティブコードバージョンの最適化ティアを分類するAPIを提供します。R2Rイメージの境界チェックとティアード・コンパイル適格性を確認して、各ネイティブコードバージョンを正しいティアに分類します。ティアされていないメソッドやコード生成がないメソッドはUnknownを報告し、コントラクト表面を最小限に保ちます。
cDAC(Compact Data Access Container)データディスクリプタ基盤に型システムを追加しました。従来はC言語のコメント(/*uint32*/)で指定されていたフィールド型を、プリプロセッサマクロ(T_UINT32、T_POINTER、TYPE(GCHandle)など)で明示的に表現するようにしました。これにより、型情報のコンパイル時検証が可能になります。
COM→CLR スタブのアーキテクチャを Reverse P/Invoke(UnmanagedCallersOnly)モデルに統合し直すことで、レガシーな動的スタックレイアウト+直接 IL スタブ呼び出しのアプローチを廃止します。これにより、実行可能ヒープ上の ComMethodTable/ComCallMethodDesc の割り当てと手動アセンブリパッチングが不要になります。
DAC(Debugging Assistant Component)メモリ列挙時に、バインダーが適切に列挙されていない問題を修正します。dumpobj実行時にRCWテーブルへのアクセスでDAC障害が発生する潜在的なバグを解決します。
dotnet.thread_pool.queue.length メトリクスが不適切な ObservableCounter から ObservableUpDownCounter に変更されました。ThreadPool.PendingWorkItemCount は現在のスナップショットを報告するため、単調増加のカウンターではなく増減可能なカウンターが正しい実装です。これは同じ理由で既に ObservableUpDownCounter を使用している dotnet.thread_pool.thread.count との一貫性を確保します。
GitHub Actionsワークフローファイルに記載されたピン留めされたSHA参照のインラインバージョンコメントが、実際のタグと不一致になっていた問題を修正します。Dependabotが参照を更新する際、コメントが同期されていなかったため、すべてのワークフローファイルを監査してバージョンコメントを正確に更新しました。
Apple mobile(iOS、tvOS、MacCatalyst)およびAndroidデバイス上でPlatformNotSupportedExceptionをスローするテストやプラットフォーム固有の動作により失敗するテストをスキップし、CI レグテストのタイムアウトを増加させる変更です。モバイル環境での不安定なテスト実行を改善し、CI パイプラインの信頼性を向上させることが目的です。
src/libraries 配下のWindows固有実装ファイルの命名規則を統一し、歴史的遺物である *.Win32.cs から *.Windows.cs への一括リネームを実施しました。Windows Store アプリが完全なWin32 API サーフェスを使用できるようになった現在、この区別は不要になったため、命名を現代的な慣例に統一します。
P/Invoke でマーシャリングされた [Out, MarshalAs(UnmanagedType.LPArray)] string[] パラメータにおいて、ネイティブ バッファが初期化されないまま確保され、ネイティブ呼び出し側が未初期化ポインタを解放しようとするとヒープ破損が発生する問題を修正しました。Out のみのパラメータについて TransformManagedToNative がスキップされていた根本原因に対処しています。
Runtime_126043 GC回帰テストプロジェクトでServer Garbage Collectionを有効化し、NativeAOTビルドがServer GC ランタイムに対してリンク/コンパイルされるようにします。これにより、NativeAOT outerloopのカバレッジを改善することを目指しています。
System.DirectoryServices.AccountManagementにおけるLDAPフィルタ構築時の脆弱性を修正。ADUtils.EscapeRFC2254SpecialCharsを使用して、LDAP フィルタ文字列に挿入される値をエスケープし、(、)、*、\などのRFC 2254特殊文字を含む値がフィルタを破損させるのを防止します。併せて、エスケープ機能の単体テストを追加。
Fedora Helix テストキューを Fedora 44(最新)に更新し、Fedora 43 を最古バージョンとして保持するビルドインフラの更新。Fedora 42 は削除されます。このPRはAI/Copilotツール(update-os-coverage skill)で自動生成されました。
ランタイム非同期メソッドおよび同期メソッドにおいて、インタープリタが全IL命令を走査する前にエピローグを発行する場合、m_synchronizedOrAsyncRetValVarIndexが初期化されないという正確性の問題を修正します。この変数はCEE_RETによる戻り値の保存・復元に使用されるため、未初期化のままではCEE_RETが不正な値を参照する可能性がありました。
PR #125995で導入されたdocker-composeからdocker composeへのコマンド変更をリバートするPRです。一方で、Azure Linux 3イメージプール(build.azurelinux.3.amd64.open)への移行は維持されます。HTTP/SSLストレステストおよびエンタープライズネットワーキングパイプラインにおけるDockerコンテナオーケストレーション機能に影響します。
WebAssembly RyuJIT コンパイラにおいて、ブロックストア(GT_STORE_BLK)の低レベル化とコード生成時に、ネイティブなmemory.copy/memory.fill命令を使用する特殊なケースで不正なアサーションが発生する問題を修正します。非フォルティング(non-faulting)アドレスの場合に不要な一時レジスタの生成を避けることで、レジスタ割り当てエラーを解決します。
WebAssembly (Wasm32) ターゲットにおいて、Vector<T> の SIMD 幅を 128 ビットに明示的に設定することで、crossgen2 が Wasm シグネチャと依存関係分析を計算する際に LayoutInt.AsInt() の例外発生を修正します。また、Wasm クライアント側 JIT が存在しないため、命令セット最適化の楽観的な判定を無効化します。
デバッガ転送セッションのプロセス終了時のシャットダウンパス(非Windows系)におけるNULLポインタ逆参照クラッシュを修正しました。DbgTransportSession::AbortConnection()が保護なしにm_channelポインタにアクセスしていた問題を、転送ワーカースレッドがこのポインタをNULLに設定・置き換えるため発生していました。
インタープリタIR(中間表現)のダンプ機能をInterpCompilerクラスの外部で利用可能にするリファクタリング。デバッガから直接呼び出し可能なInterpDumpIR()エントリーポイントを追加し、クラッシュ時のデバッグを容易にします。
// デバッガから使用例
(lldb) call InterpDumpIR(pFrame->startIp)
// インタープリタバイトコードのIR表現をダンプ
CoreCLR デバッグコンポーネントのネイティブリソース管理をリファクタリングし、レガシーな ArrayHolder と NonVMComHolder スマートポインタクラスを holder.h で定義された新しい汎用ホルダーで置き換えました。arrayholder.h と releaseholder.h を削除し、トレイトベースの堅牢なホルダー実装(NewArrayHolder、AStringHolder、WStringHolder、ReleaseHolder など)を統一導入することで、コード安全性と保守性を向上させます。
UTF8文字列マーシャリング相互運用テスト スイートを最新化するもので、ループ駆動の単一[Fact]テストを粒度の細かい[Theory]ベースのテストに分割し、ネイティブ関数が例外発生ではなくBOOL戻り値で検証結果を報告するよう変更しています。複数のテストクラスをStringMarshaling.UTF8Testsに統合し、テストの可読性と保守性を向上させています。
InMemoryDirectoryInfoのパス解決バグ(..パターンおよび相対パスの処理)を修正し、相対パスが正しくFullNameに対して解決されるようにしました。GetDirectoryとGetFileは、入力パスとFullNameをPath.Combineで結合し、Path.GetFullPathで正規化することで、..セグメントを適切に解決します。また、パターンマッチャーの動作を保持するため、isParentPathフラグでNameを".."として保存します。
MacCatalystプラットフォームでのSystem.Diagnostics.Processのテスト整備と実装修正。RemoteExecutorが非サポートのモバイルプラットフォーム(Android・MacCatalyst)向けに、Unix標準ツール(ls、sleep)を使用した統一テストスイートを追加し、Console.OpenStandard*Handle()の不適切な利用を防ぐ修正を実施。
PR #125799でBigInteger内部がnuint limbs対応に書き直された際、FastReducer.SubModの補償ループが32ビットプラットフォームで無限ループになる問題を修正しました。Barrett reduction後のk limb截断では、AddSelfループが最大2^64回反復する可能性があり、32ビット環境で実行不可能でした。修正では、unsigned underflowを許容するインライン減算に置き換え、Barrett reductionの数学的保証を活用します。
JIT コードヒープの列挙と詳細情報取得を行うための新しい cDAC API GetCodeHeapList と GetCodeHeapInfo を IExecutionManager コントラクトに追加します。CoreCLR VM の型記述子拡張、マネージドコントラクト実装、レガシ SOS DAC アダプタ、およびテストカバレッジを含みます。
マルチクライアント・ホスト型Blazor WASMシナリオにおけるパブリッシュ時の静的ウェブアセット処理の不具合を修正。複数のクライアントプロジェクト(Client1、Client2)がパブリッシュされる際に、CopyToPublishDirectory=Neverでマークされたアイテムが不正に処理され、ビルド時にマテリアライズされたFrameworkアセットが同じSDKパスに置き換わることで、重複キーエラーが発生していました。GroupResolvedFilesToPublishからCopyToPublishDirectory=Neverアイテムをスキップすることで、プロジェクトごとのユニークなIdentityを保持するように修正。
CompilerTypeSystemContext.AddModuleでBadImageFormatExceptionがスローされる際に、ファイルパスを含めることで診断情報を改善します。PEReaderの遅延初期化により、例外メッセージにどのファイルが失敗したかの情報がなかったため、例外をキャッチして新たにファイルパスを付加した例外を再スローするようにしました。
変更前:
System.BadImageFormatException: Unknown file format.
変更後:
System.BadImageFormatException: Bad IL format. The format of the file 'C:\foo\bar.dll' is invalid.
異なるAssembly Load Context(ALC)から読み込まれた型間のキャストでInvalidCastExceptionが発生した場合、特にジェネリック型の型引数が異なる場合の診断メッセージを改善します。ジェネリック型引数の違いと、それぞれが属するアセンブリ/ALC情報をエラーメッセージに含めることで、デバッグを容易にします。
cDAC(Common Data Access Component)にTranslateExceptionRecordToNotification APIを追加し、デバッガ通知の例外レコードをマネージド側でデコードするための機能を実装しました。新しいINotifications契約APIとそれに関連する公開データ型(NotificationType、GcEventType、GcEventData)を追加し、レガシーIXCLRDataProcess COM相互運用性に統合しています。
Windows NTFS の pending-delete レースコンディションと FileSystemWatcher テスト基盤のハンドルリークにより発生していた DirectoryNotFoundException フレーキーテストを修正するPRです。
主な修正内容:
FileSystemWatcher を確実に破棄ComInterfaceGeneratorをRoslyn SyntaxNodeベースの出力からIndentedTextWriterを使用した文字列ベースの出力に移行するポート作業です。スタブノード生成の一時的な互換性維持のため、ヘルパーメソッドを追加し、複数に分割されていた部分宣言を統合することで生成コードの構造を簡素化しました。
macOS/BSDプラットフォームでConvertFileStatusがst_flagsの全ビットをUF_HIDDENのみに縮約していた不具合を修正します。この問題により、.NETが隠し属性を変更する際に他のBSDユーザーフラグ(例:UF_IMMUTABLE、UF_NODUMP)が意図せず消去される可能性がありました。合わせて、PAL_UF_HIDDENとUF_HIDDENが一致することを検証するstatic assertを追加しています。
NativeAOT publish統合を、SDK提供のNativeCompileターゲットフック経由で実装するよう変更しました。従来の脆弱なBeforeTargets/AfterTargetsによる依存関係管理から移行し、publish パイプラインの順序付けをより明示的で堅牢にします。
Windows ボリュームマウントテストのfinallyブロック内でアンマウント時に発生する予期されたWin32エラーを無視し、テスト失敗を防ぐための改善。MountHelper.UnmountにdeleteDirectoryパラメータを追加し、エラーコード 4390(ERROR_NOT_A_REPARSE_POINT)と 3(ERROR_PATH_NOT_FOUND)をサイレントに処理することで、クリーンアップ処理をより堅牢にします。
NonBacktracking正規表現エンジンの入れ子ループパターン(例:((a)*)*)における指数的な時間計算量の問題を修正。深さ2000のネストでの単一文字マッチが10.7秒かかる問題を、ループフラット化、キャッシング、NFA推定値の改善により解決。匹敵の線形時間保証は維持される(パターン複雑度定数の指数的増加をパターン構築段階で制限)。
Apple モバイルプラットフォーム(iOS/tvOS シミュレータ・デバイス、MacCatalyst)のCI テストマトリックスを削減し、macOS キューの混雑を緩和しながら、デフォルトシナリオに焦点を当てるようにパイプライン設定を最適化します。テストカバレッジは一般的な開発者・ユーザーシナリオに絞られています。
System.Text.Json ソースジェネレータが、[UnsafeAccessor] (NET8+ の非ジェネリック型) またはキャッシュされたリフレクションデリゲート (旧ターゲット/ジェネリック型) を使用して、アクセス不可能なメンバーへのアクセスを実現します。これにより、3つの以前未対応シナリオが可能になります:
[JsonInclude] によるアクセス不可能プロパティのサポート: getters/setters がアクセス不可能な場合でも完全に機能[JsonConstructor] のアクセス不可能コンストラクタのサポート: SYSLIB1222 警告なく呼び出し可能// (1) Init-only プロパティのデフォルト値保持
public class Foo
{
public int Value { get; init; } = 42;
}
// 修正前: "{}" デシリアライズ時に Value=0
// 修正後: Value=42 (デフォルト値保持)
// (2) [JsonInclude] によるアクセス不可能プロパティ
public class Bar
{
[JsonInclude]
private string Secret { get; set; } = "hidden";
}
// 修正前: InvalidOperationException
// 修正後: 完全にサポート
// (3) アクセス不可能な [JsonConstructor]
public class Baz
{
[JsonConstructor]
private Baz(string name) { Name = name; }
public string Name { get; }
}
// 修正前: SYSLIB1222 警告で無視
// 修正後: UnsafeAccessor/リフレクションで呼び出し
CORINFO_HELP_ARRADDR_ST ヘルパー呼び出しをインライン化し、WriteBarrier FCallを削除することで、配列要素の代入パフォーマンスを大幅に改善します。JITが共変性チェック付きの書き込みバリアをインライン化できるようになり、冗長な書き込みバリアと範囲チェック(以前はヘルパー内部に存在)の削除が可能になります。
select-copilot-pat アクションのREADMEを更新し、gh aw secrets setコマンドの実行に必須となるgh aw CLI拡張機能のインストール手順をオンボーディングステップとして文書化しました。
テストアーカイブの圧縮処理の高速化を目的とした変更です。ZipDirectory呼び出しの圧縮レベルをデフォルトのOptimalからFastestに変更することで、ビルドパイプラインの圧縮時間を削減します。Binlog分析により、osx-arm64 Libraries_CheckedCoreCLR legで255回のZipTestArchive呼び出しが8.2分のCPU時間を消費していたため、この改善により大幅な高速化が期待されます。Helixへのテスト転送ではAzureネットワークの速度が十分であるため、ファイルサイズのわずかな増加は許容範囲です。
Apple mobile デバイスキューの信頼性の問題を回避するため、ランタイムパイプラインで ios_arm64/tvos_arm64 デバイスキューの代わりに iossimulator_arm64 シミュレータキューを使用するよう変更しました。この変更は一時的なもので、デバイスキューの問題が解決されるまでの措置です。
src/testsのパッケージ復元プロセスを最適化し、複数回の復元呼び出しを一度の処理に統合しました。これにより、ビルド時間を大幅に短縮します(約3分20秒から約1秒に改善)。
複数のライブラリに散在していたダウンレベルポリフィル(BitOperations、Stream、StringBuilder、Stack)をCommon/src/Polyfills/に統合し、コードの重複を排除して保守性を向上させます。Memory依存のストリーム拡張メソッドはStreamMemoryPolyfills.csに分離し、不要な依存関係の追加を防いでいます。
Background GC(BGC)のmark phase内で誤った join struct instanceが使用されていたバグを修正します。gc_t_join(通常のmark phase用)をbgc_t_join(BGC専用)に置き換え、Java GC bridge処理中のBGCスレッド同期を正する変更です。特定の負荷パターン(GCPerfSim)でGCハングが発生していました。
ReadyToRun(R2R)コンパイル時のタイプマップ生成における失敗を修正するPR。外部タイプマップノードとプロキシタイプマップノードに対して、タイプマップグループ型を明示的なインポート依存関係として追加することで、生成されたタイプマップがグループ型を正しく参照できるようにします。
runtime-libraries-interpreterパイプラインのLinux環境での100%の失敗を修正。原因はbuildConfig: release(小文字)がLinuxのケースセンシティブなファイルシステムで、ビルド成果物のRelease(PascalCase)と一致していなかったため。buildConfig: Releaseに変更することで、SendToHelixステップが正しいパスのtesthost実行ファイルを見つけられるようにします。
AsyncOperation.SignalCompletionで継続状態を読み取る際に、メモリバリアの欠落による再順序化を防ぐ修正です。マルチスレッド環境での競合状態を解決し、継続状態の正確な読み取りを保証します。
libnethostをスタティックライブラリとして利用するシナリオを検証するため、nativehost_staticビルドターゲットとスモークテストを追加します。このPRではネイティブホスティング機能のスタティックライブラリ利用パターンに対応するテストインフラを整備しています。
AsyncEnumerable.ToAsyncEnumerable()メソッドを改善し、入力ソースが既にIAsyncEnumerable<T>を実装している場合(例:EF Core queryableなど)に、同期ラッパーで囲まずに元のインスタンスをそのまま返すようにしました。これにより、既存の非同期実装パスが保持され、不要な同期化を防ぎます。
return source switch
{
IAsyncEnumerable<TSource> asyncEnumerable => asyncEnumerable, // 新規追加
TSource[] array => ...,
List<TSource> list => ...,
// ...
};
ストレステストパイプライン(http.ymlとssl.yml)にパスベースのPR トリガーフィルターを追加しました。これにより、関連ファイルが修正されたPRのみでストレステストが実行され、すべてのPRでの不要な実行を削減します。
シングルスレッド環境(ブラウザWASMなど)での Thread.Start() の非サポートに対応するため、5つのランタイムテストを ConditionalFact 属性で条件付け化します。マルチスレッド対応プラットフォームでのみテストが実行されるようになります。
System.Reflection.MetadataLoadContextをC# 14の拡張メンバー機能を使用してリファクタリングしました。従来のヘルパーメソッド呼び出しから、プロパティスタイルのアクセスに移行することで、モダンなType APIの利用を簡潔にしています。NetStandard向けのポリフィルを拡張メンバーで実装し、NetCore向けのエミュレータレイヤーを削除しました。
TlsFrameHelper内の複数の境界チェック不具合を修正し、SslStreamサーバーハンドシェイク時に非ClientHelloフレームを早期に検証・拒否します。SslStreamClientHelloFuzzerによって発見されたアウトオブバウンズアクセスバグを解決し、堅牢性を向上させます。
runtime-asyncをnet11.0以上の共有フレームワークソースプロジェクトで自動有効化し、ランタイム構成ノブを完全に削除する変更です。また、RISC-VとLoongArchのPEリロケーション処理を修正して、非ゼロアディーブの適切なサポートを実現します。
Native AOT個別テストのビルド手順に関するドキュメント更新。src/tests/build.*スクリプトで個別テストをビルドする際に、MSBuildプロパティに加えてnativeaot引数を渡す必要があることを明記しました。
cDAC Helix コマンドの MSBuild エンコーディングとアーカイブ終了コードの取得を修正するもの。$? を %24%3F にエスケープして MSBuild のワイルドカード展開を防ぎ、tar コマンドの失敗をキャプチャしてテスト終了コードと統合する。
AndroidのSELinuxアプリサンドボックスがlinkシステムコールを拒否することにより、File.CreateHardLinkを呼び出すテストでUnauthorizedAccessExceptionが発生していた問題を修正します。System.Formats.Tar.Testsのハードリンク関連テストをMountHelper.CanCreateHardLinksで条件付きスキップするようにしました。これにより、Android(x86/arm/arm64/x64)およびシンボリックリンク作成が不可能なプラットフォーム上での154件のCI失敗を解消します。
SafeProcessHandleにKill()とSignal(PosixSignal)メソッドを追加し、Processを経由せずにハンドル経由でプロセスを終了またはシグナル送信できるようにしました。Kill()はプロセス終了をリクエストし、既に終了している場合は暗黙的に成功します。Signal(PosixSignal)は任意のシグナルを送信し、プロセスが存在しない場合はfalseを返します。両メソッドは無効なハンドルでInvalidOperationExceptionをスロー、iOS/tvOSでPlatformNotSupportedExceptionをスローします。
ダウンレベルターゲット(.NET Standard 2.0、.NET Framework等)向けのポリフィルを共有される src/libraries/Common/src/Polyfills/ に集約し、複数のライブラリから #if NET 条件分岐を削除することで、コード維持性を向上させます。ポリフィルにより、非.NETCoreAppターゲットでも最新のAPI(Stopwatch.GetElapsedTime、double.IsFinite、Array.MaxLength等)を無条件で呼び出せるようになります。
C# 14のオーバーロード解決ルール変更により、MemoryMarshal.AsBytes<T>(int[])とMemoryMarshal.Cast<TFrom, TTo>(int[])がReadOnlySpanオーバーロードに解決される問題を修正します。既存コードでSpan<byte>への割り当てが失敗する破壊的変更を回避するため、[OverloadResolutionPriority(1)]属性をSpanオーバーロードに追加し、優先度を上げます。
int[] bits = [];
// C# 14: 修正後はSpanオーバーロードに解決
Span<byte> asBytes = MemoryMarshal.AsBytes<int>(bits);
Span<ulong> cast = MemoryMarshal.Cast<int, ulong>(bits);
NativeAOT publishing時にWindows SDKが不足している場合のエラーメッセージを改善しました。vcvarsall.bat実行後にWindowsSdkDir環境変数が設定されていない場合に、より明確なエラーメッセージを表示するようになりました。これにより、従来のLINK : fatal error LNK1181: cannot open input file 'advapi32.lib'といった不明確なリンカエラーの代わりに、Windows SDKの不足を明示するメッセージが表示されます。
メタデータコンパイラのインポートヘルパーで、pCommonAssemImportがnullのパスがCreateAssemblyRefFromAssemblyに到達する可能性を修正しました。null参照を回避するため、使用前にnullチェックを追加しています。静的解析ツール(SVACE)により検出されました。
Android プラットフォームにおける NativeAOT Exceptions smoke テストで、Server GC が有効であるという要件を常に強制するように修正しました。従来は Android 固有の例外処理があり、Server GC チェックがスキップされていましたが、この修正により すべてのプラットフォームで一貫した検証が行われるようになります。
WASM/WASI関連のHelixテスト実行環境のホストVMをUbuntu 22.04からAzure Linux 3に変更するもの。コンテナイメージ(ubuntu-22.04-helix-webassembly)は変更されません。既存のhelix-platforms.yml:271で使用されている設定との一貫性を整える変更です。
Helix キューの ARM ホスト VM を Ubuntu 22.04 から Azure Linux 3 に統一する変更です。helix-platforms.yml の ARM コンテナホスト VM 定義を更新し、他のパイプラインテンプレート(libraries/helix-queues-setup.yml、coreclr/templates/helix-queues-setup.yml)で既に使用されている AzureLinux.3.Arm64 と一致させます。
コンテナイメージ(テスト OS)は変更なし:
cDAC(Compact Data Access Component)コンテキストにおいて、IDacDbiInterfaceの32メソッドをマネージC#で実装し、レガシーネイティブデリゲートスタブを置き換えるとともに、新しいIDebuggerコントラクトを導入します。これにより、デバッガー状態クエリの機能をコントラクトベースで提供できるようになります。
release/8.0ブランチのETWマニフェスト生成テストの不安定な動作を修正するバックポート。主要な2つのテスト(Test_EventSource_EtwManifestGenerationとTest_EventSource_EtwManifestGenerationRollover)に[ActiveIssue]属性を追加し、既知の問題を追跡します。この変更はmain、release/9.0、release/10.0で既に実施されており、release/8.0への遅れたバックポートです。
[ConditionalFact(nameof(IsProcessElevatedAndNotWindowsNanoServerAndRemoteExecutorSupported))]
[ActiveIssue("https://github.com/dotnet/runtime/issues/88027")]
public void Test_EventSource_EtwManifestGeneration()
System.IO.FileSystem.WatcherのテストのWindowsにおけるフレーキーな失敗を修正し、86個の無効化されたテストを再度有効化するテスト品質改善PR。製品コードには変更なし。テスト実行時にコールバック遅延に対する許容度を段階的に引き上げることで、CI環境でのスレッドプール圧力下での遅延イベント配信に対応。
CoreCLRテスト実行前にCore_Root内の古いバイナリを検出し、警告を発行するMSBuildターゲットを追加します。ローカルビルド出力よりも古いファイルがあれば警告し、テスト実行時に古いビット(stale bits)を使用することによる時間浪費を防ぎます。警告はSkipCoreRootFreshnessCheckで無効化できます。
macOS FSEventsが監視対象から非監視対象へのファイル/ディレクトリ移動時に重複したDeletedイベントを配信する問題を修正します。既存のisFilteredOutフィルタは古いCreated/Changedイベントのみ除外していたため、重複したDeletedイベントが収集され、テストが失敗していました。新しいCreateDeduplicatingFilter()ヘルパーを導入し、特定のイベント型を除外しつつ、重複イベントをConcurrentDictionaryで一意に保つようにしました。
x86/x64プラットフォームにおいて、AVX利用可能な環境でのSIMD DotProduct計算を最適化するもの。従来のvdpps/vdppd命令の代わりに、乗算(mul)+ 並べ替え(permute)+ 加算(add)のシーケンスを使用することで、パフォーマンスを向上させます。
このPRはcDAC(コンポーネント化DAC)にWalkStackReferences APIを実装し、スタック上のGC参照を報告する機能を追加します。また、cDACの正確性を検証するためのGC stress検証ツール(CdacStress)を追加します。cDACはランタイムの内部的なGCスタッククローリングと同等の管理実装を提供し、AMD64/ARM64(Windows/Linux)をサポートしています。
構造体マーシャリングをTransient ILに移行し、レイアウトクラスマーシャリングの処理を簡潔化するリファクタリングです。構造体マーシャリングはSystem.StubHelpers.StructureMarshaler<T>の各インスタンスに対してTransient ILで生成され、レイアウトクラスマーシャリングはSystem.StubHelpers.LayoutClassMarshaler<T>の管理側スタティクスでキャッシュされるようになります。これにより、汎用IL スタブキャッシュへの依存を削減し、マーシャリング関連のランタイムロジックを簡素化します。
cDAC(Compact DAC)のダンプテスト スタックウォーキング機能を改善するPRです。新しいDumpTestStackWalkerヘルパークラスを導入し、スタックフレーム検証テストの記述を簡素化します。Fluent APIにより、隣接性チェック、述語マッチング、双方向トラバーサルをサポートしています。
ReadOnlySequence<T>.Sliceメソッドの検証バグを修正しました。単一セグメント序列において、別の序列から取得したSequencePositionを渡すと、ArgumentOutOfRangeExceptionをスローせずに負の長さの無効なスライスが生成される問題を解決しています。