From 7bf5405f51180e90ba22f5fc09aa40659cb060a4 Mon Sep 17 00:00:00 2001
From: vseanreesermsft <78103370+vseanreesermsft@users.noreply.github.com>
Date: Tue, 6 Jan 2026 12:50:53 -0800
Subject: [PATCH 1/9] Update branding to 9.0.13 (#122888)
---
eng/Versions.props | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/eng/Versions.props b/eng/Versions.props
index 649271ecac2bea..4931b8a12bdd3a 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -1,11 +1,11 @@
- 9.0.12
+ 9.0.13
9
0
- 12
+ 13
9.0.100
8.0.$([MSBuild]::Add($(PatchVersion),11))
7.0.20
From eee60bfa62f69280850c0849af833c72cf1545be Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Thu, 8 Jan 2026 10:22:36 -0800
Subject: [PATCH 2/9] [release/9.0] Update dependencies from dotnet/emsdk
(#122941)
This pull request updates the following dependencies
[marker]: <> (Begin:f85f62c8-5e7d-4706-1003-08dcbc30275f)
## From https://github.com/dotnet/emsdk
- **Subscription**:
[f85f62c8-5e7d-4706-1003-08dcbc30275f](https://maestro.dot.net/subscriptions?search=f85f62c8-5e7d-4706-1003-08dcbc30275f)
- **Build**:
[20260106.4](https://dev.azure.com/dnceng/internal/_build/results?buildId=2873153)
([296188](https://maestro.dot.net/channel/3883/github:dotnet:emsdk/build/296188))
- **Date Produced**: January 6, 2026 8:44:11 PM UTC
- **Commit**:
[8f9e359ad95f422aec3c31c21ab188166f655842](https://github.com/dotnet/emsdk/commit/8f9e359ad95f422aec3c31c21ab188166f655842)
- **Branch**:
[release/9.0](https://github.com/dotnet/emsdk/tree/release/9.0)
[DependencyUpdate]: <> (Begin)
- **Dependency Updates**:
- From [9.0.12-servicing.25626.4 to 9.0.13-servicing.26056.4][1]
- Microsoft.SourceBuild.Intermediate.emsdk
- Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport
- From [9.0.12 to 9.0.13][1]
- Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100
[1]: https://github.com/dotnet/emsdk/compare/b9d2b36b97...8f9e359ad9
[DependencyUpdate]: <> (End)
[marker]: <> (End:f85f62c8-5e7d-4706-1003-08dcbc30275f)
Co-authored-by: dotnet-maestro[bot]
---
NuGet.config | 2 +-
eng/Version.Details.xml | 12 ++++++------
eng/Versions.props | 4 ++--
3 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/NuGet.config b/NuGet.config
index 63ffcb90ccd565..87d4e0fa32806b 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -9,7 +9,7 @@
-
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 1d68d66bf7f3d9..9b14a0db74b278 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -64,18 +64,18 @@
60faa90ec95fd499f8aba4b7d212da1993b7ee15
-
+
https://github.com/dotnet/emsdk
- b9d2b36b975626fa0c56441f071dee954385a83a
+ 8f9e359ad95f422aec3c31c21ab188166f655842
-
+
https://github.com/dotnet/emsdk
- b9d2b36b975626fa0c56441f071dee954385a83a
+ 8f9e359ad95f422aec3c31c21ab188166f655842
-
+
https://github.com/dotnet/emsdk
- b9d2b36b975626fa0c56441f071dee954385a83a
+ 8f9e359ad95f422aec3c31c21ab188166f655842
diff --git a/eng/Versions.props b/eng/Versions.props
index 4931b8a12bdd3a..bd6d4251571348 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -250,8 +250,8 @@
Note: when the name is updated, make sure to update dependency name in eng/pipelines/common/xplat-setup.yml
like - DarcDependenciesChanged.Microsoft_NET_Workload_Emscripten_Current_Manifest-9_0_100_Transport
-->
- 9.0.12-servicing.25626.4
- 9.0.12
+ 9.0.13-servicing.26056.4
+ 9.0.13
$(MicrosoftNETWorkloadEmscriptenCurrentManifest90100Version)
1.1.87-gba258badda
From 7dd1559a0aacd866cb36c37e9e9346a34fb36a5b Mon Sep 17 00:00:00 2001
From: Jeff Handley
Date: Tue, 13 Jan 2026 12:25:40 -0800
Subject: [PATCH 3/9] [manual] Merge release/9.0-staging into release/9.0
(#123113)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: richlander <2608468+richlander@users.noreply.github.com>
Co-authored-by: Miha Zupan
Co-authored-by: dotnet-maestro[bot] <42748379+dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: dotnet-maestro[bot]
Co-authored-by: Sven Boemer
Co-authored-by: Vladimir Sadov
Co-authored-by: Steve Pfister
Co-authored-by: Alexander Köplinger
Co-authored-by: elinor-fung <47805090+elinor-fung@users.noreply.github.com>
Co-authored-by: Elinor Fung
Co-authored-by: Andy Gocke
Co-authored-by: Eric StJohn
Co-authored-by: Matous Kozak
Co-authored-by: Filip Navara
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
.config/dotnet-tools.json | 2 +-
.../building/coreclr/linux-instructions.md | 2 +-
eng/Version.Details.xml | 176 +++++-----
eng/Versions.props | 78 ++---
.../core-templates/job/source-build.yml | 2 +-
.../job/source-index-stage1.yml | 2 +-
.../core-templates/steps/source-build.yml | 2 +-
eng/common/internal-feed-operations.ps1 | 2 +-
eng/common/post-build/nuget-verification.ps1 | 2 +-
eng/common/tools.ps1 | 19 +-
eng/pipelines/common/evaluate-paths-job.yml | 1 +
eng/pipelines/common/global-build-job.yml | 1 +
eng/pipelines/common/platform-matrix.yml | 2 +-
.../templates/pipeline-with-resources.yml | 5 +-
.../common/templates/runtimes/xplat-job.yml | 1 +
eng/pipelines/common/xplat-setup.yml | 7 +-
.../coreclr/templates/helix-queues-setup.yml | 12 +-
eng/pipelines/coreclr/templates/perf-job.yml | 1 +
.../libraries/fuzzing/deploy-to-onefuzz.yml | 1 +
.../libraries/helix-queues-setup.yml | 4 +-
eng/pipelines/libraries/run-test-job.yml | 1 +
eng/pipelines/libraries/stress/http.yml | 2 +
eng/pipelines/libraries/stress/ssl.yml | 2 +
global.json | 10 +-
.../TestCasesRunner/ResultChecker.cs | 20 +-
.../TestCasesRunner/TestCaseCompiler.cs | 2 +-
.../vm/amd64/jithelpers_fastwritebarriers.S | 172 +++++-----
.../Net/Sockets/SocketAsyncEngine.Unix.cs | 115 +++----
.../System/Threading/ThreadPoolWorkQueue.cs | 303 +++++-------------
src/native/external/libunwind-version.txt | 1 +
.../external/libunwind/include/libunwind_i.h | 2 +-
src/tests/issues.targets | 9 +
.../TrimAnalysis/MethodParameterValue.cs | 5 -
.../TrimAnalysis/ParameterProxy.cs | 6 +-
.../TrimAnalysis/TrimAnalysisVisitor.cs | 10 +-
src/tools/illink/test/Directory.Build.props | 6 +
.../DataFlowTests.cs | 12 +
...pilerGeneratedCodeAccessedViaReflection.cs | 2 +
.../DataFlow/ExtensionMembersDataFlow.cs | 285 ++++++++++++++++
.../DataFlow/ExtensionsDataFlow.cs | 66 ++++
.../TestCasesRunner/ResultChecker.cs | 15 +
41 files changed, 807 insertions(+), 561 deletions(-)
create mode 100644 src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/ExtensionMembersDataFlow.cs
create mode 100644 src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/ExtensionsDataFlow.cs
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index f1d0059d14badd..8bfe2b1d047a4c 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -15,7 +15,7 @@
]
},
"microsoft.dotnet.xharness.cli": {
- "version": "9.0.0-prerelease.25570.2",
+ "version": "9.0.0-prerelease.25615.2",
"commands": [
"xharness"
]
diff --git a/docs/workflow/building/coreclr/linux-instructions.md b/docs/workflow/building/coreclr/linux-instructions.md
index 5fd493c7b6b471..e6dc2b1c9499b8 100644
--- a/docs/workflow/building/coreclr/linux-instructions.md
+++ b/docs/workflow/building/coreclr/linux-instructions.md
@@ -81,7 +81,7 @@ The following images are used for more extended scenarios, including for communi
| Azure Linux (x64) | Ubuntu 24.04 | RISC-V | `mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-cross-riscv64` | `/crossrootfs/riscv64` |
| Azure Linux (x64) | Ubuntu 18.04 | S390x | `mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-cross-s390x` | `/crossrootfs/s390x` |
| Azure Linux (x64) | Ubuntu 16.04 (Wasm) | x64 | `mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-webassembly-amd64` | `/crossrootfs/x64` |
-| Debian (x64) | Debian 12 | x64 | `mcr.microsoft.com/dotnet-buildtools/prereqs:debian-12-gcc14-amd64` | `/crossrootfs/armv6` |
+| Debian (x64) | Debian 13 | x64 | `mcr.microsoft.com/dotnet-buildtools/prereqs:debian-13-gcc14-amd64` | `/crossrootfs/armv6` |
| Ubuntu (x64) | Ubuntu 22.04 | x64 | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-debpkg` | |
| Ubuntu (x64) | Tizen 9.0 | Arm32 (armel) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-cross-armel-tizen` | `/crossrootfs/armel` |
| Ubuntu (x64) | Ubuntu 20.04 | Arm32 (v6) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-20.04-cross-armv6-raspbian-10` | `/crossrootfs/armv6` |
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 9b14a0db74b278..013de83088fd56 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -1,8 +1,8 @@
-
+
https://github.com/dotnet/icu
- e18dd5d9e047367be7486ab66636b892cbe24a67
+ cda39b50d316241f6c9dea44ed241a83aaccdfac
https://github.com/dotnet/msquic
@@ -54,14 +54,14 @@
803d8598f98fb4efd94604b32627ee9407f246db
-
+
https://github.com/dotnet/cecil
- 60faa90ec95fd499f8aba4b7d212da1993b7ee15
+ 1f9985e482df7a0dee94854226d0aecad102ac15
-
+
https://github.com/dotnet/cecil
- 60faa90ec95fd499f8aba4b7d212da1993b7ee15
+ 1f9985e482df7a0dee94854226d0aecad102ac15
@@ -92,139 +92,139 @@
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
https://github.com/dotnet/llvm-project
@@ -320,21 +320,21 @@
https://github.com/dotnet/runtime
b030c4dfdfa1bf287f10f96006619a06bc2000ae
-
+
https://github.com/dotnet/xharness
- 3e74b96870050adc82beed3934abf93d40716012
+ c26361a23526ea459ca0a19b34b285eda1bffecb
-
+
https://github.com/dotnet/xharness
- 3e74b96870050adc82beed3934abf93d40716012
+ c26361a23526ea459ca0a19b34b285eda1bffecb
-
+
https://github.com/dotnet/xharness
- 3e74b96870050adc82beed3934abf93d40716012
+ c26361a23526ea459ca0a19b34b285eda1bffecb
-
+
https://github.com/dotnet/arcade
- 9eaf7b289d5003a94ee23658f057a6c06ddcd570
+ ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
@@ -352,13 +352,13 @@
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
9d7532585ce71e30ab55f0364d3cecccaf0775d1
-
+
https://github.com/dotnet/hotreload-utils
- 81fc6af21b4133b2a5c5be0e6dc38b58048e732d
+ 6eb504148b667c521f41d18dca072f1d2d8eae07
-
+
https://github.com/dotnet/runtime-assets
- 91ea918f8fb26ec1d290283e5c5eeb1b003113da
+ 70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
https://github.com/dotnet/roslyn
@@ -372,13 +372,13 @@
https://github.com/dotnet/roslyn
dc344ef24932dcd53cdd24c15364a5996bc6a675
-
+
https://github.com/dotnet/roslyn-analyzers
- 16865ea61910500f1022ad2b96c499e5df02c228
+ 5ef1abb57ce3df89eae65ecadeb1ddbab323ae05
-
+
https://github.com/dotnet/roslyn-analyzers
- 16865ea61910500f1022ad2b96c499e5df02c228
+ 5ef1abb57ce3df89eae65ecadeb1ddbab323ae05
diff --git a/eng/Versions.props b/eng/Versions.props
index bd6d4251571348..3937c705c0b303 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -36,8 +36,8 @@
- 3.11.0-beta1.25173.3
- 9.0.0-preview.25173.3
+ 3.11.0-beta1.26057.1
+ 9.0.0-preview.26057.1
9.0.109
- 9.0.0-beta.25555.4
- 9.0.0-beta.25555.4
- 9.0.0-beta.25555.4
- 9.0.0-beta.25555.4
- 2.9.0-beta.25555.4
- 9.0.0-beta.25555.4
- 2.9.0-beta.25555.4
- 9.0.0-beta.25555.4
- 9.0.0-beta.25555.4
- 9.0.0-beta.25555.4
- 9.0.0-beta.25555.4
- 9.0.0-beta.25555.4
- 9.0.0-beta.25555.4
- 9.0.0-beta.25555.4
- 9.0.0-beta.25555.4
- 9.0.0-beta.25555.4
+ 9.0.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 2.9.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 2.9.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 9.0.0-beta.25626.6
+ 9.0.0-beta.25626.6
1.4.0
@@ -147,20 +147,20 @@
8.0.0
4.5.4
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
- 9.0.0-beta.25565.2
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
+ 9.0.0-beta.25625.4
1.0.0-prerelease.24462.2
1.0.0-prerelease.24462.2
@@ -191,11 +191,11 @@
1.4.0
17.4.0-preview-20220707-01
- 9.0.0-prerelease.25570.2
- 9.0.0-prerelease.25570.2
- 9.0.0-prerelease.25570.2
+ 9.0.0-prerelease.25615.2
+ 9.0.0-prerelease.25615.2
+ 9.0.0-prerelease.25615.2
- 9.0.0-alpha.0.25574.4
+ 9.0.0-alpha.0.25625.4
3.12.0
4.5.0
6.0.0
@@ -223,11 +223,11 @@
9.0.0-preview-20241010.1
- 0.11.5-alpha.25566.3
+ 0.11.5-alpha.25628.2
9.0.0-rtm.24511.16
- 9.0.0-rtm.25574.1
+ 9.0.0-rtm.25627.1
9.0.0-rtm.24466.4
2.4.8
@@ -270,7 +270,7 @@
1.0.406601
- 9.0.111
+ 9.0.112
9.0.0-alpha.1.24175.1
$(MicrosoftNETRuntimeEmscriptenVersion)
$(runtimewinx64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion)
diff --git a/eng/common/core-templates/job/source-build.yml b/eng/common/core-templates/job/source-build.yml
index 5baedac1e03dd4..1037ccedcb556c 100644
--- a/eng/common/core-templates/job/source-build.yml
+++ b/eng/common/core-templates/job/source-build.yml
@@ -65,7 +65,7 @@ jobs:
demands: ImageOverride -equals build.ubuntu.2004.amd64
${{ if eq(variables['System.TeamProject'], 'internal') }}:
name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore1ESPool-Svc-Internal'), False, 'NetCore1ESPool-Internal')]
- image: 1es-mariner-2
+ image: 1es-azurelinux-3
os: linux
${{ else }}:
pool:
diff --git a/eng/common/core-templates/job/source-index-stage1.yml b/eng/common/core-templates/job/source-index-stage1.yml
index 662b9fcce154fc..ddf8c2e00d8035 100644
--- a/eng/common/core-templates/job/source-index-stage1.yml
+++ b/eng/common/core-templates/job/source-index-stage1.yml
@@ -6,7 +6,7 @@ parameters:
sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci"
preSteps: []
binlogPath: artifacts/log/Debug/Build.binlog
- condition: ''
+ condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
dependsOn: ''
pool: ''
is1ESPipeline: ''
diff --git a/eng/common/core-templates/steps/source-build.yml b/eng/common/core-templates/steps/source-build.yml
index 0718e4ba902e8f..7846584d2a77ee 100644
--- a/eng/common/core-templates/steps/source-build.yml
+++ b/eng/common/core-templates/steps/source-build.yml
@@ -41,7 +41,7 @@ steps:
# in the default public locations.
internalRuntimeDownloadArgs=
if [ '$(dotnetbuilds-internal-container-read-token-base64)' != '$''(dotnetbuilds-internal-container-read-token-base64)' ]; then
- internalRuntimeDownloadArgs='/p:DotNetRuntimeSourceFeed=https://dotnetbuilds.blob.core.windows.net/internal /p:DotNetRuntimeSourceFeedKey=$(dotnetbuilds-internal-container-read-token-base64) --runtimesourcefeed https://dotnetbuilds.blob.core.windows.net/internal --runtimesourcefeedkey $(dotnetbuilds-internal-container-read-token-base64)'
+ internalRuntimeDownloadArgs='/p:DotNetRuntimeSourceFeed=https://ci.dot.net/internal /p:DotNetRuntimeSourceFeedKey=$(dotnetbuilds-internal-container-read-token-base64) --runtimesourcefeed https://ci.dot.net/internal --runtimesourcefeedkey $(dotnetbuilds-internal-container-read-token-base64)'
fi
buildConfig=Release
diff --git a/eng/common/internal-feed-operations.ps1 b/eng/common/internal-feed-operations.ps1
index 92b77347d9904e..c282d3ae403a09 100644
--- a/eng/common/internal-feed-operations.ps1
+++ b/eng/common/internal-feed-operations.ps1
@@ -26,7 +26,7 @@ function SetupCredProvider {
$url = 'https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1'
Write-Host "Writing the contents of 'installcredprovider.ps1' locally..."
- Invoke-WebRequest $url -OutFile installcredprovider.ps1
+ Invoke-WebRequest $url -UseBasicParsing -OutFile installcredprovider.ps1
Write-Host 'Installing plugin...'
.\installcredprovider.ps1 -Force
diff --git a/eng/common/post-build/nuget-verification.ps1 b/eng/common/post-build/nuget-verification.ps1
index ac5c69ffcac59a..eea88e653c911d 100644
--- a/eng/common/post-build/nuget-verification.ps1
+++ b/eng/common/post-build/nuget-verification.ps1
@@ -65,7 +65,7 @@ if ($NuGetExePath) {
Write-Host "Downloading nuget.exe from $nugetExeUrl..."
$ProgressPreference = 'SilentlyContinue'
try {
- Invoke-WebRequest $nugetExeUrl -OutFile $downloadedNuGetExe
+ Invoke-WebRequest $nugetExeUrl -UseBasicParsing -OutFile $downloadedNuGetExe
$ProgressPreference = 'Continue'
} catch {
$ProgressPreference = 'Continue'
diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1
index 9b3ad8840fdb28..a06513a5940717 100644
--- a/eng/common/tools.ps1
+++ b/eng/common/tools.ps1
@@ -266,7 +266,7 @@ function GetDotNetInstallScript([string] $dotnetRoot) {
Retry({
Write-Host "GET $uri"
- Invoke-WebRequest $uri -OutFile $installScript
+ Invoke-WebRequest $uri -UseBasicParsing -OutFile $installScript
})
}
@@ -499,7 +499,7 @@ function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) {
Write-Host "Downloading $packageName $packageVersion"
$ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit
Retry({
- Invoke-WebRequest "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/flat2/$packageName/$packageVersion/$packageName.$packageVersion.nupkg" -OutFile $packagePath
+ Invoke-WebRequest "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/flat2/$packageName/$packageVersion/$packageName.$packageVersion.nupkg" -UseBasicParsing -OutFile $packagePath
})
if (!(Test-Path $packagePath)) {
@@ -543,23 +543,30 @@ function LocateVisualStudio([object]$vsRequirements = $null){
Create-Directory $vsWhereDir
Write-Host 'Downloading vswhere'
Retry({
- Invoke-WebRequest "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/windows/vswhere/$vswhereVersion/vswhere.exe" -OutFile $vswhereExe
+ Invoke-WebRequest "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/windows/vswhere/$vswhereVersion/vswhere.exe" -UseBasicParsing -OutFile $vswhereExe
})
}
- if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs }
+ if (!$vsRequirements) {
+ if (Get-Member -InputObject $GlobalJson.tools -Name 'vs' -ErrorAction SilentlyContinue) {
+ $vsRequirements = $GlobalJson.tools.vs
+ } else {
+ $vsRequirements = $null
+ }
+ }
+
$args = @('-latest', '-format', 'json', '-requires', 'Microsoft.Component.MSBuild', '-products', '*')
if (!$excludePrereleaseVS) {
$args += '-prerelease'
}
- if (Get-Member -InputObject $vsRequirements -Name 'version') {
+ if ($vsRequirements -and (Get-Member -InputObject $vsRequirements -Name 'version' -ErrorAction SilentlyContinue)) {
$args += '-version'
$args += $vsRequirements.version
}
- if (Get-Member -InputObject $vsRequirements -Name 'components') {
+ if ($vsRequirements -and (Get-Member -InputObject $vsRequirements -Name 'components' -ErrorAction SilentlyContinue)) {
foreach ($component in $vsRequirements.components) {
$args += '-requires'
$args += $component
diff --git a/eng/pipelines/common/evaluate-paths-job.yml b/eng/pipelines/common/evaluate-paths-job.yml
index 696e9ac909f8f8..cadab9bdda2344 100644
--- a/eng/pipelines/common/evaluate-paths-job.yml
+++ b/eng/pipelines/common/evaluate-paths-job.yml
@@ -34,6 +34,7 @@ jobs:
- checkout: self
clean: true
fetchDepth: 2
+ fetchTags: false
- ${{ if ne(parameters.paths[0], '') }}:
- ${{ each path in parameters.paths }}:
diff --git a/eng/pipelines/common/global-build-job.yml b/eng/pipelines/common/global-build-job.yml
index 1fe318e984fa8b..1bcaf274c2cd95 100644
--- a/eng/pipelines/common/global-build-job.yml
+++ b/eng/pipelines/common/global-build-job.yml
@@ -166,6 +166,7 @@ jobs:
- checkout: self
clean: true
fetchDepth: $(checkoutFetchDepth)
+ fetchTags: false
- ${{ if and(eq(parameters.isOfficialBuild, true), notin(parameters.osGroup, 'osx', 'maccatalyst', 'ios', 'iossimulator', 'tvos', 'tvossimulator')) }}:
- template: /eng/pipelines/common/restore-internal-tools.yml
diff --git a/eng/pipelines/common/platform-matrix.yml b/eng/pipelines/common/platform-matrix.yml
index 23370eabe21a65..05f1c1285c6369 100644
--- a/eng/pipelines/common/platform-matrix.yml
+++ b/eng/pipelines/common/platform-matrix.yml
@@ -348,7 +348,7 @@ jobs:
targetRid: linux-x64
platform: linux_x64
shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
- container: debian-12-gcc14-amd64
+ container: debian-13-gcc14-amd64
jobParameters:
runtimeFlavor: ${{ parameters.runtimeFlavor }}
buildConfig: ${{ parameters.buildConfig }}
diff --git a/eng/pipelines/common/templates/pipeline-with-resources.yml b/eng/pipelines/common/templates/pipeline-with-resources.yml
index b99d425f52b58f..c45d0acf08c2bd 100644
--- a/eng/pipelines/common/templates/pipeline-with-resources.yml
+++ b/eng/pipelines/common/templates/pipeline-with-resources.yml
@@ -66,6 +66,7 @@ extends:
linux_x64_dev_innerloop:
image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04
+ # This branch cannot go past Alpine 3.21 due to clang compat
linux_musl_x64_dev_innerloop:
image: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.21-amd64
@@ -96,8 +97,8 @@ extends:
env:
ROOTFS_DIR: /crossrootfs/riscv64
- debian-12-gcc14-amd64:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-12-gcc14-amd64
+ debian-13-gcc14-amd64:
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-13-gcc14-amd64
linux_x64_llvmaot:
image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9
diff --git a/eng/pipelines/common/templates/runtimes/xplat-job.yml b/eng/pipelines/common/templates/runtimes/xplat-job.yml
index e22f8f968c4790..30c7a3c1cc8716 100644
--- a/eng/pipelines/common/templates/runtimes/xplat-job.yml
+++ b/eng/pipelines/common/templates/runtimes/xplat-job.yml
@@ -113,5 +113,6 @@ jobs:
- checkout: self
clean: true
fetchDepth: $(checkoutFetchDepth)
+ fetchTags: false
- ${{ parameters.steps }}
diff --git a/eng/pipelines/common/xplat-setup.yml b/eng/pipelines/common/xplat-setup.yml
index 39676f8fd9b292..af28c0b41e1999 100644
--- a/eng/pipelines/common/xplat-setup.yml
+++ b/eng/pipelines/common/xplat-setup.yml
@@ -156,6 +156,9 @@ jobs:
container: ${{ parameters.container }}
${{ if eq(parameters.jobParameters.pool, '') }}:
+ # N.B.: We should always be building on the latest available version of our build platform.
+ # Each of these queues should be the latest version or have a tracking issue if the latest version
+ # does not work for some reason.
pool:
# Public Linux Build Pool
${{ if and(or(in(parameters.osGroup, 'linux', 'freebsd', 'android', 'tizen'), eq(parameters.jobParameters.hostedOs, 'linux')), eq(variables['System.TeamProject'], 'public')) }}:
@@ -170,12 +173,12 @@ jobs:
# OSX Public Build Pool (we don't have on-prem OSX BuildPool).
${{ if and(in(parameters.osGroup, 'osx', 'maccatalyst', 'ios', 'iossimulator', 'tvos', 'tvossimulator'), eq(variables['System.TeamProject'], 'public')) }}:
- vmImage: 'macos-13'
+ vmImage: 'macos-15'
# OSX Internal Pool
${{ if and(in(parameters.osGroup, 'osx', 'maccatalyst', 'ios', 'iossimulator', 'tvos', 'tvossimulator'), ne(variables['System.TeamProject'], 'public')) }}:
name: "Azure Pipelines"
- vmImage: 'macOS-13'
+ vmImage: 'macos-15'
os: macOS
# Official Build Windows Pool
diff --git a/eng/pipelines/coreclr/templates/helix-queues-setup.yml b/eng/pipelines/coreclr/templates/helix-queues-setup.yml
index 15a67fd0098508..402275a132e24f 100644
--- a/eng/pipelines/coreclr/templates/helix-queues-setup.yml
+++ b/eng/pipelines/coreclr/templates/helix-queues-setup.yml
@@ -77,23 +77,23 @@ jobs:
# Linux musl x64
- ${{ if eq(parameters.platform, 'linux_musl_x64') }}:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- - (Alpine.322.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.22-helix-amd64
+ - (Alpine.323.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.23-helix-amd64
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- - (Alpine.322.Amd64)AzureLinux.3.Amd64@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.22-helix-amd64
+ - (Alpine.323.Amd64)AzureLinux.3.Amd64@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.23-helix-amd64
# Linux musl arm32
- ${{ if eq(parameters.platform, 'linux_musl_arm') }}:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- - (Alpine.322.Arm32.Open)Ubuntu.2204.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.22-helix-arm32v7
+ - (Alpine.323.Arm32.Open)Ubuntu.2204.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.23-helix-arm32v7
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- - (Alpine.322.Arm32)Ubuntu.2204.ArmArch@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.22-helix-arm32v7
+ - (Alpine.323.Arm32)Ubuntu.2204.ArmArch@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.23-helix-arm32v7
# Linux musl arm64
- ${{ if eq(parameters.platform, 'linux_musl_arm64') }}:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- - (Alpine.322.Arm64.Open)Ubuntu.2204.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.22-helix-arm64v8
+ - (Alpine.323.Arm64.Open)Ubuntu.2204.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.23-helix-arm64v8
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- - (Alpine.322.Arm64)Ubuntu.2204.ArmArch@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.22-helix-arm64v8
+ - (Alpine.323.Arm64)Ubuntu.2204.ArmArch@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.23-helix-arm64v8
# Linux x64
- ${{ if eq(parameters.platform, 'linux_x64') }}:
diff --git a/eng/pipelines/coreclr/templates/perf-job.yml b/eng/pipelines/coreclr/templates/perf-job.yml
index 743a0b6b21aeeb..fb6d9e7b3e2f23 100644
--- a/eng/pipelines/coreclr/templates/perf-job.yml
+++ b/eng/pipelines/coreclr/templates/perf-job.yml
@@ -183,6 +183,7 @@ jobs:
SourceFolder: $(Build.SourcesDirectory)/dotnet-runtime
- checkout: git://internal/dotnet-performance@${{ parameters.perfBranch }}
path: performance
+ fetchTags: false
# Extra steps that will be passed to the performance template and run before sending the job to helix (all of which is done in the template)
- script: |
$(Build.SourcesDirectory)/eng/common/msbuild.sh $(Build.SourcesDirectory)/eng/testing/performance/add_properties_to_pipeline.proj /t:SetVariables
diff --git a/eng/pipelines/libraries/fuzzing/deploy-to-onefuzz.yml b/eng/pipelines/libraries/fuzzing/deploy-to-onefuzz.yml
index 25baed9956a058..25fadd9250a1b6 100644
--- a/eng/pipelines/libraries/fuzzing/deploy-to-onefuzz.yml
+++ b/eng/pipelines/libraries/fuzzing/deploy-to-onefuzz.yml
@@ -31,6 +31,7 @@ extends:
- checkout: self
clean: true
fetchDepth: 1
+ fetchTags: false
lfs: false
- powershell: |
diff --git a/eng/pipelines/libraries/helix-queues-setup.yml b/eng/pipelines/libraries/helix-queues-setup.yml
index c35ec8c5444c53..6bb27678d48dcc 100644
--- a/eng/pipelines/libraries/helix-queues-setup.yml
+++ b/eng/pipelines/libraries/helix-queues-setup.yml
@@ -36,12 +36,12 @@ jobs:
# Linux musl x64
- ${{ if eq(parameters.platform, 'linux_musl_x64') }}:
- - (Alpine.322.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.22-helix-amd64
+ - (Alpine.323.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.23-helix-amd64
# Linux musl arm64
- ${{ if eq(parameters.platform, 'linux_musl_arm64') }}:
- ${{ if or(eq(parameters.jobParameters.isExtraPlatformsBuild, true), eq(parameters.jobParameters.includeAllPlatforms, true)) }}:
- - (Alpine.322.Arm64.Open)Ubuntu.2204.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.22-helix-arm64v8
+ - (Alpine.323.Arm64.Open)Ubuntu.2204.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.23-helix-arm64v8
# Linux x64
diff --git a/eng/pipelines/libraries/run-test-job.yml b/eng/pipelines/libraries/run-test-job.yml
index 82017494a4bb5b..9406c5799b4edb 100644
--- a/eng/pipelines/libraries/run-test-job.yml
+++ b/eng/pipelines/libraries/run-test-job.yml
@@ -86,6 +86,7 @@ jobs:
- checkout: self
clean: true
fetchDepth: $(checkoutFetchDepth)
+ fetchTags: false
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- ${{ if ne(parameters.osGroup, 'windows') }}:
diff --git a/eng/pipelines/libraries/stress/http.yml b/eng/pipelines/libraries/stress/http.yml
index 9beb1e26c2fc2f..f2f9eac3608d5c 100644
--- a/eng/pipelines/libraries/stress/http.yml
+++ b/eng/pipelines/libraries/stress/http.yml
@@ -43,6 +43,7 @@ extends:
- checkout: self
clean: true
fetchDepth: 5
+ fetchTags: false
- bash: |
$(dockerfilesFolder)/build-docker-sdk.sh -t $(sdkBaseImage) -c $(BUILD_CONFIGURATION) && \
@@ -120,6 +121,7 @@ extends:
- checkout: self
clean: true
fetchDepth: 5
+ fetchTags: false
lfs: false
- powershell: |
diff --git a/eng/pipelines/libraries/stress/ssl.yml b/eng/pipelines/libraries/stress/ssl.yml
index ed1306990e294b..696493ef75f9d8 100644
--- a/eng/pipelines/libraries/stress/ssl.yml
+++ b/eng/pipelines/libraries/stress/ssl.yml
@@ -42,6 +42,7 @@ extends:
- checkout: self
clean: true
fetchDepth: 5
+ fetchTags: false
- bash: |
$(dockerfilesFolder)/build-docker-sdk.sh -t $(sdkBaseImage) -c $(BUILD_CONFIGURATION)
@@ -72,6 +73,7 @@ extends:
- checkout: self
clean: true
fetchDepth: 5
+ fetchTags: false
lfs: false
- powershell: |
diff --git a/global.json b/global.json
index 8e4f40830f5042..0c66b3f266c358 100644
--- a/global.json
+++ b/global.json
@@ -1,16 +1,16 @@
{
"sdk": {
- "version": "9.0.111",
+ "version": "9.0.112",
"allowPrerelease": true,
"rollForward": "major"
},
"tools": {
- "dotnet": "9.0.111"
+ "dotnet": "9.0.112"
},
"msbuild-sdks": {
- "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.25555.4",
- "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.25555.4",
- "Microsoft.DotNet.SharedFramework.Sdk": "9.0.0-beta.25555.4",
+ "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.25626.6",
+ "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.25626.6",
+ "Microsoft.DotNet.SharedFramework.Sdk": "9.0.0-beta.25626.6",
"Microsoft.Build.NoTargets": "3.7.0",
"Microsoft.Build.Traversal": "3.4.0",
"Microsoft.NET.Sdk.IL": "9.0.0-rtm.24511.16"
diff --git a/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/ResultChecker.cs b/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/ResultChecker.cs
index a6eb6007661f62..b3060c1094d661 100644
--- a/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/ResultChecker.cs
+++ b/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/ResultChecker.cs
@@ -190,8 +190,24 @@ private void VerifyLoggedMessages (AssemblyDefinition original, TrimmingTestLogg
List loggedMessages = logger.GetLoggedMessages ();
List<(ICustomAttributeProvider, CustomAttribute)> expectedNoWarningsAttributes = new ();
foreach (var attrProvider in GetAttributeProviders (original)) {
- foreach (var attr in attrProvider.CustomAttributes) {
- if (!IsProducedByNativeAOT (attr))
+
+ if (attrProvider is IMemberDefinition attrMember &&
+ attrMember is not TypeDefinition &&
+ attrMember.DeclaringType is TypeDefinition declaringType &&
+ declaringType.Name.StartsWith("<>E__"))
+ {
+ // Workaround: C# 14 extension members result in a compiler-generated type
+ // that has a member for each extension member (this is in addition to the type
+ // which contains the actual extension member implementation).
+ // The generated members inherit attributes from the extension members, but
+ // have empty implementations. We don't want to check inherited ExpectedWarningAttributes
+ // for these members.
+ continue;
+ }
+
+ foreach (var attr in attrProvider.CustomAttributes)
+ {
+ if (!IsProducedByNativeAOT(attr))
continue;
switch (attr.AttributeType.Name) {
diff --git a/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/TestCaseCompiler.cs b/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/TestCaseCompiler.cs
index b20c16631302c2..ef0cc333f5ed7d 100644
--- a/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/TestCaseCompiler.cs
+++ b/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/TestCaseCompiler.cs
@@ -234,7 +234,7 @@ protected virtual NPath CompileCSharpAssemblyWithDefaultCompiler (CompilerOption
#if NET
protected virtual NPath CompileCSharpAssemblyWithRoslyn (CompilerOptions options)
{
- var languageVersion = LanguageVersion.Default;
+ var languageVersion = LanguageVersion.Preview;
var compilationOptions = new CSharpCompilationOptions (
outputKind: options.OutputPath.FileName.EndsWith (".exe") ? OutputKind.ConsoleApplication : OutputKind.DynamicallyLinkedLibrary,
assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default
diff --git a/src/coreclr/vm/amd64/jithelpers_fastwritebarriers.S b/src/coreclr/vm/amd64/jithelpers_fastwritebarriers.S
index f987751bdcb358..cf9f149e374899 100644
--- a/src/coreclr/vm/amd64/jithelpers_fastwritebarriers.S
+++ b/src/coreclr/vm/amd64/jithelpers_fastwritebarriers.S
@@ -39,10 +39,10 @@ PATCH_LABEL JIT_WriteBarrier_PreGrow64_Patch_Label_CardTable
shr rdi, 0x0B
cmp byte ptr [rdi + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardTable_PreGrow64
+ // jne LOCAL_LABEL(UpdateCardTable_PreGrow64)
REPRET
- UpdateCardTable_PreGrow64:
+ LOCAL_LABEL(UpdateCardTable_PreGrow64):
mov byte ptr [rdi + rax], 0xFF
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -57,17 +57,17 @@ PATCH_LABEL JIT_WriteBarrier_PreGrow64_Patch_Label_CardBundleTable
cmp byte ptr [rdi + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardBundle_PreGrow64
+ // jne LOCAL_LABEL(UpdateCardBundle_PreGrow64)
REPRET
- UpdateCardBundle_PreGrow64:
+ LOCAL_LABEL(UpdateCardBundle_PreGrow64):
mov byte ptr [rdi + rax], 0xFF
#endif
ret
.balign 16
- Exit_PreGrow64:
+PATCH_LABEL Exit_PreGrow64
REPRET
LEAF_END_MARKED JIT_WriteBarrier_PreGrow64, _TEXT
@@ -124,10 +124,10 @@ PATCH_LABEL JIT_WriteBarrier_PostGrow64_Patch_Label_CardTable
shr rdi, 0x0B
cmp byte ptr [rdi + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardTable_PostGrow64
+ // jne LOCAL_LABEL(UpdateCardTable_PostGrow64)
REPRET
- UpdateCardTable_PostGrow64:
+ LOCAL_LABEL(UpdateCardTable_PostGrow64):
mov byte ptr [rdi + rax], 0xFF
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -142,17 +142,17 @@ PATCH_LABEL JIT_WriteBarrier_PostGrow64_Patch_Label_CardBundleTable
cmp byte ptr [rdi + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardBundle_PostGrow64
+ // jne LOCAL_LABEL(UpdateCardBundle_PostGrow64)
REPRET
- UpdateCardBundle_PostGrow64:
+ LOCAL_LABEL(UpdateCardBundle_PostGrow64):
mov byte ptr [rdi + rax], 0xFF
#endif
ret
.balign 16
- Exit_PostGrow64:
+PATCH_LABEL Exit_PostGrow64
REPRET
LEAF_END_MARKED JIT_WriteBarrier_PostGrow64, _TEXT
@@ -183,10 +183,10 @@ PATCH_LABEL JIT_WriteBarrier_SVR64_PatchLabel_CardTable
cmp byte ptr [rdi + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardTable_SVR64
+ // jne LOCAL_LABEL(UpdateCardTable_SVR64)
REPRET
- UpdateCardTable_SVR64:
+ LOCAL_LABEL(UpdateCardTable_SVR64):
mov byte ptr [rdi + rax], 0xFF
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -200,10 +200,10 @@ PATCH_LABEL JIT_WriteBarrier_SVR64_PatchLabel_CardBundleTable
cmp byte ptr [rdi + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardBundle_SVR64
+ // jne LOCAL_LABEL(UpdateCardBundle_SVR64)
REPRET
- UpdateCardBundle_SVR64:
+ LOCAL_LABEL(UpdateCardBundle_SVR64):
mov byte ptr [rdi + rax], 0xFF
#endif
@@ -233,46 +233,46 @@ PATCH_LABEL JIT_WriteBarrier_Byte_Region64_Patch_Label_RegionShrDest
// Check whether the region we're storing into is gen 0 - nothing to do in this case
cmp byte ptr [rdi + rax], 0
.byte 0x75, 0x04
- //jne NotGen0_Byte_Region64
+ //jne LOCAL_LABEL(NotGen0_Byte_Region64)
REPRET
NOP_2_BYTE // padding for alignment of constant
- NotGen0_Byte_Region64:
+ LOCAL_LABEL(NotGen0_Byte_Region64):
PATCH_LABEL JIT_WriteBarrier_Byte_Region64_Patch_Label_Lower
movabs r9, 0xF0F0F0F0F0F0F0F0
cmp rsi, r9
.byte 0x73, 0x01
- // jae NotLow_Byte_Region64
+ // jae LOCAL_LABEL(NotLow_Byte_Region64)
ret
- NotLow_Byte_Region64:
+ LOCAL_LABEL(NotLow_Byte_Region64):
PATCH_LABEL JIT_WriteBarrier_Byte_Region64_Patch_Label_Upper
movabs r9, 0xF0F0F0F0F0F0F0F0
cmp rsi, r9
.byte 0x72, 0x02
- // jb NotHigh_Byte_Region64
+ // jb LOCAL_LABEL(NotHigh_Byte_Region64)
REPRET
- NotHigh_Byte_Region64:
+ LOCAL_LABEL(NotHigh_Byte_Region64):
PATCH_LABEL JIT_WriteBarrier_Byte_Region64_Patch_Label_RegionShrSrc
shr rsi, 0x16 // compute region index
mov dl, [rsi + rax]
cmp dl, [rdi + rax]
.byte 0x72, 0x03
- // jb IsOldToYoung_Byte_Region64
+ // jb LOCAL_LABEL(IsOldToYoung_Byte_Region64)
REPRET
nop
- IsOldToYoung_Byte_Region64:
+ LOCAL_LABEL(IsOldToYoung_Byte_Region64):
PATCH_LABEL JIT_WriteBarrier_Byte_Region64_Patch_Label_CardTable
movabs rax, 0xF0F0F0F0F0F0F0F0
shr r8, 0xB
cmp byte ptr [r8 + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardTable_Byte_Region64
+ // jne LOCAL_LABEL(UpdateCardTable_Byte_Region64)
REPRET
- UpdateCardTable_Byte_Region64:
+ LOCAL_LABEL(UpdateCardTable_Byte_Region64):
mov byte ptr [r8 + rax], 0xFF
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
shr r8, 0x0A
@@ -280,10 +280,10 @@ PATCH_LABEL JIT_WriteBarrier_Byte_Region64_Patch_Label_CardBundleTable
movabs rax, 0xF0F0F0F0F0F0F0F0
cmp byte ptr [r8 + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardBundleTable_Byte_Region64
+ // jne LOCAL_LABEL(UpdateCardBundleTable_Byte_Region64)
REPRET
- UpdateCardBundleTable_Byte_Region64:
+ LOCAL_LABEL(UpdateCardBundleTable_Byte_Region64):
mov byte ptr [r8 + rax], 0xFF
#endif
ret
@@ -308,36 +308,36 @@ PATCH_LABEL JIT_WriteBarrier_Bit_Region64_Patch_Label_RegionShrDest
// Check whether the region we're storing into is gen 0 - nothing to do in this case
cmp byte ptr [rdi + rax], 0
.byte 0x75, 0x04
- //jne NotGen0_Bit_Region64
+ //jne LOCAL_LABEL(NotGen0_Bit_Region64)
REPRET
NOP_2_BYTE // padding for alignment of constant
- NotGen0_Bit_Region64:
+ LOCAL_LABEL(NotGen0_Bit_Region64):
PATCH_LABEL JIT_WriteBarrier_Bit_Region64_Patch_Label_Lower
movabs r9, 0xF0F0F0F0F0F0F0F0
cmp rsi, r9
.byte 0x73, 0x01
- // jae NotLow_Bit_Region64
+ // jae LOCAL_LABEL(NotLow_Bit_Region64)
ret
- NotLow_Bit_Region64:
+ LOCAL_LABEL(NotLow_Bit_Region64):
PATCH_LABEL JIT_WriteBarrier_Bit_Region64_Patch_Label_Upper
movabs r9, 0xF0F0F0F0F0F0F0F0
cmp rsi, r9
.byte 0x72, 0x02
- // jb NotHigh_Bit_Region64
+ // jb LOCAL_LABEL(NotHigh_Bit_Region64)
REPRET
- NotHigh_Bit_Region64:
+ LOCAL_LABEL(NotHigh_Bit_Region64):
PATCH_LABEL JIT_WriteBarrier_Bit_Region64_Patch_Label_RegionShrSrc
shr rsi, 0x16 // compute region index
mov dl, [rsi + rax]
cmp dl, [rdi + rax]
.byte 0x72, 0x03
- // jb IsOldToYoung_Bit_Region64
+ // jb LOCAL_LABEL(IsOldToYoung_Bit_Region64)
REPRET
nop
- IsOldToYoung_Bit_Region64:
+ LOCAL_LABEL(IsOldToYoung_Bit_Region64):
PATCH_LABEL JIT_WriteBarrier_Bit_Region64_Patch_Label_CardTable
movabs rax, 0xF0F0F0F0F0F0F0F0
@@ -349,10 +349,10 @@ PATCH_LABEL JIT_WriteBarrier_Bit_Region64_Patch_Label_CardTable
shl dl, cl
test byte ptr [r8 + rax], dl
.byte 0x74, 0x02
- // je UpdateCardTable_Bit_Region64
+ // je LOCAL_LABEL(UpdateCardTable_Bit_Region64)
REPRET
- UpdateCardTable_Bit_Region64:
+ LOCAL_LABEL(UpdateCardTable_Bit_Region64):
lock or byte ptr [r8 + rax], dl
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
PATCH_LABEL JIT_WriteBarrier_Bit_Region64_Patch_Label_CardBundleTable
@@ -360,10 +360,10 @@ PATCH_LABEL JIT_WriteBarrier_Bit_Region64_Patch_Label_CardBundleTable
shr r8, 0x0A
cmp byte ptr [r8 + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardBundleTable_Bit_Region64
+ // jne LOCAL_LABEL(UpdateCardBundleTable_Bit_Region64)
REPRET
- UpdateCardBundleTable_Bit_Region64:
+ LOCAL_LABEL(UpdateCardBundleTable_Bit_Region64):
mov byte ptr [r8 + rax], 0xFF
#endif
ret
@@ -397,10 +397,10 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_Lower
add rax, r10
cmp byte ptr [rax], 0x0
.byte 0x75, 0x03
- // jne CheckCardTable_WriteWatch_PreGrow64
+ // jne LOCAL_LABEL(CheckCardTable_WriteWatch_PreGrow64)
mov byte ptr [rax], 0xFF
- CheckCardTable_WriteWatch_PreGrow64:
+ LOCAL_LABEL(CheckCardTable_WriteWatch_PreGrow64):
// Check the lower ephemeral region bound.
cmp rsi, r11
@@ -419,10 +419,10 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_CardTable
movabs rax, 0xF0F0F0F0F0F0F0F0
cmp byte ptr [rdi + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardTable_WriteWatch_PreGrow64
+ // jne LOCAL_LABEL(UpdateCardTable_WriteWatch_PreGrow64)
REPRET
- UpdateCardTable_WriteWatch_PreGrow64:
+ LOCAL_LABEL(UpdateCardTable_WriteWatch_PreGrow64):
mov byte ptr [rdi + rax], 0xFF
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -434,17 +434,17 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_CardBundleTable
cmp byte ptr [rdi + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardBundle_WriteWatch_PreGrow64
+ // jne LOCAL_LABEL(UpdateCardBundle_WriteWatch_PreGrow64)
REPRET
- UpdateCardBundle_WriteWatch_PreGrow64:
+ LOCAL_LABEL(UpdateCardBundle_WriteWatch_PreGrow64):
mov byte ptr [rdi + rax], 0xFF
#endif
ret
.balign 16
- Exit_WriteWatch_PreGrow64:
+PATCH_LABEL Exit_WriteWatch_PreGrow64
REPRET
LEAF_END_MARKED JIT_WriteBarrier_WriteWatch_PreGrow64, _TEXT
@@ -475,13 +475,13 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_PostGrow64_Patch_Label_Lower
add rax, r10
cmp byte ptr [rax], 0x0
.byte 0x75, 0x06
- // jne CheckCardTable_WriteWatch_PostGrow64
+ // jne LOCAL_LABEL(CheckCardTable_WriteWatch_PostGrow64)
mov byte ptr [rax], 0xFF
NOP_3_BYTE // padding for alignment of constant
// Check the lower and upper ephemeral region bounds
- CheckCardTable_WriteWatch_PostGrow64:
+ LOCAL_LABEL(CheckCardTable_WriteWatch_PostGrow64):
cmp rsi, r11
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -514,10 +514,10 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_PostGrow64_Patch_Label_CardTable
shr rdi, 0x0B
cmp byte ptr [rdi + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardTable_WriteWatch_PostGrow64
+ // jne LOCAL_LABEL(UpdateCardTable_WriteWatch_PostGrow64)
REPRET
- UpdateCardTable_WriteWatch_PostGrow64:
+ LOCAL_LABEL(UpdateCardTable_WriteWatch_PostGrow64):
mov byte ptr [rdi + rax], 0xFF
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -529,16 +529,16 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_PostGrow64_Patch_Label_CardBundleTable
cmp byte ptr [rdi + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardBundle_WriteWatch_PostGrow64
+ // jne LOCAL_LABEL(UpdateCardBundle_WriteWatch_PostGrow64)
REPRET
- UpdateCardBundle_WriteWatch_PostGrow64:
+ LOCAL_LABEL(UpdateCardBundle_WriteWatch_PostGrow64):
mov byte ptr [rdi + rax], 0xFF
#endif
ret
.balign 16
- Exit_WriteWatch_PostGrow64:
+PATCH_LABEL Exit_WriteWatch_PostGrow64
REPRET
LEAF_END_MARKED JIT_WriteBarrier_WriteWatch_PostGrow64, _TEXT
@@ -578,17 +578,17 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_SVR64_PatchLabel_CardTable
add rax, r10
cmp byte ptr [rax], 0x0
.byte 0x75, 0x03
- // jne CheckCardTable_WriteWatch_SVR64
+ // jne LOCAL_LABEL(CheckCardTable_WriteWatch_SVR64)
mov byte ptr [rax], 0xFF
- CheckCardTable_WriteWatch_SVR64:
+ LOCAL_LABEL(CheckCardTable_WriteWatch_SVR64):
shr rdi, 0x0B
cmp byte ptr [rdi + r11], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardTable_WriteWatch_SVR64
+ // jne LOCAL_LABEL(UpdateCardTable_WriteWatch_SVR64)
REPRET
- UpdateCardTable_WriteWatch_SVR64:
+ LOCAL_LABEL(UpdateCardTable_WriteWatch_SVR64):
mov byte ptr [rdi + r11], 0xFF
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -600,10 +600,10 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_SVR64_PatchLabel_CardBundleTable
shr rdi, 0x0A
cmp byte ptr [rdi + r11], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardBundle_WriteWatch_SVR64
+ // jne LOCAL_LABEL(UpdateCardBundle_WriteWatch_SVR64)
REPRET
- UpdateCardBundle_WriteWatch_SVR64:
+ LOCAL_LABEL(UpdateCardBundle_WriteWatch_SVR64):
mov byte ptr [rdi + r11], 0xFF
#endif
@@ -632,57 +632,57 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_Byte_Region64_Patch_Label_RegionShrDest
shr rdi, 0x16 // compute region index
cmp byte ptr [rax], 0x0
.byte 0x75, 0x03
- // jne CheckGen0_WriteWatch_Byte_Region64
+ // jne LOCAL_LABEL(CheckGen0_WriteWatch_Byte_Region64)
mov byte ptr [rax], 0xFF
- CheckGen0_WriteWatch_Byte_Region64:
+ LOCAL_LABEL(CheckGen0_WriteWatch_Byte_Region64):
PATCH_LABEL JIT_WriteBarrier_WriteWatch_Byte_Region64_Patch_Label_RegionToGeneration
mov rax, 0xF0F0F0F0F0F0F0F0
// Check whether the region we're storing into is gen 0 - nothing to do in this case
cmp byte ptr [rdi + rax], 0
.byte 0x75, 0x08
- // jne NotGen0_WriteWatch_Byte_Region64
+ // jne LOCAL_LABEL(NotGen0_WriteWatch_Byte_Region64)
REPRET
NOP_2_BYTE // padding for alignment of constant
NOP_2_BYTE // padding for alignment of constant
NOP_2_BYTE // padding for alignment of constant
- NotGen0_WriteWatch_Byte_Region64:
+ LOCAL_LABEL(NotGen0_WriteWatch_Byte_Region64):
PATCH_LABEL JIT_WriteBarrier_WriteWatch_Byte_Region64_Patch_Label_Lower
movabs r9, 0xF0F0F0F0F0F0F0F0
cmp rsi, r9
.byte 0x73, 0x01
- // jae NotLow_WriteWatch_Byte_Region64
+ // jae LOCAL_LABEL(NotLow_WriteWatch_Byte_Region64)
ret
- NotLow_WriteWatch_Byte_Region64:
+ LOCAL_LABEL(NotLow_WriteWatch_Byte_Region64):
PATCH_LABEL JIT_WriteBarrier_WriteWatch_Byte_Region64_Patch_Label_Upper
mov r9, 0xF0F0F0F0F0F0F0F0
cmp rsi, r9
.byte 0x72, 0x02
- // jb NotHigh_WriteWatch_Byte_Region64
+ // jb LOCAL_LABEL(NotHigh_WriteWatch_Byte_Region64)
REPRET
- NotHigh_WriteWatch_Byte_Region64:
+ LOCAL_LABEL(NotHigh_WriteWatch_Byte_Region64):
PATCH_LABEL JIT_WriteBarrier_WriteWatch_Byte_Region64_Patch_Label_RegionShrSrc
shr rsi, 0x16 // compute region index
mov dl, [rsi + rax]
cmp dl, [rdi + rax]
.byte 0x72, 0x03
- // jb IsOldToYoung_WriteWatch_Byte_Region64
+ // jb LOCAL_LABEL(IsOldToYoung_WriteWatch_Byte_Region64)
REPRET
nop
- IsOldToYoung_WriteWatch_Byte_Region64:
+ LOCAL_LABEL(IsOldToYoung_WriteWatch_Byte_Region64):
PATCH_LABEL JIT_WriteBarrier_WriteWatch_Byte_Region64_Patch_Label_CardTable
mov rax, 0xF0F0F0F0F0F0F0F0
shr r8, 0xB
cmp byte ptr [r8 + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardTable_WriteWatch_Byte_Region64
+ // jne LOCAL_LABEL(UpdateCardTable_WriteWatch_Byte_Region64)
REPRET
- UpdateCardTable_WriteWatch_Byte_Region64:
+ LOCAL_LABEL(UpdateCardTable_WriteWatch_Byte_Region64):
mov byte ptr [r8 + rax], 0xFF
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
shr r8, 0x0A
@@ -690,10 +690,10 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_Byte_Region64_Patch_Label_CardBundleTabl
mov rax, 0xF0F0F0F0F0F0F0F0
cmp byte ptr [r8 + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardBundleTable_WriteWatch_Byte_Region64
+ // jne LOCAL_LABEL(UpdateCardBundleTable_WriteWatch_Byte_Region64)
REPRET
- UpdateCardBundleTable_WriteWatch_Byte_Region64:
+ LOCAL_LABEL(UpdateCardBundleTable_WriteWatch_Byte_Region64):
mov byte ptr [r8 + rax], 0xFF
#endif
ret
@@ -718,47 +718,47 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_Bit_Region64_Patch_Label_RegionShrDest
shr rdi, 0x16 // compute region index
cmp byte ptr [rax], 0x0
.byte 0x75, 0x03
- // jne CheckGen0_WriteWatch_Bit_Region64
+ // jne LOCAL_LABEL(CheckGen0_WriteWatch_Bit_Region64)
mov byte ptr [rax], 0xFF
- CheckGen0_WriteWatch_Bit_Region64:
+ LOCAL_LABEL(CheckGen0_WriteWatch_Bit_Region64):
PATCH_LABEL JIT_WriteBarrier_WriteWatch_Bit_Region64_Patch_Label_RegionToGeneration
mov rax, 0xF0F0F0F0F0F0F0F0
// Check whether the region we're storing into is gen 0 - nothing to do in this case
cmp byte ptr [rdi + rax], 0
.byte 0x75, 0x08
- // jne NotGen0_WriteWatch_Bit_Region64
+ // jne LOCAL_LABEL(NotGen0_WriteWatch_Bit_Region64)
REPRET
NOP_2_BYTE // padding for alignment of constant
NOP_2_BYTE // padding for alignment of constant
NOP_2_BYTE // padding for alignment of constant
- NotGen0_WriteWatch_Bit_Region64:
+ LOCAL_LABEL(NotGen0_WriteWatch_Bit_Region64):
PATCH_LABEL JIT_WriteBarrier_WriteWatch_Bit_Region64_Patch_Label_Lower
movabs r9, 0xF0F0F0F0F0F0F0F0
cmp rsi, r9
.byte 0x73, 0x01
- // jae NotLow_WriteWatch_Bit_Region64
+ // jae LOCAL_LABEL(NotLow_WriteWatch_Bit_Region64)
ret
- NotLow_WriteWatch_Bit_Region64:
+ LOCAL_LABEL(NotLow_WriteWatch_Bit_Region64):
PATCH_LABEL JIT_WriteBarrier_WriteWatch_Bit_Region64_Patch_Label_Upper
mov r9, 0xF0F0F0F0F0F0F0F0
cmp rsi, r9
.byte 0x72, 0x02
- // jb NotHigh_WriteWatch_Bit_Region64
+ // jb LOCAL_LABEL(NotHigh_WriteWatch_Bit_Region64)
REPRET
- NotHigh_WriteWatch_Bit_Region64:
+ LOCAL_LABEL(NotHigh_WriteWatch_Bit_Region64):
PATCH_LABEL JIT_WriteBarrier_WriteWatch_Bit_Region64_Patch_Label_RegionShrSrc
shr rsi, 0x16 // compute region index
mov dl, [rsi + rax]
cmp dl, [rdi + rax]
.byte 0x72, 0x03
- // jb IsOldToYoung_WriteWatch_Bit_Region64
+ // jb LOCAL_LABEL(IsOldToYoung_WriteWatch_Bit_Region64)
REPRET
nop
- IsOldToYoung_WriteWatch_Bit_Region64:
+ LOCAL_LABEL(IsOldToYoung_WriteWatch_Bit_Region64):
PATCH_LABEL JIT_WriteBarrier_WriteWatch_Bit_Region64_Patch_Label_CardTable
mov rax, 0xF0F0F0F0F0F0F0F0
@@ -770,10 +770,10 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_Bit_Region64_Patch_Label_CardTable
shl dl, cl
test byte ptr [r8 + rax], dl
.byte 0x74, 0x02
- // je UpdateCardTable_WriteWatch_Bit_Region64
+ // je LOCAL_LABEL(UpdateCardTable_WriteWatch_Bit_Region64)
REPRET
- UpdateCardTable_WriteWatch_Bit_Region64:
+ LOCAL_LABEL(UpdateCardTable_WriteWatch_Bit_Region64):
lock or byte ptr [r8 + rax], dl
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
PATCH_LABEL JIT_WriteBarrier_WriteWatch_Bit_Region64_Patch_Label_CardBundleTable
@@ -781,10 +781,10 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_Bit_Region64_Patch_Label_CardBundleTable
shr r8, 0x0A
cmp byte ptr [r8 + rax], 0xFF
.byte 0x75, 0x02
- // jne UpdateCardBundleTable_WriteWatch_Bit_Region64
+ // jne LOCAL_LABEL(UpdateCardBundleTable_WriteWatch_Bit_Region64)
REPRET
- UpdateCardBundleTable_WriteWatch_Bit_Region64:
+ LOCAL_LABEL(UpdateCardBundleTable_WriteWatch_Bit_Region64):
mov byte ptr [r8 + rax], 0xFF
#endif
ret
diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEngine.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEngine.Unix.cs
index 43364203118470..4cc7a40107de5b 100644
--- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEngine.Unix.cs
+++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEngine.Unix.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Concurrent;
+using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@@ -87,23 +88,18 @@ private static SocketAsyncEngine[] CreateEngines()
//
private readonly ConcurrentQueue _eventQueue = new ConcurrentQueue();
- // The scheme works as follows:
- // - From NotScheduled, the only transition is to Scheduled when new events are enqueued and a work item is enqueued to process them.
- // - From Scheduled, the only transition is to Determining right before trying to dequeue an event.
- // - From Determining, it can go to either NotScheduled when no events are present in the queue (the previous work item processed all of them)
- // or Scheduled if the queue is still not empty (let the current work item handle parallelization as convinient).
- //
- // The goal is to avoid enqueueing more work items than necessary, while still ensuring that all events are processed.
- // Another work item isn't enqueued to the thread pool hastily while the state is Determining,
- // instead the parallelizer takes care of that. We also ensure that only one thread can be parallelizing at any time.
- private enum EventQueueProcessingStage
- {
- NotScheduled,
- Determining,
- Scheduled
- }
-
- private EventQueueProcessingStage _eventQueueProcessingStage;
+ // This flag is used for communication between item enqueuing and workers that process the items.
+ // There are two states of this flag:
+ // 0: has no guarantees
+ // 1: means a worker will check work queues and ensure that
+ // any work items inserted in work queue before setting the flag
+ // are picked up.
+ // Note: The state must be cleared by the worker thread _before_
+ // checking. Otherwise there is a window between finding no work
+ // and resetting the flag, when the flag is in a wrong state.
+ // A new work item may be added right before the flag is reset
+ // without asking for a worker, while the last worker is quitting.
+ private int _hasOutstandingThreadRequest;
//
// Registers the Socket with a SocketAsyncEngine, and returns the associated engine.
@@ -201,14 +197,9 @@ private void EventLoop()
// The native shim is responsible for ensuring this condition.
Debug.Assert(numEvents > 0, $"Unexpected numEvents: {numEvents}");
- // Only enqueue a work item if the stage is NotScheduled.
- // Otherwise there must be a work item already queued or another thread already handling parallelization.
- if (handler.HandleSocketEvents(numEvents) &&
- Interlocked.Exchange(
- ref _eventQueueProcessingStage,
- EventQueueProcessingStage.Scheduled) == EventQueueProcessingStage.NotScheduled)
+ if (handler.HandleSocketEvents(numEvents))
{
- ThreadPool.UnsafeQueueUserWorkItem(this, preferLocal: false);
+ EnsureWorkerScheduled();
}
}
}
@@ -218,70 +209,40 @@ private void EventLoop()
}
}
- private void UpdateEventQueueProcessingStage(bool isEventQueueEmpty)
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ private void EnsureWorkerScheduled()
{
- if (!isEventQueueEmpty)
- {
- // There are more events to process, set stage to Scheduled and enqueue a work item.
- _eventQueueProcessingStage = EventQueueProcessingStage.Scheduled;
- }
- else
+ // Only one worker is requested at a time to mitigate Thundering Herd problem.
+ if (Interlocked.Exchange(ref _hasOutstandingThreadRequest, 1) == 0)
{
- // The stage here would be Scheduled if an enqueuer has enqueued work and changed the stage, or Determining
- // otherwise. If the stage is Determining, there's no more work to do. If the stage is Scheduled, the enqueuer
- // would not have scheduled a work item to process the work, so schedule one now.
- EventQueueProcessingStage stageBeforeUpdate =
- Interlocked.CompareExchange(
- ref _eventQueueProcessingStage,
- EventQueueProcessingStage.NotScheduled,
- EventQueueProcessingStage.Determining);
- Debug.Assert(stageBeforeUpdate != EventQueueProcessingStage.NotScheduled);
- if (stageBeforeUpdate == EventQueueProcessingStage.Determining)
- {
- return;
- }
+ ThreadPool.UnsafeQueueUserWorkItem(this, preferLocal: false);
}
-
- ThreadPool.UnsafeQueueUserWorkItem(this, preferLocal: false);
}
void IThreadPoolWorkItem.Execute()
{
- ConcurrentQueue eventQueue = _eventQueue;
- SocketIOEvent ev;
- while (true)
- {
- Debug.Assert(_eventQueueProcessingStage == EventQueueProcessingStage.Scheduled);
+ // We are asking for one worker at a time, thus the state should be 1.
+ Debug.Assert(_hasOutstandingThreadRequest == 1);
+ _hasOutstandingThreadRequest = 0;
- // The change needs to be visible to other threads that may request a worker thread before a work item is attempted
- // to be dequeued by the current thread. In particular, if an enqueuer queues a work item and does not request a
- // thread because it sees a Determining or Scheduled stage, and the current thread is the last thread processing
- // work items, the current thread must either see the work item queued by the enqueuer, or it must see a stage of
- // Scheduled, and try to dequeue again or request another thread.
- _eventQueueProcessingStage = EventQueueProcessingStage.Determining;
- Interlocked.MemoryBarrier();
+ // Checking for items must happen after resetting the processing state.
+ Interlocked.MemoryBarrier();
- if (eventQueue.TryDequeue(out ev))
- {
- break;
- }
-
- // The stage here would be Scheduled if an enqueuer has enqueued work and changed the stage, or Determining
- // otherwise. If the stage is Determining, there's no more work to do. If the stage is Scheduled, the enqueuer
- // would not have scheduled a work item to process the work, so try to dequeue a work item again.
- EventQueueProcessingStage stageBeforeUpdate =
- Interlocked.CompareExchange(
- ref _eventQueueProcessingStage,
- EventQueueProcessingStage.NotScheduled,
- EventQueueProcessingStage.Determining);
- Debug.Assert(stageBeforeUpdate != EventQueueProcessingStage.NotScheduled);
- if (stageBeforeUpdate == EventQueueProcessingStage.Determining)
- {
- return;
- }
+ ConcurrentQueue eventQueue = _eventQueue;
+ if (!eventQueue.TryDequeue(out SocketIOEvent ev))
+ {
+ return;
}
- UpdateEventQueueProcessingStage(eventQueue.IsEmpty);
+ // The batch that is currently in the queue could have asked only for one worker.
+ // We are going to process a workitem, which may take unknown time or even block.
+ // In a worst case the current workitem will indirectly depend on progress of other
+ // items and that would lead to a deadlock if no one else checks the queue.
+ // We must ensure at least one more worker is coming if the queue is not empty.
+ if (!eventQueue.IsEmpty)
+ {
+ EnsureWorkerScheduled();
+ }
int startTimeMs = Environment.TickCount;
do
diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPoolWorkQueue.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPoolWorkQueue.cs
index 7660d427da63fd..a74b3850b53e5c 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPoolWorkQueue.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPoolWorkQueue.cs
@@ -420,30 +420,23 @@ public int Count
private readonly int[] _assignedWorkItemQueueThreadCounts =
s_assignableWorkItemQueueCount > 0 ? new int[s_assignableWorkItemQueueCount] : Array.Empty();
- private object? _nextWorkItemToProcess;
-
- // The scheme works as follows:
- // - From NotScheduled, the only transition is to Scheduled when new items are enqueued and a thread is requested to process them.
- // - From Scheduled, the only transition is to Determining right before trying to dequeue an item.
- // - From Determining, it can go to either NotScheduled when no items are present in the queue (the previous thread processed all of them)
- // or Scheduled if the queue is still not empty (let the current thread handle parallelization as convinient).
- //
- // The goal is to avoid requesting more threads than necessary, while still ensuring that all items are processed.
- // Another thread isn't requested hastily while the state is Determining,
- // instead the parallelizer takes care of that. We also ensure that only one thread can be parallelizing at any time.
- private enum QueueProcessingStage
- {
- NotScheduled,
- Determining,
- Scheduled
- }
-
[StructLayout(LayoutKind.Sequential)]
private struct CacheLineSeparated
{
private readonly Internal.PaddingFor32 pad1;
- public QueueProcessingStage queueProcessingStage;
+ // This flag is used for communication between item enqueuing and workers that process the items.
+ // There are two states of this flag:
+ // 0: has no guarantees
+ // 1: means a worker will check work queues and ensure that
+ // any work items inserted in work queue before setting the flag
+ // are picked up.
+ // Note: The state must be cleared by the worker thread _before_
+ // checking. Otherwise there is a window between finding no work
+ // and resetting the flag, when the flag is in a wrong state.
+ // A new work item may be added right before the flag is reset
+ // without asking for a worker, while the last worker is quitting.
+ public int _hasOutstandingThreadRequest;
private readonly Internal.PaddingFor32 pad2;
}
@@ -607,11 +600,8 @@ public void RefreshLoggingEnabledFull()
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal void EnsureThreadRequested()
{
- // Only request a thread if the stage is NotScheduled.
- // Otherwise let the current requested thread handle parallelization.
- if (Interlocked.Exchange(
- ref _separated.queueProcessingStage,
- QueueProcessingStage.Scheduled) == QueueProcessingStage.NotScheduled)
+ // Only one worker is requested at a time to mitigate Thundering Herd problem.
+ if (Interlocked.Exchange(ref _separated._hasOutstandingThreadRequest, 1) == 0)
{
ThreadPool.RequestWorkerThread();
}
@@ -737,15 +727,6 @@ internal static bool LocalFindAndPop(object callback)
return workItem;
}
- if (_nextWorkItemToProcess != null)
- {
- workItem = Interlocked.Exchange(ref _nextWorkItemToProcess, null);
- if (workItem != null)
- {
- return workItem;
- }
- }
-
// Check for high-priority work items
if (tl.isProcessingHighPriorityWorkItems)
{
@@ -922,127 +903,40 @@ internal static bool Dispatch()
workQueue.AssignWorkItemQueue(tl);
}
- // The change needs to be visible to other threads that may request a worker thread before a work item is attempted
- // to be dequeued by the current thread. In particular, if an enqueuer queues a work item and does not request a
- // thread because it sees a Determining or Scheduled stage, and the current thread is the last thread processing
- // work items, the current thread must either see the work item queued by the enqueuer, or it must see a stage of
- // Scheduled, and try to dequeue again or request another thread.
-#if !TARGET_WASI
- // TODO https://github.com/dotnet/runtime/issues/104803
- Debug.Assert(workQueue._separated.queueProcessingStage == QueueProcessingStage.Scheduled);
-#endif
- workQueue._separated.queueProcessingStage = QueueProcessingStage.Determining;
- Interlocked.MemoryBarrier();
+ // Before dequeuing the first work item, acknowledge that the thread request has been satisfied
+ workQueue._separated._hasOutstandingThreadRequest = 0;
- object? workItem = null;
- if (workQueue._nextWorkItemToProcess != null)
- {
- workItem = Interlocked.Exchange(ref workQueue._nextWorkItemToProcess, null);
- }
+ // The state change must happen before sweeping queues for items.
+ Interlocked.MemoryBarrier();
+ object? workItem = DequeueWithPriorityAlternation(workQueue, tl, out bool missedSteal);
if (workItem == null)
{
- // Try to dequeue a work item, clean up and return if no item was found
- while ((workItem = DequeueWithPriorityAlternation(workQueue, tl, out bool missedSteal)) == null)
+ if (s_assignableWorkItemQueueCount > 0)
{
- //
- // No work.
- // If we missed a steal, though, there may be more work in the queue.
- // Instead of looping around and trying again, we'll just request another thread. Hopefully the thread
- // that owns the contended work-stealing queue will pick up its own workitems in the meantime,
- // which will be more efficient than this thread doing it anyway.
- //
- if (missedSteal)
- {
- if (s_assignableWorkItemQueueCount > 0)
- {
- workQueue.UnassignWorkItemQueue(tl);
- }
-
- Debug.Assert(workQueue._separated.queueProcessingStage != QueueProcessingStage.NotScheduled);
- workQueue._separated.queueProcessingStage = QueueProcessingStage.Scheduled;
- ThreadPool.RequestWorkerThread();
- return true;
- }
-
- // The stage here would be Scheduled if an enqueuer has enqueued work and changed the stage, or Determining
- // otherwise. If the stage is Determining, there's no more work to do. If the stage is Scheduled, the enqueuer
- // would not have scheduled a work item to process the work, so try to dequeue a work item again.
- QueueProcessingStage stageBeforeUpdate =
- Interlocked.CompareExchange(
- ref workQueue._separated.queueProcessingStage,
- QueueProcessingStage.NotScheduled,
- QueueProcessingStage.Determining);
- Debug.Assert(stageBeforeUpdate != QueueProcessingStage.NotScheduled);
- if (stageBeforeUpdate == QueueProcessingStage.Determining)
- {
- if (s_assignableWorkItemQueueCount > 0)
- {
- workQueue.UnassignWorkItemQueue(tl);
- }
-
- return true;
- }
-
- // A work item was enqueued after the stage was set to Determining earlier, and a thread was not requested
- // by the enqueuer. Set the stage back to Determining and try to dequeue a work item again.
- //
- // See the first similarly used memory barrier in the method for why it's necessary.
- workQueue._separated.queueProcessingStage = QueueProcessingStage.Determining;
- Interlocked.MemoryBarrier();
+ workQueue.UnassignWorkItemQueue(tl);
}
- }
-
- {
- // A work item may have been enqueued after the stage was set to Determining earlier, so the stage may be
- // Scheduled here, and the enqueued work item may have already been dequeued above or by a different thread. Now
- // that we're about to try dequeuing a second work item, set the stage back to Determining first so that we'll
- // be able to detect if an enqueue races with the dequeue below.
- //
- // See the first similarly used memory barrier in the method for why it's necessary.
- workQueue._separated.queueProcessingStage = QueueProcessingStage.Determining;
- Interlocked.MemoryBarrier();
- object? secondWorkItem = DequeueWithPriorityAlternation(workQueue, tl, out bool missedSteal);
- if (secondWorkItem != null)
+ // Missing a steal means there may be an item that we were unable to get.
+ // Effectively, we failed to fulfill our promise to check the queues after
+ // clearing the outstanding thread request flag.
+ // We need to make sure someone will do another pass.
+ if (missedSteal)
{
- Debug.Assert(workQueue._nextWorkItemToProcess == null);
- workQueue._nextWorkItemToProcess = secondWorkItem;
+ workQueue.EnsureThreadRequested();
}
- if (secondWorkItem != null || missedSteal)
- {
- // A work item was successfully dequeued, and there may be more work items to process. Request a thread to
- // parallelize processing of work items, before processing more work items. Following this, it is the
- // responsibility of the new thread and other enqueuers to request more threads as necessary. The
- // parallelization may be necessary here for correctness (aside from perf) if the work item blocks for some
- // reason that may have a dependency on other queued work items.
- Debug.Assert(workQueue._separated.queueProcessingStage != QueueProcessingStage.NotScheduled);
- workQueue._separated.queueProcessingStage = QueueProcessingStage.Scheduled;
- ThreadPool.RequestWorkerThread();
- }
- else
- {
- // The stage here would be Scheduled if an enqueuer has enqueued work and changed the stage, or Determining
- // otherwise. If the stage is Determining, there's no more work to do. If the stage is Scheduled, the enqueuer
- // would not have requested a thread, so request one now.
- QueueProcessingStage stageBeforeUpdate =
- Interlocked.CompareExchange(
- ref workQueue._separated.queueProcessingStage,
- QueueProcessingStage.NotScheduled,
- QueueProcessingStage.Determining);
- Debug.Assert(stageBeforeUpdate != QueueProcessingStage.NotScheduled);
- if (stageBeforeUpdate == QueueProcessingStage.Scheduled)
- {
- // A work item was enqueued after the stage was set to Determining earlier, and a thread was not
- // requested by the enqueuer, so request a thread now. An alternate is to retry dequeuing, as requesting
- // a thread can be more expensive, but retrying multiple times (though unlikely) can delay the
- // processing of the first work item that was already dequeued.
- ThreadPool.RequestWorkerThread();
- }
- }
+ // Tell the VM we're returning normally, not because Hill Climbing asked us to return.
+ return true;
}
+ // The workitems that are currently in the queues could have asked only for one worker.
+ // We are going to process a workitem, which may take unknown time or even block.
+ // In a worst case the current workitem will indirectly depend on progress of other
+ // items and that would lead to a deadlock if no one else checks the queue.
+ // We must ensure at least one more worker is coming in case the queue contains more items.
+ workQueue.EnsureThreadRequested();
+
//
// After this point, this method is no longer responsible for ensuring thread requests except for missed steals
//
@@ -1069,7 +963,7 @@ internal static bool Dispatch()
{
if (workItem == null)
{
- bool missedSteal = false;
+ missedSteal = false;
workItem = workQueue.Dequeue(tl, ref missedSteal);
if (workItem == null)
@@ -1277,23 +1171,18 @@ internal sealed class ThreadPoolTypedWorkItemQueue : IThreadPoolWo
where T : struct
where TCallback : struct, IThreadPoolTypedWorkItemQueueCallback
{
- // The scheme works as follows:
- // - From NotScheduled, the only transition is to Scheduled when new items are enqueued and a TP work item is enqueued to process them.
- // - From Scheduled, the only transition is to Determining right before trying to dequeue an item.
- // - From Determining, it can go to either NotScheduled when no items are present in the queue (the previous TP work item processed all of them)
- // or Scheduled if the queue is still not empty (let the current TP work item handle parallelization as convinient).
- //
- // The goal is to avoid enqueueing more TP work items than necessary, while still ensuring that all items are processed.
- // Another TP work item isn't enqueued to the thread pool hastily while the state is Determining,
- // instead the parallelizer takes care of that. We also ensure that only one thread can be parallelizing at any time.
- private enum QueueProcessingStage
- {
- NotScheduled,
- Determining,
- Scheduled
- }
-
- private QueueProcessingStage _queueProcessingStage;
+ // This flag is used for communication between item enqueuing and workers that process the items.
+ // There are two states of this flag:
+ // 0: has no guarantees
+ // 1: means a worker will check work queues and ensure that
+ // any work items inserted in work queue before setting the flag
+ // are picked up.
+ // Note: The state must be cleared by the worker thread _before_
+ // checking. Otherwise there is a window between finding no work
+ // and resetting the flag, when the flag is in a wrong state.
+ // A new work item may be added right before the flag is reset
+ // without asking for a worker, while the last worker is quitting.
+ private int _hasOutstandingThreadRequest;
private readonly ConcurrentQueue _workItems = new ConcurrentQueue();
public int Count => _workItems.Count;
@@ -1305,84 +1194,46 @@ public void Enqueue(T workItem)
}
public void BatchEnqueue(T workItem) => _workItems.Enqueue(workItem);
- public void CompleteBatchEnqueue()
- {
- // Only enqueue a work item if the stage is NotScheduled.
- // Otherwise there must be a work item already queued or another thread already handling parallelization.
- if (Interlocked.Exchange(
- ref _queueProcessingStage,
- QueueProcessingStage.Scheduled) == QueueProcessingStage.NotScheduled)
- {
- ThreadPool.UnsafeQueueHighPriorityWorkItemInternal(this);
- }
- }
+ public void CompleteBatchEnqueue() => EnsureWorkerScheduled();
- private void UpdateQueueProcessingStage(bool isQueueEmpty)
+ private void EnsureWorkerScheduled()
{
- if (!isQueueEmpty)
+ // Only one worker is requested at a time to mitigate Thundering Herd problem.
+ if (Interlocked.Exchange(ref _hasOutstandingThreadRequest, 1) == 0)
{
- // There are more items to process, set stage to Scheduled and enqueue a TP work item.
- _queueProcessingStage = QueueProcessingStage.Scheduled;
- }
- else
- {
- // The stage here would be Scheduled if an enqueuer has enqueued work and changed the stage, or Determining
- // otherwise. If the stage is Determining, there's no more work to do. If the stage is Scheduled, the enqueuer
- // would not have scheduled a work item to process the work, so schedule one one.
- QueueProcessingStage stageBeforeUpdate =
- Interlocked.CompareExchange(
- ref _queueProcessingStage,
- QueueProcessingStage.NotScheduled,
- QueueProcessingStage.Determining);
- Debug.Assert(stageBeforeUpdate != QueueProcessingStage.NotScheduled);
- if (stageBeforeUpdate == QueueProcessingStage.Determining)
- {
- return;
- }
+ // Currently where this type is used, queued work is expected to be processed
+ // at high priority. The implementation could be modified to support different
+ // priorities if necessary.
+ ThreadPool.UnsafeQueueHighPriorityWorkItemInternal(this);
}
-
- ThreadPool.UnsafeQueueHighPriorityWorkItemInternal(this);
}
void IThreadPoolWorkItem.Execute()
{
- T workItem;
- while (true)
- {
- Debug.Assert(_queueProcessingStage == QueueProcessingStage.Scheduled);
+ // We are asking for one worker at a time, thus the state should be 1.
+ Debug.Assert(_hasOutstandingThreadRequest == 1);
+ _hasOutstandingThreadRequest = 0;
- // The change needs to be visible to other threads that may request a worker thread before a work item is attempted
- // to be dequeued by the current thread. In particular, if an enqueuer queues a work item and does not request a
- // thread because it sees a Determining or Scheduled stage, and the current thread is the last thread processing
- // work items, the current thread must either see the work item queued by the enqueuer, or it must see a stage of
- // Scheduled, and try to dequeue again or request another thread.
- _queueProcessingStage = QueueProcessingStage.Determining;
- Interlocked.MemoryBarrier();
-
- if (_workItems.TryDequeue(out workItem))
- {
- break;
- }
+ // Checking for items must happen after resetting the processing state.
+ Interlocked.MemoryBarrier();
- // The stage here would be Scheduled if an enqueuer has enqueued work and changed the stage, or Determining
- // otherwise. If the stage is Determining, there's no more work to do. If the stage is Scheduled, the enqueuer
- // would not have scheduled a work item to process the work, so try to dequeue a work item again.
- QueueProcessingStage stageBeforeUpdate =
- Interlocked.CompareExchange(
- ref _queueProcessingStage,
- QueueProcessingStage.NotScheduled,
- QueueProcessingStage.Determining);
- Debug.Assert(stageBeforeUpdate != QueueProcessingStage.NotScheduled);
- if (stageBeforeUpdate == QueueProcessingStage.Determining)
- {
- // Discount a work item here to avoid counting this queue processing work item
- ThreadInt64PersistentCounter.Decrement(
- ThreadPoolWorkQueueThreadLocals.threadLocals!.threadLocalCompletionCountObject!);
- return;
- }
+ if (!_workItems.TryDequeue(out var workItem))
+ {
+ // Discount a work item here to avoid counting this queue processing work item
+ ThreadInt64PersistentCounter.Decrement(
+ ThreadPoolWorkQueueThreadLocals.threadLocals!.threadLocalCompletionCountObject!);
+ return;
}
- UpdateQueueProcessingStage(_workItems.IsEmpty);
+ // The batch that is currently in the queue could have asked only for one worker.
+ // We are going to process a workitem, which may take unknown time or even block.
+ // In a worst case the current workitem will indirectly depend on progress of other
+ // items and that would lead to a deadlock if no one else checks the queue.
+ // We must ensure at least one more worker is coming if the queue is not empty.
+ if (!_workItems.IsEmpty)
+ {
+ EnsureWorkerScheduled();
+ }
ThreadPoolWorkQueueThreadLocals tl = ThreadPoolWorkQueueThreadLocals.threadLocals!;
Debug.Assert(tl != null);
diff --git a/src/native/external/libunwind-version.txt b/src/native/external/libunwind-version.txt
index 82cbcf4866c0a0..30f7539629d4f0 100644
--- a/src/native/external/libunwind-version.txt
+++ b/src/native/external/libunwind-version.txt
@@ -10,3 +10,4 @@ Apply https://github.com/libunwind/libunwind/pull/714
Revert https://github.com/libunwind/libunwind/commit/ec03043244082b8f552881ba9fb790aa49c85468 and follow up changes in the same file # issue: https://github.com/libunwind/libunwind/issues/715
Apply https://github.com/libunwind/libunwind/pull/734
Apply https://github.com/libunwind/libunwind/pull/758
+Apply https://github.com/libunwind/libunwind/pull/931
diff --git a/src/native/external/libunwind/include/libunwind_i.h b/src/native/external/libunwind/include/libunwind_i.h
index 4140d88a10c65d..1970b15b8ae39d 100644
--- a/src/native/external/libunwind/include/libunwind_i.h
+++ b/src/native/external/libunwind/include/libunwind_i.h
@@ -437,6 +437,6 @@ static inline void invalidate_edi (struct elf_dyn_info *edi)
# define DWARF_VAL_LOC(c,v) DWARF_NULL_LOC
#endif
-#define UNW_ALIGN(x,a) (((x)+(a)-1UL)&~((a)-1UL))
+#define UNW_ALIGN(x,a) (((size_t)(x) + (size_t)(a) - 1) & ~((size_t)(a) - 1))
#endif /* libunwind_i_h */
diff --git a/src/tests/issues.targets b/src/tests/issues.targets
index b246551a819603..d2280ccb3fca08 100644
--- a/src/tests/issues.targets
+++ b/src/tests/issues.targets
@@ -2617,6 +2617,15 @@
+
+
+ https://github.com/dotnet/runtime/issues/121983
+
+
+ https://github.com/dotnet/runtime/issues/121983
+
+
+
https://github.com/dotnet/runtime/issues/82859
diff --git a/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/MethodParameterValue.cs b/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/MethodParameterValue.cs
index 4e9ebe5aa6a2d2..32b6c656efff32 100644
--- a/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/MethodParameterValue.cs
+++ b/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/MethodParameterValue.cs
@@ -9,11 +9,6 @@ namespace ILLink.Shared.TrimAnalysis
{
internal partial record MethodParameterValue
{
- public MethodParameterValue (IParameterSymbol parameterSymbol)
- : this (new ParameterProxy (parameterSymbol)) { }
- public MethodParameterValue (IMethodSymbol methodSymbol, ParameterIndex parameterIndex, DynamicallyAccessedMemberTypes dynamicallyAccessedMemberTypes)
- : this (new (new (methodSymbol), parameterIndex), dynamicallyAccessedMemberTypes) { }
-
public MethodParameterValue (ParameterProxy parameter)
: this (parameter, FlowAnnotations.GetMethodParameterAnnotation (parameter)) { }
diff --git a/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/ParameterProxy.cs b/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/ParameterProxy.cs
index f57de9138dbf88..baa21aca62c8a4 100644
--- a/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/ParameterProxy.cs
+++ b/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/ParameterProxy.cs
@@ -9,10 +9,10 @@ namespace ILLink.Shared.TypeSystemProxy
{
internal partial struct ParameterProxy
{
- public ParameterProxy (IParameterSymbol parameter)
+ public ParameterProxy (IParameterSymbol parameter, IMethodSymbol method)
{
- Method = new ((IMethodSymbol) parameter.ContainingSymbol);
- Index = (ParameterIndex) parameter.Ordinal + (Method.HasImplicitThis () ? 1 : 0);
+ Method = new (method);
+ Index = (ParameterIndex) parameter.Ordinal + (method.HasImplicitThis () ? 1 : 0);
}
public partial ReferenceKind GetReferenceKind ()
diff --git a/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs b/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs
index 58c3c97c550202..9f9fff2602d042 100644
--- a/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs
+++ b/src/tools/illink/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs
@@ -147,7 +147,7 @@ public override MultiValue VisitInstanceReference (IInstanceReferenceOperation i
// It can also happen that we see this for a static method - for example a delegate creation
// over a local function does this, even thought the "this" makes no sense inside a static scope.
if (OwningSymbol is IMethodSymbol method && !method.IsStatic)
- return new MethodParameterValue (method, (ParameterIndex) 0, method.GetDynamicallyAccessedMemberTypes ());
+ return new MethodParameterValue (new ParameterProxy (new (method), (ParameterIndex) 0));
return TopValue;
}
@@ -227,7 +227,13 @@ public override MultiValue GetFieldTargetValue (IFieldSymbol field, IFieldRefere
}
public override MultiValue GetParameterTargetValue (IParameterSymbol parameter)
- => new MethodParameterValue (parameter);
+ {
+ // Skip analysis for extension members (we have no way to represent a parameter on an extension type).
+ if (parameter.ContainingSymbol is not IMethodSymbol method)
+ return TopValue;
+
+ return new MethodParameterValue (new ParameterProxy (parameter, method));
+ }
public override void HandleAssignment (MultiValue source, MultiValue target, IOperation operation, in FeatureContext featureContext)
{
diff --git a/src/tools/illink/test/Directory.Build.props b/src/tools/illink/test/Directory.Build.props
index 0d526221a8804f..b965a07e3578e7 100644
--- a/src/tools/illink/test/Directory.Build.props
+++ b/src/tools/illink/test/Directory.Build.props
@@ -6,4 +6,10 @@
disable
$(MSBuildThisFileDirectory)
+
+
+
+
\ No newline at end of file
diff --git a/src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/DataFlowTests.cs b/src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/DataFlowTests.cs
index b790a3a708678a..6062cb019046b6 100644
--- a/src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/DataFlowTests.cs
+++ b/src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/DataFlowTests.cs
@@ -149,6 +149,18 @@ public Task EventDataFlow ()
return RunTest ();
}
+ [Fact]
+ public Task ExtensionMembersDataFlow ()
+ {
+ return RunTest ();
+ }
+
+ [Fact]
+ public Task ExtensionsDataFlow ()
+ {
+ return RunTest ();
+ }
+
[Fact]
public Task FeatureCheckDataFlow ()
{
diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedCodeAccessedViaReflection.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedCodeAccessedViaReflection.cs
index b59683325cdf0d..4ac5bfc3c06cf3 100644
--- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedCodeAccessedViaReflection.cs
+++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedCodeAccessedViaReflection.cs
@@ -63,6 +63,8 @@ public static IEnumerable IteratorWithCorrectDataflow ()
t_IteratorWithCorrectDataflow.RequiresAll ();
}
+ // Using C# 14 compiler changes codegen in a way that introduces this warning
+ // [UnexpectedWarning("IL2062", Tool.Trimmer | Tool.NativeAot, "https://github.com/dotnet/runtime/issues/110553", CompilerGeneratedCode = true)]
public static IEnumerable IteratorWithIntegerDataflow ()
{
int integerLocal = 0;
diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/ExtensionMembersDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/ExtensionMembersDataFlow.cs
new file mode 100644
index 00000000000000..d97e7b367dbc0c
--- /dev/null
+++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/ExtensionMembersDataFlow.cs
@@ -0,0 +1,285 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Diagnostics.CodeAnalysis;
+using System.Runtime.CompilerServices;
+using Mono.Linker.Tests.Cases.Expectations.Assertions;
+using Mono.Linker.Tests.Cases.Expectations.Helpers;
+using Mono.Linker.Tests.Cases.Expectations.Metadata;
+
+namespace Mono.Linker.Tests.Cases.DataFlow
+{
+ [SkipKeptItemsValidation]
+ [IgnoreTestCase("NativeAOT sometimes emits duplicate IL2041: https://github.com/dotnet/runtime/issues/119155", IgnoredBy = Tool.NativeAot)]
+ // Root the entire assembly to ensure that ILLink/ILC analyze extension properties which are otherwise unused in IL.
+ [ExpectedNoWarnings]
+ public class ExtensionMembersDataFlow
+ {
+ public static void Main ()
+ {
+// This test is disabled until we can use C# 14 in tests.
+#if SUPPORTS_EXTENSION_MEMBERS
+ TestExtensionMethod ();
+ TestExtensionMethodMismatch ();
+ TestExtensionMethodRequires ();
+ TestExtensionMethodWithParams ();
+ TestExtensionMethodWithParamsMismatch ();
+ TestExtensionStaticMethodRequires ();
+ TestExtensionMethodAnnotation ();
+ TestExtensionStaticMethodAnnotation ();
+ TestExtensionProperty ();
+ TestExtensionPropertyMismatch ();
+ TestExtensionPropertyAnnotatedAccessor ();
+ TestExtensionPropertyAnnotatedAccessorMismatch ();
+ TestExtensionPropertyRequires ();
+ TestExtensionPropertyConflict ();
+ // TestExtensionOperators ();
+ // TestExtensionOperatorsMismatch ();
+ }
+
+ static void TestExtensionMethod ()
+ {
+ GetWithFields ().ExtensionMembersMethod ();
+ }
+
+ [ExpectedWarning ("IL2072", nameof (GetWithMethods), nameof (ExtensionMembers.ExtensionMembersMethod), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ static void TestExtensionMethodMismatch ()
+ {
+ GetWithMethods ().ExtensionMembersMethodMismatch ();
+ }
+
+ [ExpectedWarning ("IL2026", nameof (ExtensionMembers.ExtensionMembersMethodRequires), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ static void TestExtensionMethodRequires ()
+ {
+ GetWithFields ().ExtensionMembersMethodRequires ();
+ }
+
+ static void TestExtensionMethodWithParams ()
+ {
+ GetWithFields ().ExtensionMembersMethodWithParams (GetWithMethods ());
+ }
+
+ [ExpectedWarning ("IL2072", nameof (GetWithMethods), nameof (ExtensionMembers.ExtensionMembersMethodWithParams), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ [ExpectedWarning ("IL2072", nameof (GetWithFields), nameof (ExtensionMembers.ExtensionMembersMethodWithParams), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ static void TestExtensionMethodWithParamsMismatch ()
+ {
+ GetWithMethods ().ExtensionMembersMethodWithParamsMismatch (GetWithFields ());
+ }
+
+ [ExpectedWarning ("IL2026", nameof (ExtensionMembers.ExtensionMembersStaticMethodRequires))]
+ static void TestExtensionStaticMethodRequires ()
+ {
+ ExtensionMembers.ExtensionMembersStaticMethodRequires ();
+ }
+
+ static void TestExtensionMethodAnnotation ()
+ {
+ GetWithFields ().ExtensionMembersMethodAnnotation ();
+ }
+
+ static void TestExtensionStaticMethodAnnotation ()
+ {
+ ExtensionMembers.ExtensionMembersStaticMethodAnnotation ();
+ }
+
+ [ExpectedWarning ("IL2072", "ExtensionMembersProperty", nameof (DataFlowTypeExtensions.RequiresPublicMethods), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ static void TestExtensionProperty ()
+ {
+ var instance = GetWithFields ();
+ instance.ExtensionMembersProperty.RequiresPublicMethods ();
+ instance.ExtensionMembersProperty = GetWithMethods ();
+ }
+
+ [ExpectedWarning ("IL2072", nameof (GetWithMethods), "ExtensionMembersPropertyMismatch", Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ [ExpectedWarning ("IL2072", nameof (GetWithMethods), "ExtensionMembersPropertyMismatch", Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ [ExpectedWarning ("IL2072", "ExtensionMembersPropertyMismatch", nameof (DataFlowTypeExtensions.RequiresPublicFields), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ static void TestExtensionPropertyMismatch ()
+ {
+ var instance = GetWithMethods ();
+ instance.ExtensionMembersPropertyMismatch.RequiresPublicFields ();
+ instance.ExtensionMembersPropertyMismatch = GetWithFields ();
+ }
+
+ [UnexpectedWarning("IL2072", "ExtensionMembersPropertyAnnotatedAccessor", nameof(DataFlowTypeExtensions.RequiresPublicMethods), Tool.Trimmer | Tool.NativeAot, "https://github.com/dotnet/roslyn/issues/80017")]
+ static void TestExtensionPropertyAnnotatedAccessor ()
+ {
+ var instance = GetWithFields ();
+ instance.ExtensionMembersPropertyAnnotatedAccessor.RequiresPublicMethods ();
+ instance.ExtensionMembersPropertyAnnotatedAccessor = GetWithMethods ();
+ }
+
+ [ExpectedWarning ("IL2072", nameof (GetWithMethods), "ExtensionMembersPropertyAnnotatedAccessorMismatch", Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ [ExpectedWarning ("IL2072", nameof (GetWithMethods), "ExtensionMembersPropertyAnnotatedAccessorMismatch", Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ [ExpectedWarning ("IL2072", "ExtensionMembersPropertyAnnotatedAccessorMismatch", nameof (DataFlowTypeExtensions.RequiresPublicFields), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ [ExpectedWarning ("IL2072", "ExtensionMembersPropertyAnnotatedAccessorMismatch", nameof (GetWithFields), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ static void TestExtensionPropertyAnnotatedAccessorMismatch ()
+ {
+ var instance = GetWithMethods ();
+ instance.ExtensionMembersPropertyAnnotatedAccessorMismatch.RequiresPublicFields ();
+ instance.ExtensionMembersPropertyAnnotatedAccessorMismatch = GetWithFields ();
+ }
+
+ [ExpectedWarning ("IL2026", "ExtensionMembersPropertyRequires", Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ static void TestExtensionPropertyRequires ()
+ {
+ _ = GetWithFields ().ExtensionMembersPropertyRequires;
+ }
+
+ [UnexpectedWarning("IL2072", "ExtensionMembersPropertyConflict", nameof(DataFlowTypeExtensions.RequiresPublicFields), Tool.Trimmer | Tool.NativeAot, "https://github.com/dotnet/roslyn/issues/80017")]
+ static void TestExtensionPropertyConflict ()
+ {
+ var instance = GetWithFields ();
+ instance.ExtensionMembersPropertyConflict.RequiresPublicFields ();
+ instance.ExtensionMembersPropertyConflict = GetWithFields ();
+ }
+
+ // [UnexpectedWarning ("IL2062", nameof (DataFlowTypeExtensions.RequiresPublicFields), Tool.Analyzer, "https://github.com/dotnet/runtime/issues/119110")]
+ // static void TestExtensionOperators ()
+ // {
+ // var a = GetWithFields ();
+ // var b = GetWithFields ();
+ // var c = a + b;
+ // c.RequiresPublicFields ();
+ // }
+
+ // [ExpectedWarning ("IL2072", nameof (GetWithMethods), nameof (ExtensionMembers.op_Subtraction), Tool.Trimmer | Tool.NativeAot, "https://github.com/dotnet/runtime/issues/119110")]
+ // [ExpectedWarning ("IL2072", nameof (GetWithMethods), nameof (ExtensionMembers.op_Subtraction), Tool.Trimmer | Tool.NativeAot, "https://github.com/dotnet/runtime/issues/119110")]
+ // [ExpectedWarning ("IL2072", nameof (ExtensionMembers.op_Subtraction), nameof (DataFlowTypeExtensions.RequiresPublicMethods), Tool.Trimmer | Tool.NativeAot, "https://github.com/dotnet/runtime/issues/119110")]
+ // [UnexpectedWarning ("IL2062", nameof (DataFlowTypeExtensions.RequiresPublicMethods), Tool.Analyzer, "https://github.com/dotnet/runtime/issues/119110")]
+ // static void TestExtensionOperatorsMismatch ()
+ // {
+ // var a = GetWithMethods ();
+ // var b = GetWithMethods ();
+ // var c = a - b;
+ // c.RequiresPublicMethods ();
+ // }
+
+ [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)]
+ public static Type GetWithFields () => null;
+
+ [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)]
+ public static Type GetWithMethods () => null;
+ }
+
+ [ExpectedNoWarnings]
+ public static class ExtensionMembers
+ {
+ extension([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)] Type type)
+ {
+ public void ExtensionMembersMethod () => type.RequiresPublicFields ();
+
+ [ExpectedWarning ("IL2067", nameof (DataFlowTypeExtensions.RequiresPublicMethods), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ public void ExtensionMembersMethodMismatch () => type.RequiresPublicMethods ();
+
+ [RequiresUnreferencedCode (nameof (ExtensionMembersMethodRequires))]
+ public void ExtensionMembersMethodRequires () { }
+
+ public void ExtensionMembersMethodWithParams ([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] Type typeParam)
+ {
+ type.RequiresPublicFields ();
+ typeParam.RequiresPublicMethods ();
+ }
+
+ [ExpectedWarning ("IL2067", "type", nameof (DataFlowTypeExtensions.RequiresPublicMethods), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ [ExpectedWarning ("IL2067", "typeParam", nameof (DataFlowTypeExtensions.RequiresPublicFields))]
+ public void ExtensionMembersMethodWithParamsMismatch ([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] Type typeParam)
+ {
+ type.RequiresPublicMethods ();
+ typeParam.RequiresPublicFields ();
+ }
+
+ [RequiresUnreferencedCode (nameof (ExtensionMembersStaticMethodRequires))]
+ public static void ExtensionMembersStaticMethodRequires () { }
+
+ [ExpectedWarning ("IL2041")]
+ [ExpectedWarning ("IL2067", nameof (DataFlowTypeExtensions.RequiresPublicMethods), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)]
+ public void ExtensionMembersMethodAnnotation ()
+ {
+ type.RequiresPublicFields ();
+ type.RequiresPublicMethods ();
+ }
+
+ [ExpectedWarning ("IL2041")]
+ [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)]
+ public static void ExtensionMembersStaticMethodAnnotation ()
+ {
+ }
+
+ [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)]
+ public Type ExtensionMembersProperty {
+ get => ExtensionMembersDataFlow.GetWithMethods ();
+
+ [ExpectedWarning ("IL2067", "value", nameof (DataFlowTypeExtensions.RequiresPublicMethods), Tool.Trimmer | Tool.NativeAot, "Analyzer can't see extension metadata")]
+ set => value.RequiresPublicMethods ();
+ }
+
+ [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)]
+ public Type ExtensionMembersPropertyMismatch {
+ [ExpectedWarning ("IL2073", nameof (ExtensionMembersDataFlow.GetWithFields), Tool.Analyzer, "Analyzer can't see extension metadata")]
+ get => ExtensionMembersDataFlow.GetWithFields ();
+
+ [ExpectedWarning ("IL2067", "value", nameof (DataFlowTypeExtensions.RequiresPublicFields))]
+ set => value.RequiresPublicFields ();
+ }
+
+ public Type ExtensionMembersPropertyAnnotatedAccessor {
+ [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)]
+ get => ExtensionMembersDataFlow.GetWithMethods ();
+ [param: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)]
+ set => value.RequiresPublicMethods ();
+ }
+
+ public Type ExtensionMembersPropertyAnnotatedAccessorMismatch {
+ [ExpectedWarning ("IL2073", nameof (ExtensionMembersDataFlow.GetWithFields), Tool.Analyzer, "Analyzer can't see extension metadata")]
+ [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)]
+ get => ExtensionMembersDataFlow.GetWithFields ();
+
+ [ExpectedWarning ("IL2067", "value", nameof (DataFlowTypeExtensions.RequiresPublicFields))]
+ [param: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)]
+ set => value.RequiresPublicFields ();
+ }
+
+ public Type ExtensionMembersPropertyRequires {
+ [RequiresUnreferencedCode ("ExtensionMembersPropertyRequires")]
+ get => null;
+ }
+
+ [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)]
+ [ExpectedWarning ("IL2043", Tool.Analyzer, "Analyzer can't see extension metadata")]
+ [ExpectedWarning ("IL2043", Tool.Analyzer, "Analyzer can't see extension metadata")]
+ public Type ExtensionMembersPropertyConflict {
+ [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)]
+ get => ExtensionMembersDataFlow.GetWithFields ();
+
+ [param: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)]
+ set => value.RequiresPublicFields ();
+ }
+
+ // [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)]
+ // public static Type operator + (
+ // [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)] Type left,
+ // [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)] Type right)
+ // {
+ // left.RequiresPublicFields ();
+ // right.RequiresPublicFields ();
+ // return ExtensionMembersDataFlow.GetWithFields ();
+ // }
+
+ // [ExpectedWarning ("IL2067", "left", nameof (DataFlowTypeExtensions.RequiresPublicMethods))]
+ // [ExpectedWarning ("IL2067", "right", nameof (DataFlowTypeExtensions.RequiresPublicMethods))]
+ // [ExpectedWarning ("IL2073", nameof (ExtensionMembersDataFlow.GetWithMethods))]
+ // [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)]
+ // public static Type operator - (
+ // [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)] Type left,
+ // [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)] Type right)
+ // {
+ // left.RequiresPublicMethods ();
+ // right.RequiresPublicMethods ();
+ // return ExtensionMembersDataFlow.GetWithMethods ();
+ // }
+#endif
+ }
+ }
+}
diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/ExtensionsDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/ExtensionsDataFlow.cs
new file mode 100644
index 00000000000000..1f7b8bcb63df4d
--- /dev/null
+++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/ExtensionsDataFlow.cs
@@ -0,0 +1,66 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Diagnostics.CodeAnalysis;
+using Mono.Linker.Tests.Cases.Expectations.Assertions;
+using Mono.Linker.Tests.Cases.Expectations.Helpers;
+
+namespace Mono.Linker.Tests.Cases.DataFlow
+{
+ [SkipKeptItemsValidation]
+ [ExpectedNoWarnings]
+ public class ExtensionsDataFlow
+ {
+ public static void Main ()
+ {
+ TestExtensionMethod ();
+ TestExtensionMethodMismatch ();
+ TestExtensionMethodRequires ();
+ }
+
+ [ExpectedWarning ("IL2072", "GetWithMethods", nameof (Extensions.ExtensionMethod))]
+ static void TestExtensionMethod ()
+ {
+ GetWithFields ().ExtensionMethod ();
+ GetWithMethods ().ExtensionMethod ();
+ }
+
+ static void TestExtensionMethodMismatch ()
+ {
+ GetWithFields ().ExtensionMethodMismatch ();
+ }
+
+ [ExpectedWarning ("IL2026", nameof (Extensions.ExtensionMethodRequires))]
+ static void TestExtensionMethodRequires ()
+ {
+ GetWithFields ().ExtensionMethodRequires ();
+ }
+
+ [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)]
+ static Type GetWithFields () => null;
+
+ [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)]
+ static Type GetWithMethods () => null;
+ }
+
+ [ExpectedNoWarnings]
+ public static class Extensions
+ {
+ public static void ExtensionMethod ([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)] this Type type)
+ {
+ type.RequiresPublicFields ();
+ }
+
+ [ExpectedWarning ("IL2067", "RequiresPublicMethods")]
+ public static void ExtensionMethodMismatch ([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)] this Type type)
+ {
+ type.RequiresPublicMethods ();
+ }
+
+ [RequiresUnreferencedCode (nameof (ExtensionMethodRequires))]
+ public static void ExtensionMethodRequires ([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)] this Type type)
+ {
+ }
+ }
+}
diff --git a/src/tools/illink/test/Mono.Linker.Tests/TestCasesRunner/ResultChecker.cs b/src/tools/illink/test/Mono.Linker.Tests/TestCasesRunner/ResultChecker.cs
index acf9bf7a2b14d9..325d2cb93708b5 100644
--- a/src/tools/illink/test/Mono.Linker.Tests/TestCasesRunner/ResultChecker.cs
+++ b/src/tools/illink/test/Mono.Linker.Tests/TestCasesRunner/ResultChecker.cs
@@ -840,6 +840,21 @@ void VerifyLoggedMessages (AssemblyDefinition original, TrimmingTestLogger logge
List missingMessageWarnings = [];
List unexpectedMessageWarnings = [];
foreach (var attrProvider in GetAttributeProviders (original)) {
+
+ if (attrProvider is IMemberDefinition attrMember &&
+ attrMember is not TypeDefinition &&
+ attrMember.DeclaringType is TypeDefinition declaringType &&
+ declaringType.Name.StartsWith("<>E__"))
+ {
+ // Workaround: C# 14 extension members result in a compiler-generated type
+ // that has a member for each extension member (this is in addition to the type
+ // which contains the actual extension member implementation).
+ // The generated members inherit attributes from the extension members, but
+ // have empty implementations. We don't want to check inherited ExpectedWarningAttributes
+ // for these members.
+ continue;
+ }
+
foreach (var attr in attrProvider.CustomAttributes) {
if (!IsProducedByLinker (attr))
continue;
From 35c70a50dbf85096042f9f3a6c403721d8950d28 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Tue, 20 Jan 2026 13:48:00 +0000
Subject: [PATCH 4/9] [release/9.0] Update dependencies from dotnet/emsdk
(#123056)
This pull request updates the following dependencies
[marker]: <> (Begin:f85f62c8-5e7d-4706-1003-08dcbc30275f)
## From https://github.com/dotnet/emsdk
- **Subscription**:
[f85f62c8-5e7d-4706-1003-08dcbc30275f](https://maestro.dot.net/subscriptions?search=f85f62c8-5e7d-4706-1003-08dcbc30275f)
- **Build**:
[20260109.3](https://dev.azure.com/dnceng/internal/_build/results?buildId=2875751)
([296694](https://maestro.dot.net/channel/3883/github:dotnet:emsdk/build/296694))
- **Date Produced**: January 9, 2026 11:08:55 PM UTC
- **Commit**:
[6a81c0472ee65fe798afb1d746c155de47903763](https://github.com/dotnet/emsdk/commit/6a81c0472ee65fe798afb1d746c155de47903763)
- **Branch**:
[release/9.0](https://github.com/dotnet/emsdk/tree/release/9.0)
[DependencyUpdate]: <> (Begin)
- **Dependency Updates**:
- From [9.0.13-servicing.26056.4 to 9.0.13-servicing.26059.3][1]
- Microsoft.SourceBuild.Intermediate.emsdk
- Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport
- From [9.0.13 to 9.0.13][1]
- Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100
[1]: https://github.com/dotnet/emsdk/compare/8f9e359ad9...6a81c0472e
[DependencyUpdate]: <> (End)
[marker]: <> (End:f85f62c8-5e7d-4706-1003-08dcbc30275f)
Co-authored-by: dotnet-maestro[bot]
Co-authored-by: Larry Ewing
---
NuGet.config | 2 +-
eng/Version.Details.xml | 10 +++++-----
eng/Versions.props | 2 +-
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/NuGet.config b/NuGet.config
index 87d4e0fa32806b..b4574a9965f8ee 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -9,7 +9,7 @@
-
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 013de83088fd56..b08a9fce93a1d8 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -64,18 +64,18 @@
1f9985e482df7a0dee94854226d0aecad102ac15
-
+
https://github.com/dotnet/emsdk
- 8f9e359ad95f422aec3c31c21ab188166f655842
+ 6a81c0472ee65fe798afb1d746c155de47903763
https://github.com/dotnet/emsdk
- 8f9e359ad95f422aec3c31c21ab188166f655842
+ 6a81c0472ee65fe798afb1d746c155de47903763
-
+
https://github.com/dotnet/emsdk
- 8f9e359ad95f422aec3c31c21ab188166f655842
+ 6a81c0472ee65fe798afb1d746c155de47903763
diff --git a/eng/Versions.props b/eng/Versions.props
index 3937c705c0b303..3269958efef39b 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -250,7 +250,7 @@
Note: when the name is updated, make sure to update dependency name in eng/pipelines/common/xplat-setup.yml
like - DarcDependenciesChanged.Microsoft_NET_Workload_Emscripten_Current_Manifest-9_0_100_Transport
-->
- 9.0.13-servicing.26056.4
+ 9.0.13-servicing.26059.3
9.0.13
$(MicrosoftNETWorkloadEmscriptenCurrentManifest90100Version)
From e40563274819c19164e4a1f67617b4da37f3a6a4 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Wed, 21 Jan 2026 23:33:47 +0000
Subject: [PATCH 5/9] [release/9.0] Update dependencies from dotnet/arcade
(#121429)
This pull request updates the following dependencies
[marker]: <> (Begin:abfb473c-f50b-41c8-64c2-08dcbc356d11)
## From https://github.com/dotnet/arcade
- **Subscription**:
[abfb473c-f50b-41c8-64c2-08dcbc356d11](https://maestro.dot.net/subscriptions?search=abfb473c-f50b-41c8-64c2-08dcbc356d11)
- **Build**:
[20260112.2](https://dev.azure.com/dnceng/internal/_build/results?buildId=2877038)
([296888](https://maestro.dot.net/channel/5175/github:dotnet:arcade/build/296888))
- **Date Produced**: January 12, 2026 12:24:35 PM UTC
- **Commit**:
[7d6bcdd1e851735273e4eed39e40366d48f335c9](https://github.com/dotnet/arcade/commit/7d6bcdd1e851735273e4eed39e40366d48f335c9)
- **Branch**:
[release/9.0](https://github.com/dotnet/arcade/tree/release/9.0)
[DependencyUpdate]: <> (Begin)
- **Dependency Updates**:
- From [9.0.0-beta.25555.4 to 9.0.0-beta.26062.2][9]
- Microsoft.SourceBuild.Intermediate.arcade
- Microsoft.DotNet.Arcade.Sdk
- Microsoft.DotNet.Build.Tasks.Archives
- Microsoft.DotNet.Build.Tasks.Feed
- Microsoft.DotNet.Build.Tasks.Installers
- Microsoft.DotNet.Build.Tasks.Packaging
- Microsoft.DotNet.Build.Tasks.TargetFramework
- Microsoft.DotNet.Build.Tasks.Templating
- Microsoft.DotNet.Build.Tasks.Workloads
- Microsoft.DotNet.CodeAnalysis
- Microsoft.DotNet.GenAPI
- Microsoft.DotNet.GenFacades
- Microsoft.DotNet.Helix.Sdk
- Microsoft.DotNet.PackageTesting
- Microsoft.DotNet.RemoteExecutor
- Microsoft.DotNet.SharedFramework.Sdk
- Microsoft.DotNet.VersionTools.Tasks
- Microsoft.DotNet.XliffTasks
- Microsoft.DotNet.XUnitExtensions
- From [2.9.0-beta.25555.4 to 2.9.0-beta.26062.2][9]
- Microsoft.DotNet.XUnitAssert
- Microsoft.DotNet.XUnitConsoleRunner
[9]: https://github.com/dotnet/arcade/compare/9eaf7b289d...7d6bcdd1e8
[DependencyUpdate]: <> (End)
[marker]: <> (End:abfb473c-f50b-41c8-64c2-08dcbc356d11)
---------
Co-authored-by: dotnet-maestro[bot]
Co-authored-by: Larry Ewing
Co-authored-by: Jeff Handley
---
eng/Version.Details.xml | 84 +++++++++----------
eng/Versions.props | 48 ++++++-----
.../job/publish-build-assets.yml | 2 +-
.../core-templates/job/source-build.yml | 2 +-
.../core-templates/post-build/post-build.yml | 4 +-
.../templates/variables/pool-providers.yml | 2 +-
global.json | 10 +--
7 files changed, 80 insertions(+), 72 deletions(-)
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index b08a9fce93a1d8..d805e502d98acc 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -92,87 +92,87 @@
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
https://github.com/dotnet/runtime-assets
@@ -332,9 +332,9 @@
https://github.com/dotnet/xharness
c26361a23526ea459ca0a19b34b285eda1bffecb
-
+
https://github.com/dotnet/arcade
- ab5773ac30dce73227fa1dff6bf1a21eea67cbd0
+ 9b9436a55a49bd58acb8ae95a57ad2185da26805
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
diff --git a/eng/Versions.props b/eng/Versions.props
index 3269958efef39b..fe05fd6c4dfe05 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -18,7 +18,6 @@
release
-$(PreReleaseVersionLabel)
-$(PreReleaseVersionLabel).$(PreReleaseVersionIteration)
- $(SdkBandVersion)$(WorkloadVersionSuffix)
$(MajorVersion).$(MinorVersion).0.0
@@ -85,22 +84,22 @@
9.0.109
- 9.0.0-beta.25626.6
- 9.0.0-beta.25626.6
- 9.0.0-beta.25626.6
- 9.0.0-beta.25626.6
- 2.9.0-beta.25626.6
- 9.0.0-beta.25626.6
- 2.9.0-beta.25626.6
- 9.0.0-beta.25626.6
- 9.0.0-beta.25626.6
- 9.0.0-beta.25626.6
- 9.0.0-beta.25626.6
- 9.0.0-beta.25626.6
- 9.0.0-beta.25626.6
- 9.0.0-beta.25626.6
- 9.0.0-beta.25626.6
- 9.0.0-beta.25626.6
+ 9.0.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 2.9.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 2.9.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 9.0.0-beta.26070.1
+ 9.0.0-beta.26070.1
1.4.0
@@ -253,6 +252,18 @@
9.0.13-servicing.26059.3
9.0.13
$(MicrosoftNETWorkloadEmscriptenCurrentManifest90100Version)
+
+
+ <_GlobalJsonContent>$([System.IO.File]::ReadAllText('$([MSBuild]::GetPathOfFileAbove('global.json', '$(MSBuildThisFileDirectory)'))'))
+ <_GlobalJsonSdkVersion Condition="'$(_GlobalJsonContent)' != ''">$([System.Text.RegularExpressions.Regex]::Match($(_GlobalJsonContent), '"sdk"\s*:\s*\{[^\}]*"version"\s*:\s*"([^"]+)"', System.Text.RegularExpressions.RegexOptions.Singleline).Groups[1].Value)
+ <_DotnetSdkVersion>$(MicrosoftDotNetApiCompatTaskVersion)
+ $(_DotnetSdkVersion)
+ $(_GlobalJsonSdkVersion)
+ $(SdkBandVersion)$(WorkloadVersionSuffix)
1.1.87-gba258badda
1.0.0-v3.14.0.5722
@@ -268,9 +279,6 @@
3.1.7
1.0.406601
-
-
- 9.0.112
9.0.0-alpha.1.24175.1
$(MicrosoftNETRuntimeEmscriptenVersion)
$(runtimewinx64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion)
diff --git a/eng/common/core-templates/job/publish-build-assets.yml b/eng/common/core-templates/job/publish-build-assets.yml
index 6b5ff28cc70633..3cb20fb5041fed 100644
--- a/eng/common/core-templates/job/publish-build-assets.yml
+++ b/eng/common/core-templates/job/publish-build-assets.yml
@@ -74,7 +74,7 @@ jobs:
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
name: NetCore1ESPool-Publishing-Internal
- image: windows.vs2019.amd64
+ image: windows.vs2022.amd64
os: windows
steps:
- ${{ if eq(parameters.is1ESPipeline, '') }}:
diff --git a/eng/common/core-templates/job/source-build.yml b/eng/common/core-templates/job/source-build.yml
index 1037ccedcb556c..0e5458e1f46cd5 100644
--- a/eng/common/core-templates/job/source-build.yml
+++ b/eng/common/core-templates/job/source-build.yml
@@ -65,7 +65,7 @@ jobs:
demands: ImageOverride -equals build.ubuntu.2004.amd64
${{ if eq(variables['System.TeamProject'], 'internal') }}:
name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore1ESPool-Svc-Internal'), False, 'NetCore1ESPool-Internal')]
- image: 1es-azurelinux-3
+ image: Azure-Linux-3-Amd64
os: linux
${{ else }}:
pool:
diff --git a/eng/common/core-templates/post-build/post-build.yml b/eng/common/core-templates/post-build/post-build.yml
index 221d1ac6de1945..864427d9694ab3 100644
--- a/eng/common/core-templates/post-build/post-build.yml
+++ b/eng/common/core-templates/post-build/post-build.yml
@@ -291,11 +291,11 @@ stages:
${{ else }}:
${{ if eq(parameters.is1ESPipeline, true) }}:
name: NetCore1ESPool-Publishing-Internal
- image: windows.vs2019.amd64
+ image: windows.vs2022.amd64
os: windows
${{ else }}:
name: NetCore1ESPool-Publishing-Internal
- demands: ImageOverride -equals windows.vs2019.amd64
+ demands: ImageOverride -equals windows.vs2022.amd64
steps:
- template: /eng/common/core-templates/post-build/setup-maestro-vars.yml
parameters:
diff --git a/eng/common/templates/variables/pool-providers.yml b/eng/common/templates/variables/pool-providers.yml
index e0b19c14a073c6..18693ea120d57b 100644
--- a/eng/common/templates/variables/pool-providers.yml
+++ b/eng/common/templates/variables/pool-providers.yml
@@ -23,7 +23,7 @@
#
# pool:
# name: $(DncEngInternalBuildPool)
-# demands: ImageOverride -equals windows.vs2019.amd64
+# demands: ImageOverride -equals windows.vs2022.amd64
variables:
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- template: /eng/common/templates-official/variables/pool-providers.yml
diff --git a/global.json b/global.json
index 0c66b3f266c358..866982aaa042f9 100644
--- a/global.json
+++ b/global.json
@@ -1,16 +1,16 @@
{
"sdk": {
- "version": "9.0.112",
+ "version": "9.0.113",
"allowPrerelease": true,
"rollForward": "major"
},
"tools": {
- "dotnet": "9.0.112"
+ "dotnet": "9.0.113"
},
"msbuild-sdks": {
- "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.25626.6",
- "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.25626.6",
- "Microsoft.DotNet.SharedFramework.Sdk": "9.0.0-beta.25626.6",
+ "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.26070.1",
+ "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.26070.1",
+ "Microsoft.DotNet.SharedFramework.Sdk": "9.0.0-beta.26070.1",
"Microsoft.Build.NoTargets": "3.7.0",
"Microsoft.Build.Traversal": "3.4.0",
"Microsoft.NET.Sdk.IL": "9.0.0-rtm.24511.16"
From 80de31fd0ca9d838861a6b1d76c7a022176f4d9d Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Fri, 23 Jan 2026 17:30:29 +0000
Subject: [PATCH 6/9] [release/9.0] Change pool in evaluate-paths (#123458)
Backport of #123453 to release/9.0
/cc @lewing @github-actions[bot]
## Customer Impact
- [ ] Customer reported
- [ ] Found internally
[Select one or both of the boxes. Describe how this issue impacts
customers, citing the expected and actual behaviors and scope of the
issue. If customer-reported, provide the issue number.]
## Regression
- [ ] Yes
- [ ] No
[If yes, specify when the regression was introduced. Provide the PR or
commit if known.]
## Testing
[How was the fix verified? How was the issue missed previously? What
tests were added?]
## Risk
[High/Medium/Low. Justify the indication by mentioning how risks were
measured and addressed.]
**IMPORTANT**: If this backport is for a servicing release, please
verify that:
- For .NET 8 and .NET 9: The PR target branch is `release/X.0-staging`,
not `release/X.0`.
- For .NET 10+: The PR target branch is `release/X.0` (no `-staging`
suffix).
## Package authoring no longer needed in .NET 9
**IMPORTANT**: Starting with .NET 9, you no longer need to edit a NuGet
package's csproj to enable building and bump the version.
Keep in mind that we still need package authoring in .NET 8 and older
versions.
---------
Co-authored-by: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com>
---
eng/pipelines/common/evaluate-paths-job.yml | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/eng/pipelines/common/evaluate-paths-job.yml b/eng/pipelines/common/evaluate-paths-job.yml
index cadab9bdda2344..9fd88054de2046 100644
--- a/eng/pipelines/common/evaluate-paths-job.yml
+++ b/eng/pipelines/common/evaluate-paths-job.yml
@@ -28,7 +28,13 @@ jobs:
- job: evaluate_paths
displayName: Evaluate Paths
pool:
- vmImage: 'ubuntu-latest'
+ ${{ if eq(variables['System.TeamProject'], 'public') }}:
+ name: $(DncEngPublicBuildPool)
+ demands: ImageOverride -equals Azure-Linux-3-Amd64-Public
+ ${{ else }}:
+ name: $(DncEngInternalBuildPool)
+ demands: ImageOverride -equals Azure-Linux-3-Amd64
+ os: linux
steps:
- checkout: self
From 61f1104c6b188612dfd81b045e56cccef321f332 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Thu, 5 Feb 2026 00:01:07 +0000
Subject: [PATCH 7/9] [release/9.0] Update dependencies from dotnet/emsdk
(#123412)
This pull request updates the following dependencies
[marker]: <> (Begin:f85f62c8-5e7d-4706-1003-08dcbc30275f)
## From https://github.com/dotnet/emsdk
- **Subscription**:
[f85f62c8-5e7d-4706-1003-08dcbc30275f](https://maestro.dot.net/subscriptions?search=f85f62c8-5e7d-4706-1003-08dcbc30275f)
- **Build**:
[20260202.1](https://dev.azure.com/dnceng/internal/_build/results?buildId=2893738)
([300051](https://maestro.dot.net/channel/3883/github:dotnet:emsdk/build/300051))
- **Date Produced**: February 3, 2026 3:49:47 PM UTC
- **Commit**:
[c66fdc1df74783ebdae3c67033c5a9b41aae3bd3](https://github.com/dotnet/emsdk/commit/c66fdc1df74783ebdae3c67033c5a9b41aae3bd3)
- **Branch**:
[release/9.0](https://github.com/dotnet/emsdk/tree/release/9.0)
[DependencyUpdate]: <> (Begin)
- **Dependency Updates**:
- From [9.0.13-servicing.26059.3 to 9.0.14-servicing.26102.1][7]
- Microsoft.SourceBuild.Intermediate.emsdk
- Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport
- From [9.0.13 to 9.0.14][7]
- Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100
[7]: https://github.com/dotnet/emsdk/compare/6a81c0472e...c66fdc1df7
[DependencyUpdate]: <> (End)
[marker]: <> (End:f85f62c8-5e7d-4706-1003-08dcbc30275f)
[marker]: <> (Begin:Coherency Updates)
## Coherency Updates
The following updates ensure that dependencies with a
*CoherentParentDependency*
attribute were produced in a build used as input to the parent
dependency's build.
See [Dependency Description
Format](https://github.com/dotnet/arcade/blob/master/Documentation/DependencyDescriptionFormat.md#dependency-description-overview)
[DependencyUpdate]: <> (Begin)
- **Coherency Updates**:
- **runtime.linux-arm64.Microsoft.NETCore.Runtime.JIT.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.linux-x64.Microsoft.NETCore.Runtime.JIT.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.linux-musl-arm64.Microsoft.NETCore.Runtime.JIT.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.linux-musl-x64.Microsoft.NETCore.Runtime.JIT.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.win-arm64.Microsoft.NETCore.Runtime.JIT.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.win-x64.Microsoft.NETCore.Runtime.JIT.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.osx-arm64.Microsoft.NETCore.Runtime.JIT.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.osx-x64.Microsoft.NETCore.Runtime.JIT.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.linux-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.linux-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools**:
from 19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.linux-musl-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk**:
from 19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
-
**runtime.linux-musl-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools**:
from 19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.linux-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.linux-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.linux-musl-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk**:
from 19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.linux-musl-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools**:
from 19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.win-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.win-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.osx-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.osx-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.osx-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
- **runtime.osx-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools**: from
19.1.0-alpha.1.25625.1 to 19.1.0-alpha.1.26071.2 (parent:
Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport)
[DependencyUpdate]: <> (End)
[marker]: <> (End:Coherency Updates)
---------
Co-authored-by: dotnet-maestro[bot]
---
NuGet.config | 2 +-
eng/Version.Details.xml | 100 ++++++++++++++++++++--------------------
eng/Versions.props | 48 +++++++++----------
3 files changed, 75 insertions(+), 75 deletions(-)
diff --git a/NuGet.config b/NuGet.config
index b4574a9965f8ee..b539231b1b50c3 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -9,7 +9,7 @@
-
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index d805e502d98acc..1d8e72889f59ac 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -12,37 +12,37 @@
https://github.com/dotnet/wcf
7f504aabb1988e9a093c1e74d8040bd52feb2f01
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
https://github.com/dotnet/command-line-api
@@ -64,18 +64,18 @@
1f9985e482df7a0dee94854226d0aecad102ac15
-
+
https://github.com/dotnet/emsdk
- 6a81c0472ee65fe798afb1d746c155de47903763
+ c66fdc1df74783ebdae3c67033c5a9b41aae3bd3
-
+
https://github.com/dotnet/emsdk
- 6a81c0472ee65fe798afb1d746c155de47903763
+ c66fdc1df74783ebdae3c67033c5a9b41aae3bd3
-
+
https://github.com/dotnet/emsdk
- 6a81c0472ee65fe798afb1d746c155de47903763
+ c66fdc1df74783ebdae3c67033c5a9b41aae3bd3
@@ -226,61 +226,61 @@
https://github.com/dotnet/runtime-assets
70d5fa7d7d041da17e6f3827f55d7d9ceaffdb12
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
-
+
https://github.com/dotnet/llvm-project
- 4e9be0648863c94e45c31df8e2e7524fcad27f35
+ c373980dd30f821fbbdeeb316b839d6efbf688b1
https://github.com/dotnet/runtime
diff --git a/eng/Versions.props b/eng/Versions.props
index fe05fd6c4dfe05..3f6bb694264be1 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -231,26 +231,26 @@
2.4.8
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
- 9.0.13-servicing.26059.3
- 9.0.13
+ 9.0.14-servicing.26102.1
+ 9.0.14
$(MicrosoftNETWorkloadEmscriptenCurrentManifest90100Version)
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
- 19.1.0-alpha.1.25625.1
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
+ 19.1.0-alpha.1.26071.2
3.1.7
1.0.406601
From 816838489e256e19db8c9c5acafce9dc3d343971 Mon Sep 17 00:00:00 2001
From: vseanreesermsft <78103370+vseanreesermsft@users.noreply.github.com>
Date: Wed, 4 Feb 2026 17:00:05 -0800
Subject: [PATCH 8/9] Update branding to 9.0.14 (#123897)
---
eng/Versions.props | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/eng/Versions.props b/eng/Versions.props
index 3f6bb694264be1..045ad89db20dc9 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -1,11 +1,11 @@
- 9.0.13
+ 9.0.14
9
0
- 13
+ 14
9.0.100
8.0.$([MSBuild]::Add($(PatchVersion),11))
7.0.20
From 4a27bd0ae92d711a7e76ca154c394e235f3a2094 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20K=C3=B6plinger?=
Date: Mon, 9 Feb 2026 16:12:52 +0100
Subject: [PATCH 9/9] [release/9.0] Use correct name for AZL3 build image
(#124178)
Backport of #124170
---
eng/pipelines/common/evaluate-paths-job.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/eng/pipelines/common/evaluate-paths-job.yml b/eng/pipelines/common/evaluate-paths-job.yml
index 9fd88054de2046..e5139469b7332e 100644
--- a/eng/pipelines/common/evaluate-paths-job.yml
+++ b/eng/pipelines/common/evaluate-paths-job.yml
@@ -30,10 +30,10 @@ jobs:
pool:
${{ if eq(variables['System.TeamProject'], 'public') }}:
name: $(DncEngPublicBuildPool)
- demands: ImageOverride -equals Azure-Linux-3-Amd64-Public
+ demands: ImageOverride -equals build.azurelinux.3.amd64.open
${{ else }}:
name: $(DncEngInternalBuildPool)
- demands: ImageOverride -equals Azure-Linux-3-Amd64
+ demands: ImageOverride -equals build.azurelinux.3.amd64
os: linux
steps: