diff --git a/.config/CredScanSuppressions.json b/.config/CredScanSuppressions.json
index 2f274268f63fe8..6d728376700900 100644
--- a/.config/CredScanSuppressions.json
+++ b/.config/CredScanSuppressions.json
@@ -7,12 +7,19 @@
"src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/DSA/DSAKeyPemTests.cs",
"src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/EC/ECKeyPemTests.cs",
"src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/RSAKeyPemTests.cs",
- "src/libraries/System.Security.Cryptography.X509Certificates/tests/TestData.cs"
+ "src/libraries/System.Security.Cryptography/tests/X509Certificates/TestData.cs",
+ "src/tests/FunctionalTests/Android/Device_Emulator/gRPC/grpc-dotnet/testassets/Certs/InteropTests/server1.key"
],
"placeholder": [
"-----BEGIN PRIVATE KEY-----",
"-----BEGIN * PRIVATE KEY-----"
]
+ },
+ {
+ "_justification": "Suppression approved. Private key for testing purpose.",
+ "file": [
+ "src/tests/FunctionalTests/Android/Device_Emulator/gRPC/grpc-dotnet/testassets/Certs/InteropTests/server1.pfx"
+ ]
}
]
}
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 4ef4e71b3bff41..4364d86d9d70da 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -15,13 +15,13 @@
]
},
"microsoft.dotnet.xharness.cli": {
- "version": "1.0.0-prerelease.22375.5",
+ "version": "1.0.0-prerelease.23163.1",
"commands": [
"xharness"
]
},
"microsoft.visualstudio.slngen.tool": {
- "version": "8.1.6",
+ "version": "8.5.17",
"commands": [
"slngen"
]
diff --git a/.config/tsaoptions.json b/.config/tsaoptions.json
new file mode 100644
index 00000000000000..d940cdd8a5a903
--- /dev/null
+++ b/.config/tsaoptions.json
@@ -0,0 +1,10 @@
+{
+ "instanceUrl": "https://devdiv.visualstudio.com/",
+ "template": "TFSDEVDIV",
+ "projectName": "DEVDIV",
+ "areaPath": "DevDiv\\NET Libraries",
+ "iterationPath": "DevDiv",
+ "notificationAliases": [ "runtimerepo-infra@microsoft.com" ],
+ "repositoryName": "Runtime",
+ "codebaseName": "Runtime"
+}
\ No newline at end of file
diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
deleted file mode 100644
index 54f5f2ff58bb80..00000000000000
--- a/.devcontainer/Dockerfile
+++ /dev/null
@@ -1,48 +0,0 @@
-# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.192.0/containers/dotnet/.devcontainer/base.Dockerfile
-# For details on dotnet specific container, see: https://github.com/microsoft/vscode-dev-containers/tree/main/containers/dotnet
-
-# [Choice] .NET version: 6.0, 5.0, 3.1, 2.1
-ARG VARIANT="6.0-focal"
-FROM mcr.microsoft.com/vscode/devcontainers/dotnet:0-${VARIANT}
-
-# Setup the gh (GitHub) CLI signing key.
-RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \
- chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && \
- echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null
-
-# Set up machine requirements to build the repo and the gh CLI
-RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
- && apt-get -y install --no-install-recommends cmake llvm-10 clang-10 \
- build-essential python curl git lldb-6.0 liblldb-6.0-dev \
- libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev \
- libssl-dev libnuma-dev libkrb5-dev zlib1g-dev ninja-build \
- gh
-
-# Install V8 Engine
-SHELL ["/bin/bash", "-c"]
-
-RUN curl -sSL "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/linux/chromium-v8/v8-linux64-rel-8.5.183.zip" -o ./v8.zip \
- && unzip ./v8.zip -d /usr/local/v8 \
- && echo $'#!/usr/bin/env bash\n\
-"/usr/local/v8/d8" --snapshot_blob="/usr/local/v8/snapshot_blob.bin" "$@"\n' > /usr/local/bin/v8 \
- && chmod +x /usr/local/bin/v8
-
-# install chromium dependencies to run debugger tests:
-RUN sudo apt-get install libnss3 -y \
- && apt-get install libatk1.0-0 -y \
- && apt-get install libatk-bridge2.0-0 -y \
- && apt-get install libcups2 -y \
- && apt-get install libdrm2 -y \
- && apt-get install libxkbcommon-x11-0 -y \
- && apt-get install libxcomposite-dev -y \
- && apt-get install libxdamage1 -y \
- && apt-get install libxrandr2 -y \
- && apt-get install libgbm-dev -y \
- && apt-get install libpango-1.0-0 -y \
- && apt-get install libcairo2 -y \
- && apt-get install libasound2 -y
-
-# install firefox dependencies to run debugger tests:
-RUN sudo apt-get install libdbus-glib-1-2 -y \
- && apt-get install libgtk-3-0 -y \
- && apt-get install libx11-xcb-dev -y
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
deleted file mode 100644
index d7b5a8b0efb57a..00000000000000
--- a/.devcontainer/devcontainer.json
+++ /dev/null
@@ -1,53 +0,0 @@
-// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
-// https://github.com/microsoft/vscode-dev-containers/tree/v0.192.0/containers/dotnet
-{
- "name": "C# (.NET)",
- "build": {
- "dockerfile": "Dockerfile",
- "args": {
- // Update 'VARIANT' to pick a .NET Core version: 2.1, 3.1, 5.0
- "VARIANT": "5.0",
- }
- },
-
- "settings": {
- // Loading projects on demand is better for larger codebases
- "omnisharp.enableMsBuildLoadProjectsOnDemand": true,
- "omnisharp.enableRoslynAnalyzers": true,
- "omnisharp.enableEditorConfigSupport": true,
- "omnisharp.enableAsyncCompletion": true,
- "omnisharp.testRunSettings": "${containerWorkspaceFolder}/artifacts/obj/vscode/.runsettings"
- },
-
- // Add the IDs of extensions you want installed when the container is created.
- "extensions": [
- "ms-dotnettools.csharp"
- ],
-
- // Use 'onCreateCommand' to run pre-build commands inside the codespace
- "onCreateCommand": "${containerWorkspaceFolder}/.devcontainer/scripts/onCreateCommand.sh",
-
- // Use 'postCreateCommand' to run commands after the container is created.
- "postCreateCommand": "${containerWorkspaceFolder}/.devcontainer/scripts/postCreateCommand.sh",
-
- // Add the locally installed dotnet to the path to ensure that it is activated
- // This allows developers to just use 'dotnet build' on the command-line, and the local dotnet version will be used.
- // Add the global tools dir to the PATH so that globally installed tools will work
- "remoteEnv": {
- "PATH": "${containerWorkspaceFolder}/.dotnet:${containerWorkspaceFolder}/.dotnet-tools-global:${containerEnv:PATH}",
- "DOTNET_MULTILEVEL_LOOKUP": "0",
- // Path to provisioned Emscripten SDK, for rebuilding the wasm runtime
- "EMSDK_PATH": "${containerWorkspaceFolder}/src/mono/wasm/emsdk",
- },
-
- // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
- "remoteUser": "vscode",
-
- // Forward mono samples port
- "forwardPorts": [8000],
- "portsAttributes": {
- "8000": {
- "label": "mono wasm samples (8000)",
- }
- }
-}
diff --git a/.devcontainer/libraries/Dockerfile b/.devcontainer/libraries/Dockerfile
new file mode 100644
index 00000000000000..ff924ca7466f9b
--- /dev/null
+++ b/.devcontainer/libraries/Dockerfile
@@ -0,0 +1,29 @@
+# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.192.0/containers/dotnet/.devcontainer/base.Dockerfile
+# For details on dotnet specific container, see: https://github.com/microsoft/vscode-dev-containers/tree/main/containers/dotnet
+
+# [Choice] .NET version: 6.0, 3.1
+ARG VARIANT="6.0-focal"
+FROM mcr.microsoft.com/devcontainers/dotnet:0-${VARIANT}
+
+# Set up machine requirements to build the repo and the gh CLI
+RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
+ && apt-get -y install --no-install-recommends \
+ cmake \
+ llvm-10 \
+ clang-10 \
+ build-essential \
+ python \
+ curl \
+ git \
+ lldb-6.0 \
+ liblldb-6.0-dev \
+ libunwind8 \
+ libunwind8-dev \
+ gettext \
+ libicu-dev \
+ liblttng-ust-dev \
+ libssl-dev \
+ libnuma-dev \
+ libkrb5-dev \
+ zlib1g-dev \
+ ninja-build
diff --git a/.devcontainer/libraries/devcontainer.json b/.devcontainer/libraries/devcontainer.json
new file mode 100644
index 00000000000000..09daf0ecf6c6f8
--- /dev/null
+++ b/.devcontainer/libraries/devcontainer.json
@@ -0,0 +1,55 @@
+// For format details, see https://aka.ms/devcontainer.json.
+{
+ "name": "C# (.NET)",
+ "build": {
+ "dockerfile": "Dockerfile",
+ "args": {
+ // Update 'VARIANT' to pick a .NET Core version: 3.1, 6.0
+ // Append -bullseye or -focal to pin to an OS version.
+ "VARIANT": "6.0-focal"
+ }
+ },
+ "hostRequirements": {
+ "cpus": 4,
+ "memory": "8gb"
+ },
+
+ "features": {
+ "ghcr.io/devcontainers/features/github-cli:1": {}
+ },
+
+ // Configure tool-specific properties.
+ "customizations": {
+ // Configure properties specific to VS Code.
+ "vscode": {
+ // Add the IDs of extensions you want installed when the container is created.
+ "extensions": [
+ "ms-dotnettools.csharp"
+ ],
+ "settings": {
+ // Loading projects on demand is better for larger codebases
+ "omnisharp.enableMsBuildLoadProjectsOnDemand": true,
+ "omnisharp.enableRoslynAnalyzers": true,
+ "omnisharp.enableEditorConfigSupport": true,
+ "omnisharp.enableAsyncCompletion": true,
+ "omnisharp.testRunSettings": "${containerWorkspaceFolder}/artifacts/obj/vscode/.runsettings"
+ }
+ }
+ },
+
+ // Use 'onCreateCommand' to run pre-build commands inside the codespace
+ "onCreateCommand": "${containerWorkspaceFolder}/.devcontainer/scripts/onCreateCommand.sh libraries",
+
+ // Use 'postCreateCommand' to run commands after the container is created.
+ "postCreateCommand": "${containerWorkspaceFolder}/.devcontainer/scripts/postCreateCommand.sh",
+
+ // Add the locally installed dotnet to the path to ensure that it is activated
+ // This allows developers to just use 'dotnet build' on the command-line, and the local dotnet version will be used.
+ "remoteEnv": {
+ "PATH": "${containerWorkspaceFolder}/.dotnet:${containerEnv:PATH}",
+ "DOTNET_MULTILEVEL_LOOKUP": "0"
+ },
+
+ // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
+ "remoteUser": "vscode"
+}
diff --git a/.devcontainer/scripts/onCreateCommand.sh b/.devcontainer/scripts/onCreateCommand.sh
index 48850f5f00b719..85cd9f1b901645 100755
--- a/.devcontainer/scripts/onCreateCommand.sh
+++ b/.devcontainer/scripts/onCreateCommand.sh
@@ -2,18 +2,30 @@
set -e
-# prebuild the repo, so it is ready for development
-./build.sh libs+clr -rc Release
-# restore libs tests so that the project is ready to be loaded by OmniSharp
-./build.sh libs.tests -restore
+# bump the dotnet sdk version to get msbuild bugfix: https://github.com/dotnet/msbuild/issues/8531
+# TODO: remove once we're on a newer sdk in global.json
+sed -i 's/8.0.100-preview.1.23115.2/8.0.100-preview.3.23159.20/g' global.json || true
-# prebuild for WASM, so it is ready for wasm development
-make -C src/mono/wasm provision-wasm
-export EMSDK_PATH=$PWD/src/mono/wasm/emsdk
-./build.sh mono+libs -os Browser -c release
+opt=$1
+case "$opt" in
-# install dotnet-serve for running wasm samples
-./dotnet.sh tool install dotnet-serve --tool-path ./.dotnet-tools-global
+ libraries)
+ # prebuild the repo, so it is ready for development
+ ./build.sh libs+clr -rc Release
+ # restore libs tests so that the project is ready to be loaded by OmniSharp
+ ./build.sh libs.tests -restore
+ ;;
+
+ wasm)
+ # prebuild for WASM, so it is ready for wasm development
+ make -C src/mono/wasm provision-wasm
+ export EMSDK_PATH=$PWD/src/mono/wasm/emsdk
+ ./build.sh mono+libs -os browser -c Release
+
+ # install dotnet-serve for running wasm samples
+ ./dotnet.sh tool install dotnet-serve --tool-path ./.dotnet-tools-global
+ ;;
+esac
# save the commit hash of the currently built assemblies, so developers know which version was built
git rev-parse HEAD > ./artifacts/prebuild.sha
diff --git a/.devcontainer/wasm/Dockerfile b/.devcontainer/wasm/Dockerfile
new file mode 100644
index 00000000000000..cd29264dbff299
--- /dev/null
+++ b/.devcontainer/wasm/Dockerfile
@@ -0,0 +1,58 @@
+# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.192.0/containers/dotnet/.devcontainer/base.Dockerfile
+# For details on dotnet specific container, see: https://github.com/microsoft/vscode-dev-containers/tree/main/containers/dotnet
+
+# [Choice] .NET version: 6.0, 3.1
+ARG VARIANT="6.0-focal"
+FROM mcr.microsoft.com/devcontainers/dotnet:0-${VARIANT}
+
+# Set up machine requirements to build the repo and the gh CLI
+RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
+ && apt-get -y install --no-install-recommends \
+ cmake \
+ llvm-10 \
+ clang-10 \
+ build-essential \
+ python \
+ curl \
+ git \
+ lldb-6.0 \
+ liblldb-6.0-dev \
+ libunwind8 \
+ libunwind8-dev \
+ gettext \
+ libicu-dev \
+ liblttng-ust-dev \
+ libssl-dev \
+ libnuma-dev \
+ libkrb5-dev \
+ zlib1g-dev \
+ ninja-build
+
+# Install V8 Engine
+SHELL ["/bin/bash", "-c"]
+
+RUN curl -sSL "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/linux/chromium-v8/v8-linux64-rel-8.5.183.zip" -o ./v8.zip \
+ && unzip ./v8.zip -d /usr/local/v8 \
+ && echo $'#!/usr/bin/env bash\n\
+"/usr/local/v8/d8" --snapshot_blob="/usr/local/v8/snapshot_blob.bin" "$@"\n' > /usr/local/bin/v8 \
+ && chmod +x /usr/local/bin/v8
+
+# install chromium dependencies to run debugger tests:
+RUN sudo apt-get install libnss3 -y \
+ && apt-get install libatk1.0-0 -y \
+ && apt-get install libatk-bridge2.0-0 -y \
+ && apt-get install libcups2 -y \
+ && apt-get install libdrm2 -y \
+ && apt-get install libxkbcommon-x11-0 -y \
+ && apt-get install libxcomposite-dev -y \
+ && apt-get install libxdamage1 -y \
+ && apt-get install libxrandr2 -y \
+ && apt-get install libgbm-dev -y \
+ && apt-get install libpango-1.0-0 -y \
+ && apt-get install libcairo2 -y \
+ && apt-get install libasound2 -y
+
+# install firefox dependencies to run debugger tests:
+RUN sudo apt-get install libdbus-glib-1-2 -y \
+ && apt-get install libgtk-3-0 -y \
+ && apt-get install libx11-xcb-dev -y
diff --git a/.devcontainer/wasm/devcontainer.json b/.devcontainer/wasm/devcontainer.json
new file mode 100644
index 00000000000000..44fca5078392db
--- /dev/null
+++ b/.devcontainer/wasm/devcontainer.json
@@ -0,0 +1,66 @@
+// For format details, see https://aka.ms/devcontainer.json.
+{
+ "name": "C# (.NET)",
+ "build": {
+ "dockerfile": "Dockerfile",
+ "args": {
+ // Update 'VARIANT' to pick a .NET Core version: 3.1, 6.0
+ // Append -bullseye or -focal to pin to an OS version.
+ "VARIANT": "6.0-focal"
+ }
+ },
+ "hostRequirements": {
+ "cpus": 4,
+ "memory": "8gb"
+ },
+
+ "features": {
+ "ghcr.io/devcontainers/features/github-cli:1": {}
+ },
+
+ // Configure tool-specific properties.
+ "customizations": {
+ // Configure properties specific to VS Code.
+ "vscode": {
+ // Add the IDs of extensions you want installed when the container is created.
+ "extensions": [
+ "ms-dotnettools.csharp"
+ ],
+ "settings": {
+ // Loading projects on demand is better for larger codebases
+ "omnisharp.enableMsBuildLoadProjectsOnDemand": true,
+ "omnisharp.enableRoslynAnalyzers": true,
+ "omnisharp.enableEditorConfigSupport": true,
+ "omnisharp.enableAsyncCompletion": true,
+ "omnisharp.testRunSettings": "${containerWorkspaceFolder}/artifacts/obj/vscode/.runsettings"
+ }
+ }
+ },
+
+ // Use 'onCreateCommand' to run pre-build commands inside the codespace
+ "onCreateCommand": "${containerWorkspaceFolder}/.devcontainer/scripts/onCreateCommand.sh wasm",
+
+ // Use 'postCreateCommand' to run commands after the container is created.
+ "postCreateCommand": "${containerWorkspaceFolder}/.devcontainer/scripts/postCreateCommand.sh",
+
+ // Add the locally installed dotnet to the path to ensure that it is activated
+ // This allows developers to just use 'dotnet build' on the command-line, and the local dotnet version will be used.
+ // Add the global tools dir to the PATH so that globally installed tools will work
+ "remoteEnv": {
+ "PATH": "${containerWorkspaceFolder}/.dotnet:${containerWorkspaceFolder}/.dotnet-tools-global:${containerEnv:PATH}",
+ "DOTNET_MULTILEVEL_LOOKUP": "0",
+ // Path to provisioned Emscripten SDK, for rebuilding the wasm runtime
+ "EMSDK_PATH": "${containerWorkspaceFolder}/src/mono/wasm/emsdk",
+ },
+
+ // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
+ "remoteUser": "vscode",
+
+ // Forward mono samples port
+ "forwardPorts": [8000],
+ "portsAttributes": {
+ "8000": {
+ "label": "mono wasm samples (8000)",
+ }
+ }
+}
diff --git a/.editorconfig b/.editorconfig
index 15658bab8d06ef..91d15d8df5b2d4 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -187,4 +187,3 @@ indent_size = 2
end_of_line = lf
[*.{cmd,bat}]
end_of_line = crlf
-
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index e3aa63b7c0ffad..de9cca1a2a97d0 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -45,7 +45,8 @@
/src/mono/mono/mini/*riscv* @vargaz @lambdageek
/src/mono/mono/mini/*type-check* @lambdageek
/src/mono/mono/mini/debugger-agent.c @vargaz @thaystg @lambdageek
-/src/mono/mono/mini/interp/* @BrzVlad @vargaz
+/src/mono/mono/mini/interp/* @BrzVlad @vargaz @kotlarmilos
+/src/mono/mono/mini/interp/*jiterp* @kg
/src/mono/mono/profiler @BrzVlad @lambdageek
/src/mono/mono/sgen @BrzVlad @lambdageek @naricc
@@ -62,7 +63,7 @@
/src/native/public/mono @marek-safar @lambdageek
/src/libraries/sendtohelix-wasm.targets @radical
-/src/mono/wasm @lewing @pavelsavara
+/src/mono/wasm @lewing @pavelsavara @kg
/src/mono/wasm/debugger @thaystg @radical
/src/mono/wasm/build @radical
/src/mono/sample/wasm @lewing @pavelsavara
@@ -74,7 +75,8 @@
/src/mono/nuget/*Workload.Mono.Toolchain*/ @lewing @radical
/src/mono/nuget/*MonoAOTCompiler*/ @lewing @radical
-/src/tests/BuildWasmApps/ @radical
+/src/mono/wasm/Wasm* @radical
+/src/mono/wasm/testassets @radical
/src/tasks/WasmAppBuilder/ @radical
/src/tasks/WorkloadBuildTasks/ @radical
/src/tasks/AotCompilerTask/ @radical
@@ -82,6 +84,14 @@
/eng/pipelines/**/*wasm* @radical
+# ILLink codeowners
+/src/tools/illink/ @marek-safar
+/src/tools/illink/src/analyzer/ @radekdoulik
+/src/tools/illink/src/ILLink.Tasks/ @sbomer
+/src/tools/illink/src/ILLink.RoslynAnalyzer/ @sbomer
+/src/tools/illink/src/linker/ @marek-safar @mrvoorhe
+/src/tools/illink/test/ @marek-safar @mrvoorhe
+
# Obsoletions / Custom Diagnostics
/docs/project/list-of-diagnostics.md @jeffhandley
diff --git a/.github/fabricbot.json b/.github/fabricbot.json
index 449cf4d51bc7b2..35e25d76b04d3f 100644
--- a/.github/fabricbot.json
+++ b/.github/fabricbot.json
@@ -74,6 +74,14 @@
"dotnet/area-system-text-regularexpressions"
]
},
+ {
+ "labels": [
+ "area-System.Transactions"
+ ],
+ "mentionees": [
+ "roji"
+ ]
+ },
{
"labels": [
"area-GC-mono"
@@ -87,7 +95,8 @@
"area-Codegen-Interpreter-mono"
],
"mentionees": [
- "brzvlad"
+ "brzvlad",
+ "kotlarmilos"
]
},
{
@@ -165,6 +174,26 @@
"vsadov"
]
},
+ {
+ "labels": [
+ "area-Tools-ILLink"
+ ],
+ "mentionees": [
+ "agocke",
+ "sbomer",
+ "vitek-karas"
+ ]
+ },
+ {
+ "labels": [
+ "area-NativeAOT-coreclr"
+ ],
+ "mentionees": [
+ "agocke",
+ "MichalStrehovsky",
+ "jkotas"
+ ]
+ },
{
"labels": [
"area-System.Buffers"
@@ -360,8 +389,9 @@
"area-System.Data.SqlClient"
],
"mentionees": [
- "cheenamalhotra",
- "david-engel"
+ "davoudeshtehari",
+ "david-engel",
+ "jrahnama"
]
},
{
@@ -531,7 +561,8 @@
],
"mentionees": [
"JulieLeeMSFT",
- "jakobbotsch"
+ "jakobbotsch",
+ "kunalspathak"
]
},
{
@@ -564,7 +595,8 @@
"area-System.Speech"
],
"mentionees": [
- "danmoseley"
+ "ericstj",
+ "jeffhandley"
]
},
{
@@ -1402,7 +1434,7 @@
{
"name": "noActivitySince",
"parameters": {
- "days": 1827
+ "days": 1644
}
},
{
@@ -1506,8 +1538,8 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "WCF Owned Areas",
- "isOrgProject": false
+ "projectName": "Tellurium (WCF, Serialization, Etc.)",
+ "isOrgProject": true
}
}
]
@@ -1530,6 +1562,12 @@
"label": "area-System.Runtime.Caching"
}
},
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.ServiceModel"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -1568,6 +1606,12 @@
"label": "area-System.Runtime.Caching"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.ServiceModel"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -1598,9 +1642,8 @@
{
"name": "addToProject",
"parameters": {
- "projectName": "WCF Owned Areas",
- "isOrgProject": false,
- "columnName": "Needs Triage"
+ "projectName": "Tellurium (WCF, Serialization, Etc.)",
+ "isOrgProject": true
}
}
]
@@ -1625,7 +1668,8 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "WCF Owned Areas"
+ "projectName": "Tellurium (WCF, Serialization, Etc.)",
+ "isOrgProject": true
}
}
]
@@ -1648,6 +1692,12 @@
"label": "area-System.Runtime.Caching"
}
},
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.ServiceModel"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -1680,6 +1730,12 @@
"label": "area-System.Runtime.Caching"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.ServiceModel"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -1717,8 +1773,8 @@
{
"name": "addToProject",
"parameters": {
- "projectName": "WCF Owned Areas",
- "columnName": "Open PRs"
+ "projectName": "Tellurium (WCF, Serialization, Etc.)",
+ "isOrgProject": true
}
}
]
@@ -1743,8 +1799,8 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "WCF Owned Areas",
- "isOrgProject": false
+ "projectName": "Tellurium (WCF, Serialization, Etc.)",
+ "isOrgProject": true
}
}
]
@@ -1767,6 +1823,12 @@
"label": "area-System.Runtime.Caching"
}
},
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.ServiceModel"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -1805,6 +1867,12 @@
"label": "area-System.Runtime.Caching"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.ServiceModel"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -1835,9 +1903,8 @@
{
"name": "addToProject",
"parameters": {
- "projectName": "WCF Owned Areas",
- "isOrgProject": false,
- "columnName": "Needs Triage"
+ "projectName": "Tellurium (WCF, Serialization, Etc.)",
+ "isOrgProject": true
}
}
]
@@ -1862,7 +1929,8 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "WCF Owned Areas"
+ "projectName": "Tellurium (WCF, Serialization, Etc.)",
+ "isOrgProject": true
}
}
]
@@ -1885,6 +1953,12 @@
"label": "area-System.Runtime.Caching"
}
},
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.ServiceModel"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -1917,6 +1991,12 @@
"label": "area-System.Runtime.Caching"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.ServiceModel"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -1954,8 +2034,8 @@
{
"name": "addToProject",
"parameters": {
- "projectName": "WCF Owned Areas",
- "columnName": "Open PRs"
+ "projectName": "Tellurium (WCF, Serialization, Etc.)",
+ "isOrgProject": true
}
}
]
@@ -2017,6 +2097,12 @@
"label": "area-Single-File"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Tools-ILLink"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -2046,6 +2132,12 @@
"parameters": {
"label": "area-Single-File"
}
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-Tools-ILLink"
+ }
}
]
},
@@ -3613,12 +3705,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - Issue Triage] Moved to Another Area",
+ "taskName": "[Area Pod: Adam / David / Jeremy - Issue Triage] Moved to Another Area",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true
}
}
@@ -3633,6 +3725,17 @@
{
"operator": "and",
"operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Caching"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -3666,6 +3769,28 @@
}
]
},
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Asn1"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Cbor"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -3683,7 +3808,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.IO.Compression"
+ "label": "area-System.IO.Hashing"
}
}
]
@@ -3705,7 +3830,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Memory"
+ "label": "area-System.Security"
}
}
]
@@ -3721,7 +3846,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true
}
}
@@ -3736,19 +3861,19 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - Issue Triage] Needs Triage",
+ "taskName": "[Area Pod: Adam / David / Jeremy - Issue Triage] Needs Triage",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"columnName": "Needs Triage",
"isOrgProject": true
}
@@ -3770,6 +3895,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Caching"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -3788,6 +3919,18 @@
"label": "area-System.Diagnostics.Process"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Asn1"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Cbor"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -3797,7 +3940,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.IO.Compression"
+ "label": "area-System.IO.Hashing"
}
},
{
@@ -3809,7 +3952,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Memory"
+ "label": "area-System.Security"
}
}
]
@@ -3839,6 +3982,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-Extensions-Caching"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -3857,6 +4006,18 @@
"label": "area-System.Diagnostics.Process"
}
},
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.Formats.Asn1"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.Formats.Cbor"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -3866,7 +4027,7 @@
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.IO.Compression"
+ "label": "area-System.IO.Hashing"
}
},
{
@@ -3878,7 +4039,7 @@
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Memory"
+ "label": "area-System.Security"
}
}
]
@@ -3898,7 +4059,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true
}
}
@@ -3907,7 +4068,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true,
"columnName": "Triaged"
}
@@ -3925,19 +4086,19 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - Issue Triage] Needs Further Triage",
+ "taskName": "[Area Pod: Adam / David / Jeremy - Issue Triage] Needs Further Triage",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"columnName": "Needs Triage",
"isOrgProject": true
}
@@ -3953,6 +4114,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Caching"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -3971,6 +4138,18 @@
"label": "area-System.Diagnostics.Process"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Asn1"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Cbor"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -3980,7 +4159,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.IO.Compression"
+ "label": "area-System.IO.Hashing"
}
},
{
@@ -3992,7 +4171,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Memory"
+ "label": "area-System.Security"
}
}
]
@@ -4021,7 +4200,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true
}
}
@@ -4030,7 +4209,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"columnName": "Triaged",
"isOrgProject": true
}
@@ -4048,12 +4227,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - Issue Triage] Triaged",
+ "taskName": "[Area Pod: Adam / David / Jeremy - Issue Triage] Triaged",
"actions": [
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"columnName": "Triaged",
"isOrgProject": true
}
@@ -4075,7 +4254,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true
}
},
@@ -4117,12 +4296,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - Issue Triage] Adam Updated Issue",
+ "taskName": "[Area Pod: Adam / David / Jeremy - Issue Triage] Adam Updated Issue",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"columnName": "Triage: Adam",
"isOrgProject": true
}
@@ -4138,7 +4317,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -4195,12 +4374,12 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - Issue Triage] Adam Commented",
+ "taskName": "[Area Pod: Adam / David / Jeremy - Issue Triage] Adam Commented",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"columnName": "Triage: Adam",
"isOrgProject": true
}
@@ -4216,7 +4395,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -4273,12 +4452,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - Issue Triage] David Updated Issue",
+ "taskName": "[Area Pod: Adam / David / Jeremy - Issue Triage] David Updated Issue",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"columnName": "Triage: David",
"isOrgProject": true
}
@@ -4294,7 +4473,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -4351,12 +4530,12 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - Issue Triage] David Commented",
+ "taskName": "[Area Pod: Adam / David / Jeremy - Issue Triage] David Commented",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"columnName": "Triage: David",
"isOrgProject": true
}
@@ -4372,7 +4551,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - Issue Triage",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -4426,88 +4605,255 @@
"taskSource": "fabricbot-config",
"taskType": "trigger",
"capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
+ "subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - PRs] Closed, Merged, or Moved",
+ "taskName": "[Area Pod: Adam / David / Jeremy - Issue Triage] Jeremy Updated Issue",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
- "columnName": "Done",
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
+ "columnName": "Triage: Jeremy",
"isOrgProject": true
}
}
],
- "eventType": "pull_request",
+ "eventType": "issue",
"eventNames": [
- "pull_request"
+ "issues"
],
"conditions": {
"operator": "and",
"operands": [
{
- "name": "isInProject",
+ "name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
- "isOrgProject": true
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
+ "isOrgProject": true,
+ "columnName": "Needs Triage"
+ }
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "bartonjs"
}
},
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
{
"operator": "not",
"operands": [
{
- "name": "isInProjectColumn",
+ "name": "isInMilestone",
+ "parameters": {}
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
- "columnName": "Done",
- "isOrgProject": true
+ "label": "needs-author-action"
}
}
]
},
{
- "operator": "or",
+ "operator": "not",
"operands": [
{
- "operator": "not",
- "operands": [
- {
- "name": "isOpen",
- "parameters": {}
- }
- ]
- },
- {
- "operator": "and",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-FileSystem"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Console"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "api-ready-for-review"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ {
+ "taskSource": "fabricbot-config",
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssueCommentResponder",
+ "version": "1.0",
+ "config": {
+ "taskName": "[Area Pod: Adam / David / Jeremy - Issue Triage] Jeremy Commented",
+ "actions": [
+ {
+ "name": "moveToProjectColumn",
+ "parameters": {
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
+ "columnName": "Triage: Jeremy",
+ "isOrgProject": true
+ }
+ }
+ ],
+ "eventType": "issue",
+ "eventNames": [
+ "issue_comment"
+ ],
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isInProjectColumn",
+ "parameters": {
+ "projectName": "Area Pod: Adam / David / Jeremy - Issue Triage",
+ "isOrgProject": true,
+ "columnName": "Needs Triage"
+ }
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "bartonjs"
+ }
+ },
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isInMilestone",
+ "parameters": {}
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "needs-author-action"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "api-ready-for-review"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ {
+ "taskSource": "fabricbot-config",
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "taskName": "[Area Pod: Adam / David / Jeremy - PRs] Closed, Merged, or Moved",
+ "actions": [
+ {
+ "name": "moveToProjectColumn",
+ "parameters": {
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
+ "columnName": "Done",
+ "isOrgProject": true
+ }
+ }
+ ],
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request"
+ ],
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isInProject",
+ "parameters": {
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
+ "isOrgProject": true
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isInProjectColumn",
+ "parameters": {
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
+ "columnName": "Done",
+ "isOrgProject": true
+ }
+ }
+ ]
+ },
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isOpen",
+ "parameters": {}
+ }
+ ]
+ },
+ {
+ "operator": "and",
+ "operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Caching"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-FileSystem"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Console"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
"name": "hasLabel",
"parameters": {
"label": "area-System.Diagnostics.Process"
@@ -4515,6 +4861,28 @@
}
]
},
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Asn1"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Cbor"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -4532,7 +4900,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.IO.Compression"
+ "label": "area-System.IO.Hashing"
}
}
]
@@ -4554,7 +4922,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Memory"
+ "label": "area-System.Security"
}
}
]
@@ -4574,12 +4942,12 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - PRs] New PR Needs Champion",
+ "taskName": "[Area Pod: Adam / David / Jeremy - PRs] New PR Needs Champion",
"actions": [
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -4601,6 +4969,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Caching"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -4619,6 +4993,18 @@
"label": "area-System.Diagnostics.Process"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Asn1"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Cbor"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -4628,7 +5014,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.IO.Compression"
+ "label": "area-System.IO.Hashing"
}
},
{
@@ -4640,7 +5026,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Memory"
+ "label": "area-System.Security"
}
}
]
@@ -4693,6 +5079,30 @@
}
]
}
+ ],
+ [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isAssignedToUser",
+ "parameters": {
+ "user": "bartonjs"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "bartonjs"
+ }
+ }
+ ]
+ }
]
],
{
@@ -4704,7 +5114,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"isOrgProject": true
}
}
@@ -4713,7 +5123,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -4731,19 +5141,19 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - PRs] Updated PR Needs Champion",
+ "taskName": "[Area Pod: Adam / David / Jeremy - PRs] Updated PR Needs Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -4774,6 +5184,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Caching"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -4795,13 +5211,25 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.IO"
+ "label": "area-System.Formats.Asn1"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.IO.Compression"
+ "label": "area-System.Formats.Cbor"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Hashing"
}
},
{
@@ -4813,7 +5241,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Memory"
+ "label": "area-System.Security"
}
}
]
@@ -4840,6 +5268,17 @@
}
]
},
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isAssignedToUser",
+ "parameters": {
+ "user": "bartonjs"
+ }
+ }
+ ]
+ },
{
"operator": "or",
"operands": [
@@ -4849,7 +5288,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"isOrgProject": true
}
}
@@ -4858,7 +5297,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -4876,19 +5315,19 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - PRs] Adam Assigned as Champion",
+ "taskName": "[Area Pod: Adam / David / Jeremy - PRs] Adam Assigned as Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"columnName": "Champion: Adam",
"isOrgProject": true
}
@@ -4908,6 +5347,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Caching"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -4926,6 +5371,18 @@
"label": "area-System.Diagnostics.Process"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Asn1"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Cbor"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -4935,7 +5392,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.IO.Compression"
+ "label": "area-System.IO.Hashing"
}
},
{
@@ -4947,7 +5404,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Memory"
+ "label": "area-System.Security"
}
}
]
@@ -4989,7 +5446,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"isOrgProject": true
}
}
@@ -4998,7 +5455,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -5006,7 +5463,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -5024,19 +5481,19 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Adam / David - PRs] David Assigned as Champion",
+ "taskName": "[Area Pod: Adam / David / Jeremy - PRs] David Assigned as Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"columnName": "Champion: David",
"isOrgProject": true
}
@@ -5056,6 +5513,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Caching"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -5074,6 +5537,18 @@
"label": "area-System.Diagnostics.Process"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Asn1"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Cbor"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -5083,7 +5558,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.IO.Compression"
+ "label": "area-System.IO.Hashing"
}
},
{
@@ -5095,7 +5570,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Memory"
+ "label": "area-System.Security"
}
}
]
@@ -5137,7 +5612,173 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
+ "isOrgProject": true
+ }
+ }
+ ]
+ },
+ {
+ "name": "isInProjectColumn",
+ "parameters": {
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
+ "columnName": "Needs Champion",
+ "isOrgProject": true
+ }
+ },
+ {
+ "name": "isInProjectColumn",
+ "parameters": {
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
+ "columnName": "Done",
+ "isOrgProject": true
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ {
+ "taskSource": "fabricbot-config",
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "taskName": "[Area Pod: Adam / David / Jeremy - PRs] Jeremy Assigned as Champion",
+ "actions": [
+ {
+ "name": "removeFromProject",
+ "parameters": {
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
+ "isOrgProject": true
+ }
+ },
+ {
+ "name": "addToProject",
+ "parameters": {
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
+ "columnName": "Champion: Jeremy",
+ "isOrgProject": true
+ }
+ }
+ ],
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request"
+ ],
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Caching"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-FileSystem"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Console"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Diagnostics.Process"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Asn1"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Cbor"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Hashing"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Linq.Parallel"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Security"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "name": "isAssignedToUser",
+ "parameters": {
+ "user": "bartonjs"
+ }
+ },
+ {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "bartonjs"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isInProject",
+ "parameters": {
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"isOrgProject": true
}
}
@@ -5146,7 +5787,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -5154,7 +5795,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Adam / David - PRs",
+ "projectName": "Area Pod: Adam / David / Jeremy - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -5172,12 +5813,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - Issue Triage] Moved to Another Area",
+ "taskName": "[Area Pod: Buyaa / Steve - Issue Triage] Moved to Another Area",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true
}
}
@@ -5198,7 +5839,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.CodeDom"
+ "label": "area-Extensions-DependencyInjection"
}
}
]
@@ -5209,7 +5850,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Configuration"
+ "label": "area-Extensions-Hosting"
}
}
]
@@ -5220,7 +5861,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection"
+ "label": "area-System.CodeDom"
}
}
]
@@ -5231,7 +5872,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Emit"
+ "label": "area-System.ComponentModel"
}
}
]
@@ -5242,7 +5883,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Metadata"
+ "label": "area-System.ComponentModel.Composition"
}
}
]
@@ -5253,7 +5894,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Resources"
+ "label": "area-System.Composition"
}
}
]
@@ -5264,7 +5905,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Runtime.CompilerServices"
+ "label": "area-System.Configuration"
}
}
]
@@ -5275,7 +5916,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.RegularExpressions"
+ "label": "area-System.Reflection"
}
}
]
@@ -5286,7 +5927,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Channels"
+ "label": "area-System.Reflection.Emit"
}
}
]
@@ -5297,7 +5938,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Tasks"
+ "label": "area-System.Reflection.Metadata"
}
}
]
@@ -5308,23 +5949,45 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.DirectoryServices"
+ "label": "area-System.Resources"
}
}
]
- }
- ]
- },
- {
- "name": "isAction",
- "parameters": {
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.RegularExpressions"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.DirectoryServices"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "isAction",
+ "parameters": {
"action": "unlabeled"
}
},
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true
}
}
@@ -5339,19 +6002,19 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - Issue Triage] Needs Triage",
+ "taskName": "[Area Pod: Buyaa / Steve - Issue Triage] Needs Triage",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"columnName": "Needs Triage",
"isOrgProject": true
}
@@ -5373,6 +6036,18 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-DependencyInjection"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Hosting"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -5382,55 +6057,55 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Configuration"
+ "label": "area-System.ComponentModel"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection"
+ "label": "area-System.ComponentModel.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Emit"
+ "label": "area-System.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Metadata"
+ "label": "area-System.Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Resources"
+ "label": "area-System.Reflection"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Runtime.CompilerServices"
+ "label": "area-System.Reflection.Emit"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.RegularExpressions"
+ "label": "area-System.Reflection.Metadata"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Channels"
+ "label": "area-System.Resources"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Tasks"
+ "label": "area-System.Text.RegularExpressions"
}
},
{
@@ -5466,6 +6141,18 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-Extensions-DependencyInjection"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-Extensions-Hosting"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -5475,55 +6162,55 @@
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Configuration"
+ "label": "area-System.ComponentModel"
}
},
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Reflection"
+ "label": "area-System.ComponentModel.Composition"
}
},
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Reflection.Emit"
+ "label": "area-System.Composition"
}
},
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Reflection.Metadata"
+ "label": "area-System.Configuration"
}
},
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Resources"
+ "label": "area-System.Reflection"
}
},
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Runtime.CompilerServices"
+ "label": "area-System.Reflection.Emit"
}
},
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Text.RegularExpressions"
+ "label": "area-System.Reflection.Metadata"
}
},
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Threading.Channels"
+ "label": "area-System.Resources"
}
},
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Threading.Tasks"
+ "label": "area-System.Text.RegularExpressions"
}
},
{
@@ -5549,7 +6236,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true
}
}
@@ -5558,7 +6245,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true,
"columnName": "Triaged"
}
@@ -5576,19 +6263,19 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - Issue Triage] Needs Further Triage",
+ "taskName": "[Area Pod: Buyaa / Steve - Issue Triage] Needs Further Triage",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"columnName": "Needs Triage",
"isOrgProject": true
}
@@ -5604,6 +6291,18 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-DependencyInjection"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Hosting"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -5613,55 +6312,55 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Configuration"
+ "label": "area-System.ComponentModel"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection"
+ "label": "area-System.ComponentModel.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Emit"
+ "label": "area-System.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Metadata"
+ "label": "area-System.Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Resources"
+ "label": "area-System.Reflection"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Runtime.CompilerServices"
+ "label": "area-System.Reflection.Emit"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.RegularExpressions"
+ "label": "area-System.Reflection.Metadata"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Channels"
+ "label": "area-System.Resources"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Tasks"
+ "label": "area-System.Text.RegularExpressions"
}
},
{
@@ -5696,7 +6395,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true
}
}
@@ -5705,7 +6404,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"columnName": "Triaged",
"isOrgProject": true
}
@@ -5723,12 +6422,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - Issue Triage] Triaged",
+ "taskName": "[Area Pod: Buyaa / Steve - Issue Triage] Triaged",
"actions": [
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"columnName": "Triaged",
"isOrgProject": true
}
@@ -5750,7 +6449,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true
}
},
@@ -5792,12 +6491,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - Issue Triage] Buyaa Updated Issue",
+ "taskName": "[Area Pod: Buyaa / Steve - Issue Triage] Buyaa Updated Issue",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"columnName": "Triage: Buyaa",
"isOrgProject": true
}
@@ -5813,7 +6512,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -5870,12 +6569,12 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - Issue Triage] Buyaa Commented",
+ "taskName": "[Area Pod: Buyaa / Steve - Issue Triage] Buyaa Commented",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"columnName": "Triage: Buyaa",
"isOrgProject": true
}
@@ -5891,7 +6590,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -5948,13 +6647,13 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - Issue Triage] Jose Updated Issue",
+ "taskName": "[Area Pod: Buyaa / Steve - Issue Triage] Steve H Updated Issue",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
- "columnName": "Triage: Jose",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
+ "columnName": "Triage: Steve H",
"isOrgProject": true
}
}
@@ -5969,7 +6668,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -5977,7 +6676,7 @@
{
"name": "isActivitySender",
"parameters": {
- "user": "joperezr"
+ "user": "steveharter"
}
},
{
@@ -6026,90 +6725,12 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - Issue Triage] Jose Commented",
- "actions": [
- {
- "name": "moveToProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
- "columnName": "Triage: Jose",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issue_comment"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
- "isOrgProject": true,
- "columnName": "Needs Triage"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "joperezr"
- }
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInMilestone",
- "parameters": {}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "needs-author-action"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "api-ready-for-review"
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - Issue Triage] Steve H Updated Issue",
+ "taskName": "[Area Pod: Buyaa / Steve - Issue Triage] Steve H Commented",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"columnName": "Triage: Steve H",
"isOrgProject": true
}
@@ -6117,7 +6738,7 @@
],
"eventType": "issue",
"eventNames": [
- "issues"
+ "issue_comment"
],
"conditions": {
"operator": "and",
@@ -6125,7 +6746,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
+ "projectName": "Area Pod: Buyaa / Steve - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -6179,127 +6800,49 @@
"taskSource": "fabricbot-config",
"taskType": "trigger",
"capabilityId": "IssueResponder",
- "subCapability": "IssueCommentResponder",
+ "subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - Issue Triage] Steve H Commented",
+ "taskName": "[Area Pod: Buyaa / Steve - PRs] Closed, Merged, or Moved",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
- "columnName": "Triage: Steve H",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
+ "columnName": "Done",
"isOrgProject": true
}
}
],
- "eventType": "issue",
+ "eventType": "pull_request",
"eventNames": [
- "issue_comment"
+ "pull_request"
],
"conditions": {
"operator": "and",
"operands": [
{
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - Issue Triage",
- "isOrgProject": true,
- "columnName": "Needs Triage"
- }
- },
- {
- "name": "isActivitySender",
+ "name": "isInProject",
"parameters": {
- "user": "steveharter"
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
+ "isOrgProject": true
}
},
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInMilestone",
- "parameters": {}
- }
- ]
- },
{
"operator": "not",
"operands": [
{
- "name": "hasLabel",
+ "name": "isInProjectColumn",
"parameters": {
- "label": "needs-author-action"
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
+ "columnName": "Done",
+ "isOrgProject": true
}
}
]
},
{
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "api-ready-for-review"
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - PRs] Closed, Merged, or Moved",
- "actions": [
- {
- "name": "moveToProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "pull_request",
- "eventNames": [
- "pull_request"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
- "isOrgProject": true
- }
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "operator": "or",
+ "operator": "or",
"operands": [
{
"operator": "not",
@@ -6313,6 +6856,28 @@
{
"operator": "and",
"operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-DependencyInjection"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Hosting"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -6330,7 +6895,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Configuration"
+ "label": "area-System.ComponentModel"
}
}
]
@@ -6341,7 +6906,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection"
+ "label": "area-System.ComponentModel.Composition"
}
}
]
@@ -6352,7 +6917,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Emit"
+ "label": "area-System.Composition"
}
}
]
@@ -6363,7 +6928,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Metadata"
+ "label": "area-System.Configuration"
}
}
]
@@ -6374,7 +6939,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Resources"
+ "label": "area-System.Reflection"
}
}
]
@@ -6385,7 +6950,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Runtime.CompilerServices"
+ "label": "area-System.Reflection.Emit"
}
}
]
@@ -6396,7 +6961,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.RegularExpressions"
+ "label": "area-System.Reflection.Metadata"
}
}
]
@@ -6407,7 +6972,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Channels"
+ "label": "area-System.Resources"
}
}
]
@@ -6418,7 +6983,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Tasks"
+ "label": "area-System.Text.RegularExpressions"
}
}
]
@@ -6449,12 +7014,12 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - PRs] New PR Needs Champion",
+ "taskName": "[Area Pod: Buyaa / Steve - PRs] New PR Needs Champion",
"actions": [
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -6476,6 +7041,18 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-DependencyInjection"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Hosting"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -6485,55 +7062,55 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Configuration"
+ "label": "area-System.ComponentModel"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection"
+ "label": "area-System.ComponentModel.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Emit"
+ "label": "area-System.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Metadata"
+ "label": "area-System.Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Resources"
+ "label": "area-System.Reflection"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Runtime.CompilerServices"
+ "label": "area-System.Reflection.Emit"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.RegularExpressions"
+ "label": "area-System.Reflection.Metadata"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Channels"
+ "label": "area-System.Resources"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Tasks"
+ "label": "area-System.Text.RegularExpressions"
}
},
{
@@ -6569,30 +7146,6 @@
]
}
],
- [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "joperezr"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "joperezr"
- }
- }
- ]
- }
- ],
[
{
"operator": "not",
@@ -6627,7 +7180,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"isOrgProject": true
}
}
@@ -6636,7 +7189,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -6654,19 +7207,19 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - PRs] Updated PR Needs Champion",
+ "taskName": "[Area Pod: Buyaa / Steve - PRs] Updated PR Needs Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -6700,78 +7253,79 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.CodeDom"
+ "label": "area-Extensions-DependencyInjection"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Configuration"
+ "label": "area-Extensions-Hosting"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection"
+ "label": "area-System.CodeDom"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Emit"
+ "label": "area-System.ComponentModel"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Metadata"
+ "label": "area-System.ComponentModel.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Resources"
+ "label": "area-System.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Runtime.CompilerServices"
+ "label": "area-System.Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.RegularExpressions"
+ "label": "area-System.Reflection"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Channels"
+ "label": "area-System.Reflection.Emit"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Tasks"
+ "label": "area-System.Reflection.Metadata"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.DirectoryServices"
+ "label": "area-System.Resources"
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
+ },
{
- "name": "isAssignedToUser",
+ "name": "hasLabel",
"parameters": {
- "user": "buyaa-n"
+ "label": "area-System.Text.RegularExpressions"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.DirectoryServices"
}
}
]
@@ -6782,7 +7336,7 @@
{
"name": "isAssignedToUser",
"parameters": {
- "user": "joperezr"
+ "user": "buyaa-n"
}
}
]
@@ -6807,7 +7361,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"isOrgProject": true
}
}
@@ -6816,7 +7370,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -6834,19 +7388,19 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - PRs] Buyaa Assigned as Champion",
+ "taskName": "[Area Pod: Buyaa / Steve - PRs] Buyaa Assigned as Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"columnName": "Champion: Buyaa",
"isOrgProject": true
}
@@ -6866,6 +7420,18 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-DependencyInjection"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Hosting"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -6875,55 +7441,55 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Configuration"
+ "label": "area-System.ComponentModel"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection"
+ "label": "area-System.ComponentModel.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Emit"
+ "label": "area-System.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Metadata"
+ "label": "area-System.Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Resources"
+ "label": "area-System.Reflection"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Runtime.CompilerServices"
+ "label": "area-System.Reflection.Emit"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.RegularExpressions"
+ "label": "area-System.Reflection.Metadata"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Channels"
+ "label": "area-System.Resources"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Tasks"
+ "label": "area-System.Text.RegularExpressions"
}
},
{
@@ -6971,7 +7537,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"isOrgProject": true
}
}
@@ -6980,7 +7546,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -6988,7 +7554,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -7006,20 +7572,20 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - PRs] Jose Assigned as Champion",
+ "taskName": "[Area Pod: Buyaa / Steve - PRs] Steve H Assigned as Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
- "columnName": "Champion: Jose",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
+ "columnName": "Champion: Steve H",
"isOrgProject": true
}
}
@@ -7038,6 +7604,18 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-DependencyInjection"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Hosting"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -7047,55 +7625,55 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Configuration"
+ "label": "area-System.ComponentModel"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection"
+ "label": "area-System.ComponentModel.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Emit"
+ "label": "area-System.Composition"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Reflection.Metadata"
+ "label": "area-System.Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Resources"
+ "label": "area-System.Reflection"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Runtime.CompilerServices"
+ "label": "area-System.Reflection.Emit"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.RegularExpressions"
+ "label": "area-System.Reflection.Metadata"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Channels"
+ "label": "area-System.Resources"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Threading.Tasks"
+ "label": "area-System.Text.RegularExpressions"
}
},
{
@@ -7112,7 +7690,7 @@
{
"name": "isAssignedToUser",
"parameters": {
- "user": "joperezr"
+ "user": "steveharter"
}
},
{
@@ -7127,7 +7705,7 @@
{
"name": "isActivitySender",
"parameters": {
- "user": "joperezr"
+ "user": "steveharter"
}
}
]
@@ -7143,7 +7721,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"isOrgProject": true
}
}
@@ -7152,7 +7730,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -7160,7 +7738,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
+ "projectName": "Area Pod: Buyaa / Steve - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -7175,208 +7753,69 @@
"taskSource": "fabricbot-config",
"taskType": "trigger",
"capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
+ "subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Buyaa / Jose / Steve - PRs] Steve H Assigned as Champion",
+ "taskName": "[Area Pod: Akhil / Carlos / Viktor - Issue Triage] Moved to Another Area",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
- "isOrgProject": true
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
- "columnName": "Champion: Steve H",
+ "projectName": "Area Pod: Akhil / Carlos / Viktor - Issue Triage",
"isOrgProject": true
}
}
],
- "eventType": "pull_request",
+ "eventType": "issue",
"eventNames": [
- "pull_request"
+ "issues"
],
"conditions": {
"operator": "and",
"operands": [
{
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "or",
+ "operator": "and",
"operands": [
{
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.CodeDom"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Configuration"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Reflection"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Reflection.Emit"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Reflection.Metadata"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Resources"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Runtime.CompilerServices"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Text.RegularExpressions"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Threading.Channels"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Threading.Tasks"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.DirectoryServices"
- }
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "steveharter"
- }
- },
- {
- "operator": "and",
+ "operator": "not",
"operands": [
{
- "name": "isAction",
+ "name": "hasLabel",
"parameters": {
- "action": "opened"
+ "label": "area-DependencyModel"
}
- },
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
{
- "name": "isActivitySender",
+ "name": "hasLabel",
"parameters": {
- "user": "steveharter"
+ "label": "area-Infrastructure-libraries"
}
}
]
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
+ },
{
"operator": "not",
"operands": [
{
- "name": "isInProject",
+ "name": "hasLabel",
"parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
- "isOrgProject": true
+ "label": "area-Microsoft.Win32"
}
}
]
},
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
- "columnName": "Needs Champion",
- "isOrgProject": true
- }
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Buyaa / Jose / Steve - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Akhil / Carlos / Viktor - Issue Triage] Moved to Another Area",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Akhil / Carlos / Viktor - Issue Triage",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issues"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "and",
- "operands": [
{
"operator": "not",
"operands": [
{
"name": "hasLabel",
"parameters": {
- "label": "area-Infrastructure-libraries"
+ "label": "area-System.Diagnostics.EventLog"
}
}
]
@@ -7387,7 +7826,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-Microsoft.Win32"
+ "label": "area-System.Diagnostics.PerformanceCounter"
}
}
]
@@ -7398,7 +7837,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Diagnostics.EventLog"
+ "label": "area-System.Diagnostics.TraceSource"
}
}
]
@@ -7409,7 +7848,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Diagnostics.PerformanceCounter"
+ "label": "area-System.Drawing"
}
}
]
@@ -7420,7 +7859,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Diagnostics.TraceSource"
+ "label": "area-System.Formats.Tar"
}
}
]
@@ -7431,7 +7870,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Drawing"
+ "label": "area-System.IO.Compression"
}
}
]
@@ -7518,6 +7957,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-DependencyModel"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -7554,6 +7999,18 @@
"label": "area-System.Drawing"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Tar"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Compression"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -7593,6 +8050,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-DependencyModel"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -7629,6 +8092,18 @@
"label": "area-System.Drawing"
}
},
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.Formats.Tar"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.IO.Compression"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -7713,6 +8188,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-DependencyModel"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -7749,6 +8230,18 @@
"label": "area-System.Drawing"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Tar"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Compression"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -8404,6 +8897,17 @@
{
"operator": "and",
"operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-DependencyModel"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -8470,6 +8974,28 @@
}
]
},
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Tar"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Compression"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -8534,6 +9060,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-DependencyModel"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -8573,21 +9105,33 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Management"
+ "label": "area-System.Formats.Tar"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.ServiceProcess"
+ "label": "area-System.IO.Compression"
}
- }
- ]
- },
- [
- [
+ },
{
- "operator": "not",
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Management"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.ServiceProcess"
+ }
+ }
+ ]
+ },
+ [
+ [
+ {
+ "operator": "not",
"operands": [
{
"name": "isAssignedToUser",
@@ -8737,6 +9281,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-DependencyModel"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -8773,6 +9323,18 @@
"label": "area-System.Drawing"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Tar"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Compression"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -8888,6 +9450,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-DependencyModel"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -8924,6 +9492,18 @@
"label": "area-System.Drawing"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Tar"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Compression"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -9042,6 +9622,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-DependencyModel"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -9078,6 +9664,18 @@
"label": "area-System.Drawing"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Tar"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Compression"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -9196,6 +9794,12 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-DependencyModel"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -9232,6 +9836,18 @@
"label": "area-System.Drawing"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Formats.Tar"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Compression"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -9349,6 +9965,17 @@
}
]
},
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Memory"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -9382,6 +10009,17 @@
}
]
},
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Runtime.CompilerServices"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -9392,6 +10030,28 @@
}
}
]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Channels"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Tasks"
+ }
+ }
+ ]
}
]
},
@@ -9459,6 +10119,12 @@
"label": "area-System.Buffers"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Memory"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -9477,11 +10143,29 @@
"label": "area-System.Runtime"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Runtime.CompilerServices"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
"label": "area-System.Runtime.Intrinsics"
}
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Channels"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Tasks"
+ }
}
]
},
@@ -9516,6 +10200,12 @@
"label": "area-System.Buffers"
}
},
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.Memory"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -9534,11 +10224,29 @@
"label": "area-System.Runtime"
}
},
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.Runtime.CompilerServices"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
"label": "area-System.Runtime.Intrinsics"
}
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.Threading.Channels"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.Threading.Tasks"
+ }
}
]
}
@@ -9618,6 +10326,12 @@
"label": "area-System.Buffers"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Memory"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -9636,11 +10350,29 @@
"label": "area-System.Runtime"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Runtime.CompilerServices"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
"label": "area-System.Runtime.Intrinsics"
}
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Channels"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Tasks"
+ }
}
]
},
@@ -10296,6 +11028,17 @@
}
]
},
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Memory"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -10329,6 +11072,17 @@
}
]
},
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Runtime.CompilerServices"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -10339,6 +11093,28 @@
}
}
]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Channels"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Tasks"
+ }
+ }
+ ]
}
]
}
@@ -10388,6 +11164,12 @@
"label": "area-System.Buffers"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Memory"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -10409,11 +11191,29 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Runtime.Intrinsics"
+ "label": "area-System.Runtime.CompilerServices"
}
- }
- ]
- },
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Runtime.Intrinsics"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Channels"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Tasks"
+ }
+ }
+ ]
+ },
[
[
{
@@ -10573,6 +11373,12 @@
"label": "area-System.Buffers"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Memory"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -10591,11 +11397,29 @@
"label": "area-System.Runtime"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Runtime.CompilerServices"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
"label": "area-System.Runtime.Intrinsics"
}
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Channels"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Tasks"
+ }
}
]
},
@@ -10706,6 +11530,12 @@
"label": "area-System.Buffers"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Memory"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -10724,11 +11554,29 @@
"label": "area-System.Runtime"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Runtime.CompilerServices"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
"label": "area-System.Runtime.Intrinsics"
}
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Channels"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Tasks"
+ }
}
]
},
@@ -10842,6 +11690,12 @@
"label": "area-System.Buffers"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Memory"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -10860,11 +11714,29 @@
"label": "area-System.Runtime"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Runtime.CompilerServices"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
"label": "area-System.Runtime.Intrinsics"
}
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Channels"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Tasks"
+ }
}
]
},
@@ -10978,6 +11850,12 @@
"label": "area-System.Buffers"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Memory"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -10996,11 +11874,29 @@
"label": "area-System.Runtime"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Runtime.CompilerServices"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
"label": "area-System.Runtime.Intrinsics"
}
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Channels"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Threading.Tasks"
+ }
}
]
},
@@ -11076,12 +11972,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - Issue Triage] Moved to Another Area",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Moved to Another Area",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true
}
}
@@ -11096,6 +11992,72 @@
{
"operator": "and",
"operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Configuration"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Logging"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Options"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Primitives"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Diagnostics.Activity"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Globalization"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -11107,6 +12069,39 @@
}
]
},
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.ComponentModel.DataAnnotations"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.DateTime"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Ports"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -11118,6 +12113,28 @@
}
]
},
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Encoding"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Encodings.Web"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -11151,7 +12168,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true
}
}
@@ -11166,19 +12183,19 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - Issue Triage] Needs Triage",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Needs Triage",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"columnName": "Needs Triage",
"isOrgProject": true
}
@@ -11203,41 +12220,107 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Collections"
+ "label": "area-Extensions-Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Linq"
+ "label": "area-Extensions-Logging"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Json"
+ "label": "area-Extensions-Options"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Xml"
+ "label": "area-Extensions-Primitives"
}
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
+ },
{
- "name": "isAction",
+ "name": "hasLabel",
"parameters": {
- "action": "reopened"
+ "label": "area-System.Diagnostics.Activity"
}
},
{
- "operator": "not",
- "operands": [
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Globalization"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Collections"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.ComponentModel.DataAnnotations"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.DateTime"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Ports"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Linq"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Encoding"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Encodings.Web"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Json"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Xml"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "reopened"
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
{
"name": "isInMilestone",
"parameters": {}
@@ -11251,18 +12334,84 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-Extensions-Configuration"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-Extensions-Logging"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-Extensions-Options"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-Extensions-Primitives"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.Diagnostics.Activity"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.Globalization"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
"label": "area-System.Collections"
}
},
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.ComponentModel.DataAnnotations"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.DateTime"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.IO.Ports"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
"label": "area-System.Linq"
}
},
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.Text.Encoding"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-System.Text.Encodings.Web"
+ }
+ },
{
"name": "labelAdded",
"parameters": {
@@ -11292,7 +12441,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true
}
}
@@ -11301,7 +12450,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true,
"columnName": "Triaged"
}
@@ -11319,19 +12468,19 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - Issue Triage] Needs Further Triage",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Needs Further Triage",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"columnName": "Needs Triage",
"isOrgProject": true
}
@@ -11347,18 +12496,84 @@
{
"operator": "or",
"operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Configuration"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Logging"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Options"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Primitives"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Diagnostics.Activity"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Globalization"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
"label": "area-System.Collections"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.ComponentModel.DataAnnotations"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.DateTime"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Ports"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
"label": "area-System.Linq"
}
},
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Encoding"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Encodings.Web"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -11397,7 +12612,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true
}
}
@@ -11406,7 +12621,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"columnName": "Triaged",
"isOrgProject": true
}
@@ -11424,12 +12639,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - Issue Triage] Triaged",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Triaged",
"actions": [
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"columnName": "Triaged",
"isOrgProject": true
}
@@ -11451,7 +12666,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true
}
},
@@ -11493,12 +12708,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - Issue Triage] Eirik Updated Issue",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Eirik Updated Issue",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"columnName": "Triage: Eirik",
"isOrgProject": true
}
@@ -11514,7 +12729,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -11571,12 +12786,12 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - Issue Triage] Eirik Commented",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Eirik Commented",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"columnName": "Triage: Eirik",
"isOrgProject": true
}
@@ -11592,7 +12807,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -11649,12 +12864,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - Issue Triage] Krzysztof Updated Issue",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Krzysztof Updated Issue",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"columnName": "Triage: Krzysztof",
"isOrgProject": true
}
@@ -11670,7 +12885,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -11727,12 +12942,12 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - Issue Triage] Krzysztof Commented",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Krzysztof Commented",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"columnName": "Triage: Krzysztof",
"isOrgProject": true
}
@@ -11748,7 +12963,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -11805,12 +13020,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - Issue Triage] Layomi Updated Issue",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Layomi Updated Issue",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"columnName": "Triage: Layomi",
"isOrgProject": true
}
@@ -11826,7 +13041,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -11883,12 +13098,12 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - Issue Triage] Layomi Commented",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Layomi Commented",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"columnName": "Triage: Layomi",
"isOrgProject": true
}
@@ -11904,7 +13119,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - Issue Triage",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -11958,107 +13173,73 @@
"taskSource": "fabricbot-config",
"taskType": "trigger",
"capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
+ "subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - PRs] Closed, Merged, or Moved",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Tarek Updated Issue",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Done",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
+ "columnName": "Triage: Tarek",
"isOrgProject": true
}
}
],
- "eventType": "pull_request",
+ "eventType": "issue",
"eventNames": [
- "pull_request"
+ "issues"
],
"conditions": {
"operator": "and",
"operands": [
{
- "name": "isInProject",
+ "name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "isOrgProject": true
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
+ "isOrgProject": true,
+ "columnName": "Needs Triage"
+ }
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "tarekgh"
}
},
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
{
"operator": "not",
"operands": [
{
- "name": "isInProjectColumn",
+ "name": "isInMilestone",
+ "parameters": {}
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Done",
- "isOrgProject": true
+ "label": "needs-author-action"
}
}
]
},
{
- "operator": "or",
+ "operator": "not",
"operands": [
{
- "operator": "not",
- "operands": [
- {
- "name": "isOpen",
- "parameters": {}
- }
- ]
- },
- {
- "operator": "and",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Collections"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Linq"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Text.Json"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Xml"
- }
- }
- ]
- }
- ]
+ "name": "hasLabel",
+ "parameters": {
+ "label": "api-ready-for-review"
+ }
}
]
}
@@ -12070,157 +13251,72 @@
"taskSource": "fabricbot-config",
"taskType": "trigger",
"capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
+ "subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - PRs] New PR Needs Champion",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage] Tarek Commented",
"actions": [
{
- "name": "addToProject",
+ "name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Needs Champion",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
+ "columnName": "Triage: Tarek",
"isOrgProject": true
}
}
],
- "eventType": "pull_request",
+ "eventType": "issue",
"eventNames": [
- "pull_request"
+ "issue_comment"
],
"conditions": {
"operator": "and",
"operands": [
{
- "name": "isAction",
+ "name": "isInProjectColumn",
"parameters": {
- "action": "opened"
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - Issue Triage",
+ "isOrgProject": true,
+ "columnName": "Needs Triage"
}
},
{
- "operator": "or",
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "tarekgh"
+ }
+ },
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
+ {
+ "operator": "not",
"operands": [
{
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Collections"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Linq"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Text.Json"
- }
- },
+ "name": "isInMilestone",
+ "parameters": {}
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Xml"
+ "label": "needs-author-action"
}
}
]
},
- [
- [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "eiriktsarpalis"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "eiriktsarpalis"
- }
- }
- ]
- }
- ],
- [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "krwq"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "krwq"
- }
- }
- ]
- }
- ],
- [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "layomia"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "layomia"
- }
- }
- ]
- }
- ]
- ],
{
- "operator": "or",
+ "operator": "not",
"operands": [
{
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "name": "isInProjectColumn",
+ "name": "hasLabel",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Done",
- "isOrgProject": true
+ "label": "api-ready-for-review"
}
}
]
@@ -12236,20 +13332,13 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - PRs] Updated PR Needs Champion",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs] Closed, Merged, or Moved",
"actions": [
{
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "isOrgProject": true
- }
- },
- {
- "name": "addToProject",
+ "name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Needs Champion",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "columnName": "Done",
"isOrgProject": true
}
}
@@ -12262,16 +13351,21 @@
"operator": "and",
"operands": [
{
- "name": "isOpen",
- "parameters": {}
+ "name": "isInProject",
+ "parameters": {
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "isOrgProject": true
+ }
},
{
"operator": "not",
"operands": [
{
- "name": "isAction",
+ "name": "isInProjectColumn",
"parameters": {
- "action": "opened"
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "columnName": "Done",
+ "isOrgProject": true
}
}
]
@@ -12280,86 +13374,183 @@
"operator": "or",
"operands": [
{
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Collections"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Linq"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Text.Json"
- }
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isOpen",
+ "parameters": {}
+ }
+ ]
},
{
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Xml"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "eiriktsarpalis"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "krwq"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "layomia"
- }
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "operator": "not",
+ "operator": "and",
"operands": [
{
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "isOrgProject": true
- }
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Configuration"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Logging"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Options"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Primitives"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Diagnostics.Activity"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Globalization"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Collections"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.ComponentModel.DataAnnotations"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.DateTime"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Ports"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Linq"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Encoding"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Encodings.Web"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Json"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Xml"
+ }
+ }
+ ]
}
]
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
}
]
}
@@ -12374,20 +13565,13 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - PRs] Eirik Assigned as Champion",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs] New PR Needs Champion",
"actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "isOrgProject": true
- }
- },
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Champion: Eirik",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "columnName": "Needs Champion",
"isOrgProject": true
}
}
@@ -12400,8 +13584,10 @@
"operator": "and",
"operands": [
{
- "name": "isOpen",
- "parameters": {}
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
},
{
"operator": "or",
@@ -12409,133 +13595,39 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Collections"
+ "label": "area-Extensions-Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Linq"
+ "label": "area-Extensions-Logging"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Json"
+ "label": "area-Extensions-Options"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Xml"
+ "label": "area-Extensions-Primitives"
}
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
+ },
{
- "name": "isAssignedToUser",
+ "name": "hasLabel",
"parameters": {
- "user": "eiriktsarpalis"
+ "label": "area-System.Diagnostics.Activity"
}
},
{
- "operator": "and",
- "operands": [
- {
- "name": "isAction",
- "parameters": {
- "action": "opened"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "eiriktsarpalis"
- }
- }
- ]
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Needs Champion",
- "isOrgProject": true
- }
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - PRs] Krzysztof Assigned as Champion",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "isOrgProject": true
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Champion: Krzysztof",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "pull_request",
- "eventNames": [
- "pull_request"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "or",
- "operands": [
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Globalization"
+ }
+ },
{
"name": "hasLabel",
"parameters": {
@@ -12545,137 +13637,37 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Linq"
+ "label": "area-System.ComponentModel.DataAnnotations"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Json"
+ "label": "area-System.DateTime"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Xml"
- }
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "krwq"
+ "label": "area-System.IO.Ports"
}
},
{
- "operator": "and",
- "operands": [
- {
- "name": "isAction",
- "parameters": {
- "action": "opened"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "krwq"
- }
- }
- ]
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "name": "isInProjectColumn",
+ "name": "hasLabel",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Needs Champion",
- "isOrgProject": true
+ "label": "area-System.Linq"
}
},
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eirik / Krzysztof / Layomi - PRs] Layomi Assigned as Champion",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "isOrgProject": true
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Champion: Layomi",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "pull_request",
- "eventNames": [
- "pull_request"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "or",
- "operands": [
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Collections"
+ "label": "area-System.Text.Encoding"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Linq"
+ "label": "area-System.Text.Encodings.Web"
}
},
{
@@ -12692,2072 +13684,125 @@
}
]
},
- {
- "operator": "or",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "layomia"
- }
- },
+ [
+ [
{
- "operator": "and",
+ "operator": "not",
"operands": [
{
- "name": "isAction",
+ "name": "isAssignedToUser",
"parameters": {
- "action": "opened"
+ "user": "eiriktsarpalis"
}
- },
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
{
"name": "isActivitySender",
"parameters": {
- "user": "layomia"
+ "user": "eiriktsarpalis"
}
}
]
}
- ]
- },
- {
- "operator": "or",
- "operands": [
+ ],
+ [
{
"operator": "not",
"operands": [
{
- "name": "isInProject",
+ "name": "isAssignedToUser",
"parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "isOrgProject": true
+ "user": "krwq"
}
}
]
},
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Needs Champion",
- "isOrgProject": true
- }
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eirik / Krzysztof / Layomi - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Moved to Another Area",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issues"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "and",
- "operands": [
{
"operator": "not",
"operands": [
{
- "name": "hasLabel",
+ "name": "isActivitySender",
"parameters": {
- "label": "area-Meta"
+ "user": "krwq"
}
}
]
}
- ]
- },
- {
- "name": "isAction",
- "parameters": {
- "action": "unlabeled"
- }
- },
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true
- }
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Needs Triage",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "columnName": "Needs Triage",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issues"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "or",
- "operands": [
- {
- "operator": "and",
- "operands": [
- {
- "operator": "or",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Meta"
- }
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "isAction",
- "parameters": {
- "action": "reopened"
- }
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInMilestone",
- "parameters": {}
- }
- ]
- }
- ]
- }
- ]
- },
+ ],
+ [
{
- "operator": "or",
+ "operator": "not",
"operands": [
{
- "name": "labelAdded",
+ "name": "isAssignedToUser",
"parameters": {
- "label": "area-Meta"
+ "user": "layomia"
}
}
]
- }
- ]
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "or",
- "operands": [
+ },
{
"operator": "not",
"operands": [
{
- "name": "isInProject",
+ "name": "isActivitySender",
"parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true
+ "user": "layomia"
}
}
]
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true,
- "columnName": "Triaged"
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssueCommentResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Needs Further Triage",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "columnName": "Needs Triage",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issue_comment"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "or",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Meta"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isCloseAndComment",
- "parameters": {}
}
- ]
- },
- {
- "name": "activitySenderHasPermissions",
- "parameters": {
- "permissions": "read"
- }
- },
- {
- "operator": "or",
- "operands": [
+ ],
+ [
{
"operator": "not",
"operands": [
{
- "name": "isInProject",
+ "name": "isAssignedToUser",
"parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "columnName": "Triaged",
- "isOrgProject": true
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Triaged",
- "actions": [
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "columnName": "Triaged",
- "isOrgProject": true
- }
- },
- {
- "name": "removeLabel",
- "parameters": {
- "label": "untriaged"
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issues"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true
- }
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "addedToMilestone",
- "parameters": {}
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "needs-author-action"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "api-ready-for-review"
- }
- },
- {
- "name": "isAction",
- "parameters": {
- "action": "closed"
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Eric Updated Issue",
- "actions": [
- {
- "name": "moveToProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "columnName": "Triage: Eric",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issues"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true,
- "columnName": "Needs Triage"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "ericstj"
- }
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInMilestone",
- "parameters": {}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "needs-author-action"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "api-ready-for-review"
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssueCommentResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Eric Commented",
- "actions": [
- {
- "name": "moveToProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "columnName": "Triage: Eric",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issue_comment"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true,
- "columnName": "Needs Triage"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "ericstj"
- }
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInMilestone",
- "parameters": {}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "needs-author-action"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "api-ready-for-review"
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Jeff Updated Issue",
- "actions": [
- {
- "name": "moveToProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "columnName": "Triage: Jeff",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issues"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true,
- "columnName": "Needs Triage"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "jeffhandley"
- }
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInMilestone",
- "parameters": {}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "needs-author-action"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "api-ready-for-review"
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssueCommentResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Jeff Commented",
- "actions": [
- {
- "name": "moveToProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "columnName": "Triage: Jeff",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issue_comment"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - Issue Triage",
- "isOrgProject": true,
- "columnName": "Needs Triage"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "jeffhandley"
- }
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInMilestone",
- "parameters": {}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "needs-author-action"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "api-ready-for-review"
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - PRs] Closed, Merged, or Moved",
- "actions": [
- {
- "name": "moveToProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "pull_request",
- "eventNames": [
- "pull_request"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "isOrgProject": true
- }
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isOpen",
- "parameters": {}
- }
- ]
- },
- {
- "operator": "and",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Meta"
- }
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - PRs] New PR Needs Champion",
- "actions": [
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Needs Champion",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "pull_request",
- "eventNames": [
- "pull_request"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isAction",
- "parameters": {
- "action": "opened"
- }
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Meta"
- }
- }
- ]
- },
- [
- [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "ericstj"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "ericstj"
- }
- }
- ]
- }
- ],
- [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "jeffhandley"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "jeffhandley"
- }
- }
- ]
- }
- ]
- ],
- {
- "operator": "or",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - PRs] Updated PR Needs Champion",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "isOrgProject": true
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Needs Champion",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "pull_request",
- "eventNames": [
- "pull_request"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAction",
- "parameters": {
- "action": "opened"
- }
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Meta"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "ericstj"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "jeffhandley"
- }
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - PRs] Eric Assigned as Champion",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "isOrgProject": true
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Champion: Eric",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "pull_request",
- "eventNames": [
- "pull_request"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Meta"
- }
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "ericstj"
- }
- },
- {
- "operator": "and",
- "operands": [
- {
- "name": "isAction",
- "parameters": {
- "action": "opened"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "ericstj"
- }
- }
- ]
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Needs Champion",
- "isOrgProject": true
- }
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Jeff - PRs] Jeff Assigned as Champion",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "isOrgProject": true
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Champion: Jeff",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "pull_request",
- "eventNames": [
- "pull_request"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Meta"
- }
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "jeffhandley"
- }
- },
- {
- "operator": "and",
- "operands": [
- {
- "name": "isAction",
- "parameters": {
- "action": "opened"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "jeffhandley"
- }
- }
- ]
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Needs Champion",
- "isOrgProject": true
- }
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Jeff - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - Issue Triage] Moved to Another Area",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issues"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "and",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-DependencyModel"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Caching"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Configuration"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-DependencyInjection"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Hosting"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Logging"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Options"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Primitives"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.ComponentModel"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.ComponentModel.Composition"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Composition"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Diagnostics.Activity"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Globalization"
- }
- }
- ]
- }
- ]
- },
- {
- "name": "isAction",
- "parameters": {
- "action": "unlabeled"
- }
- },
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true
- }
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - Issue Triage] Needs Triage",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "columnName": "Needs Triage",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issues"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "or",
- "operands": [
- {
- "operator": "and",
- "operands": [
- {
- "operator": "or",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-DependencyModel"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Caching"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Configuration"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-DependencyInjection"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Hosting"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Logging"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Options"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Primitives"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.ComponentModel"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.ComponentModel.Composition"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Composition"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Diagnostics.Activity"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Globalization"
- }
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "isAction",
- "parameters": {
- "action": "reopened"
- }
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInMilestone",
- "parameters": {}
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-DependencyModel"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-Extensions-Caching"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-Extensions-Configuration"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-Extensions-DependencyInjection"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-Extensions-Hosting"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-Extensions-Logging"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-Extensions-Options"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-Extensions-Primitives"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-System.ComponentModel"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-System.ComponentModel.Composition"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-System.Composition"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-System.Diagnostics.Activity"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-System.Globalization"
- }
- }
- ]
- }
- ]
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "or",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true,
- "columnName": "Triaged"
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssueCommentResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - Issue Triage] Needs Further Triage",
- "actions": [
- {
- "name": "removeFromProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "columnName": "Needs Triage",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issue_comment"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "or",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-DependencyModel"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Caching"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Configuration"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-DependencyInjection"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Hosting"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Logging"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Options"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Primitives"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.ComponentModel"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.ComponentModel.Composition"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Composition"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Diagnostics.Activity"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Globalization"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isCloseAndComment",
- "parameters": {}
- }
- ]
- },
- {
- "name": "activitySenderHasPermissions",
- "parameters": {
- "permissions": "read"
- }
- },
- {
- "operator": "or",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true
- }
- }
- ]
- },
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "columnName": "Triaged",
- "isOrgProject": true
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - Issue Triage] Triaged",
- "actions": [
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "columnName": "Triaged",
- "isOrgProject": true
- }
- },
- {
- "name": "removeLabel",
- "parameters": {
- "label": "untriaged"
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issues"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true
- }
- },
- {
- "operator": "or",
- "operands": [
- {
- "name": "addedToMilestone",
- "parameters": {}
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "needs-author-action"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "api-ready-for-review"
- }
- },
- {
- "name": "isAction",
- "parameters": {
- "action": "closed"
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - Issue Triage] Maryam Updated Issue",
- "actions": [
- {
- "name": "moveToProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "columnName": "Triage: Maryam",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issues"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true,
- "columnName": "Needs Triage"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "maryamariyan"
- }
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInMilestone",
- "parameters": {}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "needs-author-action"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "api-ready-for-review"
- }
- }
- ]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssueCommentResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - Issue Triage] Maryam Commented",
- "actions": [
- {
- "name": "moveToProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "columnName": "Triage: Maryam",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issue_comment"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true,
- "columnName": "Needs Triage"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "maryamariyan"
- }
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInMilestone",
- "parameters": {}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
+ "user": "tarekgh"
+ }
+ }
+ ]
+ },
{
- "name": "hasLabel",
- "parameters": {
- "label": "needs-author-action"
- }
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "tarekgh"
+ }
+ }
+ ]
}
]
- },
+ ],
{
- "operator": "not",
+ "operator": "or",
"operands": [
{
- "name": "hasLabel",
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isInProject",
+ "parameters": {
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "isOrgProject": true
+ }
+ }
+ ]
+ },
+ {
+ "name": "isInProjectColumn",
"parameters": {
- "label": "api-ready-for-review"
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "columnName": "Done",
+ "isOrgProject": true
}
}
]
@@ -14770,41 +13815,34 @@
"taskSource": "fabricbot-config",
"taskType": "trigger",
"capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
+ "subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - Issue Triage] Tarek Updated Issue",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs] Updated PR Needs Champion",
"actions": [
{
- "name": "moveToProjectColumn",
+ "name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "columnName": "Triage: Tarek",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "isOrgProject": true
+ }
+ },
+ {
+ "name": "addToProject",
+ "parameters": {
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "columnName": "Needs Champion",
"isOrgProject": true
}
}
],
- "eventType": "issue",
+ "eventType": "pull_request",
"eventNames": [
- "issues"
+ "pull_request"
],
"conditions": {
"operator": "and",
"operands": [
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true,
- "columnName": "Needs Triage"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "tarekgh"
- }
- },
{
"name": "isOpen",
"parameters": {}
@@ -14813,86 +13851,116 @@
"operator": "not",
"operands": [
{
- "name": "isInMilestone",
- "parameters": {}
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
}
]
},
{
- "operator": "not",
+ "operator": "or",
"operands": [
{
"name": "hasLabel",
"parameters": {
- "label": "needs-author-action"
+ "label": "area-Extensions-Configuration"
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
+ },
{
"name": "hasLabel",
"parameters": {
- "label": "api-ready-for-review"
+ "label": "area-Extensions-Logging"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Options"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-Extensions-Primitives"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Diagnostics.Activity"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Globalization"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Collections"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.ComponentModel.DataAnnotations"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.DateTime"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.IO.Ports"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Linq"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Encoding"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Encodings.Web"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Json"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Xml"
}
}
]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssueCommentResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - Issue Triage] Tarek Commented",
- "actions": [
- {
- "name": "moveToProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "columnName": "Triage: Tarek",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issue_comment"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - Issue Triage",
- "isOrgProject": true,
- "columnName": "Needs Triage"
- }
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "tarekgh"
- }
- },
- {
- "name": "isOpen",
- "parameters": {}
},
{
"operator": "not",
"operands": [
{
- "name": "isInMilestone",
- "parameters": {}
+ "name": "isAssignedToUser",
+ "parameters": {
+ "user": "eiriktsarpalis"
+ }
}
]
},
@@ -14900,9 +13968,9 @@
"operator": "not",
"operands": [
{
- "name": "hasLabel",
+ "name": "isAssignedToUser",
"parameters": {
- "label": "needs-author-action"
+ "user": "krwq"
}
}
]
@@ -14911,58 +13979,20 @@
"operator": "not",
"operands": [
{
- "name": "hasLabel",
+ "name": "isAssignedToUser",
"parameters": {
- "label": "api-ready-for-review"
+ "user": "layomia"
}
}
]
- }
- ]
- }
- }
- },
- {
- "taskSource": "fabricbot-config",
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - PRs] Closed, Merged, or Moved",
- "actions": [
- {
- "name": "moveToProjectColumn",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
- "columnName": "Done",
- "isOrgProject": true
- }
- }
- ],
- "eventType": "pull_request",
- "eventNames": [
- "pull_request"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
- "isOrgProject": true
- }
},
{
"operator": "not",
"operands": [
{
- "name": "isInProjectColumn",
+ "name": "isAssignedToUser",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
- "columnName": "Done",
- "isOrgProject": true
+ "user": "tarekgh"
}
}
]
@@ -14974,158 +14004,21 @@
"operator": "not",
"operands": [
{
- "name": "isOpen",
- "parameters": {}
+ "name": "isInProject",
+ "parameters": {
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "isOrgProject": true
+ }
}
]
},
{
- "operator": "and",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-DependencyModel"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Caching"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Configuration"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-DependencyInjection"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Hosting"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Logging"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Options"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-Extensions-Primitives"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.ComponentModel"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.ComponentModel.Composition"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Composition"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Diagnostics.Activity"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Globalization"
- }
- }
- ]
- }
- ]
+ "name": "isInProjectColumn",
+ "parameters": {
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "columnName": "Done",
+ "isOrgProject": true
+ }
}
]
}
@@ -15140,13 +14033,20 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - PRs] New PR Needs Champion",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs] Eirik Assigned as Champion",
"actions": [
+ {
+ "name": "removeFromProject",
+ "parameters": {
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "isOrgProject": true
+ }
+ },
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
- "columnName": "Needs Champion",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "columnName": "Champion: Eirik",
"isOrgProject": true
}
}
@@ -15159,10 +14059,8 @@
"operator": "and",
"operands": [
{
- "name": "isAction",
- "parameters": {
- "action": "opened"
- }
+ "name": "isOpen",
+ "parameters": {}
},
{
"operator": "or",
@@ -15170,157 +14068,123 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-DependencyModel"
+ "label": "area-Extensions-Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Caching"
+ "label": "area-Extensions-Logging"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Configuration"
+ "label": "area-Extensions-Options"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-DependencyInjection"
+ "label": "area-Extensions-Primitives"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Hosting"
+ "label": "area-System.Diagnostics.Activity"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Logging"
+ "label": "area-System.Globalization"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Options"
+ "label": "area-System.Collections"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Primitives"
+ "label": "area-System.ComponentModel.DataAnnotations"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.ComponentModel"
+ "label": "area-System.DateTime"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.ComponentModel.Composition"
+ "label": "area-System.IO.Ports"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Composition"
+ "label": "area-System.Linq"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Diagnostics.Activity"
+ "label": "area-System.Text.Encoding"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Globalization"
+ "label": "area-System.Text.Encodings.Web"
}
- }
- ]
- },
- [
- [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "eerhardt"
- }
- }
- ]
},
{
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "eerhardt"
- }
- }
- ]
- }
- ],
- [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAssignedToUser",
- "parameters": {
- "user": "maryamariyan"
- }
- }
- ]
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Json"
+ }
},
{
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "maryamariyan"
- }
- }
- ]
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Xml"
+ }
}
- ],
- [
+ ]
+ },
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "name": "isAssignedToUser",
+ "parameters": {
+ "user": "eiriktsarpalis"
+ }
+ },
{
- "operator": "not",
+ "operator": "and",
"operands": [
{
- "name": "isAssignedToUser",
+ "name": "isAction",
"parameters": {
- "user": "tarekgh"
+ "action": "opened"
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
+ },
{
"name": "isActivitySender",
"parameters": {
- "user": "tarekgh"
+ "user": "eiriktsarpalis"
}
}
]
}
]
- ],
+ },
{
"operator": "or",
"operands": [
@@ -15330,7 +14194,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"isOrgProject": true
}
}
@@ -15339,7 +14203,15 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "columnName": "Needs Champion",
+ "isOrgProject": true
+ }
+ },
+ {
+ "name": "isInProjectColumn",
+ "parameters": {
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -15357,20 +14229,20 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - PRs] Updated PR Needs Champion",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs] Krzysztof Assigned as Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
- "columnName": "Needs Champion",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "columnName": "Champion: Krzysztof",
"isOrgProject": true
}
}
@@ -15386,130 +14258,126 @@
"name": "isOpen",
"parameters": {}
},
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAction",
- "parameters": {
- "action": "opened"
- }
- }
- ]
- },
{
"operator": "or",
"operands": [
{
"name": "hasLabel",
"parameters": {
- "label": "area-DependencyModel"
+ "label": "area-Extensions-Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Caching"
+ "label": "area-Extensions-Logging"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Configuration"
+ "label": "area-Extensions-Options"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-DependencyInjection"
+ "label": "area-Extensions-Primitives"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Hosting"
+ "label": "area-System.Diagnostics.Activity"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Logging"
+ "label": "area-System.Globalization"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Options"
+ "label": "area-System.Collections"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Primitives"
+ "label": "area-System.ComponentModel.DataAnnotations"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.ComponentModel"
+ "label": "area-System.DateTime"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.ComponentModel.Composition"
+ "label": "area-System.IO.Ports"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Composition"
+ "label": "area-System.Linq"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Diagnostics.Activity"
+ "label": "area-System.Text.Encoding"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Globalization"
+ "label": "area-System.Text.Encodings.Web"
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
+ },
{
- "name": "isAssignedToUser",
+ "name": "hasLabel",
"parameters": {
- "user": "eerhardt"
+ "label": "area-System.Text.Json"
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
+ },
{
- "name": "isAssignedToUser",
+ "name": "hasLabel",
"parameters": {
- "user": "maryamariyan"
+ "label": "area-System.Xml"
}
}
]
},
{
- "operator": "not",
+ "operator": "or",
"operands": [
{
"name": "isAssignedToUser",
"parameters": {
- "user": "tarekgh"
+ "user": "krwq"
}
+ },
+ {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "krwq"
+ }
+ }
+ ]
}
]
},
@@ -15522,7 +14390,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"isOrgProject": true
}
}
@@ -15531,7 +14399,15 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "columnName": "Needs Champion",
+ "isOrgProject": true
+ }
+ },
+ {
+ "name": "isInProjectColumn",
+ "parameters": {
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -15549,20 +14425,20 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - PRs] Maryam Assigned as Champion",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs] Layomi Assigned as Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
- "columnName": "Champion: Maryam",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
+ "columnName": "Champion: Layomi",
"isOrgProject": true
}
}
@@ -15584,79 +14460,91 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-DependencyModel"
+ "label": "area-Extensions-Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Caching"
+ "label": "area-Extensions-Logging"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Configuration"
+ "label": "area-Extensions-Options"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-DependencyInjection"
+ "label": "area-Extensions-Primitives"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Hosting"
+ "label": "area-System.Diagnostics.Activity"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Logging"
+ "label": "area-System.Globalization"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Options"
+ "label": "area-System.Collections"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Primitives"
+ "label": "area-System.ComponentModel.DataAnnotations"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.ComponentModel"
+ "label": "area-System.DateTime"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.ComponentModel.Composition"
+ "label": "area-System.IO.Ports"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Composition"
+ "label": "area-System.Linq"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Diagnostics.Activity"
+ "label": "area-System.Text.Encoding"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Globalization"
+ "label": "area-System.Text.Encodings.Web"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Json"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Xml"
}
}
]
@@ -15667,7 +14555,7 @@
{
"name": "isAssignedToUser",
"parameters": {
- "user": "maryamariyan"
+ "user": "layomia"
}
},
{
@@ -15682,7 +14570,7 @@
{
"name": "isActivitySender",
"parameters": {
- "user": "maryamariyan"
+ "user": "layomia"
}
}
]
@@ -15698,7 +14586,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"isOrgProject": true
}
}
@@ -15707,7 +14595,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -15715,7 +14603,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -15733,19 +14621,19 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Eric / Maryam / Tarek - PRs] Tarek Assigned as Champion",
+ "taskName": "[Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs] Tarek Assigned as Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"columnName": "Champion: Tarek",
"isOrgProject": true
}
@@ -15768,79 +14656,91 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-DependencyModel"
+ "label": "area-Extensions-Configuration"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Caching"
+ "label": "area-Extensions-Logging"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Configuration"
+ "label": "area-Extensions-Options"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-DependencyInjection"
+ "label": "area-Extensions-Primitives"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Hosting"
+ "label": "area-System.Diagnostics.Activity"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Logging"
+ "label": "area-System.Globalization"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Options"
+ "label": "area-System.Collections"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-Extensions-Primitives"
+ "label": "area-System.ComponentModel.DataAnnotations"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.ComponentModel"
+ "label": "area-System.DateTime"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.ComponentModel.Composition"
+ "label": "area-System.IO.Ports"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Composition"
+ "label": "area-System.Linq"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Diagnostics.Activity"
+ "label": "area-System.Text.Encoding"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Globalization"
+ "label": "area-System.Text.Encodings.Web"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Text.Json"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "area-System.Xml"
}
}
]
@@ -15882,7 +14782,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"isOrgProject": true
}
}
@@ -15891,7 +14791,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -15899,7 +14799,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Eric / Maryam / Tarek - PRs",
+ "projectName": "Area Pod: Eirik / Krzysztof / Layomi / Tarek - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -15917,12 +14817,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - Issue Triage] Moved to Another Area",
+ "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Moved to Another Area",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true
}
}
@@ -15943,40 +14843,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Formats.Asn1"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Formats.Cbor"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Security"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Text.Encoding"
+ "label": "area-Meta"
}
}
]
@@ -15987,7 +14854,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Encodings.Web"
+ "label": "needs-area-label"
}
}
]
@@ -16003,7 +14870,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true
}
}
@@ -16018,19 +14885,19 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - Issue Triage] Needs Triage",
+ "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Needs Triage",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"columnName": "Needs Triage",
"isOrgProject": true
}
@@ -16038,48 +14905,30 @@
],
"eventType": "issue",
"eventNames": [
- "issues"
- ],
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "or",
- "operands": [
- {
- "operator": "and",
- "operands": [
- {
- "operator": "or",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Formats.Asn1"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Formats.Cbor"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Security"
- }
- },
+ "issues"
+ ],
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "operator": "and",
+ "operands": [
+ {
+ "operator": "or",
+ "operands": [
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Encoding"
+ "label": "area-Meta"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Encodings.Web"
+ "label": "needs-area-label"
}
}
]
@@ -16112,31 +14961,13 @@
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Formats.Asn1"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-System.Formats.Cbor"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-System.Security"
- }
- },
- {
- "name": "labelAdded",
- "parameters": {
- "label": "area-System.Text.Encoding"
+ "label": "area-Meta"
}
},
{
"name": "labelAdded",
"parameters": {
- "label": "area-System.Text.Encodings.Web"
+ "label": "needs-area-label"
}
}
]
@@ -16156,7 +14987,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true
}
}
@@ -16165,7 +14996,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true,
"columnName": "Triaged"
}
@@ -16183,19 +15014,19 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - Issue Triage] Needs Further Triage",
+ "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Needs Further Triage",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"columnName": "Needs Triage",
"isOrgProject": true
}
@@ -16214,31 +15045,13 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Formats.Asn1"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Formats.Cbor"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Security"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Text.Encoding"
+ "label": "area-Meta"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Encodings.Web"
+ "label": "needs-area-label"
}
}
]
@@ -16267,7 +15080,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true
}
}
@@ -16276,7 +15089,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"columnName": "Triaged",
"isOrgProject": true
}
@@ -16294,12 +15107,12 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - Issue Triage] Triaged",
+ "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Triaged",
"actions": [
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"columnName": "Triaged",
"isOrgProject": true
}
@@ -16321,7 +15134,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true
}
},
@@ -16363,13 +15176,13 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - Issue Triage] Jeremy Updated Issue",
+ "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Eric Updated Issue",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
- "columnName": "Triage: Jeremy",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
+ "columnName": "Triage: Eric",
"isOrgProject": true
}
}
@@ -16384,7 +15197,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -16392,7 +15205,7 @@
{
"name": "isActivitySender",
"parameters": {
- "user": "bartonjs"
+ "user": "ericstj"
}
},
{
@@ -16441,13 +15254,13 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - Issue Triage] Jeremy Commented",
+ "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Eric Commented",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
- "columnName": "Triage: Jeremy",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
+ "columnName": "Triage: Eric",
"isOrgProject": true
}
}
@@ -16462,7 +15275,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -16470,7 +15283,7 @@
{
"name": "isActivitySender",
"parameters": {
- "user": "bartonjs"
+ "user": "ericstj"
}
},
{
@@ -16519,13 +15332,13 @@
"subCapability": "IssuesOnlyResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - Issue Triage] Levi Updated Issue",
+ "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Jeff Updated Issue",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
- "columnName": "Triage: Levi",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
+ "columnName": "Triage: Jeff",
"isOrgProject": true
}
}
@@ -16540,7 +15353,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -16548,7 +15361,7 @@
{
"name": "isActivitySender",
"parameters": {
- "user": "GrabYourPitchForks"
+ "user": "jeffhandley"
}
},
{
@@ -16597,13 +15410,13 @@
"subCapability": "IssueCommentResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - Issue Triage] Levi Commented",
+ "taskName": "[Area Pod: Eric / Jeff - Issue Triage] Jeff Commented",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
- "columnName": "Triage: Levi",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
+ "columnName": "Triage: Jeff",
"isOrgProject": true
}
}
@@ -16618,7 +15431,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - Issue Triage",
+ "projectName": "Area Pod: Eric / Jeff - Issue Triage",
"isOrgProject": true,
"columnName": "Needs Triage"
}
@@ -16626,7 +15439,7 @@
{
"name": "isActivitySender",
"parameters": {
- "user": "GrabYourPitchForks"
+ "user": "jeffhandley"
}
},
{
@@ -16675,12 +15488,12 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - PRs] Closed, Merged, or Moved",
+ "taskName": "[Area Pod: Eric / Jeff - PRs] Closed, Merged, or Moved",
"actions": [
{
"name": "moveToProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -16696,7 +15509,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"isOrgProject": true
}
},
@@ -16706,7 +15519,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -16734,40 +15547,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Formats.Asn1"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Formats.Cbor"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Security"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Text.Encoding"
+ "label": "area-Meta"
}
}
]
@@ -16778,7 +15558,7 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Encodings.Web"
+ "label": "needs-area-label"
}
}
]
@@ -16798,12 +15578,12 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - PRs] New PR Needs Champion",
+ "taskName": "[Area Pod: Eric / Jeff - PRs] New PR Needs Champion",
"actions": [
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -16828,31 +15608,13 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Formats.Asn1"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Formats.Cbor"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Security"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Text.Encoding"
+ "label": "area-Meta"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Encodings.Web"
+ "label": "needs-area-label"
}
}
]
@@ -16865,7 +15627,7 @@
{
"name": "isAssignedToUser",
"parameters": {
- "user": "bartonjs"
+ "user": "ericstj"
}
}
]
@@ -16876,7 +15638,7 @@
{
"name": "isActivitySender",
"parameters": {
- "user": "bartonjs"
+ "user": "ericstj"
}
}
]
@@ -16889,7 +15651,7 @@
{
"name": "isAssignedToUser",
"parameters": {
- "user": "GrabYourPitchForks"
+ "user": "jeffhandley"
}
}
]
@@ -16900,7 +15662,7 @@
{
"name": "isActivitySender",
"parameters": {
- "user": "GrabYourPitchForks"
+ "user": "jeffhandley"
}
}
]
@@ -16916,7 +15678,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"isOrgProject": true
}
}
@@ -16925,7 +15687,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -16943,19 +15705,19 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - PRs] Updated PR Needs Champion",
+ "taskName": "[Area Pod: Eric / Jeff - PRs] Updated PR Needs Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -16989,31 +15751,13 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Formats.Asn1"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Formats.Cbor"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Security"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Text.Encoding"
+ "label": "area-Meta"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Encodings.Web"
+ "label": "needs-area-label"
}
}
]
@@ -17024,7 +15768,7 @@
{
"name": "isAssignedToUser",
"parameters": {
- "user": "bartonjs"
+ "user": "ericstj"
}
}
]
@@ -17035,7 +15779,7 @@
{
"name": "isAssignedToUser",
"parameters": {
- "user": "GrabYourPitchForks"
+ "user": "jeffhandley"
}
}
]
@@ -17049,7 +15793,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"isOrgProject": true
}
}
@@ -17058,7 +15802,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -17076,20 +15820,20 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - PRs] Jeremy Assigned as Champion",
+ "taskName": "[Area Pod: Eric / Jeff - PRs] Eric Assigned as Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
- "columnName": "Champion: Jeremy",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
+ "columnName": "Champion: Eric",
"isOrgProject": true
}
}
@@ -17111,31 +15855,13 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Formats.Asn1"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Formats.Cbor"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Security"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Text.Encoding"
+ "label": "area-Meta"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Encodings.Web"
+ "label": "needs-area-label"
}
}
]
@@ -17146,7 +15872,7 @@
{
"name": "isAssignedToUser",
"parameters": {
- "user": "bartonjs"
+ "user": "ericstj"
}
},
{
@@ -17161,7 +15887,7 @@
{
"name": "isActivitySender",
"parameters": {
- "user": "bartonjs"
+ "user": "ericstj"
}
}
]
@@ -17177,7 +15903,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"isOrgProject": true
}
}
@@ -17186,7 +15912,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -17194,7 +15920,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"columnName": "Done",
"isOrgProject": true
}
@@ -17212,20 +15938,20 @@
"subCapability": "PullRequestResponder",
"version": "1.0",
"config": {
- "taskName": "[Area Pod: Jeremy / Levi - PRs] Levi Assigned as Champion",
+ "taskName": "[Area Pod: Eric / Jeff - PRs] Jeff Assigned as Champion",
"actions": [
{
"name": "removeFromProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"isOrgProject": true
}
},
{
"name": "addToProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
- "columnName": "Champion: Levi",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
+ "columnName": "Champion: Jeff",
"isOrgProject": true
}
}
@@ -17247,31 +15973,13 @@
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Formats.Asn1"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Formats.Cbor"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Security"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "area-System.Text.Encoding"
+ "label": "area-Meta"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "area-System.Text.Encodings.Web"
+ "label": "needs-area-label"
}
}
]
@@ -17282,7 +15990,7 @@
{
"name": "isAssignedToUser",
"parameters": {
- "user": "GrabYourPitchForks"
+ "user": "jeffhandley"
}
},
{
@@ -17297,7 +16005,7 @@
{
"name": "isActivitySender",
"parameters": {
- "user": "GrabYourPitchForks"
+ "user": "jeffhandley"
}
}
]
@@ -17313,7 +16021,7 @@
{
"name": "isInProject",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"isOrgProject": true
}
}
@@ -17322,7 +16030,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"columnName": "Needs Champion",
"isOrgProject": true
}
@@ -17330,7 +16038,7 @@
{
"name": "isInProjectColumn",
"parameters": {
- "projectName": "Area Pod: Jeremy / Levi - PRs",
+ "projectName": "Area Pod: Eric / Jeff - PRs",
"columnName": "Done",
"isOrgProject": true
}
diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml
index 4124fa04342fe4..d604ff41ead20b 100644
--- a/.github/workflows/backport.yml
+++ b/.github/workflows/backport.yml
@@ -3,81 +3,29 @@ on:
issue_comment:
types: [created]
schedule:
- # once a day at 13:00 UTC
+ # once a day at 13:00 UTC to cleanup old runs
- cron: '0 13 * * *'
permissions:
contents: write
issues: write
pull-requests: write
+ actions: write
jobs:
- cleanup_old_runs:
- if: github.event.schedule == '0 13 * * *'
- runs-on: ubuntu-20.04
- permissions:
- actions: write
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- steps:
- - name: Delete old workflow runs
- run: |
- _UrlPath="/repos/$GITHUB_REPOSITORY/actions/workflows"
- _CurrentWorkflowID="$(gh api -X GET "$_UrlPath" | jq '.workflows[] | select(.name == '\""$GITHUB_WORKFLOW"\"') | .id')"
-
- # delete workitems which are 'completed'. (other candidate values of status field are: 'queued' and 'in_progress')
-
- gh api -X GET "$_UrlPath/$_CurrentWorkflowID/runs" --paginate \
- | jq '.workflow_runs[] | select(.status == "completed") | .id' \
- | xargs -I{} gh api -X DELETE "/repos/$GITHUB_REPOSITORY/actions/runs"/{}
-
backport:
- if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/backport to')
- runs-on: ubuntu-20.04
- steps:
- - name: Extract backport target branch
- uses: actions/github-script@v3
- id: target-branch-extractor
- with:
- result-encoding: string
- script: |
- if (context.eventName !== "issue_comment") throw "Error: This action only works on issue_comment events.";
-
- // extract the target branch name from the trigger phrase containing these characters: a-z, A-Z, digits, forward slash, dot, hyphen, underscore
- const regex = /^\/backport to ([a-zA-Z\d\/\.\-\_]+)/;
- target_branch = regex.exec(context.payload.comment.body);
- if (target_branch == null) throw "Error: No backport branch found in the trigger phrase.";
-
- return target_branch[1];
- - name: Post backport started comment to pull request
- uses: actions/github-script@v3
- with:
- script: |
- const backport_start_body = `Started backporting to ${{ steps.target-branch-extractor.outputs.result }}: https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${process.env.GITHUB_RUN_ID}`;
- await github.issues.createComment({
- issue_number: context.issue.number,
- owner: context.repo.owner,
- repo: context.repo.repo,
- body: backport_start_body
- });
- - name: Checkout repo
- uses: actions/checkout@v2
- with:
- fetch-depth: 0
- - name: Run backport
- uses: ./eng/actions/backport
- with:
- target_branch: ${{ steps.target-branch-extractor.outputs.result }}
- auth_token: ${{ secrets.GITHUB_TOKEN }}
- pr_description_template: |
- Backport of #%source_pr_number% to %target_branch%
+ if: ${{ contains(github.event.comment.body, '/backport to') || github.event_name == 'schedule' }}
+ uses: dotnet/arcade/.github/workflows/backport-base.yml@main
+ with:
+ pr_description_template: |
+ Backport of #%source_pr_number% to %target_branch%
- /cc %cc_users%
+ /cc %cc_users%
- ## Customer Impact
+ ## Customer Impact
- ## Testing
+ ## Testing
- ## Risk
+ ## Risk
- IMPORTANT: If this change touches code that ships in a NuGet package, please make certain that you have added any necessary [package authoring](https://github.com/dotnet/runtime/blob/main/docs/project/library-servicing.md) and gotten it explicitly reviewed.
+ IMPORTANT: Is this backport for a servicing release? If so and this change touches code that ships in a NuGet package, please make certain that you have added any necessary [package authoring](https://github.com/dotnet/runtime/blob/main/docs/project/library-servicing.md) and gotten it explicitly reviewed.
diff --git a/.gitignore b/.gitignore
index 75ecf88e93af4e..07ac84d04867e4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -342,9 +342,6 @@ jit32
# performance testing sandbox
sandbox
-#IL linker for testing
-linker
-
# Symbolic link for the shared portion of CoreLib to make grep/findstr work for runtime devs
#
# On Windows, make your own by running these commands from the repo root:
@@ -366,6 +363,7 @@ src/coreclr/System.Private.CoreLib/common
# Temporary artifacts from local libraries stress builds
.dotnet-daily/
run-stress-*
+test:.cs
# Unity emebdding API tests
unity/embed_api_tests/ALL_BUILD.*
diff --git a/.vsconfig b/.vsconfig
index 84d90d194a6ff6..402799aa5537e4 100644
--- a/.vsconfig
+++ b/.vsconfig
@@ -1,53 +1,54 @@
{
"version": "1.0",
"components": [
- "Microsoft.VisualStudio.Component.Roslyn.Compiler",
- "Microsoft.VisualStudio.Component.Roslyn.LanguageServices",
+ "Component.CPython39.x64",
+ "Microsoft.Component.CodeAnalysis.SDK",
"Microsoft.Component.MSBuild",
- "Microsoft.Net.Component.4.5.2.TargetingPack",
- "Microsoft.VisualStudio.Component.SQL.LocalDB.Runtime",
- "Microsoft.VisualStudio.Component.SQL.CLR",
- "Microsoft.VisualStudio.Component.CoreEditor",
- "Microsoft.VisualStudio.Workload.CoreEditor",
- "Microsoft.Net.Component.4.8.SDK",
- "Microsoft.Net.Component.4.7.2.TargetingPack",
- "Microsoft.Net.ComponentGroup.DevelopmentPrerequisites",
- "Microsoft.VisualStudio.Component.TextTemplating",
- "Microsoft.VisualStudio.Component.NuGet",
- "Microsoft.VisualStudio.Component.ManagedDesktop.Core",
- "Microsoft.NetCore.Component.SDK",
- "Microsoft.VisualStudio.Component.FSharp",
"Microsoft.ComponentGroup.ClickOnce.Publish",
- "Microsoft.NetCore.Component.DevelopmentTools",
- "Microsoft.Net.Component.4.8.TargetingPack",
"Microsoft.Net.Component.4.6.1.TargetingPack",
- "Microsoft.VisualStudio.Component.DiagnosticTools",
- "Microsoft.VisualStudio.Component.IntelliCode",
+ "Microsoft.Net.Component.4.6.2.SDK",
"Microsoft.Net.Component.4.6.2.TargetingPack",
+ "Microsoft.Net.Component.4.6.TargetingPack",
+ "Microsoft.Net.Component.4.7.2.TargetingPack",
+ "Microsoft.Net.Component.4.7.SDK",
"Microsoft.Net.Component.4.7.TargetingPack",
+ "Microsoft.Net.Component.4.8.SDK",
+ "Microsoft.Net.Component.4.8.TargetingPack",
+ "Microsoft.Net.ComponentGroup.DevelopmentPrerequisites",
+ "Microsoft.Net.ComponentGroup.TargetingPacks.Common",
+ "Microsoft.NetCore.Component.DevelopmentTools",
+ "Microsoft.NetCore.Component.Runtime.3.1",
+ "Microsoft.NetCore.Component.Runtime.6.0",
+ "Microsoft.NetCore.Component.SDK",
"Microsoft.VisualStudio.Component.ClassDesigner",
+ "Microsoft.VisualStudio.Component.CoreEditor",
+ "Microsoft.VisualStudio.Component.DiagnosticTools",
+ "Microsoft.VisualStudio.Component.FSharp",
+ "Microsoft.VisualStudio.Component.FSharp.Desktop",
+ "Microsoft.VisualStudio.Component.Git",
"Microsoft.VisualStudio.Component.GraphDocument",
+ "Microsoft.VisualStudio.Component.IntelliCode",
+ "Microsoft.VisualStudio.Component.LinqToSql",
+ "Microsoft.VisualStudio.Component.ManagedDesktop.Core",
+ "Microsoft.VisualStudio.Component.ManagedDesktop.Prerequisites",
+ "Microsoft.VisualStudio.Component.NuGet",
+ "Microsoft.VisualStudio.Component.Roslyn.Compiler",
+ "Microsoft.VisualStudio.Component.Roslyn.LanguageServices",
+ "Microsoft.VisualStudio.Component.SQL.CLR",
+ "Microsoft.VisualStudio.Component.SQL.LocalDB.Runtime",
+ "Microsoft.VisualStudio.Component.TextTemplating",
+ "Microsoft.VisualStudio.Component.VC.CLI.Support",
+ "Microsoft.VisualStudio.Component.VC.CMake.Project",
"Microsoft.VisualStudio.Component.VC.CoreIde",
+ "Microsoft.VisualStudio.Component.VC.Redist.14.Latest",
+ "Microsoft.VisualStudio.Component.VC.Tools.ARM",
+ "Microsoft.VisualStudio.Component.VC.Tools.ARM64",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
"Microsoft.VisualStudio.Component.Windows10SDK.19041",
- "Microsoft.VisualStudio.Component.ManagedDesktop.Prerequisites",
- "Microsoft.ComponentGroup.Blend",
- "Microsoft.VisualStudio.Component.FSharp.Desktop",
"Microsoft.VisualStudio.ComponentGroup.MSIX.Packaging",
- "Microsoft.VisualStudio.Workload.ManagedDesktop",
- "Microsoft.VisualStudio.Component.VC.Redist.14.Latest",
"Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core",
- "Microsoft.VisualStudio.Component.VC.Tools.ARM64",
- "Microsoft.VisualStudio.Component.VC.CLI.Support",
+ "Microsoft.VisualStudio.Workload.CoreEditor",
+ "Microsoft.VisualStudio.Workload.ManagedDesktop",
"Microsoft.VisualStudio.Workload.NativeDesktop",
- "Microsoft.VisualStudio.Component.VC.Tools.ARM",
- "Microsoft.Net.ComponentGroup.TargetingPacks.Common",
- "Microsoft.Net.Component.4.6.TargetingPack",
- "Microsoft.VisualStudio.Component.Git",
- "Microsoft.VisualStudio.Component.LinqToSql",
- "Microsoft.NetCore.Component.Runtime.3.1",
- "Microsoft.NetCore.Component.Runtime.5.0",
- "Microsoft.Net.Component.4.6.2.SDK",
- "Microsoft.Net.Component.4.7.SDK"
]
-}
\ No newline at end of file
+}
diff --git a/Build.proj b/Build.proj
index bff94b97a7a799..baa240685ae5db 100644
--- a/Build.proj
+++ b/Build.proj
@@ -8,9 +8,6 @@
-
-
-
true
+
+ true
- <_hostOS>Linux
- <_hostOS Condition="$([MSBuild]::IsOSPlatform('OSX'))">OSX
- <_hostOS Condition="$([MSBuild]::IsOSPlatform('FREEBSD'))">FreeBSD
- <_hostOS Condition="$([MSBuild]::IsOSPlatform('NETBSD'))">NetBSD
+ <_hostOS>linux
+ <_hostOS Condition="$([MSBuild]::IsOSPlatform('OSX'))">osx
+ <_hostOS Condition="$([MSBuild]::IsOSPlatform('FREEBSD'))">freebsd
+ <_hostOS Condition="$([MSBuild]::IsOSPlatform('NETBSD'))">netbsd
<_hostOS Condition="$([MSBuild]::IsOSPlatform('ILLUMOS'))">illumos
- <_hostOS Condition="$([MSBuild]::IsOSPlatform('SOLARIS'))">Solaris
+ <_hostOS Condition="$([MSBuild]::IsOSPlatform('SOLARIS'))">solaris
<_hostOS Condition="$([MSBuild]::IsOSPlatform('WINDOWS'))">windows
$(_hostOS)
browser
$(_hostOS)
- true
- true
- true
+ true
+ true
<_hostArch>$([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture.ToString().ToLowerInvariant)
$(_hostArch)
+ wasm
+ wasm
arm
armv6
armel
@@ -36,34 +41,66 @@
loongarch64
s390x
ppc64le
- wasm
x64
x64
$(TargetArchitecture)
+
+
+ 21
+ 11.0
+ 11.0
+ 2.0
+ 5.1
+ 10.15
+ 11.0
+
+
+
+
+ true
+ $(MSBuildProjectName)$([System.IO.Path]::DirectorySeparatorChar)ref
+
+
- 7.0
+ 8.0
.NETCoreApp
$(NetCoreAppCurrentIdentifier),Version=v$(NetCoreAppCurrentVersion)
Microsoft.NETCore.App
.NET $(NetCoreAppCurrentVersion)
net$(NetCoreAppCurrentVersion)
+
+
+ 7.0
+ net$(NetCoreAppPreviousVersion)
+ $(NetCoreAppCurrent)
+ $(NetCoreAppPreviousVersion).0
+
+
net6.0
+ $(NetCoreAppCurrent)
- 7.0
+
+ 8.0
net$(NetCoreAppToolCurrentVersion)
$(NetCoreAppCurrentIdentifier),Version=v$(NetCoreAppToolCurrentVersion)
- 6.0
- $(NetCoreAppLatestStableVersion).0
- net$(NetCoreAppLatestStableVersion)
-
- 7.0
+ 8.0
net$(AspNetCoreAppCurrentVersion)
net462
@@ -78,27 +115,40 @@
$(NetCoreAppToolCurrent)
+
+
+ $(Configuration)
+ $(Configuration)
+ Debug
+ $(RuntimeConfiguration)
+ $(RuntimeConfiguration)
+
+ Debug
+ $(Configuration)
+ $(Configuration)
+
+
$([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', 'src', 'libraries'))
$([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', 'src', 'coreclr'))
$([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', 'src', 'mono'))
$([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', 'src', 'installer'))
$([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', 'src', 'workloads'))
+ $([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', 'src', 'tools'))
$([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'src', 'native'))
$([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', 'tools-local'))
$([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', 'src', 'tasks'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'ibc'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'mibc'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'docs'))
- $([MSBuild]::NormalizeDirectory('$(NuGetPackageRoot)', 'microsoft.private.intellisense', '$(MicrosoftPrivateIntellisenseVersion)', 'IntellisenseFiles', 'net'))
$([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', 'docs'))
- $([MSBuild]::NormalizeDirectory('$(DocsDir)', 'manpages'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AppleAppBuilder', 'Debug', '$(NetCoreAppToolCurrent)'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AndroidAppBuilder', 'Debug', '$(NetCoreAppToolCurrent)', 'publish'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'WasmAppBuilder', 'Debug', '$(NetCoreAppToolCurrent)'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'WasmBuildTasks', 'Debug', '$(NetCoreAppToolCurrent)', 'publish'))
- $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'WorkloadBuildTasks', 'Debug', '$(NetCoreAppToolCurrent)', 'publish'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'WorkloadBuildTasks', 'Debug', '$(NetCoreAppToolCurrent)'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'LibraryBuilder', 'Debug', '$(NetCoreAppToolCurrent)'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'MonoAOTCompiler', 'Debug', '$(NetCoreAppToolCurrent)'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'MonoTargetsTasks', 'Debug', '$(NetCoreAppToolCurrent)'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'TestExclusionListTasks', 'Debug', '$(NetCoreAppToolCurrent)'))
@@ -112,32 +162,28 @@
$([MSBuild]::NormalizePath('$(WasmBuildTasksDir)', 'WasmBuildTasks.dll'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'WasmAppHost', 'wasm', '$(Configuration)'))
$([MSBuild]::NormalizePath('$(WorkloadBuildTasksDir)', 'WorkloadBuildTasks.dll'))
+ $([MSBuild]::NormalizePath('$(LibraryBuilderDir)', 'LibraryBuilder.dll'))
$([MSBuild]::NormalizePath('$(MonoAOTCompilerDir)', 'MonoAOTCompiler.dll'))
$([MSBuild]::NormalizePath('$(MonoTargetsTasksDir)', 'MonoTargetsTasks.dll'))
$([MSBuild]::NormalizePath('$(TestExclusionListTasksDir)', 'TestExclusionListTasks.dll'))
- $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'coreclr', '$(TargetOS).$(TargetArchitecture).$(Configuration)'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'coreclr', '$(TargetOS).$(TargetArchitecture).$(RuntimeConfiguration)'))
$(CoreCLRToolPath)
-
-
-
- $(Configuration)
- $(Configuration)
- Debug
- $(RuntimeConfiguration)
- $(RuntimeConfiguration)
-
- Debug
- $(Configuration)
+ $(WASMTIME_PATH)
+ $([MSBuild]::NormalizeDirectory($(ArtifactsObjDir), 'wasmtime'))
+ true
+ false
true
+ <_hostRid Condition="'$(MSBuildRuntimeType)' == 'core'">$([System.Runtime.InteropServices.RuntimeInformation]::RuntimeIdentifier)
+ <_hostRid Condition="'$(MSBuildRuntimeType)' != 'core'">win-$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture.ToString().ToLowerInvariant)
+
<_parseDistroRid>$(__DistroRid)
- <_parseDistroRid Condition="'$(_parseDistroRid)' == '' and '$(MSBuildRuntimeType)' == 'core'">$([System.Runtime.InteropServices.RuntimeInformation]::RuntimeIdentifier)
- <_parseDistroRid Condition="'$(_parseDistroRid)' == '' and '$(MSBuildRuntimeType)' != 'core'">win-$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture.ToString().ToLowerInvariant)
+ <_parseDistroRid Condition="'$(_parseDistroRid)' == ''">$(_hostRid)
<_distroRidIndex>$(_parseDistroRid.LastIndexOf('-'))
<_runtimeOS>$(RuntimeOS)
@@ -148,39 +194,41 @@
<_runtimeOS Condition="'$(TargetsMobile)' == 'true'">$(TargetOS.ToLowerInvariant())
<_portableOS>linux
- <_portableOS Condition="'$(_runtimeOS)' == 'linux-musl'">linux-musl
+ <_portableOS Condition="'$(_runtimeOS)' == 'linux-musl' or $(_runtimeOS.StartsWith('alpine'))">linux-musl
<_portableOS Condition="'$(_runtimeOS)' == 'linux-bionic'">linux-bionic
- <_portableOS Condition="'$(_hostOS)' == 'OSX'">osx
+ <_portableOS Condition="'$(_hostOS)' == 'osx'">osx
<_portableOS Condition="'$(_runtimeOS)' == 'win' or '$(TargetOS)' == 'windows'">win
- <_portableOS Condition="'$(_runtimeOS)' == 'FreeBSD' or '$(TargetOS)' == 'FreeBSD'">freebsd
+ <_portableOS Condition="'$(_runtimeOS)' == 'freebsd' or '$(TargetOS)' == 'freebsd'">freebsd
<_portableOS Condition="'$(_runtimeOS)' == 'illumos' or '$(TargetOS)' == 'illumos'">illumos
- <_portableOS Condition="'$(_runtimeOS)' == 'Solaris' or '$(TargetOS)' == 'Solaris'">solaris
- <_portableOS Condition="'$(_runtimeOS)' == 'Browser'">browser
+ <_portableOS Condition="'$(_runtimeOS)' == 'solaris' or '$(TargetOS)' == 'solaris'">solaris
+ <_portableOS Condition="'$(_runtimeOS)' == 'browser'">browser
+ <_portableOS Condition="'$(_runtimeOS)' == 'wasi'">wasi
<_portableOS Condition="'$(_runtimeOS)' == 'maccatalyst'">maccatalyst
<_portableOS Condition="'$(_runtimeOS)' == 'ios'">ios
- <_portableOS Condition="'$(_runtimeOS)' == 'iOSSimulator'">iossimulator
+ <_portableOS Condition="'$(_runtimeOS)' == 'iossimulator'">iossimulator
<_portableOS Condition="'$(_runtimeOS)' == 'tvos'">tvos
- <_portableOS Condition="'$(_runtimeOS)' == 'tvOSSimulator'">tvossimulator
+ <_portableOS Condition="'$(_runtimeOS)' == 'tvossimulator'">tvossimulator
<_portableOS Condition="'$(_runtimeOS)' == 'android'">android
<_runtimeOS Condition="$(_runtimeOS.StartsWith('tizen'))">linux
<_runtimeOS Condition="'$(PortableBuild)' == 'true'">$(_portableOS)
+ <_runtimeOS Condition="'$(RuntimeOS)' == '' and '$(DotNetBuildFromSource)' == 'true'">$(_portableOS)
<_packageLibc Condition="$(_runtimeOS.Contains('musl'))">-musl
- <_packageOS Condition="'$(CrossBuild)' == 'true'">$(_hostOS.ToLowerInvariant)$(_packageLibc)
+ <_packageOS Condition="'$(CrossBuild)' == 'true'">$(_hostOS)$(_packageLibc)
<_packageOS Condition="'$(_packageOS)' == '' and '$(PortableBuild)' == 'true'">$(_portableOS)
<_packageOS Condition="'$(_packageOS)' == ''">$(_runtimeOS)
- <_toolsRID Condition="'$(CrossBuild)' == 'true'">$(_hostOS.ToLowerInvariant)-$(_hostArch)
+ <_toolsRID Condition="'$(CrossBuild)' == 'true'">$(_hostOS)-$(_hostArch)
<_toolsRID Condition="'$(BuildingInsideVisualStudio)' == 'true'">$(_runtimeOS)-x64
<_toolsRID Condition="'$(_toolsRID)' == ''">$(_runtimeOS)-$(_hostArch)
- <_toolsRID Condition="'$(_runtimeOS)' == 'browser'">linux-x64
- <_toolsRID Condition="'$(_runtimeOS)' == 'browser' and '$(HostOS)' == 'windows'">win-x64
- <_toolsRID Condition="'$(_runtimeOS)' == 'browser' and '$(HostOS)' == 'osx'">osx-x64
+ <_toolsRID Condition="'$(_runtimeOS)' == 'browser' or '$(_runtimeOS)' == 'wasi'">linux-x64
+ <_toolsRID Condition="('$(_runtimeOS)' == 'browser' or '$(_runtimeOS)' == 'wasi') and '$(HostOS)' == 'windows'">win-x64
+ <_toolsRID Condition="('$(_runtimeOS)' == 'browser' or '$(_runtimeOS)' == 'wasi') and '$(HostOS)' == 'osx'">osx-x64
<_toolsRID Condition="'$(_runtimeOS)' == 'android' or '$(_runtimeOS)' == 'linux-bionic'">linux-x64
@@ -188,7 +236,7 @@
<_toolsRID Condition="('$(_runtimeOS)' == 'android' or '$(_runtimeOS)' == 'linux-bionic') and '$(HostOS)' == 'osx'">osx-x64
- <_toolsRID Condition="'$(_runtimeOS)' == 'maccatalyst' or '$(_runtimeOS)' == 'ios' or '$(_runtimeOS)' == 'iOSSimulator' or '$(_runtimeOS)' == 'tvos' or '$(_runtimeOS)' == 'tvOSSimulator'">osx-x64
+ <_toolsRID Condition="'$(_runtimeOS)' == 'maccatalyst' or '$(_runtimeOS)' == 'ios' or '$(_runtimeOS)' == 'iossimulator' or '$(_runtimeOS)' == 'tvos' or '$(_runtimeOS)' == 'tvossimulator'">osx-x64
linux-$(_hostArch)
@@ -197,24 +245,28 @@
$(_packageOS)-$(TargetArchitecture)
+ $(_hostRid)
$(PackageRID)
$(_portableOS)-$(TargetArchitecture)
+ true
+ true
- true
+ true
true
- true
- true
- true
- true
- true
- true
- true
- true
- true
- true
- true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
true
true
@@ -224,18 +276,20 @@
$([MSBuild]::NormalizeDirectory('$(MicrosoftNetCoreAppRefPackDir)', 'ref', '$(NetCoreAppCurrent)'))
$([MSBuild]::NormalizeDirectory('$(MicrosoftNetCoreAppRefPackDir)', 'data'))
- $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'microsoft.netcore.app.runtime.$(PackageRID)', '$(LibrariesConfiguration)'))
- $([MSBuild]::NormalizeDirectory('$(MicrosoftNetCoreAppRuntimePackDir)', 'runtimes', '$(PackageRID)'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'microsoft.netcore.app.runtime.$(OutputRid)', '$(LibrariesConfiguration)'))
+ $([MSBuild]::NormalizeDirectory('$(MicrosoftNetCoreAppRuntimePackDir)', 'runtimes', '$(OutputRid)'))
$([MSBuild]::NormalizeDirectory('$(MicrosoftNetCoreAppRuntimePackRidDir)', 'lib', '$(NetCoreAppCurrent)'))
$([MSBuild]::NormalizeDirectory('$(MicrosoftNetCoreAppRuntimePackRidDir)', 'native'))
- $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', '$(OutputRid).$(Configuration)', 'corehost'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', '$(OutputRid).$(HostConfiguration)', 'corehost'))
+ true
+ false
true
true
@@ -273,12 +327,11 @@
https://dot.net
microsoft,dotnetframework
true
- $([MSBuild]::NormalizePath('$(LibrariesProjectRoot)', 'Microsoft.NETCore.Platforms', 'src', 'runtime.json'))
- $(MSBuildThisFileDirectory)LICENSE.md
+ $(MSBuildThisFileDirectory)LICENSE.TXT
MIT
false
$(CopyrightNetFoundation)
- $(MSBuildThisFileDirectory)Third Party Notices.md
+ $(MSBuildThisFileDirectory)THIRD-PARTY-NOTICES.TXT
https://go.microsoft.com/fwlink/?LinkID=799421
$(MSBuildProjectName.Contains('Private'))
@@ -297,13 +350,13 @@
latest
strict;nullablePublicOnly
- true
+ true
$(NoWarn),CS8969
portable
true
-
+ true
false
Properties
@@ -311,8 +364,93 @@
false
+
+
+ true
+ true
+ true
+ true
+ true
+
+
+ false
+
+
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ false
+
+ $(NoWarn);CS0169;CS0649;CS8618
+
+ $(NoWarn);CS8597
+
+ $(NoWarn);CS8625
+
+ $(NoWarn);CS8617
+
+
+ none
+
+ false
+
+
+
+
+
+
+ <_Parameter1>(System.Reflection.AssemblyNameFlags)0x70
+ <_Parameter1_IsLiteral>true
+
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+ true
+
+
+
+
+
+ $(NoWarn);SYSLIB0011
+
+ $(NoWarn);IL2121
+
+ annotations
+
+
$(RepositoryEngineeringDir)NoTargetsSdk.BeforeTargets.targets
+ $(RepositoryEngineeringDir)NoTargetsSdk.AfterTargets.targets
$(RepositoryEngineeringDir)TraversalSdk.AfterTargets.targets
diff --git a/Directory.Build.targets b/Directory.Build.targets
index 541cdfb59f27f9..14d08b1b18b933 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -1,4 +1,4 @@
-
+
+
+
+ $(PackageRID)
+
+
+ $(PackageRID)
+
+
+
+
$(ProductVersion)
+ $(ProductVersion)
$(ProductVersion)-$(VersionSuffix)
@@ -61,6 +79,126 @@
$(PackageDescription)
+
+
+
+
+
+
+ $(IsReferenceAssemblyProject)
+
+
+
+
+
+
+
+
+
+
+
+ <_FileVersionMaj>$(FileVersion.Split('.')[0])
+ <_FileVersionMin>$(FileVersion.Split('.')[1])
+ <_FileVersionBld>$(FileVersion.Split('.')[2])
+ <_FileVersionRev>$(FileVersion.Split('.')[3])
+ $(_FileVersionMaj).$([MSBuild]::Add($(_FileVersionMin), 100)).$(_FileVersionBld).$(_FileVersionRev)
+
+
+
+
+
+ <_analyzerPath>analyzers/dotnet
+ <_analyzerPath Condition="'$(AnalyzerRoslynVersion)' != ''">$(_analyzerPath)/roslyn$(AnalyzerRoslynVersion)
+ <_analyzerPath Condition="'$(AnalyzerLanguage)' != ''">$(_analyzerPath)/$(AnalyzerLanguage)
+
+
+
+
+ <_AnalyzerPackFile Include="@(_BuildOutputInPackage->WithMetadataValue('TargetFramework', 'netstandard2.0'))" IsSymbol="false" />
+ <_AnalyzerPackFile Include="@(_TargetPathsToSymbols->WithMetadataValue('TargetFramework', 'netstandard2.0'))" IsSymbol="true" />
+ <_AnalyzerPackFile PackagePath="$(_analyzerPath)/%(TargetPath)" />
+
+
+
+
+
+
+
+
+
+ false
+ None
+
+
+
+
+ <_ResolvedProjectReferencePaths Condition="'%(_ResolvedProjectReferencePaths.SkipUseReferenceAssembly)' == 'true'"
+ ReferenceAssembly="" />
+
+
+
+
+
+
+ <_transitiveProjectReferenceWithProjectName Include="@(ProjectReference->Metadata('NuGetPackageId'))"
+ OriginalIdentity="%(Identity)" />
+ <_transitiveIncludedProjectReferenceWithProjectName Include="@(_transitiveProjectReferenceWithProjectName)"
+ Exclude="@(DefaultReferenceExclusion)" />
+ <_transitiveExcludedProjectReferenceWithProjectName Include="@(_transitiveProjectReferenceWithProjectName)"
+ Exclude="@(_transitiveIncludedProjectReferenceWithProjectName)" />
+
+
+
+
+
+
+
+ <_targetingPackReferenceExclusion Include="$(TargetName)" />
+ <_targetingPackReferenceExclusion Include="@(_ResolvedProjectReferencePaths->Metadata('Filename'))" />
+ <_targetingPackReferenceExclusion Include="@(DefaultReferenceExclusion)" />
+
+
+
+
+ <_targetingPackReferenceExclusion Include="@(NetFxReference)" />
+ <_targetingPackReferenceExclusion Include="netstandard" />
+
+
+
+ <_targetingPackReferenceWithProjectName Include="@(Reference->WithMetadataValue('ExternallyResolved', 'true')->Metadata('Filename'))"
+ OriginalIdentity="%(Identity)" />
+ <_targetingPackIncludedReferenceWithProjectName Include="@(_targetingPackReferenceWithProjectName)"
+ Exclude="@(_targetingPackReferenceExclusion)" />
+ <_targetingPackExcludedReferenceWithProjectName Include="@(_targetingPackReferenceWithProjectName)"
+ Exclude="@(_targetingPackIncludedReferenceWithProjectName)" />
+
+
+
+
-
-
+
+
diff --git a/PATENTS.TXT b/PATENTS.TXT
new file mode 100644
index 00000000000000..695305bf6abbb9
--- /dev/null
+++ b/PATENTS.TXT
@@ -0,0 +1,46 @@
+Microsoft Patent Promise for .NET Libraries and Runtime Components
+
+Microsoft Corporation and its affiliates ("Microsoft") promise not to assert
+any .NET Patents against you for making, using, selling, offering for sale,
+importing, or distributing Covered Code, as part of either a .NET Runtime or
+as part of any application designed to run on a .NET Runtime.
+
+If you file, maintain, or voluntarily participate in any claim in a lawsuit
+alleging direct or contributory patent infringement by any Covered Code, or
+inducement of patent infringement by any Covered Code, then your rights under
+this promise will automatically terminate.
+
+This promise is not an assurance that (i) any .NET Patents are valid or
+enforceable, or (ii) Covered Code does not infringe patents or other
+intellectual property rights of any third party. No rights except those
+expressly stated in this promise are granted, waived, or received by
+Microsoft, whether by implication, exhaustion, estoppel, or otherwise.
+This is a personal promise directly from Microsoft to you, and you agree as a
+condition of benefiting from it that no Microsoft rights are received from
+suppliers, distributors, or otherwise from any other person in connection with
+this promise.
+
+Definitions:
+
+"Covered Code" means those Microsoft .NET libraries and runtime components as
+made available by Microsoft at https://github.com/dotnet/runtime.
+
+".NET Patents" are those patent claims, both currently owned by Microsoft and
+acquired in the future, that are necessarily infringed by Covered Code. .NET
+Patents do not include any patent claims that are infringed by any Enabling
+Technology, that are infringed only as a consequence of modification of
+Covered Code, or that are infringed only by the combination of Covered Code
+with third party code.
+
+".NET Runtime" means any compliant implementation in software of (a) all of
+the required parts of the mandatory provisions of Standard ECMA-335 – Common
+Language Infrastructure (CLI); and (b) if implemented, any additional
+functionality in Microsoft's .NET Framework, as described in Microsoft's API
+documentation on its MSDN website. For example, .NET Runtimes include
+Microsoft's .NET Framework and those portions of the Mono Project compliant
+with (a) and (b).
+
+"Enabling Technology" means underlying or enabling technology that may be
+used, combined, or distributed in connection with Microsoft's .NET Framework
+or other .NET Runtimes, such as hardware, operating systems, and applications
+that run on .NET Framework or other .NET Runtimes.
diff --git a/README.md b/README.md
index 1af1cff1f571d6..fe488d1d6e706b 100644
--- a/README.md
+++ b/README.md
@@ -3,17 +3,26 @@
See [unity/README.md](unity/README.md) for details specific to Unity's fork.
# .NET Runtime
-[](https://dnceng.visualstudio.com/public/_build/latest?definitionId=686&branchName=main)
-[](https://github.com/dotnet/runtime/issues?q=is%3Aissue+is%3Aopen+label%3A%22up-for-grabs%22)
+
+[](https://dev.azure.com/dnceng-public/public/_build/latest?definitionId=129&branchName=main)
+[](https://github.com/dotnet/runtime/labels/help%20wanted)
[](https://gitter.im/dotnet/runtime)
[](https://aka.ms/dotnet-discord)
+* [What is .NET?](#what-is-net)
+* [How can I contribute?](#how-can-i-contribute)
+* [Reporting security issues and security bugs](#reporting-security-issues-and-security-bugs)
+* [Filing issues](#filing-issues)
+* [Useful Links](#useful-links)
+* [.NET Foundation](#net-foundation)
+* [License](#license)
+
This repo contains the code to build the .NET runtime, libraries and shared host (`dotnet`) installers for
all supported platforms, as well as the sources to .NET runtime and libraries.
## What is .NET?
-Official Starting Page: https://dotnet.microsoft.com
+Official Starting Page:
* [How to use .NET](https://docs.microsoft.com/dotnet/core/get-started) (with VS, VS Code, command-line CLI)
* [Install official releases](https://dotnet.microsoft.com/download)
@@ -29,12 +38,12 @@ Official Starting Page: https://dotnet.microsoft.com
We welcome contributions! Many people all over the world have helped make this project better.
* [Contributing](CONTRIBUTING.md) explains what kinds of contributions we welcome
-- [Workflow Instructions](docs/workflow/README.md) explains how to build and test
+* [Workflow Instructions](docs/workflow/README.md) explains how to build and test
* [Get Up and Running on .NET Core](docs/project/dogfooding.md) explains how to get nightly builds of the runtime and its libraries to test them in your own projects.
## Reporting security issues and security bugs
-Security issues and bugs should be reported privately, via email, to the Microsoft Security Response Center (MSRC) . You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Further information, including the MSRC PGP key, can be found in the [Security TechCenter](https://www.microsoft.com/msrc/faqs-report-an-issue).
+Security issues and bugs should be reported privately, via email, to the Microsoft Security Response Center (MSRC) . You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Further information, including the MSRC PGP key, can be found in the [Security TechCenter](https://www.microsoft.com/msrc/faqs-report-an-issue). You can also find these instructions in this repo's [Security doc](SECURITY.md).
Also see info about related [Microsoft .NET Core and ASP.NET Core Bug Bounty Program](https://www.microsoft.com/msrc/bounty-dot-net-core).
@@ -42,10 +51,7 @@ Also see info about related [Microsoft .NET Core and ASP.NET Core Bug Bounty Pro
This repo should contain issues that are tied to the runtime, the class libraries and frameworks, the installation of the `dotnet` binary (sometimes known as the `muxer`) and installation of the .NET runtime and libraries.
-For other issues, please use the following repos:
-
-- For overall .NET SDK issues, file in the [dotnet/sdk](https://github.com/dotnet/sdk) repo
-- For ASP.NET issues, file in the [dotnet/aspnetcore](https://github.com/dotnet/aspnetcore) repo.
+For other issues, please file them to their appropriate sibling repos. Their respective links are described in the [config issue template doc](/.github/ISSUE_TEMPLATE/config.yml).
## Useful Links
@@ -61,8 +67,8 @@ For other issues, please use the following repos:
There are many .NET related projects on GitHub.
-- [.NET home repo](https://github.com/Microsoft/dotnet) - links to 100s of .NET projects, from Microsoft and the community.
-- [ASP.NET Core home](https://docs.microsoft.com/aspnet/core) - the best place to start learning about ASP.NET Core.
+* [.NET home repo](https://github.com/Microsoft/dotnet) - links to 100s of .NET projects, from Microsoft and the community.
+* [ASP.NET Core home](https://docs.microsoft.com/aspnet/core) - the best place to start learning about ASP.NET Core.
This project has adopted the code of conduct defined by the [Contributor Covenant](https://contributor-covenant.org) to clarify expected behavior in our community. For more information, see the [.NET Foundation Code of Conduct](https://www.dotnetfoundation.org/code-of-conduct).
diff --git a/THIRD-PARTY-NOTICES.TXT b/THIRD-PARTY-NOTICES.TXT
new file mode 100644
index 00000000000000..feb4d4fe851c8c
--- /dev/null
+++ b/THIRD-PARTY-NOTICES.TXT
@@ -0,0 +1,1198 @@
+.NET Runtime uses third-party libraries or other resources that may be
+distributed under licenses different than the .NET Runtime software.
+
+In the event that we accidentally failed to list a required notice, please
+bring it to our attention. Post an issue or email us:
+
+ dotnet@microsoft.com
+
+The attached notices are provided for information only.
+
+License notice for ASP.NET
+-------------------------------
+
+Copyright (c) .NET Foundation. All rights reserved.
+Licensed under the Apache License, Version 2.0.
+
+Available at
+https://github.com/dotnet/aspnetcore/blob/main/LICENSE.txt
+
+License notice for Slicing-by-8
+-------------------------------
+
+http://sourceforge.net/projects/slicing-by-8/
+
+Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
+
+
+This software program is licensed subject to the BSD License, available at
+http://www.opensource.org/licenses/bsd-license.html.
+
+
+License notice for Unicode data
+-------------------------------
+
+https://www.unicode.org/license.html
+
+Copyright © 1991-2022 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+
+License notice for Zlib
+-----------------------
+
+https://github.com/madler/zlib
+https://zlib.net/zlib_license.html
+
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.12, March 27th, 2022
+
+ Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+*/
+
+License notice for Mono
+-------------------------------
+
+http://www.mono-project.com/docs/about-mono/
+
+Copyright (c) .NET Foundation Contributors
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the Software), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for International Organization for Standardization
+-----------------------------------------------------------------
+
+Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.
+
+License notice for Intel
+------------------------
+
+"Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Xamarin and Novell
+-------------------------------------
+
+Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Copyright (c) 2011 Novell, Inc (http://www.novell.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Third party notice for W3C
+--------------------------
+
+"W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE
+Status: This license takes effect 13 May, 2015.
+This work is being provided by the copyright holders under the following license.
+License
+By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
+Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
+The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
+Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
+Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)."
+Disclaimers
+THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
+The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders."
+
+License notice for Bit Twiddling Hacks
+--------------------------------------
+
+Bit Twiddling Hacks
+
+By Sean Eron Anderson
+seander@cs.stanford.edu
+
+Individually, the code snippets here are in the public domain (unless otherwise
+noted) — feel free to use them however you please. The aggregate collection and
+descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are
+distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and
+without even the implied warranty of merchantability or fitness for a particular
+purpose.
+
+License notice for Brotli
+--------------------------------------
+
+Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+compress_fragment.c:
+Copyright (c) 2011, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+decode_fuzzer.c:
+Copyright (c) 2015 The Chromium Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+
+License notice for Json.NET
+-------------------------------
+
+https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md
+
+The MIT License (MIT)
+
+Copyright (c) 2007 James Newton-King
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for vectorized base64 encoding / decoding
+--------------------------------------------------------
+
+Copyright (c) 2005-2007, Nick Galbreath
+Copyright (c) 2013-2017, Alfred Klomp
+Copyright (c) 2015-2017, Wojciech Mula
+Copyright (c) 2016-2017, Matthieu Darbois
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+- Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for RFC 3492
+---------------------------
+
+The punycode implementation is based on the sample code in RFC 3492
+
+Copyright (C) The Internet Society (2003). All Rights Reserved.
+
+This document and translations of it may be copied and furnished to
+others, and derivative works that comment on or otherwise explain it
+or assist in its implementation may be prepared, copied, published
+and distributed, in whole or in part, without restriction of any
+kind, provided that the above copyright notice and this paragraph are
+included on all such copies and derivative works. However, this
+document itself may not be modified in any way, such as by removing
+the copyright notice or references to the Internet Society or other
+Internet organizations, except as needed for the purpose of
+developing Internet standards in which case the procedures for
+copyrights defined in the Internet Standards process must be
+followed, or as required to translate it into languages other than
+English.
+
+The limited permissions granted above are perpetual and will not be
+revoked by the Internet Society or its successors or assigns.
+
+This document and the information contained herein is provided on an
+"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Copyright(C) The Internet Society 1997. All Rights Reserved.
+
+This document and translations of it may be copied and furnished to others,
+and derivative works that comment on or otherwise explain it or assist in
+its implementation may be prepared, copied, published and distributed, in
+whole or in part, without restriction of any kind, provided that the above
+copyright notice and this paragraph are included on all such copies and
+derivative works.However, this document itself may not be modified in any
+way, such as by removing the copyright notice or references to the Internet
+Society or other Internet organizations, except as needed for the purpose of
+developing Internet standards in which case the procedures for copyrights
+defined in the Internet Standards process must be followed, or as required
+to translate it into languages other than English.
+
+The limited permissions granted above are perpetual and will not be revoked
+by the Internet Society or its successors or assigns.
+
+This document and the information contained herein is provided on an "AS IS"
+basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE
+DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
+RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
+PARTICULAR PURPOSE.
+
+License notice for Algorithm from RFC 4122 -
+A Universally Unique IDentifier (UUID) URN Namespace
+----------------------------------------------------
+
+Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
+Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
+Digital Equipment Corporation, Maynard, Mass.
+Copyright (c) 1998 Microsoft.
+To anyone who acknowledges that this file is provided "AS IS"
+without any express or implied warranty: permission to use, copy,
+modify, and distribute this file for any purpose is hereby
+granted without fee, provided that the above copyright notices and
+this notice appears in all source code copies, and that none of
+the names of Open Software Foundation, Inc., Hewlett-Packard
+Company, Microsoft, or Digital Equipment Corporation be used in
+advertising or publicity pertaining to distribution of the software
+without specific, written prior permission. Neither Open Software
+Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
+Equipment Corporation makes any representations about the
+suitability of this software for any purpose."
+
+License notice for The LLVM Compiler Infrastructure
+---------------------------------------------------
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+License notice for Bob Jenkins
+------------------------------
+
+By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
+code any way you wish, private, educational, or commercial. It's free.
+
+License notice for Greg Parker
+------------------------------
+
+Greg Parker gparker@cs.stanford.edu December 2000
+This code is in the public domain and may be copied or modified without
+permission.
+
+License notice for libunwind based code
+----------------------------------------
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for Printing Floating-Point Numbers (Dragon4)
+------------------------------------------------------------
+
+/******************************************************************************
+ Copyright (c) 2014 Ryan Juckett
+ http://www.ryanjuckett.com/
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
+******************************************************************************/
+
+License notice for Printing Floating-point Numbers (Grisu3)
+-----------------------------------------------------------
+
+Copyright 2012 the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for xxHash
+-------------------------
+
+xxHash - Extremely Fast Hash algorithm
+Header File
+Copyright (C) 2012-2021 Yann Collet
+
+BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+You can contact the author at:
+ - xxHash homepage: https://www.xxhash.com
+ - xxHash source repository: https://github.com/Cyan4973/xxHash
+
+License notice for Berkeley SoftFloat Release 3e
+------------------------------------------------
+
+https://github.com/ucb-bar/berkeley-softfloat-3
+https://github.com/ucb-bar/berkeley-softfloat-3/blob/master/COPYING.txt
+
+License for Berkeley SoftFloat Release 3e
+
+John R. Hauser
+2018 January 20
+
+The following applies to the whole of SoftFloat Release 3e as well as to
+each source file individually.
+
+Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
+University of California. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions, and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for xoshiro RNGs
+--------------------------------
+
+Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org)
+
+To the extent possible under law, the author has dedicated all copyright
+and related and neighboring rights to this software to the public domain
+worldwide. This software is distributed without any warranty.
+
+See .
+
+License for fastmod (https://github.com/lemire/fastmod), ibm-fpgen (https://github.com/nigeltao/parse-number-fxx-test-data) and fastrange (https://github.com/lemire/fastrange)
+--------------------------------------
+
+ Copyright 2018 Daniel Lemire
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+License for sse4-strstr (https://github.com/WojciechMula/sse4-strstr)
+--------------------------------------
+
+ Copyright (c) 2008-2016, Wojciech Mula
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for The C++ REST SDK
+-----------------------------------
+
+C++ REST SDK
+
+The MIT License (MIT)
+
+Copyright (c) Microsoft Corporation
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for MessagePack-CSharp
+-------------------------------------
+
+MessagePack for C#
+
+MIT License
+
+Copyright (c) 2017 Yoshifumi Kawai
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for lz4net
+-------------------------------------
+
+lz4net
+
+Copyright (c) 2013-2017, Milosz Krajewski
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Nerdbank.Streams
+-----------------------------------
+
+The MIT License (MIT)
+
+Copyright (c) Andrew Arnott
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for RapidJSON
+----------------------------
+
+Tencent is pleased to support the open source community by making RapidJSON available.
+
+Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
+
+Licensed under the MIT License (the "License"); you may not use this file except
+in compliance with the License. You may obtain a copy of the License at
+
+http://opensource.org/licenses/MIT
+
+Unless required by applicable law or agreed to in writing, software distributed
+under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied. See the License for the
+specific language governing permissions and limitations under the License.
+
+License notice for DirectX Math Library
+---------------------------------------
+
+https://github.com/microsoft/DirectXMath/blob/master/LICENSE
+
+ The MIT License (MIT)
+
+Copyright (c) 2011-2020 Microsoft Corp
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be included in all copies
+or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for ldap4net
+---------------------------
+
+The MIT License (MIT)
+
+Copyright (c) 2018 Alexander Chermyanin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for vectorized sorting code
+------------------------------------------
+
+MIT License
+
+Copyright (c) 2020 Dan Shechter
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for musl
+-----------------------
+
+musl as a whole is licensed under the following standard MIT license:
+
+Copyright © 2005-2020 Rich Felker, et al.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+License notice for "Faster Unsigned Division by Constants"
+------------------------------
+
+Reference implementations of computing and using the "magic number" approach to dividing
+by constants, including codegen instructions. The unsigned division incorporates the
+"round down" optimization per ridiculous_fish.
+
+This is free and unencumbered software. Any copyright is dedicated to the Public Domain.
+
+
+License notice for mimalloc
+-----------------------------------
+
+MIT License
+
+Copyright (c) 2019 Microsoft Corporation, Daan Leijen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License for remote stack unwind (https://github.com/llvm/llvm-project/blob/main/lldb/source/Symbol/CompactUnwindInfo.cpp)
+--------------------------------------
+
+Copyright 2019 LLVM Project
+
+Licensed under the Apache License, Version 2.0 (the "License") with LLVM Exceptions;
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+https://llvm.org/LICENSE.txt
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+License notice for Apple header files
+-------------------------------------
+
+Copyright (c) 1980, 1986, 1993
+ The Regents of the University of California. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. All advertising materials mentioning features or use of this software
+ must display the following acknowledgement:
+ This product includes software developed by the University of
+ California, Berkeley and its contributors.
+4. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+License notice for JavaScript queues
+-------------------------------------
+
+CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER.
+
+Statement of Purpose
+The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").
+Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
+For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:
+the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
+moral rights retained by the original author(s) and/or performer(s);
+publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
+rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
+rights protecting the extraction, dissemination, use and reuse of data in a Work;
+database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
+other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
+2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.
+3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.
+4. Limitations and Disclaimers.
+a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
+b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
+c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
+d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
+
+
+License notice for FastFloat algorithm
+-------------------------------------
+MIT License
+Copyright (c) 2021 csFastFloat authors
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for MsQuic
+--------------------------------------
+
+Copyright (c) Microsoft Corporation.
+Licensed under the MIT License.
+
+Available at
+https://github.com/microsoft/msquic/blob/main/LICENSE
+
+License notice for m-ou-se/floatconv
+-------------------------------
+
+Copyright (c) 2020 Mara Bos
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for code from The Practice of Programming
+-------------------------------
+
+Copyright (C) 1999 Lucent Technologies
+
+Excerpted from 'The Practice of Programming
+by Brian W. Kernighan and Rob Pike
+
+You may use this code for any purpose, as long as you leave the copyright notice and book citation attached.
+
+Notice for Euclidean Affine Functions and Applications to Calendar
+Algorithms
+-------------------------------
+
+Aspects of Date/Time processing based on algorithm described in "Euclidean Affine Functions and Applications to Calendar
+Algorithms", Cassio Neri and Lorenz Schneider. https://arxiv.org/pdf/2102.06959.pdf
+
+License notice for amd/aocl-libm-ose
+-------------------------------
+
+Copyright (C) 2008-2020 Advanced Micro Devices, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+3. Neither the name of the copyright holder nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+License notice for fmtlib/fmt
+-------------------------------
+
+Formatting library for C++
+
+Copyright (c) 2012 - present, Victor Zverovich
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License for Jb Evain
+---------------------
+
+Copyright (c) 2006 Jb Evain (jbevain@gmail.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--- Optional exception to the license ---
+
+As an exception, if, as a result of your compiling your source code, portions
+of this Software are embedded into a machine-executable object form of such
+source code, you may redistribute such embedded portions in such object form
+without including the above copyright and permission notices.
+
+
+License for MurmurHash3
+--------------------------------------
+
+https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
+
+MurmurHash3 was written by Austin Appleby, and is placed in the public
+domain. The author hereby disclaims copyright to this source
diff --git a/Third Party Notices.md b/Third Party Notices.md
deleted file mode 100644
index 84bfb1b787fd4b..00000000000000
--- a/Third Party Notices.md
+++ /dev/null
@@ -1,1424 +0,0 @@
-This package contains third-party software components governed by the license(s) indicated below:
----------
-
-Component Name: ASP.NET
-
-License Type: Apache License, Version 2.0.
-
-Copyright © .NET Foundation. All rights reserved.
-
-```
-The MIT License (MIT)
-
-Copyright (c) .NET Foundation and Contributors
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-```
----------
-
-Component Name: Slicing-by-8
-
-License Type: BSD
-
-Copyright © 2004-2006 Intel Corporation - All Rights Reserved
-
-http://sourceforge.net/projects/slicing-by-8/
-
-```
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-```
----------
-
-Component Name: Unicode data
-
-License Type: Unicode
-
-Copyright © 1991-2020 Unicode, Inc. All rights reserved.
-
-```
-https://www.unicode.org/license.html
-
-Copyright © 1991-2022 Unicode, Inc. All rights reserved.
-Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Unicode data files and any associated documentation
-(the "Data Files") or Unicode software and any associated documentation
-(the "Software") to deal in the Data Files or Software
-without restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, and/or sell copies of
-the Data Files or Software, and to permit persons to whom the Data Files
-or Software are furnished to do so, provided that either
-(a) this copyright and permission notice appear with all copies
-of the Data Files or Software, or
-(b) this copyright and permission notice appear in associated
-Documentation.
-
-THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT OF THIRD PARTY RIGHTS.
-IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
-NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THE DATA FILES OR SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder
-shall not be used in advertising or otherwise to promote the sale,
-use or other dealings in these Data Files or Software without prior
-written authorization of the copyright holder.
-```
----------
-
-Component Name: Zlib
-
-License Type: Zlib
-
-Copyright © 1995-2017 Jean-loup Gailly and Mark Adler
-
-https://github.com/madler/zlib
-https://zlib.net/zlib_license.html
-
-```
-/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.12, March 27th, 2022
-
- Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
-*/
-```
----------
-
-Component Name: Mono
-
-License Type: MIT
-
-Copyright © .NET Foundation Contributors
-
-http://www.mono-project.com/docs/about-mono/
-
-MIT License
-```
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the Software), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-License notice for Mono
-```
----------
-
-Component Name: International Organization for Standardization
-
-License Type: [Provide license type, i.e. "MIT", "Apache 2.0"]
-
-Copyright © 1986 International Organization for Standardization
-
-```
-Portions (C) International Organization for Standardization 1986:
- Permission to copy in any form is granted for use with
- conforming SGML systems and applications as defined in
- ISO 8879, provided this notice is included in all copies.
-```
----------
-
-Component Name: Intel
-
-License Type: Intel
-
-Copyright © 2004-2006 Intel Corporation - All Rights Reserved
-
-```
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-```
----------
-
-Component Name: Xamarin and Novell
-
-License Type: Xamarin and Novell
-
-Copyright © 2015 Xamarin, Inc
-Copyright © 2011 Novell, Inc
-
-http://www.xamarin.com
-http://www.novell.com
-
-```
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-```
-```
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-```
----------
-
-Component Name: W3C
-
-License Type: W3C
-```
-"W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE
-Status: This license takes effect 13 May, 2015.
-This work is being provided by the copyright holders under the following license.
-License
-By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
-Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
-The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
-Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
-Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)."
-Disclaimers
-THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
-The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders."
-```
----------
-
-Component Name: Bit Twiddling Hacks
-
-License Type: ??????
-
-Copyright © 1997-2005 Sean Eron Anderson (aggregate collection)
-
-```
-By Sean Eron Anderson
-seander@cs.stanford.edu
-
-Individually, the code snippets here are in the public domain (unless otherwise
-noted) — feel free to use them however you please. The aggregate collection and
-descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are
-distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and
-without even the implied warranty of merchantability or fitness for a particular
-purpose.
-```
----------
-
-Component Name: Brotli
-
-License Type: Brotli
-
-Copyright © 2009, 2010, 2013-2016 by the Brotli Authors.
-Copyright © 2011, Google Inc.
-Copyright © 2015 The Chromium Authors. All rights reserved.
-
-```
-Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-```
-```
-compress_fragment.c:
-Copyright (c) 2011, Google Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-```
-```
-decode_fuzzer.c:
-Copyright (c) 2015 The Chromium Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-```
----------
-
-Component Name: Json.NET
-
-License Type: MIT
-
-Copyright © 2007 James Newton-King
-
-https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md
-
-```
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-```
----------
-
-Component Name: vectorized base64 encoding / decoding
-
-License Type: Unkown
-
-Copyright © 2005-2007, Nick Galbreath
-Copyright © 2013-2017, Alfred Klomp
-Copyright © 2015-2017, Wojciech Mula
-Copyright © 2016-2017, Matthieu Darbois
-All rights reserved.
-
-```
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
-- Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-```
----------
-
-Component Name: RFC 3492
-
-License Type: The Internet Society
-
-Copyright © 2003 The Internet Society
-
-```
-The punycode implementation is based on the sample code in RFC 3492
-
-Copyright (C) The Internet Society (2003). All Rights Reserved.
-
-This document and translations of it may be copied and furnished to
-others, and derivative works that comment on or otherwise explain it
-or assist in its implementation may be prepared, copied, published
-and distributed, in whole or in part, without restriction of any
-kind, provided that the above copyright notice and this paragraph are
-included on all such copies and derivative works. However, this
-document itself may not be modified in any way, such as by removing
-the copyright notice or references to the Internet Society or other
-Internet organizations, except as needed for the purpose of
-developing Internet standards in which case the procedures for
-copyrights defined in the Internet Standards process must be
-followed, or as required to translate it into languages other than
-English.
-
-The limited permissions granted above are perpetual and will not be
-revoked by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an
-"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
-TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
-BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
-HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-```
----------
-
-Component Name: Algorithm from Internet Draft document "UUIDs and GUIDs"
-
-License Type: Multiple
-
-Copyright © 1990- 1993, 1996 Open Software Foundation, Inc.
-Copyright © 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.
-Copyright © 1997 The Internet Society. All Rights Reserved.
-
-```
-Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
-Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
-Digital Equipment Corporation, Maynard, Mass.
-To anyone who acknowledges that this file is provided "AS IS"
-without any express or implied warranty: permission to use, copy,
-modify, and distribute this file for any purpose is hereby
-granted without fee, provided that the above copyright notices and
-this notice appears in all source code copies, and that none of
-the names of Open Software Foundation, Inc., Hewlett-Packard
-Company, or Digital Equipment Corporation be used in advertising
-or publicity pertaining to distribution of the software without
-specific, written prior permission. Neither Open Software
-Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment
-Corporation makes any representations about the suitability of
-this software for any purpose.
-```
-```
-Copyright(C) The Internet Society 1997. All Rights Reserved.
-
-This document and translations of it may be copied and furnished to others,
-and derivative works that comment on or otherwise explain it or assist in
-its implementation may be prepared, copied, published and distributed, in
-whole or in part, without restriction of any kind, provided that the above
-copyright notice and this paragraph are included on all such copies and
-derivative works.However, this document itself may not be modified in any
-way, such as by removing the copyright notice or references to the Internet
-Society or other Internet organizations, except as needed for the purpose of
-developing Internet standards in which case the procedures for copyrights
-defined in the Internet Standards process must be followed, or as required
-to translate it into languages other than English.
-
-The limited permissions granted above are perpetual and will not be revoked
-by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an "AS IS"
-basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE
-DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
-ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
-RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
-PARTICULAR PURPOSE.
-```
----------
-
-Component Name: Algorithm from RFC 4122 - A Universally Unique IDentifier (UUID) URN Namespace
-
-License Type: Multiple
-
-Copyright © 1990- 1993, 1996 Open Software Foundation, Inc.
-Copyright © 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.
-Copyright © 1998 Microsoft.
-
-```
-To anyone who acknowledges that this file is provided "AS IS"
-without any express or implied warranty: permission to use, copy,
-modify, and distribute this file for any purpose is hereby
-granted without fee, provided that the above copyright notices and
-this notice appears in all source code copies, and that none of
-the names of Open Software Foundation, Inc., Hewlett-Packard
-Company, Microsoft, or Digital Equipment Corporation be used in
-advertising or publicity pertaining to distribution of the software
-without specific, written prior permission. Neither Open Software
-Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
-Equipment Corporation makes any representations about the
-suitability of this software for any purpose."
-```
----------
-
-Component Name: The LLVM Compiler Infrastructure
-
-License Type: Apache 2.0 License with LLVM exceptions
-
-https://llvm.org/docs/DeveloperPolicy.html#new-llvm-project-license-framework
-
-```
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-```
----------
-
-Component Name: Bob Jenkins
-
-License Type: Unknown
-
-Copyright © 1996 Bob Jenkins
-
-```
-By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
-code any way you wish, private, educational, or commercial. It's free.
-```
----------
-
-Component Name: Greg Parker
-
-License Type: Unkown
-
-Copyright © 2000 Greg Parker
-
-```
-Greg Parker gparker@cs.stanford.edu December 2000
-This code is in the public domain and may be copied or modified without
-permission.
-```
----------
-
-Component Name: libunwind based code
-
-License Type: MIT
-
-```
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-```
----------
-
-Component Name: Printing Floating-Point Numbers (Dragon4)
-
-License Type: Unknown
-
-Copyright © 2014 Ryan Juckett
-
-```
-/******************************************************************************
- Copyright (c) 2014 Ryan Juckett
- http://www.ryanjuckett.com/
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
-
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
- 3. This notice may not be removed or altered from any source
- distribution.
-******************************************************************************/
-```
----------
-
-Component Name: Printing Floating-point Numbers (Grisu3)
-
-License Type: [Provide license type, i.e. "MIT", "Apache 2.0"]
-
-Copyright © 2012 the V8 project authors.
-
-```
-Copyright 2012 the V8 project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-```
-
----------
-
-Component Name: xxHash Library
-
-License Type: BSD 2-Clause
-
-Copyright © 2012-2014, Yann Collet All rights reserved.
-
-```
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-```
----------
-
-Component Name: Berkeley SoftFloat Release 3e
-
-License Type: Unknown
-
-Copyright © 2018 John R. Hauser
-
-https://github.com/ucb-bar/berkeley-softfloat-3
-https://github.com/ucb-bar/berkeley-softfloat-3/blob/master/COPYING.txt
-
-```
-John R. Hauser
-2018 January 20
-
-The following applies to the whole of SoftFloat Release 3e as well as to
-each source file individually.
-
-Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
-University of California. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions, and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions, and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-```
----------
-
-Component Name: xoshiro RNGs
-
-License Type: Public Domain
-
-http://creativecommons.org/publicdomain/zero/1.0/
-
-```
-Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org)
-
-To the extent possible under law, the author has dedicated all copyright
-and related and neighboring rights to this software to the public domain
-worldwide. This software is distributed without any warranty.
-
-See .
-```
-
----------
-
-Component Name: fastmod
-
-License Type: Apache 2.0
-
-Copyright © 2018 Daniel Lemire
-
-https://github.com/lemire/fastmod
-
-```
-Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-```
----------
-
-Component Name: sse4-strstr
-
-License Type: BSD 2-Clause
-
-Copyright © 2008-2016, Wojciech Muła
-
-https://github.com/WojciechMula/sse4-strstr
-
-```
- Copyright (c) 2008-2016, Wojciech Muła
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-```
----------
-
-Component Name: ibm-fpgen
-
-License Type: Apache 2.0
-
-Copyright © 2018 Daniel Lemire
-
-https://github.com/nigeltao/parse-number-fxx-test-data
-
-```
-Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-```
----------
-
-Component Name: The C++ REST SDK
-
-License Type: MIT
-
-Copyright © Microsoft Corporation
-
-```
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-```
-
----------
-
-Component Name: MessagePack-CSharp
-
-License Type: MIT
-
-Copyright © 2017 Yoshifumi Kawai
-
-```
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-```
----------
-
-Component Name: lz4net
-
-License Type: BSD 2-Clause "Simplified" License
-
-Copyright © 2013-2017, Milosz Krajewski
-
-https://github.com/MiloszKrajewski/lz4net
-
-```
-Copyright (c) 2013-2017, Milosz Krajewski
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-```
----------
-
-Component Name: Nerdbank.Streams
-
-License Type: MIT
-
-Copyright © Andrew Arnott
-
-```
-The MIT License (MIT)
-
-Copyright (c) Andrew Arnott
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-```
----------
-
-Component Name: RapidJSON
-
-License Type: MIT
-
-Copyright © 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
-
-```
-Tencent is pleased to support the open source community by making RapidJSON available.
-
-Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
-
-Licensed under the MIT License (the "License"); you may not use this file except
-in compliance with the License. You may obtain a copy of the License at
-
-http://opensource.org/licenses/MIT
-
-Unless required by applicable law or agreed to in writing, software distributed
-under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the License for the
-specific language governing permissions and limitations under the License.
-```
----------
-
-Component Name: DirectX Math Library
-
-License Type: MIT
-
-Copyright © 2011-2020 Microsoft Corp
-
-https://github.com/microsoft/DirectXMath/blob/master/LICENSE
-
-```
- The MIT License (MIT)
-
-Copyright (c) 2011-2020 Microsoft Corp
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this
-software and associated documentation files (the "Software"), to deal in the Software
-without restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be included in all copies
-or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
-CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
-OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-```
-
----------
-
-Component Name: ldap4net
-
-License Type: MIT
-
-Copyright © 2018 Alexander Chermyanin
-```
-The MIT License (MIT)
-
-Copyright (c) 2018 Alexander Chermyanin
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-```
-
----------
-
-Component Name: vectorized sorting code
-
-License Type: MIT
-
-Copyright © 2020 Dan Shechter
-```
-MIT License
-
-Copyright (c) 2020 Dan Shechter
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-```
----------
-
-Component Name: musl
-
-License Type: MIT
-
-Copyright © 2005-2020 Rich Felker, et al.
-
-```
-musl as a whole is licensed under the following standard MIT license:
-
-Copyright © 2005-2020 Rich Felker, et al.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-```
----------
-
-Component Name: "Faster Unsigned Division by Constants"
-
-License Type: Public Domain
-
-```
-Reference implementations of computing and using the "magic number" approach to dividing
-by constants, including codegen instructions. The unsigned division incorporates the
-"round down" optimization per ridiculous_fish.
-
-This is free and unencumbered software. Any copyright is dedicated to the Public Domain.
-```
----------
-
-Component Name: mimalloc
-
-License Type: MIT
-
-Copyright © 2019 Microsoft Corporation, Daan Leijen
-
-```
-MIT License
-
-Copyright (c) 2019 Microsoft Corporation, Daan Leijen
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-```
----------
-
-ComponentName: License for remote stack unwind
-
-License Type: Apache License, Version 2.0.
-
-Copyright © 2019 LLVM Project
-```
-
-License for remote stack unwind (https://github.com/llvm/llvm-project/blob/main/lldb/source/Symbol/CompactUnwindInfo.cpp)
-
-Copyright 2019 LLVM Project
-
-Licensed under the Apache License, Version 2.0 (the "License") with LLVM Exceptions;
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-https://llvm.org/LICENSE.txt
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-```
----------
-Component Name: Apple header files
-
-License Type: Unknown
-
-Copyright © 1980, 1986, 1993 The Regents of the University of California. All rights reserved.
-
-```
-Copyright (c) 1980, 1986, 1993
- The Regents of the University of California. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-3. All advertising materials mentioning features or use of this software
- must display the following acknowledgement:
- This product includes software developed by the University of
- California, Berkeley and its contributors.
-4. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-```
----------
-
-Component Name: JavaScript queues
-
-License Type: Creative Commons
-
-```
-CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER.
-
-Statement of Purpose
-The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").
-Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
-For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
-
-1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:
-the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
-moral rights retained by the original author(s) and/or performer(s);
-publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
-rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
-rights protecting the extraction, dissemination, use and reuse of data in a Work;
-database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
-other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
-2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.
-3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.
-4. Limitations and Disclaimers.
-a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
-b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
-c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
-d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
-
-License notice for FastFloat algorithm
--------------------------------------
-MIT License
-Copyright (c) 2021 csFastFloat authors
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-```
----------
-
-Component Name: MsQuic
-
-License Type: MIT
-
-```
-Copyright (c) Microsoft Corporation.
-Licensed under the MIT License.
-
-Available at
-https://github.com/microsoft/msquic/blob/main/LICENSE
-
-License notice for m-ou-se/floatconv
--------------------------------
-
-Copyright (c) 2020 Mara Bos
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-```
----------
-
-Component Name: code from The Practice of Programming
-
-License Type: Unknown
-
-Copyright © 1999 Lucent Technologies
-
-```
-License notice for code from The Practice of Programming
--------------------------------
-
-Copyright (C) 1999 Lucent Technologies
-
-Excerpted from 'The Practice of Programming
-by Brian W. Kernighan and Rob Pike
-
-You may use this code for any purpose, as long as you leave the copyright notice and book citation attached.
-```
----------
-
-Component Name: Euclidean Affine Functions and Applications to Calendar Algorithms
-
-License Type: Unknown
-
-Copyright © 1999 Lucent Technologies
-
-```
-Copyright © 1999 Lucent Technologies
-
-Aspects of Date/Time processing based on algorithm described in "Euclidean Affine Functions and Applications to Calendar
-Algorithms", Cassio Neri and Lorenz Schneider. https://arxiv.org/pdf/2102.06959.pdf
-```
----------
-
-Component Name:amd/aocl-libm-ose
-
-License Type: Unknown
-
-Copyright © 2008-2020 Advanced Micro Devices, Inc. All rights reserved.
-```
-License notice for amd/aocl-libm-ose
--------------------------------
-
-Copyright (C) 2008-2020 Advanced Micro Devices, Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-3. Neither the name of the copyright holder nor the names of its contributors
- may be used to endorse or promote products derived from this software without
- specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-```
\ No newline at end of file
diff --git a/docs/README.md b/docs/README.md
index 023cb7b5686099..6989879155dcc5 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -25,6 +25,7 @@ Design Docs
=================
- [.NET Globalization Invariant Mode](design/features/globalization-invariant-mode.md)
+- [WASM Globalization Icu](design/features/globalization-icu-wasm.md)
- [Cross-Platform Cryptography](design/features/cross-platform-cryptography.md)
- Many more under [design/features](design/features/)
diff --git a/docs/area-owners.json b/docs/area-owners.json
index be3b338b7e09f0..82c347c9492795 100644
--- a/docs/area-owners.json
+++ b/docs/area-owners.json
@@ -58,6 +58,7 @@
"clamp03",
"gbalykov",
"hjleee",
+ "JongHeonChoi",
"wscho77"
],
"label": "os-tizen"
@@ -68,6 +69,36 @@
"vargaz"
],
"label": "os-tvos"
+ },
+ {
+ "lead": "lewing",
+ "owners": [
+ "pavelsavara"
+ ],
+ "label": "os-wasi"
+ }
+ ],
+ "trimming": [
+ {
+ "lead": "",
+ "owners": [
+ "eerhardt",
+ "vitek-karas",
+ "LakshanF",
+ "sbomer",
+ "joperezr",
+ "marek-safar"
+ ],
+ "label": "linkable-framework"
+ },
+ {
+ "lead": "",
+ "owners": [
+ "eerhardt",
+ "SamMonoRT",
+ "marek-safar"
+ ],
+ "label": "size-reduction"
}
],
"areas": [
@@ -114,7 +145,6 @@
{
"lead": "JulieLeeMSFT",
"owners": [
- "amanasifkhalid",
"AndyAyersMS",
"BruceForstall",
"EgorBo",
@@ -124,6 +154,7 @@
"kunalspathak",
"markples",
"SingleAccretion",
+ "tannergooding",
"TIHan",
"dotnet/jit-contrib"
],
@@ -136,6 +167,13 @@
],
"label": "area-Codegen-Interpreter-mono"
},
+ {
+ "lead": "SamMonoRT",
+ "owners": [
+ "fanyang-mono"
+ ],
+ "label": "area-Codegen-Intrinsic-mono"
+ },
{
"lead": "SamMonoRT",
"owners": [
@@ -206,13 +244,13 @@
},
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "akhil-carlos-viktor",
"owners": [
- "eerhardt",
+ "carlossanlop",
"ericstj",
"jeffhandley",
- "maryamariyan",
- "tarekgh",
+ "smasher164",
+ "ViktorHofer",
"dotnet/area-dependencymodel"
],
"label": "area-DependencyModel"
@@ -248,25 +286,26 @@
},
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "adam-david-jeremy",
"owners": [
- "eerhardt",
+ "adamsitnik",
+ "bartonjs",
"ericstj",
"jeffhandley",
- "maryamariyan",
- "tarekgh",
+ "Jozkee",
"dotnet/area-extensions-caching"
],
"label": "area-Extensions-Caching"
},
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
- "eerhardt",
+ "eiriktsarpalis",
"ericstj",
"jeffhandley",
- "maryamariyan",
+ "krwq",
+ "layomia",
"tarekgh",
"dotnet/area-extensions-configuration"
],
@@ -274,40 +313,37 @@
},
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "buyaa-steve",
"owners": [
- "eerhardt",
+ "buyaa-n",
"ericstj",
"jeffhandley",
- "maryamariyan",
- "tarekgh",
+ "steveharter",
"dotnet/area-extensions-dependencyinjection"
],
"label": "area-Extensions-DependencyInjection"
},
{
"lead": "jeffhandley",
- "pod": "adam-david",
+ "pod": "adam-david-jeremy",
"owners": [
"adamsitnik",
- "eerhardt",
+ "bartonjs",
"ericstj",
"jeffhandley",
"Jozkee",
- "maryamariyan",
"dotnet/area-extensions-filesystem"
],
"label": "area-Extensions-FileSystem"
},
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "buyaa-steve",
"owners": [
- "eerhardt",
+ "buyaa-n",
"ericstj",
"jeffhandley",
- "maryamariyan",
- "tarekgh",
+ "steveharter",
"dotnet/area-extensions-hosting"
],
"label": "area-Extensions-Hosting"
@@ -321,6 +357,7 @@
"greenEkatherine",
"halter73",
"karelz",
+ "liveans",
"ManickaP",
"MihaZupan",
"rzikm",
@@ -331,12 +368,13 @@
},
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
- "eerhardt",
+ "eiriktsarpalis",
"ericstj",
"jeffhandley",
- "maryamariyan",
+ "krwq",
+ "layomia",
"tarekgh",
"dotnet/area-extensions-logging"
],
@@ -344,12 +382,13 @@
},
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
- "eerhardt",
+ "eiriktsarpalis",
"ericstj",
"jeffhandley",
- "maryamariyan",
+ "krwq",
+ "layomia",
"tarekgh",
"dotnet/area-extensions-options"
],
@@ -357,12 +396,13 @@
},
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
- "eerhardt",
+ "eiriktsarpalis",
"ericstj",
"jeffhandley",
- "maryamariyan",
+ "krwq",
+ "layomia",
"tarekgh",
"dotnet/area-extensions-primitives"
],
@@ -402,7 +442,6 @@
{
"lead": "JulieLeeMSFT",
"owners": [
- "amanasifkhalid",
"AndyAyersMS",
"BruceForstall",
"EgorBo",
@@ -412,6 +451,7 @@
"kunalspathak",
"markples",
"SingleAccretion",
+ "tannergooding",
"TIHan",
"dotnet/jit-contrib"
],
@@ -420,7 +460,6 @@
{
"lead": "JulieLeeMSFT",
"owners": [
- "amanasifkhalid",
"AndyAyersMS",
"BruceForstall",
"EgorBo",
@@ -430,10 +469,11 @@
"kunalspathak",
"markples",
"SingleAccretion",
+ "tannergooding",
"TIHan",
"dotnet/jit-contrib"
],
- "label": "area-ILVerification"
+ "label": "area-Tools-ILVerification"
},
{
"lead": "agocke",
@@ -480,10 +520,10 @@
"label": "area-Infrastructure-mono"
},
{
- "lead": "jeffschwMSFT",
+ "lead": "agocke",
"owners": [
"AaronRobinsonMSFT",
- "jeffschwMSFT"
+ "jkoritzinsky"
],
"label": "area-Interop-coreclr"
},
@@ -495,10 +535,9 @@
"label": "area-Interop-mono"
},
{
- "lead": "danmoseley",
+ "lead": "jeffhandley",
"pod": "eric-jeff",
"owners": [
- "danmoseley",
"ericstj",
"jeffhandley",
"dotnet/area-meta"
@@ -538,7 +577,8 @@
"lead": "agocke",
"owners": [
"jkotas",
- "MichalStrehovsky"
+ "MichalStrehovsky",
+ "dotnet/ilc-contrib"
],
"label": "area-NativeAOT-coreclr"
},
@@ -618,12 +658,11 @@
},
{
"lead": "ericstj",
- "pod": "buyaa-jose-steve",
+ "pod": "buyaa-steve",
"owners": [
"buyaa-n",
"ericstj",
"jeffhandley",
- "joperezr",
"steveharter",
"dotnet/area-system-codedom"
],
@@ -631,7 +670,7 @@
},
{
"lead": "jeffhandley",
- "pod": "eirik-krzysztof-layomi",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
"eiriktsarpalis",
"ericstj",
@@ -639,65 +678,68 @@
"jeffhandley",
"krwq",
"layomia",
+ "tarekgh",
"dotnet/area-system-collections"
],
"label": "area-System.Collections"
},
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "buyaa-steve",
"owners": [
- "eerhardt",
+ "buyaa-n",
"ericstj",
"jeffhandley",
- "maryamariyan",
- "tarekgh",
+ "steveharter",
"dotnet/area-system-componentmodel"
],
"label": "area-System.ComponentModel"
},
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "buyaa-steve",
"owners": [
- "eerhardt",
+ "buyaa-n",
"ericstj",
"jeffhandley",
- "maryamariyan",
- "tarekgh",
+ "steveharter",
"dotnet/area-system-componentmodel-composition"
],
"label": "area-System.ComponentModel.Composition"
},
{
- "lead": "ajcvickers",
+ "lead": "jeffhandley",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
- "ajcvickers",
- "lajones"
+ "eiriktsarpalis",
+ "ericstj",
+ "jeffhandley",
+ "krwq",
+ "layomia",
+ "tarekgh",
+ "dotnet/area-system-componentmodel-dataannotations"
],
"label": "area-System.ComponentModel.DataAnnotations"
},
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "buyaa-steve",
"owners": [
- "eerhardt",
+ "buyaa-n",
"ericstj",
"jeffhandley",
- "maryamariyan",
- "tarekgh",
+ "steveharter",
"dotnet/area-system-composition"
],
"label": "area-System.Composition"
},
{
"lead": "ericstj",
- "pod": "buyaa-jose-steve",
+ "pod": "buyaa-steve",
"owners": [
"buyaa-n",
"ericstj",
"jeffhandley",
- "joperezr",
"steveharter",
"dotnet/area-system-configuration"
],
@@ -705,9 +747,10 @@
},
{
"lead": "jeffhandley",
- "pod": "adam-david",
+ "pod": "adam-david-jeremy",
"owners": [
"adamsitnik",
+ "bartonjs",
"ericstj",
"jeffhandley",
"Jozkee",
@@ -747,6 +790,20 @@
],
"label": "area-System.Data.SqlClient"
},
+ {
+ "lead": "ericstj",
+ "pod": "eirik-krzysztof-layomi-tarek",
+ "owners": [
+ "eiriktsarpalis",
+ "ericstj",
+ "jeffhandley",
+ "krwq",
+ "layomia",
+ "tarekgh",
+ "dotnet/area-system-datetime"
+ ],
+ "label": "area-System.DateTime"
+ },
{
"lead": "tommcdon",
"owners": [
@@ -771,10 +828,16 @@
},
{
"lead": "tommcdon",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
- "eerhardt",
- "maryamariyan",
- "tarekgh"
+ "eiriktsarpalis",
+ "ericstj",
+ "jeffhandley",
+ "krwq",
+ "layomia",
+ "tarekgh",
+ "tommcdon",
+ "dotnet/area-system-diagnostics-activity"
],
"label": "area-System.Diagnostics.Activity"
},
@@ -813,9 +876,10 @@
},
{
"lead": "jeffhandley",
- "pod": "adam-david",
+ "pod": "adam-david-jeremy",
"owners": [
"adamsitnik",
+ "bartonjs",
"ericstj",
"jeffhandley",
"Jozkee",
@@ -847,12 +911,11 @@
},
{
"lead": "ericstj",
- "pod": "buyaa-jose-steve",
+ "pod": "buyaa-steve",
"owners": [
"buyaa-n",
"ericstj",
"jeffhandley",
- "joperezr",
"steveharter",
"dotnet/area-system-directoryservices"
],
@@ -881,37 +944,55 @@
},
{
"lead": "jeffhandley",
- "pod": "jeremy-levi",
+ "pod": "adam-david-jeremy",
"owners": [
+ "adamsitnik",
"bartonjs",
"ericstj",
"GrabYourPitchforks",
"jeffhandley",
+ "Jozkee",
"dotnet/area-system-formats-asn1"
],
"label": "area-System.Formats.Asn1"
},
{
"lead": "jeffhandley",
- "pod": "jeremy-levi",
+ "pod": "adam-david-jeremy",
"owners": [
+ "adamsitnik",
"bartonjs",
"eiriktsarpalis",
"ericstj",
"GrabYourPitchforks",
"jeffhandley",
+ "Jozkee",
"dotnet/area-system-formats-cbor"
],
"label": "area-System.Formats.Cbor"
},
+ {
+ "lead": "jeffhandley",
+ "pod": "akhil-carlos-viktor",
+ "owners": [
+ "carlossanlop",
+ "ericstj",
+ "jeffhandley",
+ "smasher164",
+ "ViktorHofer",
+ "dotnet/area-system-formats-tar"
+ ],
+ "label": "area-System.Formats.Tar"
+ },
{
"lead": "ericstj",
- "pod": "eric-maryam-tarek",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
- "eerhardt",
+ "eiriktsarpalis",
"ericstj",
"jeffhandley",
- "maryamariyan",
+ "krwq",
+ "layomia",
"tarekgh",
"dotnet/area-system-globalization"
],
@@ -919,9 +1000,10 @@
},
{
"lead": "jeffhandley",
- "pod": "adam-david",
+ "pod": "adam-david-jeremy",
"owners": [
"adamsitnik",
+ "bartonjs",
"ericstj",
"jeffhandley",
"Jozkee",
@@ -931,34 +1013,62 @@
},
{
"lead": "jeffhandley",
- "pod": "adam-david",
+ "pod": "akhil-carlos-viktor",
"owners": [
- "adamsitnik",
+ "carlossanlop",
"ericstj",
"jeffhandley",
- "Jozkee",
+ "smasher164",
+ "ViktorHofer",
"dotnet/area-system-io-compression"
],
"label": "area-System.IO.Compression"
},
{
- "lead": "kevinpi",
+ "lead": "jeffhandley",
+ "pod": "adam-david-jeremy",
+ "owners": [
+ "adamsitnik",
+ "bartonjs",
+ "ericstj",
+ "jeffhandley",
+ "Jozkee",
+ "dotnet/area-system-io-hashing"
+ ],
+ "label": "area-System.IO.Hashing"
+ },
+ {
+ "lead": "adityamandaleeka",
"owners": [
"davidfowl",
- "halter73",
- "jkotalik"
+ "halter73"
],
"label": "area-System.IO.Pipelines"
},
{
"lead": "jeffhandley",
- "pod": "eirik-krzysztof-layomi",
+ "pod": "eirik-krzysztof-layomi-tarek",
+ "owners": [
+ "eiriktsarpalis",
+ "ericstj",
+ "jeffhandley",
+ "krwq",
+ "layomia",
+ "tarekgh",
+ "dotnet/area-system-io-ports"
+ ],
+ "label": "area-System.IO.Ports"
+ },
+ {
+ "lead": "jeffhandley",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
"eiriktsarpalis",
"ericstj",
"jeffhandley",
"krwq",
"layomia",
+ "tarekgh",
"dotnet/area-system-linq"
],
"label": "area-System.Linq"
@@ -973,9 +1083,10 @@
},
{
"lead": "jeffhandley",
- "pod": "adam-david",
+ "pod": "adam-david-jeremy",
"owners": [
"adamsitnik",
+ "bartonjs",
"ericstj",
"jeffhandley",
"Jozkee",
@@ -999,13 +1110,15 @@
},
{
"lead": "jeffhandley",
- "pod": "adam-david",
+ "pod": "adam-david-jeremy",
"owners": [
"adamsitnik",
+ "dakersnar",
"ericstj",
"GrabYourPitchforks",
"jeffhandley",
- "Jozkee",
+ "michaelgsharp",
+ "tannergooding",
"dotnet/area-system-memory"
],
"label": "area-System.Memory"
@@ -1019,6 +1132,7 @@
"greenEkatherine",
"halter73",
"karelz",
+ "liveans",
"ManickaP",
"MihaZupan",
"rzikm",
@@ -1036,6 +1150,7 @@
"greenEkatherine",
"halter73",
"karelz",
+ "liveans",
"ManickaP",
"MihaZupan",
"rzikm",
@@ -1053,6 +1168,7 @@
"greenEkatherine",
"halter73",
"karelz",
+ "liveans",
"ManickaP",
"MihaZupan",
"rzikm",
@@ -1070,6 +1186,7 @@
"greenEkatherine",
"halter73",
"karelz",
+ "liveans",
"ManickaP",
"MihaZupan",
"rzikm",
@@ -1087,6 +1204,7 @@
"greenEkatherine",
"halter73",
"karelz",
+ "liveans",
"ManickaP",
"MihaZupan",
"rzikm",
@@ -1123,12 +1241,11 @@
},
{
"lead": "ericstj",
- "pod": "buyaa-jose-steve",
+ "pod": "buyaa-steve",
"owners": [
"buyaa-n",
"ericstj",
"jeffhandley",
- "joperezr",
"steveharter",
"dotnet/area-system-reflection"
],
@@ -1139,16 +1256,15 @@
"owners": [
"lambdageek"
],
- "label": "area-System.Reflection-mono"
+ "label": "area-VM-reflection-mono"
},
{
"lead": "ericstj",
- "pod": "buyaa-jose-steve",
+ "pod": "buyaa-steve",
"owners": [
"buyaa-n",
"ericstj",
"jeffhandley",
- "joperezr",
"steveharter",
"dotnet/area-system-reflection-emit"
],
@@ -1156,12 +1272,11 @@
},
{
"lead": "ericstj",
- "pod": "buyaa-jose-steve",
+ "pod": "buyaa-steve",
"owners": [
"buyaa-n",
"ericstj",
"jeffhandley",
- "joperezr",
"steveharter",
"dotnet/area-system-reflection-metadata"
],
@@ -1169,12 +1284,11 @@
},
{
"lead": "ericstj",
- "pod": "buyaa-jose-steve",
+ "pod": "buyaa-steve",
"owners": [
"buyaa-n",
"ericstj",
"jeffhandley",
- "joperezr",
"steveharter",
"tarekgh",
"dotnet/area-system-resources"
@@ -1204,19 +1318,19 @@
},
{
"lead": "ericstj",
- "pod": "buyaa-jose-steve",
+ "pod": "drew-michael-tanner",
"owners": [
- "buyaa-n",
+ "dakersnar",
"ericstj",
"jeffhandley",
- "joperezr",
- "steveharter",
+ "michaelgsharp",
+ "tannergooding",
"dotnet/area-system-runtime-compilerservices"
],
"label": "area-System.Runtime.CompilerServices"
},
{
- "lead": "jeffschwMSFT",
+ "lead": "agocke",
"owners": [
"AaronRobinsonMSFT",
"jkoritzinsky"
@@ -1235,6 +1349,7 @@
"pod": "drew-michael-tanner",
"owners": [
"dakersnar",
+ "ericstj",
"jeffhandley",
"michaelgsharp",
"tannergooding",
@@ -1244,12 +1359,14 @@
},
{
"lead": "jeffhandley",
- "pod": "jeremy-levi",
+ "pod": "adam-david-jeremy",
"owners": [
+ "adamsitnik",
"bartonjs",
"ericstj",
"GrabYourPitchforks",
"jeffhandley",
+ "Jozkee",
"krwq",
"dotnet/area-system-security"
],
@@ -1285,20 +1402,24 @@
"label": "area-System.ServiceProcess"
},
{
- "lead": "danmoseley",
+ "lead": "jeffhandley",
+ "pod": "eric-jeff",
"owners": [
- "danmoseley"
+ "ericstj",
+ "jeffhandley"
],
"label": "area-System.Speech"
},
{
"lead": "jeffhandley",
- "pod": "jeremy-levi",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
- "bartonjs",
+ "eiriktsarpalis",
"ericstj",
"GrabYourPitchforks",
"jeffhandley",
+ "krwq",
+ "layomia",
"tarekgh",
"dotnet/area-system-text-encoding"
],
@@ -1306,12 +1427,14 @@
},
{
"lead": "jeffhandley",
- "pod": "jeremy-levi",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
- "bartonjs",
+ "eiriktsarpalis",
"ericstj",
"GrabYourPitchforks",
"jeffhandley",
+ "krwq",
+ "layomia",
"tarekgh",
"dotnet/area-system-text-encodings-web"
],
@@ -1319,7 +1442,7 @@
},
{
"lead": "jeffhandley",
- "pod": "eirik-krzysztof-layomi",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
"eiriktsarpalis",
"ericstj",
@@ -1327,18 +1450,18 @@
"krwq",
"layomia",
"steveharter",
+ "tarekgh",
"dotnet/area-system-text-json"
],
"label": "area-System.Text.Json"
},
{
"lead": "ericstj",
- "pod": "buyaa-jose-steve",
+ "pod": "buyaa-steve",
"owners": [
"buyaa-n",
"ericstj",
"jeffhandley",
- "joperezr",
"steveharter",
"dotnet/area-system-text-regularexpressions"
],
@@ -1353,14 +1476,14 @@
},
{
"lead": "ericstj",
- "pod": "buyaa-jose-steve",
+ "pod": "drew-michael-tanner",
"owners": [
- "buyaa-n",
+ "dakersnar",
"ericstj",
"jeffhandley",
- "joperezr",
+ "michaelgsharp",
"stephentoub",
- "steveharter",
+ "tannergooding",
"dotnet/area-system-threading-channels"
],
"label": "area-System.Threading.Channels"
@@ -1375,34 +1498,35 @@
},
{
"lead": "ericstj",
- "pod": "buyaa-jose-steve",
+ "pod": "drew-michael-tanner",
"owners": [
- "buyaa-n",
+ "dakersnar",
"ericstj",
"jeffhandley",
- "joperezr",
+ "michaelgsharp",
"stephentoub",
- "steveharter",
+ "tannergooding",
"dotnet/area-system-threading-tasks"
],
"label": "area-System.Threading.Tasks"
},
{
- "lead": "HongGit",
+ "lead": "ajcvickers",
"owners": [
- "HongGit"
+ "roji"
],
"label": "area-System.Transactions"
},
{
"lead": "jeffhandley",
- "pod": "eirik-krzysztof-layomi",
+ "pod": "eirik-krzysztof-layomi-tarek",
"owners": [
"eiriktsarpalis",
"ericstj",
"jeffhandley",
"krwq",
"layomia",
+ "tarekgh",
"dotnet/area-system-xml"
],
"label": "area-System.Xml"
@@ -1412,7 +1536,7 @@
"owners": [
"lambdageek"
],
- "label": "area-Threading-mono"
+ "label": "area-VM-threading-mono"
},
{
"lead": "mangod9",
@@ -1421,6 +1545,13 @@
],
"label": "area-TieredCompilation-coreclr"
},
+ {
+ "lead": "agocke",
+ "owners": [
+ "dotnet/illink"
+ ],
+ "label": "area-Tools-ILLink"
+ },
{
"lead": "tommcdon",
"owners": [
@@ -1466,6 +1597,13 @@
"lambdageek"
],
"label": "area-VM-meta-mono"
+ },
+ {
+ "lead": "lewing",
+ "owners": [
+ "dotnet/net-sdk-workload-contributors"
+ ],
+ "label": "area-Workloads"
}
]
}
diff --git a/docs/area-owners.md b/docs/area-owners.md
index b86675006cd87f..07f81f772a0612 100644
--- a/docs/area-owners.md
+++ b/docs/area-owners.md
@@ -6,159 +6,167 @@ If you need to tag folks on an issue or PR, you will generally want to tag the o
Note: Editing this file doesn't update the mapping used by `@msftbot` for area-specific issue/PR notifications. That configuration is part of the [`fabricbot.json`](../.github/fabricbot.json) file, and many areas use GitHub teams for those notifications. If you're a community member interested in receiving area-specific issue/PR notifications, you won't appear in this table or be added to those GitHub teams, but you can create a PR that updates `fabricbot.json` to add yourself to those notifications. See [automation.md](infra/automation.md) for more information on the schema and tools used by FabricBot.
-| Area | Lead | Owners (area experts to tag in PR's and issues) | Notes |
-|------------------------------------------------|---------------|-----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| area-AssemblyLoader-coreclr | @agocke | @agocke @vitek-karas @vsadov | |
-| area-AssemblyLoader-mono | @SamMonoRT | @lambdageek | |
-| area-Build-mono | @steveisok | @akoeplinger | |
-| area-Codeflow | @dotnet/dnr-codeflow | @dotnet/dnr-codeflow | Used for automated PR's that ingest code from other repos |
-| area-Codegen-AOT-mono | @SamMonoRT | @vargaz | |
-| area-CodeGen-coreclr | @JulieLeeMSFT | @BruceForstall @dotnet/jit-contrib | |
-| area-Codegen-Interpreter-mono | @SamMonoRT | @BrzVlad | |
-| area-Codegen-JIT-mono | @SamMonoRT | @vargaz | |
-| area-Codegen-LLVM-mono | @SamMonoRT | @vargaz | |
-| area-Codegen-meta-mono | @SamMonoRT | @vargaz | |
-| area-CoreLib-mono | @steveisok | @vargaz | |
-| area-CrossGen/NGEN-coreclr | @mangod9 | @dotnet/crossgen-contrib | |
-| area-crossgen2-coreclr | @mangod9 | @trylek @dotnet/crossgen-contrib | |
-| area-Debugger-mono | @lewing | @thaystg @radical | |
-| area-DependencyModel | @ericstj | @dotnet/area-dependencymodel | - Microsoft.Extensions.DependencyModel
|
-| area-Diagnostics-coreclr | @tommcdon | @tommcdon | |
-| area-Diagnostics-mono | @steveisok | @lateralusX @mdh1418 | |
-| area-EnC-mono | @marek-safar | @lambdageek | Hot Reload on WebAssembly, Android, iOS, etc |
-| area-ExceptionHandling-coreclr | @mangod9 | @janvorli | |
-| area-Extensions-Caching | @ericstj | @dotnet/area-extensions-caching | |
-| area-Extensions-Configuration | @ericstj | @dotnet/area-extensions-configuration | |
-| area-Extensions-DependencyInjection | @ericstj | @dotnet/area-extensions-dependencyinjection | |
-| area-Extensions-FileSystem | @jeffhandley | @dotnet/area-extensions-filesystem | |
-| area-Extensions-Hosting | @ericstj | @dotnet/area-extensions-hosting | |
-| area-Extensions-HttpClientFactory | @karelz | @dotnet/ncl | |
-| area-Extensions-Logging | @ericstj | @dotnet/area-extensions-logging | |
-| area-Extensions-Options | @ericstj | @dotnet/area-extensions-options | |
-| area-Extensions-Primitives | @ericstj | @dotnet/area-extensions-primitives | |
-| area-GC-coreclr | @mangod9 | @Maoni0 | |
-| area-GC-mono | @SamMonoRT | @BrzVlad | |
-| area-Host | @agocke | @jeffschwMSFT @vitek-karas @vsadov | Issues with dotnet.exe including bootstrapping, framework detection, hostfxr.dll and hostpolicy.dll |
-| area-HostModel | @agocke | @vitek-karas | |
-| area-ILTools-coreclr | @JulieLeeMSFT | @BruceForstall @dotnet/jit-contrib | |
-| area-ILVerification | @JulieLeeMSFT | @BruceForstall @dotnet/jit-contrib | |
-| area-Infrastructure | @agocke | @jeffschwMSFT @MichaelSimons | |
-| area-Infrastructure-coreclr | @agocke | @jeffschwMSFT @trylek | |
-| area-Infrastructure-installer | @MichaelSimons | @NikolaMilosavljevic | |
-| area-Infrastructure-libraries | @ericstj | @dotnet/area-infrastructure-libraries | Covers:- Packaging
- Build and test infra for libraries in dotnet/runtime repo
- VS integration
|
-| area-Infrastructure-mono | @steveisok | @directhex | |
-| area-Interop-coreclr | @jeffschwMSFT | @jeffschwMSFT @AaronRobinsonMSFT | |
-| area-Interop-mono | @marek-safar | @lambdageek | |
-| area-Meta | @danmoseley | @dotnet/area-meta | Cross-cutting concerns that span many or all areas, including project-wide code/test patterns and documentation. |
-| area-Microsoft.CSharp | @jaredpar | @cston @333fred | Archived component - limited churn/contributions (see [#27790](https://github.com/dotnet/runtime/issues/27790)) |
-| area-Microsoft.VisualBasic | @jaredpar | @cston @333fred | Archived component - limited churn/contributions (see [#27790](https://github.com/dotnet/runtime/issues/27790)) |
-| area-Microsoft.Win32 | @ericstj | @dotnet/area-microsoft-win32 | Including System.Windows.Extensions |
-| area-NativeAOT-coreclr | @agocke | @MichalStrehovsky @jkotas | |
-| area-PAL-coreclr | @mangod9 | @janvorli | |
-| area-Performance-mono | @SamMonoRT | @SamMonoRT | |
-| area-R2RDump-coreclr | @mangod9 | @trylek | |
-| area-ReadyToRun-coreclr | @mangod9 | @trylek | |
-| area-Serialization | @HongGit | @StephenMolloy @HongGit | Packages:- System.Runtime.Serialization.Xml
- System.Runtime.Serialization.Json
- System.Private.DataContractSerialization
- System.Xml.XmlSerializer
Excluded:- System.Runtime.Serialization.Formatters
|
-| area-Setup | @MichaelSimons | @NikolaMilosavljevic | Distro-specific (Linux, Mac and Windows) setup packages and msi files |
-| area-Single-File | @agocke | @vitek-karas @vsadov | |
-| area-Snap | @MichaelSimons | @NikolaMilosavljevic @leecow @MichaelSimons | |
-| area-System.Buffers | @jeffhandley | @dotnet/area-system-buffers | |
-| area-System.CodeDom | @ericstj | @dotnet/area-system-codedom | |
-| area-System.Collections | @jeffhandley | @dotnet/area-system-collections | Excluded:- System.Array -> System.Runtime
|
-| area-System.ComponentModel | @ericstj | @dotnet/area-system-componentmodel | |
-| area-System.ComponentModel.Composition | @ericstj | @dotnet/area-system-componentmodel-composition | |
-| area-System.ComponentModel.DataAnnotations | @ajcvickers | @lajones @ajcvickers | Included:- System.ComponentModel.Annotations
|
-| area-System.Composition | @ericstj | @dotnet/area-system-composition | |
-| area-System.Configuration | @ericstj | @dotnet/area-system-configuration | |
-| area-System.Console | @jeffhandley | @dotnet/area-system-console | |
-| area-System.Data | @ajcvickers | @ajcvickers @davoudeshtehari @david-engel | - Odbc, OleDb - @saurabh500
|
-| area-System.Data.Odbc | @ajcvickers | @ajcvickers | |
-| area-System.Data.OleDB | @ajcvickers | @ajcvickers | |
-| area-System.Data.SqlClient | @David-Engel | @davoudeshtehari @david-engel @jrahnama | Archived component - limited churn/contributions (see https://devblogs.microsoft.com/dotnet/introducing-the-new-microsoftdatasqlclient/) |
-| area-System.Diagnostics | @tommcdon | @tommcdon | |
-| area-System.Diagnostics-coreclr | @tommcdon | @tommcdon | |
-| area-System.Diagnostics-mono | @lewing | @thaystg @radical | |
-| area-System.Diagnostics.Activity | @tommcdon | @eerhardt @maryamariyan @tarekgh | |
-| area-System.Diagnostics.EventLog | @ericstj | @dotnet/area-system-diagnostics-eventlog | |
-| area-System.Diagnostics.Metric | @tommcdon | @noahfalk | |
-| area-System.Diagnostics.PerformanceCounter | @ericstj | @dotnet/area-system-diagnostics-performancecounter | |
-| area-System.Diagnostics.Process | @jeffhandley | @dotnet/area-system-diagnostics-process | |
-| area-System.Diagnostics.Tracing | @tommcdon | @noahfalk @tommcdon @tarekgh | Included: - System.Diagnostics.DiagnosticSource
|
-| area-System.Diagnostics.TraceSource | @ericstj | @dotnet/area-system-diagnostics-tracesource | |
-| area-System.DirectoryServices | @ericstj | @dotnet/area-system-directoryservices | Consultants: @BRDPM @grubioe @jay98014 |
-| area-System.Drawing | @ericstj | @dotnet/area-system-drawing | |
-| area-System.Dynamic.Runtime | @jaredpar | @cston @333fred | Archived component - limited churn/contributions (see [#27790](https://github.com/dotnet/runtime/issues/27790)) |
-| area-System.Formats.Asn1 | @jeffhandley | @dotnet/area-system-formats-asn1 | |
-| area-System.Formats.Cbor | @jeffhandley | @dotnet/area-system-formats-cbor | |
-| area-System.Globalization | @ericstj | @dotnet/area-system-globalization | |
-| area-System.IO | @jeffhandley | @dotnet/area-system-io | |
-| area-System.IO.Compression | @jeffhandley | @dotnet/area-system-io-compression | - Also includes System.IO.Packaging
|
-| area-System.IO.Pipelines | @kevinpi | @davidfowl @halter73 @jkotalik | |
-| area-System.Linq | @jeffhandley | @dotnet/area-system-linq | |
-| area-System.Linq.Expressions | @jaredpar | @cston @333fred | Archived component - limited churn/contributions (see [#27790](https://github.com/dotnet/runtime/issues/27790)) |
-| area-System.Linq.Parallel | @jeffhandley | @dotnet/area-system-linq-parallel | Consultants: @stephentoub @kouvel |
-| area-System.Management | @ericstj | @dotnet/area-system-management | WMI |
-| area-System.Memory | @jeffhandley | @dotnet/area-system-memory | |
-| area-System.Net | @karelz | @dotnet/ncl | Included: |
-| area-System.Net.Http | @karelz | @dotnet/ncl | |
-| area-System.Net.Quic | @karelz | @dotnet/ncl | |
-| area-System.Net.Security | @karelz | @dotnet/ncl | |
-| area-System.Net.Sockets | @karelz | @dotnet/ncl | |
-| area-System.Numerics | @jeffhandley | @dotnet/area-system-numerics | |
-| area-System.Numerics.Tensors | @jeffhandley | @dotnet/area-system-numerics-tensors | |
-| area-System.Reflection | @ericstj | @dotnet/area-system-reflection | |
-| area-System.Reflection-mono | @SamMonoRT | @lambdageek | MonoVM-specific reflection and reflection-emit issues |
-| area-System.Reflection.Emit | @ericstj | @dotnet/area-system-reflection-emit | |
-| area-System.Reflection.Metadata | @ericstj | @dotnet/area-system-reflection-metadata | Consultants: @tmat |
-| area-System.Resources | @ericstj | @dotnet/area-system-resources | |
-| area-System.Runtime | @jeffhandley | @dotnet/area-system-runtime | Included:- System.Runtime.Serialization.Formatters
- System.Runtime.InteropServices.RuntimeInfo
- System.Array
Excluded:- Path -> System.IO
- StopWatch -> System.Diagnostics
- Uri -> System.Net
- WebUtility -> System.Net
|
-| area-System.Runtime.Caching | @HongGit | @StephenMolloy @HongGit | |
-| area-System.Runtime.CompilerServices | @ericstj | @dotnet/area-system-runtime-compilerservices | |
-| area-System.Runtime.InteropServices | @jeffschwMSFT | @AaronRobinsonMSFT @jkoritzinsky | Excluded:- System.Runtime.InteropServices.RuntimeInfo
|
-| area-System.Runtime.InteropServices.JavaScript | @lewing | @pavelsavara | |
-| area-System.Runtime.Intrinsics | @jeffhandley | @dotnet/area-system-runtime-intrinsics | Consultants: @echesakovMSFT @kunalspathak |
-| area-System.Security | @jeffhandley | @dotnet/area-system-security | |
-| area-System.ServiceModel | @HongGit | @HongGit @mconnew | Repo: https://github.com/dotnet/WCF
Packages:- System.ServiceModel.Primitives
- System.ServiceModel.Http
- System.ServiceModel.NetTcp
- System.ServiceModel.Duplex
- System.ServiceModel.Security
|
-| area-System.ServiceModel.Syndication | @HongGit | @StephenMolloy @HongGit | |
-| area-System.ServiceProcess | @ericstj | @dotnet/area-system-serviceprocess | |
-| area-System.Speech | @danmoseley | @danmoseley | |
-| area-System.Text.Encoding | @jeffhandley | @dotnet/area-system-text-encoding | |
-| area-System.Text.Encodings.Web | @jeffhandley | @dotnet/area-system-text-encodings-web | |
-| area-System.Text.Json | @jeffhandley | @dotnet/area-system-text-json | |
-| area-System.Text.RegularExpressions | @ericstj | @dotnet/area-system-text-regularexpressions | Consultants: @stephentoub |
-| area-System.Threading | @mangod9 | @kouvel | |
-| area-System.Threading.Channels | @ericstj | @dotnet/area-system-threading-channels | Consultants: @stephentoub |
-| area-System.Threading.RateLimiting | @rafikiassumani-msft | @BrennanConroy @halter73 | Consultants: @eerhardt |
-| area-System.Threading.Tasks | @ericstj | @dotnet/area-system-threading-tasks | Consultants: @stephentoub |
-| area-System.Transactions | @HongGit | @HongGit | |
-| area-System.Xml | @jeffhandley | @dotnet/area-system-xml | |
-| area-Threading-mono | @SamMonoRT | @lambdageek | |
-| area-TieredCompilation-coreclr | @mangod9 | @kouvel | |
-| area-Tracing-coreclr | @tommcdon | @sywhang @josalem | |
-| area-Tracing-mono | @steveisok | @lateralusX | |
-| area-TypeSystem-coreclr | @mangod9 | @davidwrighton @MichalStrehovsky @janvorli @mangod9 | |
-| area-UWP | @tommcdon | @jashook | UWP-specific issues including Microsoft.NETCore.UniversalWindowsPlatform and Microsoft.Net.UWPCoreRuntimeSdk |
-| area-VM-coreclr | @mangod9 | @mangod9 | |
-| area-VM-meta-mono | @SamMonoRT | @lambdageek | |
+| Area | Lead | Owners (area experts to tag in PRs and issues) | Notes |
+|------------------------------------------------|----------------------|-----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| area-AssemblyLoader-coreclr | @agocke | @agocke @vitek-karas @vsadov | |
+| area-AssemblyLoader-mono | @SamMonoRT | @lambdageek | |
+| area-Build-mono | @steveisok | @akoeplinger | |
+| area-Codeflow | @dotnet/dnr-codeflow | @dotnet/dnr-codeflow | Used for automated PRs that ingest code from other repos |
+| area-Codegen-AOT-mono | @SamMonoRT | @vargaz | |
+| area-CodeGen-coreclr | @JulieLeeMSFT | @BruceForstall @dotnet/jit-contrib | |
+| area-Codegen-Interpreter-mono | @SamMonoRT | @BrzVlad @kotlarmilos | |
+| area-Codegen-Intrinsics-mono | @SamMonoRT | @fanyang-mono | |
+| area-Codegen-JIT-mono | @SamMonoRT | @vargaz | |
+| area-Codegen-LLVM-mono | @SamMonoRT | @vargaz | |
+| area-Codegen-meta-mono | @SamMonoRT | @vargaz | |
+| area-CoreLib-mono | @steveisok | @vargaz | |
+| area-CrossGen/NGEN-coreclr | @mangod9 | @dotnet/crossgen-contrib | |
+| area-crossgen2-coreclr | @mangod9 | @trylek @dotnet/crossgen-contrib | |
+| area-Debugger-mono | @lewing | @thaystg @radical | |
+| area-DependencyModel | @ericstj | @dotnet/area-dependencymodel | Included:- Microsoft.Extensions.DependencyModel
|
+| area-Diagnostics-coreclr | @tommcdon | @tommcdon | |
+| area-Diagnostics-mono | @steveisok | @lateralusX @mdh1418 | |
+| area-EnC-mono | @marek-safar | @lambdageek | Hot Reload on WebAssembly, Android, iOS, etc |
+| area-ExceptionHandling-coreclr | @mangod9 | @janvorli | |
+| area-Extensions-Caching | @ericstj | @dotnet/area-extensions-caching | |
+| area-Extensions-Configuration | @ericstj | @dotnet/area-extensions-configuration | |
+| area-Extensions-DependencyInjection | @ericstj | @dotnet/area-extensions-dependencyinjection | |
+| area-Extensions-FileSystem | @jeffhandley | @dotnet/area-extensions-filesystem | |
+| area-Extensions-Hosting | @ericstj | @dotnet/area-extensions-hosting | |
+| area-Extensions-HttpClientFactory | @karelz | @dotnet/ncl | |
+| area-Extensions-Logging | @ericstj | @dotnet/area-extensions-logging | |
+| area-Extensions-Options | @ericstj | @dotnet/area-extensions-options | |
+| area-Extensions-Primitives | @ericstj | @dotnet/area-extensions-primitives | |
+| area-GC-coreclr | @mangod9 | @Maoni0 | |
+| area-GC-mono | @SamMonoRT | @BrzVlad | |
+| area-Host | @agocke | @jeffschwMSFT @vitek-karas @vsadov | Issues with dotnet.exe including bootstrapping, framework detection, hostfxr.dll and hostpolicy.dll |
+| area-HostModel | @agocke | @vitek-karas | |
+| area-ILTools-coreclr | @JulieLeeMSFT | @BruceForstall @dotnet/jit-contrib | |
+| area-Infrastructure | @agocke | @jeffschwMSFT @MichaelSimons | |
+| area-Infrastructure-coreclr | @agocke | @jeffschwMSFT @trylek | |
+| area-Infrastructure-installer | @MichaelSimons | @NikolaMilosavljevic | |
+| area-Infrastructure-libraries | @ericstj | @dotnet/area-infrastructure-libraries | Covers:- Packaging
- Build and test infra for libraries in dotnet/runtime repo
- VS integration
|
+| area-Infrastructure-mono | @steveisok | @directhex | |
+| area-Interop-coreclr | @agocke | @AaronRobinsonMSFT @jkoritzinsky | |
+| area-Interop-mono | @marek-safar | @lambdageek | |
+| area-Meta | @jeffhandley | @dotnet/area-meta | Cross-cutting concerns that span many or all areas, including project-wide code/test patterns and documentation. |
+| area-Microsoft.CSharp | @jaredpar | @cston @333fred | Archived component - limited churn/contributions (see [#27790](https://github.com/dotnet/runtime/issues/27790)) |
+| area-Microsoft.VisualBasic | @jaredpar | @cston @333fred | Archived component - limited churn/contributions (see [#27790](https://github.com/dotnet/runtime/issues/27790)) |
+| area-Microsoft.Win32 | @ericstj | @dotnet/area-microsoft-win32 | Included:- System.Windows.Extensions
|
+| area-NativeAOT-coreclr | @agocke | @dotnet/ilc-contrib | |
+| area-PAL-coreclr | @mangod9 | @janvorli | |
+| area-Performance-mono | @SamMonoRT | @SamMonoRT | |
+| area-R2RDump-coreclr | @mangod9 | @trylek | |
+| area-ReadyToRun-coreclr | @mangod9 | @trylek | |
+| area-Serialization | @HongGit | @StephenMolloy @HongGit | Packages:- System.Runtime.Serialization.Xml
- System.Runtime.Serialization.Json
- System.Private.DataContractSerialization
- System.Xml.XmlSerializer
Excluded:- System.Runtime.Serialization.Formatters
|
+| area-Setup | @MichaelSimons | @NikolaMilosavljevic | Distro-specific (Linux, Mac and Windows) setup packages and msi files |
+| area-Single-File | @agocke | @vitek-karas @vsadov | |
+| area-Snap | @MichaelSimons | @NikolaMilosavljevic @leecow @MichaelSimons | |
+| area-System.Buffers | @jeffhandley | @dotnet/area-system-buffers | |
+| area-System.CodeDom | @ericstj | @dotnet/area-system-codedom | |
+| area-System.Collections | @jeffhandley | @dotnet/area-system-collections | Excluded:- System.Array -> System.Runtime
|
+| area-System.ComponentModel | @ericstj | @dotnet/area-system-componentmodel | |
+| area-System.ComponentModel.Composition | @ericstj | @dotnet/area-system-componentmodel-composition | |
+| area-System.ComponentModel.DataAnnotations | @jeffhandley | @dotnet/area-system-componentmodel-dataannotations | Included:- System.ComponentModel.Annotations
|
+| area-System.Composition | @ericstj | @dotnet/area-system-composition | |
+| area-System.Configuration | @ericstj | @dotnet/area-system-configuration | |
+| area-System.Console | @jeffhandley | @dotnet/area-system-console | |
+| area-System.Data | @ajcvickers | @ajcvickers @davoudeshtehari @david-engel | - Odbc, OleDb - @saurabh500
|
+| area-System.Data.Odbc | @ajcvickers | @ajcvickers | |
+| area-System.Data.OleDB | @ajcvickers | @ajcvickers | |
+| area-System.Data.SqlClient | @David-Engel | @davoudeshtehari @david-engel @jrahnama | Archived component - limited churn/contributions (see https://devblogs.microsoft.com/dotnet/introducing-the-new-microsoftdatasqlclient/) |
+| area-System.DateTime | @ericstj | @dotnet/area-system-datetime | System namespace APIs related to dates and times, including DateOnly, DateTime, DateTimeKind, DateTimeOffset, DayOfWeek, TimeOnly, TimeSpan, TimeZone, and TimeZoneInfo |
+| area-System.Diagnostics | @tommcdon | @tommcdon | |
+| area-System.Diagnostics-coreclr | @tommcdon | @tommcdon | |
+| area-System.Diagnostics-mono | @lewing | @thaystg @radical | |
+| area-System.Diagnostics.Activity | @tommcdon | @dotnet/area-system-diagnostics-activity | |
+| area-System.Diagnostics.EventLog | @ericstj | @dotnet/area-system-diagnostics-eventlog | |
+| area-System.Diagnostics.Metric | @tommcdon | @noahfalk | |
+| area-System.Diagnostics.PerformanceCounter | @ericstj | @dotnet/area-system-diagnostics-performancecounter | |
+| area-System.Diagnostics.Process | @jeffhandley | @dotnet/area-system-diagnostics-process | |
+| area-System.Diagnostics.Tracing | @tommcdon | @noahfalk @tommcdon @tarekgh | Included:- System.Diagnostics.DiagnosticSource
|
+| area-System.Diagnostics.TraceSource | @ericstj | @dotnet/area-system-diagnostics-tracesource | |
+| area-System.DirectoryServices | @ericstj | @dotnet/area-system-directoryservices | Consultants: @BRDPM @grubioe @jay98014 |
+| area-System.Drawing | @ericstj | @dotnet/area-system-drawing | Excluded:- System.Drawing.Common -> winforms
|
+| area-System.Dynamic.Runtime | @jaredpar | @cston @333fred | Archived component - limited churn/contributions (see [#27790](https://github.com/dotnet/runtime/issues/27790)) |
+| area-System.Formats.Asn1 | @jeffhandley | @dotnet/area-system-formats-asn1 | |
+| area-System.Formats.Cbor | @jeffhandley | @dotnet/area-system-formats-cbor | |
+| area-System.Formats.Tar | @jeffhandley | @dotnet/area-system-formats-tar | Consultants: @bartonjs @jozkee |
+| area-System.Globalization | @ericstj | @dotnet/area-system-globalization | |
+| area-System.IO | @jeffhandley | @dotnet/area-system-io | |
+| area-System.IO.Compression | @jeffhandley | @dotnet/area-system-io-compression | Included:- System.Formats.Tar
- System.IO.Packaging
|
+| area-System.IO.Hashing | @jeffhandley | @dotnet/area-system-io-hashing | APIs within the System.IO.Hashing namespace, which align more with cryptography than with I/O |
+| area-System.IO.Pipelines | @adityamandaleeka | @davidfowl @halter73 | |
+| area-System.IO.Ports | @jeffhandley | @dotnet/area-system-io-ports | |
+| area-System.Linq | @jeffhandley | @dotnet/area-system-linq | |
+| area-System.Linq.Expressions | @jaredpar | @cston @333fred | Archived component - limited churn/contributions (see [#27790](https://github.com/dotnet/runtime/issues/27790)) |
+| area-System.Linq.Parallel | @jeffhandley | @dotnet/area-system-linq-parallel | Consultants: @stephentoub @kouvel |
+| area-System.Management | @ericstj | @dotnet/area-system-management | WMI |
+| area-System.Memory | @jeffhandley | @dotnet/area-system-memory | |
+| area-System.Net | @karelz | @dotnet/ncl | Included: |
+| area-System.Net.Http | @karelz | @dotnet/ncl | |
+| area-System.Net.Quic | @karelz | @dotnet/ncl | |
+| area-System.Net.Security | @karelz | @dotnet/ncl | |
+| area-System.Net.Sockets | @karelz | @dotnet/ncl | |
+| area-System.Numerics | @jeffhandley | @dotnet/area-system-numerics | |
+| area-System.Numerics.Tensors | @jeffhandley | @dotnet/area-system-numerics-tensors | |
+| area-System.Reflection | @ericstj | @dotnet/area-system-reflection | |
+| area-System.Reflection.Emit | @ericstj | @dotnet/area-system-reflection-emit | |
+| area-System.Reflection.Metadata | @ericstj | @dotnet/area-system-reflection-metadata | Consultants: @tmat |
+| area-System.Resources | @ericstj | @dotnet/area-system-resources | |
+| area-System.Runtime | @jeffhandley | @dotnet/area-system-runtime | Included:- System.Runtime.Serialization.Formatters
- System.Runtime.InteropServices.RuntimeInfo
- System.Array
Excluded:- Path -> System.IO
- StopWatch -> System.Diagnostics
- Uri -> System.Net
- WebUtility -> System.Net
|
+| area-System.Runtime.Caching | @HongGit | @StephenMolloy @HongGit | |
+| area-System.Runtime.CompilerServices | @ericstj | @dotnet/area-system-runtime-compilerservices | |
+| area-System.Runtime.InteropServices | @agocke | @AaronRobinsonMSFT @jkoritzinsky | Excluded:- System.Runtime.InteropServices.RuntimeInfo
|
+| area-System.Runtime.InteropServices.JavaScript | @lewing | @pavelsavara | |
+| area-System.Runtime.Intrinsics | @jeffhandley | @dotnet/area-system-runtime-intrinsics | Consultants: @echesakovMSFT @kunalspathak |
+| area-System.Security | @jeffhandley | @dotnet/area-system-security | |
+| area-System.ServiceModel | @HongGit | @HongGit @mconnew | Repo: https://github.com/dotnet/WCF
Packages:- System.ServiceModel.Primitives
- System.ServiceModel.Http
- System.ServiceModel.NetTcp
- System.ServiceModel.Duplex
- System.ServiceModel.Security
|
+| area-System.ServiceModel.Syndication | @HongGit | @StephenMolloy @HongGit | |
+| area-System.ServiceProcess | @ericstj | @dotnet/area-system-serviceprocess | |
+| area-System.Speech | @jeffhandley | @ericstj @jeffhandley | |
+| area-System.Text.Encoding | @jeffhandley | @dotnet/area-system-text-encoding | |
+| area-System.Text.Encodings.Web | @jeffhandley | @dotnet/area-system-text-encodings-web | |
+| area-System.Text.Json | @jeffhandley | @dotnet/area-system-text-json | |
+| area-System.Text.RegularExpressions | @ericstj | @dotnet/area-system-text-regularexpressions | Consultants: @stephentoub |
+| area-System.Threading | @mangod9 | @kouvel | |
+| area-System.Threading.Channels | @ericstj | @dotnet/area-system-threading-channels | Consultants: @stephentoub |
+| area-System.Threading.RateLimiting | @rafikiassumani-msft | @BrennanConroy @halter73 | |
+| area-System.Threading.Tasks | @ericstj | @dotnet/area-system-threading-tasks | Consultants: @stephentoub |
+| area-System.Transactions | @ajcvickers | @roji | |
+| area-System.Xml | @jeffhandley | @dotnet/area-system-xml | |
+| area-TieredCompilation-coreclr | @mangod9 | @kouvel | |
+| area-Tools-ILLink | @agocke | @dotnet/illink | |
+| area-Tools-ILVerification | @JulieLeeMSFT | @BruceForstall @dotnet/jit-contrib | |
+| area-Tracing-coreclr | @tommcdon | @sywhang @josalem | |
+| area-Tracing-mono | @steveisok | @lateralusX | |
+| area-TypeSystem-coreclr | @mangod9 | @davidwrighton @MichalStrehovsky @janvorli @mangod9 | |
+| area-UWP | @tommcdon | @jashook | UWP-specific issues including Microsoft.NETCore.UniversalWindowsPlatform and Microsoft.Net.UWPCoreRuntimeSdk |
+| area-VM-coreclr | @mangod9 | @mangod9 | |
+| area-VM-meta-mono | @SamMonoRT | @lambdageek | |
+| area-VM-reflection-mono | @SamMonoRT | @lambdageek | MonoVM-specific reflection and reflection-emit issues |
+| area-VM-threading-mono | @SamMonoRT | @lambdageek | |
+| area-Workloads | @lewing | @dotnet/net-sdk-workload-contributors | |
## Operating Systems
-| Operating System | Lead | Owners (area experts to tag in PR's and issues) | Description |
-|------------------|---------------|-----------------------------------------------------|--------------|
-| os-alpine | | | |
-| os-android | @steveisok | @akoeplinger | |
-| os-freebsd | | | |
-| os-mac-os-x | | | |
-| os-maccatalyst | @steveisok | | |
-| os-ios | @steveisok | @vargaz | |
-| os-tizen | @alpencolt | @gbalykov, @hjleee, @wscho77, @clamp03 | |
-| os-tvos | @steveisok | @vargaz | |
+| Operating System | Lead | Owners (area experts to tag in PRs and issues) | Description |
+|------------------|---------------|-------------------------------------------------------|--------------|
+| os-alpine | | | |
+| os-android | @steveisok | @akoeplinger | |
+| os-freebsd | | | |
+| os-mac-os-x | | | |
+| os-maccatalyst | @steveisok | | |
+| os-ios | @steveisok | @vargaz | |
+| os-tizen | @alpencolt | @gbalykov, @hjleee, @wscho77, @clamp03, @JongHeonChoi | |
+| os-tvos | @steveisok | @vargaz | |
+| os-wasi | @lewing | @pavelsavara | |
## Architectures
-| Architecture | Lead | Owners (area experts to tag in PR's and issues) | Description |
-|------------------|---------------|-----------------------------------------------------|--------------|
-| arch-wasm | @lewing | @lewing @BrzVlad | |
+| Architecture | Lead | Owners (area experts to tag in PRs and issues) | Description |
+|------------------|---------------|-------------------------------------------------------|--------------|
+| arch-wasm | @lewing | @lewing @BrzVlad | |
## Community Triagers
diff --git a/docs/coding-guidelines/adding-api-guidelines.md b/docs/coding-guidelines/adding-api-guidelines.md
index 36d03f92237be5..2db8da8cc1f3e6 100644
--- a/docs/coding-guidelines/adding-api-guidelines.md
+++ b/docs/coding-guidelines/adding-api-guidelines.md
@@ -24,8 +24,8 @@ the implementation without compat concerns in future releases.
### Determine target framework
-`net7.0` is the target framework version currently under development and the new apis
-should be added to `net7.0`. [More Information on TargetFrameworks](https://docs.microsoft.com/en-us/dotnet/standard/frameworks)
+`net8.0` is the target framework version currently under development and the new apis
+should be added to `net8.0`. [More Information on TargetFrameworks](https://docs.microsoft.com/en-us/dotnet/standard/frameworks)
## Making the changes in repo
diff --git a/docs/coding-guidelines/clr-code-guide.md b/docs/coding-guidelines/clr-code-guide.md
index 88a4c3a06c74f7..ef6f7a555d615c 100644
--- a/docs/coding-guidelines/clr-code-guide.md
+++ b/docs/coding-guidelines/clr-code-guide.md
@@ -1162,7 +1162,7 @@ These declare whether a function or callee deals with the case "GetThread() == N
EE_THREAD_REQUIRED simply asserts that GetThread() != NULL.
-EE_THREAD_NOT_REQUIRED is a noop by default. You must "set COMPlus_EnforceEEThreadNotRequiredContracts=1" for this to be enforced. Setting the envvar forces a C version of GetThread() to be used, instead of the optimized assembly versions. This C GetThread() always asserts in an EE_THREAD_NOT_REQUIRED scope regardless of whether there actually is an EE Thread available or not. The reason is that if you claim you don't require an EE Thread, then you have no business asking for it (even if you get lucky and there happens to be an EE Thread available).
+EE_THREAD_NOT_REQUIRED is a noop by default. You must "set DOTNET_EnforceEEThreadNotRequiredContracts=1" for this to be enforced. Setting the envvar forces a C version of GetThread() to be used, instead of the optimized assembly versions. This C GetThread() always asserts in an EE_THREAD_NOT_REQUIRED scope regardless of whether there actually is an EE Thread available or not. The reason is that if you claim you don't require an EE Thread, then you have no business asking for it (even if you get lucky and there happens to be an EE Thread available).
Of course, there are exceptions to this. In particular, if there is a clear code path for GetThread() == NULL, then it's ok to call GetThread() in an EE_THREAD_NOT_REQUIRED scope. You declare your intention by using GetThreadNULLOk():
diff --git a/docs/coding-guidelines/clr-jit-coding-conventions.md b/docs/coding-guidelines/clr-jit-coding-conventions.md
index ab90d1772ce22a..a3d82383c94dcb 100644
--- a/docs/coding-guidelines/clr-jit-coding-conventions.md
+++ b/docs/coding-guidelines/clr-jit-coding-conventions.md
@@ -1457,7 +1457,7 @@ Note that periodically we do need to go through and remove FEATURE_* defines tha
It is generally discouraged to permanently disable code by commenting it out or by putting `#if 0` around it, in an attempt to keep it around for reference. This reduces the hygiene of the code base over time and such disabled code is rarely actually useful. Instead, such disabled code should be entirely deleted. If you do disable code without deleting it, then you must add a comment as to why the code is disabled, and why it is better to leave the code disabled than it is to delete it.
-One exception is that it is often useful to `#if 0` code that is useful for debugging an area, but is not otherwise useful. Even in this case, however, it is probably better to introduce a COMPlus_* variable to enable the special debugging mode.
+One exception is that it is often useful to `#if 0` code that is useful for debugging an area, but is not otherwise useful. Even in this case, however, it is probably better to introduce a DOTNET_* variable to enable the special debugging mode.
### 14.1.3 Debug code
@@ -1465,7 +1465,7 @@ Use `#ifdef DEBUG` for debug-only code. Do not use `#ifdef _DEBUG` (with a leadi
Use the `INDEBUG(x)` macro (and related macros) judiciously, for code that only runs in DEBUG, to avoid `#ifdef`s.
-Use the `JITDUMP(x)` macro for printing things to the JIT dump output. Note that these things will only get printed when the `verbose` variable is set, which is when `COMPlus_JitDump=*` or when `COMPlus_JitDump=XXX` and we are JITting function XXX. Do not use `JITDUMP` for all output in a debug-only function that might be useful to call from the debugger. In that case, define a function that uses `printf` (which is a JIT-specific implementation of this function), which can be called from the debugger, and invoke that function like this:
+Use the `JITDUMP(x)` macro for printing things to the JIT dump output. Note that these things will only get printed when the `verbose` variable is set, which is when `DOTNET_JitDump=*` or when `DOTNET_JitDump=XXX` and we are JITting function XXX. Do not use `JITDUMP` for all output in a debug-only function that might be useful to call from the debugger. In that case, define a function that uses `printf` (which is a JIT-specific implementation of this function), which can be called from the debugger, and invoke that function like this:
```c++
DBEXEC(verbose, MyDumpFunction());
@@ -1486,7 +1486,7 @@ This could be written on fewer lines as:
JITDUMP("*************** In genGenerateCode()\n");
```
-However, the former is preferred because it is trivial to set an unconditional breakpoint on the "printf" that triggers when we are compiling the function that matches what COMPlus_JitDump is set to – a very common debugging technique. Note that conditional breakpoints could be used, but they are more cumbersome, and are very difficult to get right in windbg.
+However, the former is preferred because it is trivial to set an unconditional breakpoint on the "printf" that triggers when we are compiling the function that matches what DOTNET_JitDump is set to – a very common debugging technique. Note that conditional breakpoints could be used, but they are more cumbersome, and are very difficult to get right in windbg.
If many back-to-back JITDUMP statements are going to be used it is preferred that they be written using printf().
diff --git a/docs/coding-guidelines/interop-guidelines.md b/docs/coding-guidelines/interop-guidelines.md
index a156b40bb0a8c4..d0a1748d2ea32b 100644
--- a/docs/coding-guidelines/interop-guidelines.md
+++ b/docs/coding-guidelines/interop-guidelines.md
@@ -126,10 +126,10 @@ internal static partial class Interop // contents of Common\src\Interop\Windows\
```
### Build System
-When building dotnet/runtime, we use the "TargetOS" property to control what target platform we are building for. The valid values for this property are windows (which is the default value from MSBuild when running on Windows), Linux and OSX.
+When building dotnet/runtime, we use the "TargetOS" property to control what target platform we are building for. The valid values for this property are windows (which is the default value from MSBuild when running on Windows), linux and osx.
#### Project Files
-Whenever possible, a single .csproj should be used per assembly, spanning all target platforms, e.g. System.Console.csproj includes conditional entries for when targeting Windows vs when targeting Linux. A property can be passed to dotnet build to control which flavor is built, e.g. `dotnet build /p:TargetOS=OSX System.Console.csproj`.
+Whenever possible, a single .csproj should be used per assembly, spanning all target platforms, e.g. System.Console.csproj includes conditional entries for when targeting Windows vs when targeting Linux. A property can be passed to dotnet build to control which flavor is built, e.g. `dotnet build /p:TargetOS=osx System.Console.csproj`.
### Constants
- Wherever possible, constants should be defined as "const". Only if the data type doesn't support this (e.g. IntPtr) should they instead be static readonly fields.
diff --git a/docs/coding-guidelines/libraries-packaging.md b/docs/coding-guidelines/libraries-packaging.md
index 3c03ab64398918..25a2894cfe9ae5 100644
--- a/docs/coding-guidelines/libraries-packaging.md
+++ b/docs/coding-guidelines/libraries-packaging.md
@@ -28,7 +28,7 @@ Such transport packages represent the set of libraries which are produced in dot
To add a library to the target's shared framework, that library should be listed in the `AspNetCoreAppLibrary` or `WindowsDesktopAppLibrary` section in `NetCoreAppLibrary.props`.
-Source generators and analyzers can be included in the package by adding them to the `Microsoft.Internal.Runtime.**TARGET**.Transport.proj` as an AnalyzerReference. The analyzer projects should specify `AnalyzerLanguage` as mentioned [below](#analyzers--source-generators).
+Source generators and analyzers can be included in the package by adding them to the `Microsoft.Internal.Runtime.**TARGET**.Transport.proj` as a ProjectReference with the `ReferenceOutputAssembly=false` and `PackAsAnalyzer=true` metadata set. The analyzer projects should specify `AnalyzerLanguage` as mentioned [below](#analyzers--source-generators).
Libraries included in this transport package should ensure all direct and transitive assembly references are also included in either the target's shared framework or the Microsoft.NETCore.App shared framework. This is not validated in dotnet/runtime at the moment: https://github.com/dotnet/runtime/issues/52562
@@ -40,22 +40,29 @@ Libraries to be packaged must set `IsPackable` to true. By default, all `librari
Package versions and shipping state should be controlled using the properties defined by the [Arcade SDK](https://github.com/dotnet/arcade/blob/master/Documentation/ArcadeSdk.md#project-properties-defined-by-the-sdk). Typically libraries should not need to explicitly set any of these properties.
-Most metadata for packages is controlled centrally in the repository and individual projects may not need to make any changes to these. One property is required to be set in each project: `PackageDescription`. This should be set to a descriptive summary of the purpose of the package, and a list of common entry-point types for the package: to aide in search engine optimization. Example:
+Most metadata for packages is controlled centrally in the repository and individual projects may not need to make any changes to these. One property is required to be set in each project: `PackageDescription`. This should be set to a descriptive summary of the purpose of the package. Example:
+
```xml
-Logging abstractions for Microsoft.Extensions.Logging.
-
-Commonly Used Types:
-Microsoft.Extensions.Logging.ILogger
-Microsoft.Extensions.Logging.ILoggerFactory
-Microsoft.Extensions.Logging.ILogger<TCategoryName>
-Microsoft.Extensions.Logging.LogLevel
-Microsoft.Extensions.Logging.Logger<T>
-Microsoft.Extensions.Logging.LoggerMessage
-Microsoft.Extensions.Logging.Abstractions.NullLogger
+Logging abstractions for Microsoft.Extensions.Logging.
```
Package content can be defined using any of the publicly defined Pack inputs: https://docs.microsoft.com/en-us/nuget/reference/msbuild-targets
+### Package Readme
+
+Packages can include a Markdown Readme file with a short usage documentation. To include a package Readme, create a `PACKAGE.md` file in the library `src` directory. The file will be automatically included in the package and used as a Readme if its name matches this convention.
+
+The package Readme is displayed on the package details page on [NuGet gallery](https://nuget.org/). You can include the following content in it:
+
+- A description of the package purpose.
+- Information when package should be used. For example, if the library is included in the shared framework in .NET, but needs to be installed via NuGet on .NET Framework, it should be mentioned.
+- Information on how to get started with the package.
+- Links to related documentation.
+- A list of common entry-point types for the package, with links to their API docs under [.NET API Browser](https://learn.microsoft.com/dotnet/api/).
+- A short code example that demostrates the package usage.
+
+For a list of supported Markdown features, see [NuGet documentation](https://learn.microsoft.com/nuget/nuget-org/package-readme-on-nuget-org#supported-markdown-features).
+
### Build props / targets and other content
Build props and targets may be needed in NuGet packages. To define these, author a build folder in your src project and place the necessary props/targets in this subfolder. You can then add items to include these in the package by defining `Content` items and setting `PackagePath` as follows:
@@ -70,10 +77,13 @@ Build props and targets may be needed in NuGet packages. To define these, author
Some packages may wish to include a companion analyzer or source-generator with their library. Analyzers are much different from normal library contributors: their dependencies shouldn't be treated as nuget package dependencies, their TargetFramework isn't applicable to the project they are consumed in (since they run in the compiler). To facilitate this, we've defined some common infrastructure for packaging Analyzers.
-To include an analyzer in a package, simply add an `AnalyzerReference` item to the project that produces the package that should contain the analyzer and set the `Pack` metadata to true. If you just want to include the analyzer but not consume it, set the `ReferenceAnalyzer` metadata to false.
+To include an analyzer in a package, simply add a `ProjectReference` item to the project that produces the package that should contain the analyzer and set the `ReferenceOutputAssembly` metadata to false and the `PackAsAnalyzer` metadata to true. If you also want to consume the analyzer, set the `OutputItemType` metadata to `Analyzer`.
```xml
-
+
+
+
+
```
diff --git a/docs/coding-guidelines/project-guidelines.md b/docs/coding-guidelines/project-guidelines.md
index a0e37a38831a8b..8bb511be52f906 100644
--- a/docs/coding-guidelines/project-guidelines.md
+++ b/docs/coding-guidelines/project-guidelines.md
@@ -19,15 +19,15 @@ Below is a list of all the various options we pivot the project builds on:
- **Target Frameworks:** .NETFramework, .NETStandard, .NETCoreApp
- **Platform Runtimes:** .NETFramework (aka CLR/Desktop), CoreCLR, Mono
-- **OS:** windows, Linux, OSX, FreeBSD, AnyOS
+- **OS:** windows, linux, osx, freebsd, AnyOS
- **Flavor:** Debug, Release
## Individual build properties
The following are the properties associated with each build pivot
-- `$(BuildTargetFramework) -> Any .NETCoreApp or .NETFramework TFM, e.g. net7.0`
-- `$(TargetOS) -> Windows | Linux | OSX | FreeBSD | [defaults to running OS when empty]`
-- `$(Configuration) -> Release | [defaults to Debug when empty]`
+- `$(BuildTargetFramework) -> Any .NETCoreApp or .NETFramework TFM, e.g. net8.0`
+- `$(TargetOS) -> windows | linux | osx | freebsd | ... | [defaults to running OS when empty]`
+- `$(Configuration) -> Debug | Release | [defaults to Debug when empty]`
- `$(TargetArchitecture) - x86 | x64 | arm | arm64 | [defaults to x64 when empty]`
- `$(RuntimeOS) - win7 | osx10.10 | ubuntu.14.04 | [any other RID OS+version] | [defaults to running OS when empty]` See [RIDs](https://github.com/dotnet/runtime/tree/main/src/libraries/Microsoft.NETCore.Platforms) for more info.
@@ -51,7 +51,7 @@ Non cross-targeting project that targets .NETStandard:
A cross-targeting project which targets specific platform with `$(NetCoreAppCurrent)` and one .NETFramework tfm:
```
- $(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-Unix;$(NetFrameworkMinimum)
+ $(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-unix;$(NetFrameworkMinimum)
```
@@ -60,7 +60,7 @@ A cross-targeting project which targets specific platform with `$(NetCoreAppCurr
A full or individual project build is centered around BuildTargetFramework, TargetOS, Configuration and TargetArchitecture.
1. `$(BuildTargetFramework), $(TargetOS), $(Configuration), $(TargetArchitecture)` can individually be passed in to change the default values.
-2. If nothing is passed to the build then we will default value of these properties from the environment. Example: `net7.0-[TargetOS Running On]-Debug-x64`.
+2. If nothing is passed to the build then we will default value of these properties from the environment. Example: `net8.0-[TargetOS Running On]-Debug-x64`.
3. When building an individual project (either from the CLI or an IDE), all target frameworks are built.
We also have `RuntimeOS` which can be passed to customize the specific OS and version needed for native package builds as well as package restoration. If not passed it will default based on the OS you are running on.
@@ -103,17 +103,17 @@ Example:
Example:
```
- $(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-OSX;$(NetCoreAppCurrent)
+ $(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-osx;$(NetCoreAppCurrent)
...
-...
+...
```
Important: In contrast to the old `Targets*` checks, `TargetPlatformIdentifier` conditions apply to a single tfm only, inheritance between target frameworks can't be expressed. See the example below for Unix:
```
- $(NetCoreAppCurrent)-Unix;$(NetCoreAppCurrent)-Linux;$(NetCoreAppCurrent)-android;$(NetCoreAppCurrent)-windows
+ $(NetCoreAppCurrent)-unix;$(NetCoreAppCurrent)-linux;$(NetCoreAppCurrent)-android;$(NetCoreAppCurrent)-windows
-...
+...
...
```
@@ -188,7 +188,9 @@ All test outputs should be under
## gen
In the gen directory any source generator related to the assembly should exist. This does not mean the source generator is only used for that assembly only that it is conceptually apart of that assembly. For example, the assembly may provide attributes or low-level types the source generator uses.
-To consume a source generator, simply add an `` item to the project, usually next to the `References` and `ProjectReferences` items.
+To consume a source generator, simply add a `` item to the project, usually next to the `Reference` and `ProjectReference` items.
+
+A source generator must target `netstandard2.0` as such assemblies are loaded into the compiler's process which might run on either .NET Framework or modern .NET depending on the tooling being used (CLI vs Visual Studio). While that's true, a source project can still multi-target and include `$(NetCoreAppToolCurrent)` (which is the latest non live-built .NETCoreApp tfm that is supported by the SDK) to benefit from the ehancanced nullable reference type warnings emitted by the compiler. For an example see [System.Text.Json's roslyn4.4 source generator](/src/libraries/System.Text.Json/gen/System.Text.Json.SourceGeneration.Roslyn4.4.csproj). While the repository's infrastructure makes sure that only the source generator's `netstandard2.0` build output is included in packages, to consume such a multi-targeting source generator via a `ProjectReference` (as described above), you need to add the `SetTargetFramework="TargetFramework=netstandard2.0"` metadata to the ProjectReference item to guarantee that the netstandard2.0 asset is chosen.
## Facades
Facade are unique in that they don't have any code and instead are generated by finding a contract reference assembly with the matching identity and generating type forwards for all the types to where they live in the implementation assemblies (aka facade seeds). There are also partial facades which contain some type forwards as well as some code definitions. All the various build configurations should be contained in the one csproj file per library.
diff --git a/docs/coding-guidelines/updating-ref-source.md b/docs/coding-guidelines/updating-ref-source.md
index fa33fe51d7e02a..5b47ec2f56665a 100644
--- a/docs/coding-guidelines/updating-ref-source.md
+++ b/docs/coding-guidelines/updating-ref-source.md
@@ -2,7 +2,7 @@ This document provides the steps you need to take to update the reference assemb
## For most assemblies within libraries
-1. Implement the API in the source assembly and [build it](../workflow/building/libraries/README.md#building-individual-libraries). Note that when adding new public types, this might fail with a `TypeMustExist` error. The deadlock can be worked around by disabling the `RunApiCompat` property: `dotnet build /p:RunApiCompat=false`.
+1. Implement the API in the source assembly and [build it](../workflow/building/libraries/README.md#building-individual-libraries). Note that when adding new public types, this might fail with a `TypeMustExist` error. The deadlock can be worked around by disabling ApiCompat's assembly validation: `dotnet build /p:ApiCompatValidateAssemblies=false`.
2. Run the following command (from the src directory) `dotnet msbuild /t:GenerateReferenceAssemblySource` to update the reference assembly**.
3. Navigate to the ref directory and build the reference assembly.
4. Add, build, and run tests.
diff --git a/docs/deep-dive-blog-posts.md b/docs/deep-dive-blog-posts.md
index 72b7dd45940436..b0927c9eb242a8 100644
--- a/docs/deep-dive-blog-posts.md
+++ b/docs/deep-dive-blog-posts.md
@@ -8,7 +8,7 @@
- [Performance improvements in .NET Core 3.0](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/)
- [Performance improvements in .NET 5](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/)
- [Performance improvements in .NET 6](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/)
-
+- [Performance improvements in .NET 7](https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/)
### Posts that take a high-level look at the entire source:
@@ -30,3 +30,4 @@
- [Preventing .NET Garbage Collections with the TryStartNoGCRegion API](http://mattwarren.org/2016/08/16/Preventing-dotNET-Garbage-Collections-with-the-TryStartNoGCRegion-API/)
- [GC Pauses and Safe Points](http://mattwarren.org/2016/08/08/GC-Pauses-and-Safe-Points/)
- [Strings and the CLR - a Special Relationship](http://mattwarren.org/2016/05/31/Strings-and-the-CLR-a-Special-Relationship/)
+- [How Async/Await Really Works in C#](https://devblogs.microsoft.com/dotnet/how-async-await-really-works/)
diff --git a/docs/design/coreclr/botr/guide-for-porting.md b/docs/design/coreclr/botr/guide-for-porting.md
index f15e7a539aa073..5d2c01aa52d066 100644
--- a/docs/design/coreclr/botr/guide-for-porting.md
+++ b/docs/design/coreclr/botr/guide-for-porting.md
@@ -76,7 +76,7 @@ The process follows the following strategy
getting some code to work is a prerequisite for handling more complex
scenarios. When doing initial bringup, configuring the Gen0 budget of the GC
to be a large number so that the GC does not attempt to run during most
- tests is very useful. (Set `COMPlus_GCgen0size=99999999`)
+ tests is very useful. (Set `DOTNET_GCgen0size=99999999`)
- Once basic code is executing, the focus shifts to enabling the GC to work.
In this initial phase, the correct choice is to enable conservative GC
@@ -137,7 +137,7 @@ Stage 4 Focus on stress
really works.
- See the various test passes done in CI, but most critically GCStress testing
- is needed. See documentation around use of the ComPlus_GCStress environment
+ is needed. See documentation around use of the DOTNET_GCStress environment
variable.
Stage 5 productization
diff --git a/docs/design/coreclr/botr/vectors-and-intrinsics.md b/docs/design/coreclr/botr/vectors-and-intrinsics.md
index 232c0af136975f..f507b55bd622f1 100644
--- a/docs/design/coreclr/botr/vectors-and-intrinsics.md
+++ b/docs/design/coreclr/botr/vectors-and-intrinsics.md
@@ -15,7 +15,7 @@ Most hardware intrinsics support is tied to the use of various Vector apis. Ther
- The fixed length float vectors. `Vector2`, `Vector3`, and `Vector4`. These vector types represent a struct of floats of various lengths. For type layout, ABI and, interop purposes they are represented in exactly the same way as a structure with an appropriate number of floats in it. Operations on these vector types are supported on all architectures and platforms, although some architectures may optimize various operations.
- The variable length `Vector`. This represents vector data of runtime-determined length. In any given process the length of a `Vector` is the same in all methods, but this length may differ between various machines or environment variable settings read at startup of the process. The `T` type variable may be the following types (`System.Byte`, `System.SByte`, `System.Int16`, `System.UInt16`, `System.Int32`, `System.UInt32`, `System.Int64`, `System.UInt64`, `System.Single`, and `System.Double`), and allows use of integer or double data within a vector. The length and alignment of `Vector` is unknown to the developer at compile time (although discoverable at runtime by using the `Vector.Count` api), and `Vector` may not exist in any interop signature. Operations on these vector types are supported on all architectures and platforms, although some architectures may optimize various operations if the `Vector.IsHardwareAccelerated` api returns true.
-- `Vector64`, `Vector128`, and `Vector256` represent fixed-sized vectors that closely resemble the fixed- sized vectors available in C++. These structures can be used in any code that runs, but very few features are supported directly on these types other than creation. They are used primarily in the processor specific hardware intrinsics apis.
+- `Vector64`, `Vector128`, `Vector256`, and `Vector512` represent fixed-sized vectors that closely resemble the fixed- sized vectors available in C++. These structures can be used in any code that runs, but very few features are supported directly on these types other than creation. They are used primarily in the processor specific hardware intrinsics apis.
- Processor specific hardware intrinsics apis such as `System.Runtime.Intrinsics.X86.Ssse3`. These apis map directly to individual instructions or short instruction sequences that are specific to a particular hardware instruction. These apis are only usable on hardware that supports the particular instruction. See https://github.com/dotnet/designs/blob/master/accepted/2018/platform-intrinsics.md for the design of these.
# How to use intrinsics apis
@@ -23,7 +23,7 @@ Most hardware intrinsics support is tied to the use of various Vector apis. Ther
There are 3 models for use of intrinsics apis.
1. Usage of `Vector2`, `Vector3`, `Vector4`, and `Vector`. For these, its always safe to just use the types. The jit will generate code that is as optimal as it can for the logic, and will do so unconditionally.
-2. Usage of `Vector64`, `Vector128`, and `Vector256`. These types may be used unconditionally, but are only truly useful when also using the platform specific hardware intrinsics apis.
+2. Usage of `Vector64`, `Vector128`, `Vector256`, and `Vector512`. These types may be used unconditionally, but are only truly useful when also using the platform specific hardware intrinsics apis.
3. Usage of platform intrinsics apis. All usage of these apis should be wrapped in an `IsSupported` check of the appropriate kind. Then, within the `IsSupported` check the platform specific api may be used. If multiple instruction sets are used, then the application developer must have checks for the instruction sets as used on each one of them.
# Effect of usage of hardware intrinsics on how code is generated
@@ -142,7 +142,7 @@ public class BitOperations
#### Crossgen implementation rules
- Any code which uses an intrinsic from the `System.Runtime.Intrinsics.Arm` or `System.Runtime.Intrinsics.X86` namespace will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_HWINTRINSIC_NGEN_DISALLOWED`)
- Any code which uses `Vector` will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_SIMD_NGEN_DISALLOWED`)
-- Any code which uses `Vector64`, `Vector128` or `Vector256` will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_HWINTRINSIC_NGEN_DISALLOWED`)
+- Any code which uses `Vector64`, `Vector128`, `Vector256`, or `Vector512` will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_HWINTRINSIC_NGEN_DISALLOWED`)
- Non-platform intrinsics which require more hardware support than the minimum supported hardware capability will not take advantage of that capability. In particular the code generated for Vector2/3/4 is sub-optimal. MethodImplOptions.AggressiveOptimization may be used to disable compilation of this sub-par code.
#### Characteristics which result from rules
@@ -160,10 +160,10 @@ There are 2 sets of instruction sets known to the compiler.
- The baseline instruction set which defaults to (Sse, Sse2), but may be adjusted via compiler option.
- The optimistic instruction set which defaults to (Sse3, Ssse3, Sse41, Sse42, Popcnt, Pclmulqdq, and Lzcnt).
-Code will be compiled using the optimistic instruction set to drive compilation, but any use of an instruction set beyond the baseline instruction set will be recorded, as will any attempt to use an instruction set beyond the optimistic set if that attempted use has a semantic effect. If the baseline instruction set includes `Avx2` then the size and characteristics of of `Vector` is known. Any other decisions about ABI may also be encoded. For instance, it is likely that the ABI of `Vector256` will vary based on the presence/absence of `Avx` support.
+Code will be compiled using the optimistic instruction set to drive compilation, but any use of an instruction set beyond the baseline instruction set will be recorded, as will any attempt to use an instruction set beyond the optimistic set if that attempted use has a semantic effect. If the baseline instruction set includes `Avx2` then the size and characteristics of of `Vector` is known. Any other decisions about ABI may also be encoded. For instance, it is likely that the ABI of `Vector256` and `Vector512` will vary based on the presence/absence of `Avx` support.
- Any code which uses `Vector` will not be compiled AOT unless the size of `Vector` is known.
-- Any code which passes a `Vector256` as a parameter on a Linux or Mac machine will not be compiled AOT unless the support for the `Avx` instruction set is known.
+- Any code which passes a `Vector256` or `Vector512` as a parameter on a Linux or Mac machine will not be compiled AOT unless the support for the `Avx` instruction set is known.
- Non-platform intrinsics which require more hardware support than the optimistic supported hardware capability will not take advantage of that capability. MethodImplOptions.AggressiveOptimization may be used to disable compilation of this sub-par code.
- Code which takes advantage of instructions sets in the optimistic set will not be used on a machine which only supports the baseline instruction set.
- Code which attempts to use instruction sets outside of the optimistic set will generate code that will not be used on machines with support for the instruction set.
@@ -194,7 +194,6 @@ While the above api exists, it is not expected that general purpose code within
|`compExactlyDependsOn(isa)`| Use when making a decision to use or not use an instruction set when the decision will affect the semantics of the generated code. Should never be used in an assert. | Return whether or not an instruction set is supported. Calls notifyInstructionSetUsage with the result of that computation.
|`compOpportunisticallyDependsOn(isa)`| Use when making an opportunistic decision to use or not use an instruction set. Use when the instruction set usage is a "nice to have optimization opportunity", but do not use when a false result may change the semantics of the program. Should never be used in an assert. | Return whether or not an instruction set is supported. Calls notifyInstructionSetUsage if the instruction set is supported.
|`compIsaSupportedDebugOnly(isa)` | Use to assert whether or not an instruction set is supported | Return whether or not an instruction set is supported. Does not report anything. Only available in debug builds.
-|`getSIMDSupportLevel()`| Use when determining what codegen to generate for code that operates on `Vector`, `Vector2`, `Vector3` or `Vector4`.| Queries the instruction sets supported using `compOpportunisticallyDependsOn`, and finds a set of instructions available to use for working with the platform agnostic vector types.
|`getSIMDVectorType()`| Use to get the TYP of a the `Vector` type. | Determine the TYP of the `Vector` type. If on the architecture the TYP may vary depending on whatever rules, this function will make sufficient use of the `notifyInstructionSetUsage` api to ensure that the TYP is consistent between compile time and runtime.
|`getSIMDVectorRegisterByteLength()` | Use to get the size of a `Vector` value. | Determine the size of the `Vector` type. If on the architecture the size may vary depending on whatever rules, this function will make sufficient use of the `notifyInstructionSetUsage` api to ensure that the size is consistent between compile time and runtime.
|`maxSIMDStructBytes()`| Get the maximum number of bytes that might be used in a SIMD type during this compilation. | Query the set of instruction sets supported, and determine the largest simd type supported. Use `compOpportunisticallyDependsOn` to perform the queries so that the maximum size needed is the only one recorded.
diff --git a/docs/design/coreclr/botr/xplat-minidump-generation.md b/docs/design/coreclr/botr/xplat-minidump-generation.md
index a936b200ca4443..997b9a1e5deaea 100644
--- a/docs/design/coreclr/botr/xplat-minidump-generation.md
+++ b/docs/design/coreclr/botr/xplat-minidump-generation.md
@@ -40,9 +40,9 @@ Like the severe memory corruption case, if the signal handler (`SIGSEGV`) gets c
There will be some differences gathering the crash information but these platforms still use ELF format core dumps so that part of the utility should be much different. The mechanism used for Linux to give _createdump_ permission to use ptrace and access the /proc doesn't exists on these platforms.
-### OS X ###
+### macOS ###
-On .NET 5.0, createdump supported generating dumps on MacOS but instead of the MachO dump format, it generates the ELF coredumps. This wad because of time constraints developing a MachO dump writer on the generation side and a MachO reader for the diagnostics tooling side (dotnet-dump and CLRMD). This means the native debuggers like gdb and lldb will not work with dumps obtained from apps running on a 5.0 runtime, but the dotnet-dump tool will allow the managed state to be analyzed. Because of this behavior an additional environment variable will need to be set (COMPlus_DbgEnableElfDumpOnMacOS=1) along with the ones below in the Configuration/Policy section.
+On .NET 5.0, createdump supported generating dumps on macOS but instead of the MachO dump format, it generates the ELF coredumps. This wad because of time constraints developing a MachO dump writer on the generation side and a MachO reader for the diagnostics tooling side (dotnet-dump and CLRMD). This means the native debuggers like gdb and lldb will not work with dumps obtained from apps running on a 5.0 runtime, but the dotnet-dump tool will allow the managed state to be analyzed. Because of this behavior an additional environment variable will need to be set (COMPlus_DbgEnableElfDumpOnMacOS=1) along with the ones below in the Configuration/Policy section.
Starting .NET 6.0, native Mach-O core files get generated and the variable COMPlus_DbgEnableElfDumpOnMacOS has been deprecated.
@@ -56,20 +56,18 @@ NOTE: Core dump generation in docker containers require the ptrace capability (-
Any configuration or policy is set with environment variables which are passed as options to the _createdump_ utility.
-Starting with .NET 7.0 or greater the below environment variables can be prefixed with DOTNET_ or COMPlus_.
-
Environment variables supported:
-- `COMPlus_DbgEnableMiniDump`: if set to "1", enables this core dump generation. The default is NOT to generate a dump.
-- `COMPlus_DbgMiniDumpType`: See below. Default is "2" MiniDumpWithPrivateReadWriteMemory.
-- `COMPlus_DbgMiniDumpName`: if set, use as the template to create the dump path and file name. See "Dump name formatting" for how the dump name can be formatted. The default is _/tmp/coredump.%p_.
-- `COMPlus_CreateDumpDiagnostics`: if set to "1", enables the _createdump_ utilities diagnostic messages (TRACE macro).
-- `COMPlus_CreateDumpVerboseDiagnostics`: if set to "1", enables the _createdump_ utilities verbose diagnostic messages (TRACE_VERBOSE macro).
-- `COMPlus_CreateDumpLogToFile`: if set, it is the path of the file to write the _createdump_ diagnostic messages.
-- `COMPlus_EnableCrashReport`: In .NET 6.0 or greater, if set to "1", createdump also generates a json formatted crash report which includes information about the threads and stack frames of the crashing application. The crash report name is the dump path/name with _.crashreport.json_ appended.
-- `COMPlus_EnableCrashReportOnly`: In .NET 7.0 or greater, same as COMPlus_EnableCrashReport except the core dump is not generated.
+- `DOTNET_DbgEnableMiniDump`: if set to "1", enables this core dump generation. The default is NOT to generate a dump.
+- `DOTNET_DbgMiniDumpType`: See below. Default is "2" MiniDumpWithPrivateReadWriteMemory.
+- `DOTNET_DbgMiniDumpName`: if set, use as the template to create the dump path and file name. See "Dump name formatting" for how the dump name can be formatted. The default is _/tmp/coredump.%p_.
+- `DOTNET_CreateDumpDiagnostics`: if set to "1", enables the _createdump_ utilities diagnostic messages (TRACE macro).
+- `DOTNET_CreateDumpVerboseDiagnostics`: if set to "1", enables the _createdump_ utilities verbose diagnostic messages (TRACE_VERBOSE macro).
+- `DOTNET_CreateDumpLogToFile`: if set, it is the path of the file to write the _createdump_ diagnostic messages.
+- `DOTNET_EnableCrashReport`: In .NET 6.0 or greater, if set to "1", createdump also generates a json formatted crash report which includes information about the threads and stack frames of the crashing application. The crash report name is the dump path/name with _.crashreport.json_ appended.
+- `DOTNET_EnableCrashReportOnly`: In .NET 7.0 or greater, same as DOTNET_EnableCrashReport except the core dump is not generated.
-COMPlus_DbgMiniDumpType values:
+DOTNET_DbgMiniDumpType values:
|Value|Minidump Enum|Description|
diff --git a/docs/design/coreclr/jit/JitOptimizerPlanningGuide.md b/docs/design/coreclr/jit/JitOptimizerPlanningGuide.md
index 3132147e3bde0a..bc4b0b8980d09d 100644
--- a/docs/design/coreclr/jit/JitOptimizerPlanningGuide.md
+++ b/docs/design/coreclr/jit/JitOptimizerPlanningGuide.md
@@ -95,7 +95,7 @@ worth investing in.
collect profiles and correlate them with that machine code. This could
benefit any developers doing performance analysis of their own code.
The JIT team has discussed this, options include building something on top of
- the profiler APIs, enabling COMPlus_JitDisasm in release builds, and shipping
+ the profiler APIs, enabling DOTNET_JitDisasm in release builds, and shipping
with or making easily available an alt jit that supports JitDisasm.
- Hardware companies maintain optimization/performance guides for their ISAs.
Should we maintain one for MSIL and/or C# (and/or F#)? If we hosted such a
diff --git a/docs/design/coreclr/jit/first-class-structs.md b/docs/design/coreclr/jit/first-class-structs.md
index d72af35753daec..dc017aee75f2e6 100644
--- a/docs/design/coreclr/jit/first-class-structs.md
+++ b/docs/design/coreclr/jit/first-class-structs.md
@@ -113,9 +113,9 @@ Structs only appear as rvalues in the following contexts:
* As a call argument
* In this context, it must be one of: `GT_OBJ`, `GT_LCL_VAR`, `GT_LCL_FLD` or `GT_FIELD_LIST`.
-* As an operand to a hardware or SIMD intrinsic (for `TYP_SIMD*` only)
+* As an operand to a hardware intrinsic (for `TYP_SIMD*` only)
* In this case the struct handle is generally assumed to be unneeded, as it is captured (directly or
- indirectly) in the `GT_SIMD` or `GT_HWINTRINSIC` node.
+ indirectly) in the `GT_HWINTRINSIC` node.
* It would simplify both the recognition and optimization of these nodes if they carried a `ClassLayout`.
After morph, a struct-typed value on the RHS of assignment is one of:
@@ -124,7 +124,6 @@ After morph, a struct-typed value on the RHS of assignment is one of:
* `GT_CALL`
* `GT_LCL_VAR`
* `GT_LCL_FLD`
-* `GT_SIMD`
* `GT_OBJ` nodes can also be used as rvalues when they are call arguments
* Proposed: `GT_OBJ` nodes can be used in any context where a struct rvalue or lvalue might occur,
except after morph when the struct is independently promoted.
diff --git a/docs/design/coreclr/jit/hot-cold-splitting.md b/docs/design/coreclr/jit/hot-cold-splitting.md
index a68cda3d11e553..95134203ad2469 100644
--- a/docs/design/coreclr/jit/hot-cold-splitting.md
+++ b/docs/design/coreclr/jit/hot-cold-splitting.md
@@ -21,7 +21,7 @@ The below sections describe various improvements made to the JIT's hot/cold spli
Without runtime support for hot/cold splitting in .NET as of summer 2022, testing the JIT's existing hot/cold splitting
support is not as simple as turning the feature on. A new "fake" splitting mode, enabled by the
-`COMPlus_JitFakeProcedureSplitting` environment variable, removes this dependency on runtime support. This mode allows
+`DOTNET_JitFakeProcedureSplitting` environment variable, removes this dependency on runtime support. This mode allows
the JIT to execute its hot/cold splitting workflow without changing the runtime's behavior. This workflow proceeds as
follows:
@@ -41,7 +41,7 @@ are adjacent, the JIT generates unwind info once for the entire function.
While enabling fake-splitting also enables `opts.compProcedureSplitting`, there is no guarantee the JIT will fake-split
a function unless `Compiler::fgDetermineFirstColdBlock` finds a splitting point; without PGO data, the JIT's heuristics
may be too conservative for extensive testing. To aid regression testing, the JIT also has a stress-splitting mode now,
-under `COMPlus_JitStressProcedureSplitting`. When `opts.compProcedureSplitting` and stress-splitting are both enabled,
+under `DOTNET_JitStressProcedureSplitting`. When `opts.compProcedureSplitting` and stress-splitting are both enabled,
the JIT splits every function after its first basic block; in other words, `fgFirstColdBlock` is always
`fgFirstBB->bbNext`. The rest of the hot/cold splitting workflow is the same: The JIT emits instructions to handle the
split code sections and, if fake-splitting, utilizes only one memory buffer.
diff --git a/docs/design/coreclr/jit/lsra-detail.md b/docs/design/coreclr/jit/lsra-detail.md
index eaf1ecfeba9b10..6671a570fc5487 100644
--- a/docs/design/coreclr/jit/lsra-detail.md
+++ b/docs/design/coreclr/jit/lsra-detail.md
@@ -552,7 +552,7 @@ Loc RP# Name Type Action Reg │rax │rcx │rdx │rbx │rbp │rsi │rdi
- This is generally not required, as the block will
normally have a predecessor block that has already
been allocated. This facility is exercised by the 0x100
- (`LSRA_BLOCK_BOUNDARY_LAYOUT`) or 0x200 (`LSRA_BLOCK_BOUNDARY_ROTATE`) settings of `COMPlus_JitStressRegs`.
+ (`LSRA_BLOCK_BOUNDARY_LAYOUT`) or 0x200 (`LSRA_BLOCK_BOUNDARY_ROTATE`) settings of `DOTNET_JitStressRegs`.
- At the end of a block, for any exposed uses that do not have downstream
`RefPosition`s (e.g. variables that are live across the backedge, so there is no
@@ -733,7 +733,7 @@ LinearScanAllocation(List refPositions)
- Resolution of exception edges
- - When `COMPlus_EnableEHWriteThru == 0`, any variable that's
+ - When `DOTNET_EnableEHWriteThru == 0`, any variable that's
live in to an exception region is always referenced on the stack.
- See [Enable EHWriteThru by default](#enable-ehwritethru-by-default).
@@ -962,7 +962,7 @@ The following dumps and debugging modes are provided:
LSRA Stress Modes
-----------------
-The implementation uses the `COMPlus_JitStressRegs` environment variable.
+The implementation uses the `DOTNET_JitStressRegs` environment variable.
The following are the stress modes associated with this variable. For
the most part they can be combined, though in some cases the values are
exclusive:
@@ -1201,7 +1201,7 @@ Issues [\#8552](https://github.com/dotnet/runtime/issues/8552) and [\#40264](htt
### Enable EHWriteThru by default
-When `COMPlus_EnableEHWriteThru` is set, some performance regressions are observed. When an EH write-thru variable (i.e. one that is live into an exception region) is defined, its value is
+When `DOTNET_EnableEHWriteThru` is set, some performance regressions are observed. When an EH write-thru variable (i.e. one that is live into an exception region) is defined, its value is
always stored, in addition to potentially remaining live in a register. This increases register
pressure which may result in worse code.
@@ -1381,7 +1381,7 @@ kill site.
## Test and Cleanup Issues
Issue [\#9767](https://github.com/dotnet/runtime/issues/9767) captures the issue that the
-"spill always" stress mode, `LSRA_SPILL_ALWAYS`, `COMPlus_JitStressRegs=0x800` doesn't work properly.
+"spill always" stress mode, `LSRA_SPILL_ALWAYS`, `DOTNET_JitStressRegs=0x800` doesn't work properly.
Issue [\#6261](https://github.com/dotnet/runtime/issues/6261) has to do with `RegOptional`
`RefPositions` that are marked as `copyReg` or `moveReg`. See the notes on this issue;
diff --git a/docs/design/coreclr/jit/lsra-heuristic-tuning.md b/docs/design/coreclr/jit/lsra-heuristic-tuning.md
index a41d83f64daaea..f684432b2ca2e1 100644
--- a/docs/design/coreclr/jit/lsra-heuristic-tuning.md
+++ b/docs/design/coreclr/jit/lsra-heuristic-tuning.md
@@ -88,7 +88,7 @@ bool applyHeuristics(selected_candidates)
```
-If we wanted to change the order of heuristics, we would have to update above code to rearrange the portion of heuristics we apply. To experiment with different heuristics ordering, it is not feasible to do such refactoring for every combination. After doing some research on which design pattern to pick for such problems, we went the old school way and moved the individual heuristics code in its own method (marked with `__forceinline`, to eliminate the throughput impact of refactoring changes). We could use function pointer to invoke one of these methods in any order we wanted. The last bit was an ability to add a way for user to specify heuristic order they want to try. We assigned a single letter to each heuristic (`Shorthand` column in above table) and we exposed `COMPlus_JitLsraOrdering` environment variable to specify the ordering. The default ordering is `"ABCDEFGHIJKLMNOPQ"` (the current order), but if given something else like `"PEHDCGAIJNLKOBFMQ"`, it would apply heuristic in that order. In this example, heuristic corresponding to `P` is `PREV_REG_OPT` and thus would apply busy register heuristics first, followed by `OWN_PREFERENCE`, `CALLER_CALLEE` and so forth. As you notice, now we will be able to apply the busy register heuristics before applying the ones for free registers.
+If we wanted to change the order of heuristics, we would have to update above code to rearrange the portion of heuristics we apply. To experiment with different heuristics ordering, it is not feasible to do such refactoring for every combination. After doing some research on which design pattern to pick for such problems, we went the old school way and moved the individual heuristics code in its own method (marked with `__forceinline`, to eliminate the throughput impact of refactoring changes). We could use function pointer to invoke one of these methods in any order we wanted. The last bit was an ability to add a way for user to specify heuristic order they want to try. We assigned a single letter to each heuristic (`Shorthand` column in above table) and we exposed `DOTNET_JitLsraOrdering` environment variable to specify the ordering. The default ordering is `"ABCDEFGHIJKLMNOPQ"` (the current order), but if given something else like `"PEHDCGAIJNLKOBFMQ"`, it would apply heuristic in that order. In this example, heuristic corresponding to `P` is `PREV_REG_OPT` and thus would apply busy register heuristics first, followed by `OWN_PREFERENCE`, `CALLER_CALLEE` and so forth. As you notice, now we will be able to apply the busy register heuristics before applying the ones for free registers.
After stitching all this together, the refactored code looked like this:
@@ -104,7 +104,7 @@ HashTable ScoreMappingTable = {
LinearScan::allocateReg(RefPosition refPosition, Interval* interval)
{
- char *ordering = Read_COMPlus_LsraOrdering();
+ char *ordering = Read_DOTNET_JitLsraOrdering();
HeuristicFn fn;
for (char order in ordering) {
if (ScoreMappingTable->Lookup(order, &fn)) {
@@ -136,13 +136,13 @@ bool LinearScan::try_REG_NUM() {
## Impact measurement
-Now that rearranging the heuristic ordering is possible with `COMPlus_JitLsraOrdering`, we decided to measure the impact of the reordering by running [superpmi](https://github.com/dotnet/runtime/blob/e063533eb79eace045f43b41980cbed21c8d7365/src/coreclr/ToolBox/superpmi/readme.md) tool. `superpmi` tool JITs all the methods of a given assembly file (`*.dll` or `*.exe`) without executing the generated machine code. Given two versions of `clrjit.dll` (RyuJIT binary), it also has an ability to perform the comparison of generated code and reporting back the number of methods that got improved/regressed in terms of `CodeSize` (machine code size), `PerfScore` (instruction latency/throughput measurements), `InstructionCount` (number of instructions present), etc. We picked `PerfScore` metrics because that accurately includes the cost of register spilling. If LSRA doesn't come up with optimal register choice, we would see several `mov` instructions that load/store into memory and that would decrease the throughput, increase the latency, and hence lower the `PerfScore`. If the spilling happens inside a loop, `PerfScore` metrics accounts for that by considering the product of loop block weights and `PerfScore`. Thus, our goal would be to reduce the `PerfScore` as much possible, lower the `PerfScore`, better is the code we generated. The baseline for the comparison was the default ordering, and we wanted to compare it with an ordering specified in `COMPlus_JitLsraOrdering`. We could specify any combination of sequence `A` thru `Q` and tweak the LSRA algorithm to apply a different heuristics order. But since there are 17 heuristics, there would be **355,687,428,096,000** (17!) possibilities to try out and it will not be practical to do so. We ought to find a better way!
+Now that rearranging the heuristic ordering is possible with `DOTNET_JitLsraOrdering`, we decided to measure the impact of the reordering by running [superpmi](https://github.com/dotnet/runtime/blob/e063533eb79eace045f43b41980cbed21c8d7365/src/coreclr/ToolBox/superpmi/readme.md) tool. `superpmi` tool JITs all the methods of a given assembly file (`*.dll` or `*.exe`) without executing the generated machine code. Given two versions of `clrjit.dll` (RyuJIT binary), it also has an ability to perform the comparison of generated code and reporting back the number of methods that got improved/regressed in terms of `CodeSize` (machine code size), `PerfScore` (instruction latency/throughput measurements), `InstructionCount` (number of instructions present), etc. We picked `PerfScore` metrics because that accurately includes the cost of register spilling. If LSRA doesn't come up with optimal register choice, we would see several `mov` instructions that load/store into memory and that would decrease the throughput, increase the latency, and hence lower the `PerfScore`. If the spilling happens inside a loop, `PerfScore` metrics accounts for that by considering the product of loop block weights and `PerfScore`. Thus, our goal would be to reduce the `PerfScore` as much possible, lower the `PerfScore`, better is the code we generated. The baseline for the comparison was the default ordering, and we wanted to compare it with an ordering specified in `DOTNET_JitLsraOrdering`. We could specify any combination of sequence `A` thru `Q` and tweak the LSRA algorithm to apply a different heuristics order. But since there are 17 heuristics, there would be **355,687,428,096,000** (17!) possibilities to try out and it will not be practical to do so. We ought to find a better way!
## Genetic Algorithm
[Genetic algorithm](https://en.wikipedia.org/wiki/Genetic_algorithm) is the perfect solution to solve these kind of problems. For those who are not familiar, here is a quick summary - The algorithm starts with a community that has few candidates whose fitness score is predetermined. Each candidate is made up of sequence of genes and all candidates have same number of genes in them. The algorithm picks a pair of fit candidates (parents) and mutate their genes to produce offsprings. The algorithm calculates the fitness of the new offsprings and add them (along with the fitness score) back to the community pool. As the community evolves, more and more candidates who has fitness score equivalent or better than the initial population are added to the community. Of course, the community cannot grow infinitely, so the least fit candidates die. When there are no more candidates that are fit than the fittest candidate, the algorithm stops, giving us a set of fit candidates.
-This can be perfectly mapped to the heuristic selection ordering problem. We want to start with `"ABCDEFGHIJKLMNOPQ"` (default selection order) and each letter in this combination can be represented as a gene. Genetic algorithm would mutate the gene to produce a different order say `"ABMCDEFGHIKLNJOPQ"` and we will set that value in `COMPlus_JitLsraOrdering` variable. We would then run `superpmi.py` to produce the generated code and compare the `PerfScore` with that of the one produced by the default order. `PerfScore` represents the fitness, lower the value of that metric, more fit is the corresponding candidate, in our case, better is the heuristic ordering.
+This can be perfectly mapped to the heuristic selection ordering problem. We want to start with `"ABCDEFGHIJKLMNOPQ"` (default selection order) and each letter in this combination can be represented as a gene. Genetic algorithm would mutate the gene to produce a different order say `"ABMCDEFGHIKLNJOPQ"` and we will set that value in `DOTNET_JitLsraOrdering` variable. We would then run `superpmi.py` to produce the generated code and compare the `PerfScore` with that of the one produced by the default order. `PerfScore` represents the fitness, lower the value of that metric, more fit is the corresponding candidate, in our case, better is the heuristic ordering.
Below is the pseudo code of genetic algorithm that we experimented with to find optimal heuristic ordering.
@@ -248,7 +248,7 @@ To conduct experiments, we made few changes to the way superpmi gathers `PerfSco
1. `superpmi.exe` was modified to aggregate **relative** `PerfScore` difference of code generated by default and modified LSRA ordering. When `superpmi.exe` is run in parallel (which is by default), this number was reported back on the console by each parallel process.
2. `superpmi.py` was modified to further aggregate the relative `PerfScore` differences of parallel `superpmi.exe` processes and report back the final relative `PerfScore` difference.
3. LSRA has many asserts throughout the codebase. They assume that during register selection, all the free registers are tried first before checking for busy registers. Since we wanted to understand the impact of preferring busy registers as well, we had to disable those asserts.
-4. `superpmi.exe asmdiffs` takes two versions of `clrjit.dll` that you want to compare. Both must be from different location. In our case, we only wanted to experiment with different heuristic ordering by passing different values for `COMPlus_JitLsraOrdering`, we made a copy of `clrjit.dll` -> `copy_clrjit.dll` and passed various ordering to the copied `copy_clrjit.dll`.
+4. `superpmi.exe asmdiffs` takes two versions of `clrjit.dll` that you want to compare. Both must be from different location. In our case, we only wanted to experiment with different heuristic ordering by passing different values for `DOTNET_JitLsraOrdering`, we made a copy of `clrjit.dll` -> `copy_clrjit.dll` and passed various ordering to the copied `copy_clrjit.dll`.
Here is the sample invocation of `superpmi.py` that genetic algorithm invoked to get the `PerfScore` (fitness score) of each experimented ordering:
diff --git a/docs/design/coreclr/jit/porting-ryujit.md b/docs/design/coreclr/jit/porting-ryujit.md
index 8628ca1d11c78c..7cf275bc2ff2c8 100644
--- a/docs/design/coreclr/jit/porting-ryujit.md
+++ b/docs/design/coreclr/jit/porting-ryujit.md
@@ -43,7 +43,7 @@ There are several steps to follow to port the JIT (some of which can be be done
* Create the new platform-specific files
* Create the platform-specific build instructions (in CMakeLists.txt). This probably will require
new platform-specific build instructions at the root level, as well as the JIT level of the source tree.
-* Focus on MinOpts; disable the optimization phases, or always test with `COMPlus_JITMinOpts=1`.
+* Focus on MinOpts; disable the optimization phases, or always test with `DOTNET_JITMinOpts=1`.
* Disable optional features, such as:
* `FEATURE_EH` -- if 0, all exception handling blocks are removed. Of course, tests with exception handling
that depend on exceptions being thrown and caught won't run correctly.
@@ -52,7 +52,7 @@ There are several steps to follow to port the JIT (some of which can be be done
* `FEATURE_TAILCALL_OPT`
* `FEATURE_SIMD`
* Build the new JIT as an altjit. In this mode, a "base" JIT is invoked to compile all functions except
- the one(s) specified by the `COMPlus_AltJit` variable. For example, setting `COMPlus_AltJit=Add` and running
+ the one(s) specified by the `DOTNET_AltJit` variable. For example, setting `DOTNET_AltJit=Add` and running
a test will use the "base" JIT (say, the Windows x64 targeting JIT) to compile all functions *except*
`Add`, which will be first compiled by the new altjit, and if it fails, fall back to the "base" JIT. In this
way, only very limited JIT functionality need to work, as the "base" JIT takes care of most functions.
@@ -61,9 +61,9 @@ There are several steps to follow to port the JIT (some of which can be be done
* Focus on the CodeGenBringUpTests (src\tests\JIT\CodeGenBringUpTests), starting with the simple ones.
These are designed such that for a test `XXX.cs`, there is a single interesting function named `XXX` to compile
(that is, the name of the source file is the same as the name of the interesting function. This was done to make
- the scripts to invoke these tests very simple.). Set `COMPlus_AltJit=XXX` so the new JIT only attempts to
+ the scripts to invoke these tests very simple.). Set `DOTNET_AltJit=XXX` so the new JIT only attempts to
compile that one function.
-* Use `COMPlus_JitDisasm` to see the generated code for functions, even if the code isn't run.
+* Use `DOTNET_JitDisasm` to see the generated code for functions, even if the code isn't run.
## Expand test coverage
@@ -77,15 +77,15 @@ There are several steps to follow to port the JIT (some of which can be be done
## Bring the optimizer phases on-line
-* Run tests with and without `COMPlus_JITMinOpts=1`.
-* It probably makes sense to set `COMPlus_TieredCompilation=0` (or disable it for the platform entirely) until much later.
+* Run tests with and without `DOTNET_JITMinOpts=1`.
+* It probably makes sense to set `DOTNET_TieredCompilation=0` (or disable it for the platform entirely) until much later.
## Improve quality
* When the tests pass with the basic modes, start running with `JitStress` and `JitStressRegs` stress modes.
* Bring `GCStress` on-line. This also requires VM work.
-* Work on `COMPlus_GCStress=4` quality. When crossgen/ngen is brought on-line, test with `COMPlus_GCStress=8`
- and `COMPlus_GCStress=C` as well.
+* Work on `DOTNET_GCStress=4` quality. When crossgen/ngen is brought on-line, test with `DOTNET_GCStress=8`
+ and `DOTNET_GCStress=C` as well.
## Work on performance
diff --git a/docs/design/coreclr/jit/ryujit-overview.md b/docs/design/coreclr/jit/ryujit-overview.md
index 1311e11e8f5365..e38e487058c744 100644
--- a/docs/design/coreclr/jit/ryujit-overview.md
+++ b/docs/design/coreclr/jit/ryujit-overview.md
@@ -131,7 +131,7 @@ bit vectors.
### Example of Post-Import IR
For this snippet of code (extracted from
-[src/tests/JIT/CodeGenBringUpTests/DblRoots.cs](https://github.com/dotnet/runtime/blob/main/src/tests/JIT/CodeGenBringUpTests/DblRoots.cs)), with `COMPlus_TieredCompilation=0` and using the DblRoots_ro.csproj project to compile it:
+[src/tests/JIT/CodeGenBringUpTests/DblRoots.cs](https://github.com/dotnet/runtime/blob/main/src/tests/JIT/CodeGenBringUpTests/DblRoots.cs)), with `DOTNET_TieredCompilation=0` and using the DblRoots_ro.csproj project to compile it:
r1 = (-b + Math.Sqrt(b*b - 4*a*c))/(2*a);
@@ -756,13 +756,13 @@ phase-specific information by searching for the phase name. Some useful points f
## How to create a JitDump
-You can enable dumps by setting the `COMPlus_JitDump` environment variable to a space-separated list of the method(s)
+You can enable dumps by setting the `DOTNET_JitDump` environment variable to a space-separated list of the method(s)
you want to dump. For example:
```cmd
:: Print out lots of useful info when
:: compiling methods named Main/GetEnumerator
-set "COMPlus_JitDump=Main GetEnumerator"
+set "DOTNET_JitDump=Main GetEnumerator"
```
See [Setting configuration variables](viewing-jit-dumps.md#setting-configuration-variables) for more
@@ -843,7 +843,7 @@ bad tree and wish to understand how it got corrupted, you can place a conditiona
`gtNewNode` to see when it is created, and then a data breakpoint on the field that you believe is corrupted.
The trees are connected by line characters (either in ASCII, by default, or in slightly more readable Unicode when
-`COMPlus_JitDumpASCII=0` is specified), to make it a bit easier to read.
+`DOTNET_JitDumpASCII=0` is specified), to make it a bit easier to read.
## Variable naming
diff --git a/docs/design/coreclr/jit/ryujit-tutorial.md b/docs/design/coreclr/jit/ryujit-tutorial.md
index e496bcda1c6834..34466e45afbcdc 100644
--- a/docs/design/coreclr/jit/ryujit-tutorial.md
+++ b/docs/design/coreclr/jit/ryujit-tutorial.md
@@ -622,12 +622,12 @@ Note that this is not necessarily the approach one would take, because the loop
### Getting Dumps
```
-set COMPlus_JitDump=Main
-set COMPlus_JitDumpAscii=0
-set COMPlus_JitDumpFg=Main
-set COMPlus_JitDumpFgDot=1
-set COMPlus_JitDumpFgFile=Main
-set COMPlus_JitDumpFgPhase=OPT-CHK
+set DOTNET_JitDump=Main
+set DOTNET_JitDumpAscii=0
+set DOTNET_JitDumpFg=Main
+set DOTNET_JitDumpFgDot=1
+set DOTNET_JitDumpFgFile=Main
+set DOTNET_JitDumpFgPhase=OPT-CHK
```
{BinaryDir}\CoreRun.exe PopCount.exe 1122334455667788 > jitdump.out.0
@@ -650,8 +650,8 @@ I added/changed some foundational stuff:
- unsigned optIsLclVarUpdateTree(GenTreePtr tree, GenTreePtr* otherTree, genTreeOps *updateOper);
Getting Ready
-- Set COMPlus_JitDump=Main
-- Set COMPlus_AltJit=*
+- Set DOTNET_JitDump=Main
+- Set DOTNET_AltJit=*
- Run and capture jitdump1.out
- Examine the IR for the loop just prior to optCloneLoops
@@ -661,7 +661,7 @@ Recognize "Intrinsic" (SampleStep1 shelveset)
- instrsxarch.h: encoding
- codegenxarch.cpp: generate instruction
- importer.cpp: name recognition
-- set COMPlus_JitDump
+- set DOTNET_JitDump
- Run & capture jitdump2.out, search for CountBits, then look at disassembly
Add Pattern Recognition (SampleStep2 shelveset):
@@ -678,19 +678,19 @@ Add Pattern Recognition (SampleStep2 shelveset):
## Backup
-### COMPlus Variables
-- COMPlus_JitDump={method-list} – lots of info about what the JIT is doing
-- COMPlus_JitDisasm={method-list} – disassembly listing of each method
-- COMPlus_JitDiffableDasm – avoid printing pointer values that can change from one invocation to the next, so that the disassembly can be more easily diffed.
-- COMPlus_JITGCDump={method-list} – this dumps the GC information.
-- COMPlus_JitUnwindDump={method-list} – dumps the unwind tables.
-- COMPlus_JitEHDump={method-list} – dumps the exception handling tables.
-- COMPlus_JitTimeLogFile – a log file for timing information (dbg or chk builds)
-- COMPlus_JitTimeLogCsv – a log file for timing information in csv form (all builds)
+### Environment Variables
+- DOTNET_JitDump={method-list} – lots of info about what the JIT is doing
+- DOTNET_JitDisasm={method-list} – disassembly listing of each method
+- DOTNET_JitDisasmDiffable – avoid printing pointer values that can change from one invocation to the next, so that the disassembly can be more easily diffed.
+- DOTNET_JITGCDump={method-list} – this dumps the GC information.
+- DOTNET_JitUnwindDump={method-list} – dumps the unwind tables.
+- DOTNET_JitEHDump={method-list} – dumps the exception handling tables.
+- DOTNET_JitTimeLogFile – a log file for timing information (dbg or chk builds)
+- DOTNET_JitTimeLogCsv – a log file for timing information in csv form (all builds)
- {method-list} can be a space-separated list of method names or * for all methods
### IR Dump: Front-end
-Here is an example dump in tree order (shown with COMPlus_JitDumpAscii=0)
+Here is an example dump in tree order (shown with DOTNET_JitDumpAscii=0)
```
STMT00000 (IL ???... ???)
[000067] -AC-G------- ▌ call help void HELPER.CORINFO_HELP_ARRADDR_ST
diff --git a/docs/design/coreclr/jit/viewing-jit-dumps.md b/docs/design/coreclr/jit/viewing-jit-dumps.md
index cef68fdac51871..523971fac2935f 100644
--- a/docs/design/coreclr/jit/viewing-jit-dumps.md
+++ b/docs/design/coreclr/jit/viewing-jit-dumps.md
@@ -20,7 +20,7 @@ The first thing to do is setup the .NET Core app we want to dump. Here are the s
Exe
- net5.0
+ net6.0
win-x64
@@ -58,17 +58,17 @@ The first thing to do is setup the .NET Core app we want to dump. Here are the s
}
```
-* After you've finished editing the code, run `dotnet restore` and `dotnet publish -c Release`. This should drop all of the binaries needed to run your app in `bin/Release/net5.0//publish`.
+* After you've finished editing the code, run `dotnet restore` and `dotnet publish -c Release`. This should drop all of the binaries needed to run your app in `bin/Release///publish`.
* Overwrite the CLR dlls with the ones you've built locally. If you're a fan of the command line, here are some shell commands for doing this:
```shell
# Windows
- robocopy /e \artifacts\bin\coreclr\windows..Release \bin\Release\net5.0\\publish > NUL
- copy /y \artifacts\bin\coreclr\windows..Debug\clrjit.dll \bin\Release\net5.0\\publish > NUL
+ robocopy /e \artifacts\bin\coreclr\windows..Release \bin\Release\\\publish > NUL
+ copy /y \artifacts\bin\coreclr\windows..Debug\clrjit.dll \bin\Release\\\publish > NUL
# Unix
- cp -rT /artifacts/bin/coreclr/..Release /bin/Release/net5.0//publish
- cp /artifacts/bin/coreclr/..Debug/libclrjit.so /bin/Release/net5.0//publish
+ cp -rT /artifacts/bin/coreclr/..Release /bin/Release///publish
+ cp /artifacts/bin/coreclr/..Debug/libclrjit.so /bin/Release///publish
```
* Set the configuration knobs you need (see below) and run your published app. The info you want should be dumped to stdout.
@@ -98,21 +98,21 @@ The first thing to do is setup the .NET Core app we want to dump. Here are the s
## Setting configuration variables
-The behavior of the JIT can be controlled via a number of configuration variables. These are declared in [inc/clrconfigvalues.h](/src/coreclr/inc/clrconfigvalues.h) and [jit/jitconfigvalues.h](/src/coreclr/jit/jitconfigvalues.h). When used as an environment variable, the string name generally has `COMPlus_` prepended. When used as a registry value name, the configuration name is used directly.
+The behavior of the JIT can be controlled via a number of configuration variables. These are declared in [inc/clrconfigvalues.h](/src/coreclr/inc/clrconfigvalues.h) and [jit/jitconfigvalues.h](/src/coreclr/jit/jitconfigvalues.h). When used as an environment variable, the string name generally has `DOTNET_` prepended. When used as a registry value name, the configuration name is used directly.
These can be set in one of three ways:
-* Setting the environment variable `COMPlus_`. For example, the following will set the `JitDump` flag so that the compilation of all methods named `Main` will be dumped:
+* Setting the environment variable `DOTNET_`. For example, the following will set the `JitDump` flag so that the compilation of all methods named `Main` will be dumped:
```shell
# Windows
- set COMPlus_JitDump=Main
+ set DOTNET_JitDump=Main
# Powershell
- $env:COMPlus_JitDump="Main"
+ $env:DOTNET_JitDump="Main"
# Unix
- export COMPlus_JitDump=Main
+ export DOTNET_JitDump=Main
```
* *Windows-only:* Setting the registry key `HKCU\Software\Microsoft\.NETFramework`, Value ``, type `REG_SZ` or `REG_DWORD` (depending on the flag).
@@ -120,50 +120,74 @@ These can be set in one of three ways:
## Specifying method names
-The complete syntax for specifying a single method name (for a flag that takes a method name, such as `COMPlus_JitDump`) is:
+Some environment variables such as `DOTNET_JitDump` take a set of patterns specifying method names. The matching works in the following way:
+* A method set string is a space-separated list of patterns. Patterns can arbitrarily contain both '*' (match any characters) and '?' (match any 1 character).
+* The string matched against depends on characters in the pattern:
+ + If the pattern contains a ':' character, the string matched against is prefixed by the class name and a colon
+ + If the pattern contains a '(' character, the string matched against is suffixed by the signature
+ + If the class name (part before colon) contains a '[', the class contains its generic instantiation
+ + If the method name (part between colon and '(') contains a '[', the method contains its generic instantiation
+In particular, the matching is done against strings of the following format which coincides with how the JIT displays method signatures (so these can be copy pasted into the environment variable).
```
-[[.]::][([)]
+[ClassName[Instantiation]:]MethodName[Instantiation][()]
```
-For example
+For example, consider the following:
+```csharp
+namespace MyNamespace
+{
+ public class C
+ {
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ public void M(T1 arg1, T2 arg2, T3 arg3, T4 arg4)
+ {
+ }
+ }
+}
-```
-System.Object::ToString(System.Object)
+new C().M(default, default, default, default); // compilation 1
+new C().M(default, default, default, default); // compilation 2
```
-The namespace, class name, and argument types are optional, and if they are not present, default to a wildcard. Thus stating:
+The full names of these instantiations are the following, as printed by `DOTNET_JitDisasmSummary`:
```
-Main
+MyNamespace.C`2[byte,System.__Canon]:M[int,System.__Canon](byte,System.__Canon,int,System.__Canon)
+MyNamespace.C`2[int,int]:M[int,int](int,int,int,int)
```
+Note that ``C`2`` here is the name put into metadata by Roslyn; the suffix is not added by RyuJIT.
+For Powershell users keep in mind that backtick is the escape character and itself has to be escaped via double backtick.
-will match all methods named Main from any class and any number of arguments.
-
-`` is a comma separated list of type names. Note that presently only the number of arguments and not the types themselves are used to distinguish methods. Thus, `Main(Foo, Bar)` and `Main(int, int)` will both match any main method with two arguments.
+The following strings will match both compilations:
+```
+M
+*C`2:M
+*C`2[*]:M[*](*)
+MyNamespace.C`2:M
+```
-The wildcard character `*` can be used for `` and ``. In particular `*` by itself indicates every method.
+The following match only the first compilation:
+```
+M[int,*Canon]
+MyNamespace.C`2[byte,*]:M
+M(*Canon)
+```
## Useful COMPlus variables
Below are some of the most useful `COMPlus` variables. Where {method-list} is specified in the list below, you can supply a space-separated list of either fully-qualified or simple method names (the former is useful when running something that has many methods of the same name), or you can specify `*` to mean all methods.
-* `COMPlus_JitDump`={method-list} – dump lots of useful information about what the JIT is doing. See [Reading a JitDump](ryujit-overview.md#reading-a-jitdump) for more on how to analyze this data.
-* `COMPlus_JitDumpASCII`={1 or 0} - Specifies whether the JIT dump should be ASCII only (Defaults to 1). Disabling this generates more readable expression trees.
-* `COMPlus_JitDisasm`={method-list} – dump a disassembly listing of each method.
-* `COMPlus_JitDiffableDasm` – set to 1 to tell the JIT to avoid printing things like pointer values that can change from one invocation to the next, so that the disassembly can be more easily compared.
-* `COMPlus_JitGCDump`={method-list} – dump the GC information.
-* `COMPlus_JitUnwindDump`={method-list} – dump the unwind tables.
-* `COMPlus_JitEHDump`={method-list} – dump the exception handling tables.
-* `COMPlus_JitTimeLogFile`={file name} – this specifies a log file to which timing information is written.
-* `COMPlus_JitTimeLogCsv`={file name} – this specifies a log file to which summary timing information can be written, in CSV form.
+* `DOTNET_JitDump`={method-list} – dump lots of useful information about what the JIT is doing. See [Reading a JitDump](ryujit-overview.md#reading-a-jitdump) for more on how to analyze this data.
+* `DOTNET_JitDumpASCII`={1 or 0} - Specifies whether the JIT dump should be ASCII only (Defaults to 1). Disabling this generates more readable expression trees.
+* `DOTNET_JitDisasm`={method-list} – dump a disassembly listing of each method.
+* `DOTNET_JitDisasmDiffable` – set to 1 to tell the JIT to avoid printing things like pointer values that can change from one invocation to the next, so that the disassembly can be more easily compared.
+* `DOTNET_JitGCDump`={method-list} – dump the GC information.
+* `DOTNET_JitUnwindDump`={method-list} – dump the unwind tables.
+* `DOTNET_JitEHDump`={method-list} – dump the exception handling tables.
+* `DOTNET_JitTimeLogFile`={file name} – this specifies a log file to which timing information is written.
+* `DOTNET_JitTimeLogCsv`={file name} – this specifies a log file to which summary timing information can be written, in CSV form.
## Dumping native images
-If you followed the tutorial above and ran the sample app, you may be wondering why the disassembly for methods like `Substring` didn't show up in the output. This is because `Substring` lives in mscorlib, which (by default) is compiled ahead-of-time to a native image via [crossgen](/docs/workflow/building/coreclr/crossgen.md). Telling crossgen to dump the info works slightly differently.
-
-* First, perform a debug build of the native parts of the repo: `build skipmscorlib skiptests`.
- * This should produce the binaries for crossgen in `artifacts/Product/..Debug`.
-* Next, set the appropriate configuration knob for the info you want to dump. Usually, this is just the same as the corresponding JIT knob, except prefixed with `Ngen`; for example, to show the disassembly listing of a particular method you would `set COMPlus_NgenDisasm=Foo`.
-* Run crossgen on the assembly you want to dump: `crossgen MyLibrary.dll`
- * If you want to see the output of crossgen specifically for mscorlib, invoke `build skipnative skiptests` from the repo root. The dumps should be written to a file in `artifacts/Logs` that you can just view.
+If you followed the tutorial above and ran the sample app, you may be wondering why the disassembly for methods like `Substring` didn't show up in the output. This is because `Substring` lives in System.Private.CoreLib.dll, which (by default) is compiled ahead-of-time via crossgen2. Telling crossgen2 to dump the info works slightly differently in that it has to be specified on the command line instead. For more information, see the [debugging-aot-compilers](/docs/workflow/debugging/coreclr/debugging-aot-compilers.md) document.
diff --git a/docs/design/coreclr/profiling/Profiler Attach on CoreCLR.md b/docs/design/coreclr/profiling/Profiler Attach on CoreCLR.md
index 6a724e4fdc2f2f..2e80aeca5a71e0 100644
--- a/docs/design/coreclr/profiling/Profiler Attach on CoreCLR.md
+++ b/docs/design/coreclr/profiling/Profiler Attach on CoreCLR.md
@@ -19,7 +19,7 @@ This method returns a status HR following the usual convention, 0 (S_OK) means a
## What if you can't run managed code in your trigger process?
-If you are unable to run managed code as part of your trigger process, it is still possible to request a profiler attach. The spec for the diagnostics port is located [here](https://github.com/dotnet/diagnostics/blob/master/documentation/design-docs/ipc-protocol.md).
+If you are unable to run managed code as part of your trigger process, it is still possible to request a profiler attach. The spec for the diagnostics port is located [here](https://github.com/dotnet/diagnostics/blob/main/documentation/design-docs/ipc-protocol.md).
You will have to do the following (according to the above spec):
1) Open the appropriate channel - domain socket on Linux and a named pipe on Windows
diff --git a/docs/design/features/DynamicPgo-InstrumentedTiers-Plaintext-opt.png b/docs/design/features/DynamicPgo-InstrumentedTiers-Plaintext-opt.png
new file mode 100644
index 00000000000000..c795c7d067b674
Binary files /dev/null and b/docs/design/features/DynamicPgo-InstrumentedTiers-Plaintext-opt.png differ
diff --git a/docs/design/features/DynamicPgo-InstrumentedTiers-Plaintext.png b/docs/design/features/DynamicPgo-InstrumentedTiers-Plaintext.png
new file mode 100644
index 00000000000000..780227d2a3f483
Binary files /dev/null and b/docs/design/features/DynamicPgo-InstrumentedTiers-Plaintext.png differ
diff --git a/docs/design/features/DynamicPgo-InstrumentedTiers-ilsize-histogram1.png b/docs/design/features/DynamicPgo-InstrumentedTiers-ilsize-histogram1.png
new file mode 100644
index 00000000000000..9eb74ee70a2414
Binary files /dev/null and b/docs/design/features/DynamicPgo-InstrumentedTiers-ilsize-histogram1.png differ
diff --git a/docs/design/features/DynamicPgo-InstrumentedTiers-msft-service.png b/docs/design/features/DynamicPgo-InstrumentedTiers-msft-service.png
new file mode 100644
index 00000000000000..be6e94e8d826f4
Binary files /dev/null and b/docs/design/features/DynamicPgo-InstrumentedTiers-msft-service.png differ
diff --git a/docs/design/features/DynamicPgo-InstrumentedTiers.md b/docs/design/features/DynamicPgo-InstrumentedTiers.md
new file mode 100644
index 00000000000000..4cac91f8882e02
--- /dev/null
+++ b/docs/design/features/DynamicPgo-InstrumentedTiers.md
@@ -0,0 +1,450 @@
+# Dynamic PGO: Instrumented Tiers
+
+[#70941](https://github.com/dotnet/runtime/pull/70941) introduced a new tier to instrument only hot code. It's mainly done to address the following problems:
+1) R2R code should still benefit from Dynamic PGO despite being not instrumented in the first place.
+2) Overhead from the instrumentation in Tier0 should not slow startup down (compared to the mode where DynamicPGO is disabled) and methods which never reach the next tier should not be instrumented at all.
+
+To address these problems the following workflow was introduced:
+
+```mermaid
+flowchart
+ prestub(.NET Function) -->|Compilation| hasAO{"Marked with
[AggressiveOpts]?"}
+ hasAO-->|Yes|tier1ao["JIT to Tier1
(no dynamic profile data)"]
+ hasAO-->|No|hasR2R
+ hasR2R{"Is prejitted (R2R)?"} -->|No| tier000
+
+ tier000["JIT to Tier0
(not optimized, not instrumented,
with patchpoints)"]-->|Running...|ishot555
+ ishot555{"Is hot?
(called >30 times)"}
+ ishot555-.->|No,
keep running...|ishot555
+ ishot555-->|Yes|tier0
+
+ hasR2R -->|Yes| R2R
+ R2R["Use R2R code
(optimized, not instrumented,
no patchpoints)"] -->|Running...|ishot1
+ ishot1{"Is hot?
(called >30 times)"}-.->|No,
keep running...|ishot1
+ ishot1--->|"Yes"|tier1inst
+
+ tier0["JIT to Tier0Instrumented
(not optimized, instrumented,
with patchpoints)"]-->|Running...|ishot5
+ tier1pgo2["JIT to Tier1
(optimized with profile data)"]
+
+ tier1inst["JIT to Tier1Instrumented
(optimized, instrumented,
no patchpoints)"]
+ tier1inst-->|Running...|ishot5
+ ishot5{"Is hot?
(called >30 times)"}-->|Yes|tier1pgo2
+ ishot5-.->|No,
keep running...|ishot5
+```
+(_VSCode doesn't support mermaid diagrams out of the box, consider installing external add-ins_)
+
+Now, any code is eligible for Dynamic PGO if it's hot enough. It's easier to explain this on a concrete example:
+
+```csharp
+class MyDisposableImpl : IDisposable
+{
+ public void Dispose() => Console.WriteLine("disposed");
+}
+
+class Program
+{
+ static void Main()
+ {
+ for (int i = 0; i < 100; i++)
+ {
+ CallDispose(new MyDisposableImpl());
+ // Give VM some time to promote CallDispose
+ Thread.Sleep(15);
+ }
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ static void CallDispose(IDisposable d) => d?.Dispose(); // virtual (interface) call
+}
+```
+
+The method we'll be inspecting is `CallDispose`. It has an unknown interface call + two branches (the `?` operator).
+
+# Case 1: `CallDispose` is initially prejitted (R2R)
+
+Let's see what happens when the method we're inspecting has an AOT version on start (e.g. our app was published with `/p:PublishReadyToRun=true`):
+
+### 1) R2R version of `CallDispose` is picked up:
+
+```asm
+; Assembly listing for method Program:CallDispose(System.IDisposable)
+; Emitting BLENDED_CODE for X64 CPU with AVX - Windows
+; ReadyToRun compilation
+; optimized code
+; No PGO data
+G_M10906_IG01: ;; offset=0000H
+ 4883EC28 sub rsp, 40
+ ;; size=4 bbWeight=1 PerfScore 0.25
+G_M10906_IG02: ;; offset=0004H
+ 4885C9 test rcx, rcx
+ 740A je SHORT G_M10906_IG04
+ ;; size=5 bbWeight=1 PerfScore 1.25
+G_M10906_IG03: ;; offset=0009H
+ 4C8D1D00000000 lea r11, [(reloc 0x4000000000420240)]
+ 41FF13 call [r11]System.IDisposable:Dispose():this
+ ;; size=10 bbWeight=0.50 PerfScore 1.75
+G_M10906_IG04: ;; offset=0013H
+ 90 nop
+ ;; size=1 bbWeight=1 PerfScore 0.25
+G_M10906_IG05: ;; offset=0014H
+ 4883C428 add rsp, 40
+ C3 ret
+ ;; size=5 bbWeight=1 PerfScore 1.25
+; Total bytes of code 25
+; ============================================================
+```
+
+As we can see from the codegen: it's not instrumented (we never instrument R2R'd code - that is a lot of additional size increase) and is optimized already. The interface call is not devirtualized yet as we don't have any profile for it.
+
+### 2) `CallDispose` is promoted to Tier1Instrumented
+
+ `CallDispose` is invoked more than 30 times so VM "promotes" it to Tier1Instrumented for instrumentation:
+```asm
+; Assembly listing for method Program:CallDispose(System.IDisposable)
+; Emitting BLENDED_CODE for X64 CPU with AVX - Windows
+; Tier-1 compilation
+; optimized code
+; instrumented for collecting profile data
+; No PGO data
+G_M10906_IG01: ;; offset=0000H
+ 56 push rsi
+ 4883EC20 sub rsp, 32
+ 488BF1 mov rsi, rcx
+ ;; size=8 bbWeight=1 PerfScore 1.50
+G_M10906_IG02: ;; offset=0008H
+ 4885F6 test rsi, rsi
+ 7428 je SHORT G_M10906_IG04
+ ;; size=5 bbWeight=1 PerfScore 1.25
+G_M10906_IG03: ;; offset=000DH
+ FF057D366600 inc dword ptr [(reloc 0x7ffbea03b250)]
+ 488BCE mov rcx, rsi
+ 48BA58B203EAFB7F0000 mov rdx, 0x7FFBEA03B258
+ E89B77505F call CORINFO_HELP_CLASSPROFILE32
+ 488BCE mov rcx, rsi
+ 49BB500071E9FB7F0000 mov r11, 0x7FFBE9710050 ; code for System.IDisposable:Dispose():this
+ 41FF13 call [r11]System.IDisposable:Dispose():this
+ ;; size=40 bbWeight=0.50 PerfScore 4.00
+G_M10906_IG04: ;; offset=0035H
+ FF05A5366600 inc dword ptr [(reloc 0x7ffbea03b2a0)]
+ ;; size=6 bbWeight=1 PerfScore 3.00
+G_M10906_IG05: ;; offset=003BH
+ 4883C420 add rsp, 32
+ 5E pop rsi
+ C3 ret
+ ;; size=6 bbWeight=1 PerfScore 1.75
+; Total bytes of code 65
+; ============================================================
+```
+
+The code is optimized, it has a helper call to record types of objects passed to that virtual call (`Dispose()`).
+Also, there are two edge counters (`inc [reloc]`) to get a better understanding which branch is more popular (where d is null or where it is not).
+It is worth noting that we had to instrument **optimized** code here to mitigate two issues:
+1) We don't want to see a significant performance degradation (even temporarily) after fast R2R.
+2) Unoptimized code tends to spawn a lot of new unnecessary jit compilations because it doesn't inline code, even simple getters/setters.
+
+As a downside, the profile is less accurate and it doesn't instrument inlinees.
+
+### 3) `CallDispose` is promoted to Tier1
+
+The new code version of `CallDispose` is also invoked >30 times leading to the final promotion to Tier1:
+```asm
+; Assembly listing for method Program:CallDispose(System.IDisposable)
+; Emitting BLENDED_CODE for X64 CPU with AVX - Windows
+; Tier-1 compilation
+; optimized code
+; optimized using profile data
+; with Dynamic PGO: edge weights are valid, and fgCalledCount is 48
+; 0 inlinees with PGO data; 1 single block inlinees; 0 inlinees without PGO data
+G_M10906_IG01: ;; offset=0000H
+ 4883EC28 sub rsp, 40
+ ;; size=4 bbWeight=1 PerfScore 0.25
+G_M10906_IG02: ;; offset=0004H
+ 4885C9 test rcx, rcx
+ 741F je SHORT G_M10906_IG03
+ 48B8688CFBE9FB7F0000 mov rax, 0x7FFBE9FB8C68 ; MyDisposableImpl
+ 483901 cmp qword ptr [rcx], rax
+ 7516 jne SHORT G_M10906_IG05
+ 48B908855A29EE010000 mov rcx, 0x1EE295A8508 ; 'disposed'
+ FF1538535A00 call [System.Console:WriteLine(System.String)]
+ ;; size=36 bbWeight=1 PerfScore 8.75
+G_M10906_IG03: ;; offset=0028H
+ 90 nop
+ ;; size=1 bbWeight=1 PerfScore 0.25
+G_M10906_IG04: ;; offset=0029H
+ 4883C428 add rsp, 40
+ C3 ret
+ ;; size=5 bbWeight=1 PerfScore 1.25
+G_M10906_IG05: ;; offset=002EH
+ 49BB580071E9FB7F0000 mov r11, 0x7FFBE9710058 ; code for System.IDisposable:Dispose():this
+ 41FF13 call [r11]System.IDisposable:Dispose():this
+ EBEB jmp SHORT G_M10906_IG03
+ ;; size=15 bbWeight=0 PerfScore 0.00
+; Total bytes of code 61
+; ============================================================
+```
+PGO helped us to optimize two things in the final tier:
+1) We know that `d` object is rarely/never null so we mark that path as cold
+2) We know that `d` is mostly/always `MyDisposableImpl` so we optimized an unknown interface call to basically this:
+```csharp
+if (d is MyDisposableImpl)
+ Console.WriteLine("disposed"); // MyDisposableImpl.Dispose inlined
+else
+ d.Dispose(); // fallback, interface call in case if a new type is added/loaded and used here
+```
+There are more things JIT can optimize with help of PGO, e.g. be more aggressive inlining methods on hot paths, etc.
+
+Thus, R2R didn't lead to a missing oportunity to run Dynamic PGO here. To summarize what happened with `CallDispose` we can take a look at this part of the diagram:
+```mermaid
+flowchart
+ hasR2R("...") -->|Yes| R2R
+ R2R["Use R2R code
(optimized, not instrumented,
no patchpoints)"] -->|Running...|ishot1
+ ishot1{"Is hot?
(called >30 times)"}-.->|No,
keep running...|ishot1
+ ishot1--->|"Yes"|tier1inst
+ tier1pgo2["JIT to Tier1
(optimized with profile data)"]
+ tier1inst["JIT to Tier1Instrumented
(optimized, instrumented,
no patchpoints)"]
+ tier1inst-->|Running...|ishot5
+ ishot5{"Is hot?
(called >30 times)"}-->|Yes|tier1pgo2
+ ishot5-.->|No,
keep running...|ishot5
+```
+
+# Case 2: `CallDispose` is not initially prejitted
+
+### 1) `CallDispose` is compiled to Tier0
+
+Since there is no R2R version for `CallDispose`, VM has to ask JIT to compile a Tier0 version of it as fast as it can (because it needs to execute it and there is no any code version of it available):
+```asm
+; Assembly listing for method Program:CallDispose(System.IDisposable)
+; Emitting BLENDED_CODE for X64 CPU with AVX - Windows
+; Tier-0 compilation
+; MinOpts code
+G_M10906_IG01: ;; offset=0000H
+ 55 push rbp
+ 4883EC20 sub rsp, 32
+ 488D6C2420 lea rbp, [rsp+20H]
+ 48894D10 mov gword ptr [rbp+10H], rcx
+ ;; size=14 bbWeight=1 PerfScore 2.75
+G_M10906_IG02: ;; offset=000EH
+ 48837D1000 cmp gword ptr [rbp+10H], 0
+ 7411 je SHORT G_M10906_IG03
+ 488B4D10 mov rcx, gword ptr [rbp+10H]
+ 49BB78020E3CFC7F0000 mov r11, 0x7FFC3C0E0278 ; code for System.IDisposable:Dispose():this
+ 41FF13 call [r11]System.IDisposable:Dispose():this
+ ;; size=24 bbWeight=1 PerfScore 7.25
+G_M10906_IG03: ;; offset=0026H
+ 90 nop
+ ;; size=1 bbWeight=1 PerfScore 0.25
+G_M10906_IG04: ;; offset=0027H
+ 4883C420 add rsp, 32
+ 5D pop rbp
+ C3 ret
+ ;; size=6 bbWeight=1 PerfScore 1.75
+; Total bytes of code 45
+; ============================================================
+```
+
+The codegen is not optimized and doesn't have any instrumentation (to avoid spending time on it for methods which will never make it to Tier1 - as the practice shows: only 10-20% of methods make it to Tier1)
+
+### 2) `CallDispose` is promoted to Tier0Instrumented
+
+`CallDispose` is invoked more than 30 times and that triggers promotion to Tier0Instrumented (when VM is busy serving other Tier0 requests):
+```asm
+; Assembly listing for method Program:CallDispose(System.IDisposable)
+; Emitting BLENDED_CODE for X64 CPU with AVX - Windows
+; Tier-0 compilation
+; MinOpts code
+; instrumented for collecting profile data
+G_M10906_IG01: ;; offset=0000H
+ 55 push rbp
+ 4883EC30 sub rsp, 48
+ 488D6C2430 lea rbp, [rsp+30H]
+ 33C0 xor eax, eax
+ 488945F8 mov qword ptr [rbp-08H], rax
+ 488945F0 mov qword ptr [rbp-10H], rax
+ 48894D10 mov gword ptr [rbp+10H], rcx
+ ;; size=24 bbWeight=1 PerfScore 5.00
+G_M10906_IG02: ;; offset=0018H
+ 48837D1000 cmp gword ptr [rbp+10H], 0
+ 743A je SHORT G_M10906_IG03
+ FF05832A7500 inc dword ptr [(reloc 0x7ffc3cbac2f8)]
+ 488B4D10 mov rcx, gword ptr [rbp+10H]
+ 48894DF8 mov gword ptr [rbp-08H], rcx
+ 488B4DF8 mov rcx, gword ptr [rbp-08H]
+ 48BA00C3BA3CFC7F0000 mov rdx, 0x7FFC3CBAC300
+ E8F05A455F call CORINFO_HELP_CLASSPROFILE32
+ 488B4DF8 mov rcx, gword ptr [rbp-08H]
+ 48894DF0 mov gword ptr [rbp-10H], rcx
+ 488B4DF0 mov rcx, gword ptr [rbp-10H]
+ 49BB90020E3CFC7F0000 mov r11, 0x7FFC3C0E0290 ; code for System.IDisposable:Dispose():this
+ disposed
+ 41FF13 call [r11]System.IDisposable:Dispose():this
+ ;; size=65 bbWeight=1 PerfScore 16.50
+G_M10906_IG03: ;; offset=0059H
+ FF05992A7500 inc dword ptr [(reloc 0x7ffc3cbac348)]
+ ;; size=6 bbWeight=1 PerfScore 3.00
+G_M10906_IG04: ;; offset=005FH
+ 4883C430 add rsp, 48
+ 5D pop rbp
+ C3 ret
+ ;; size=6 bbWeight=1 PerfScore 1.75
+; Total bytes of code 101
+; ============================================================
+```
+Now the whole method is compiled to Tier0 with instrumentation. No optimizations.
+We decided to promote hot Tier0 to Tier0Instrumented without optimizations for the following reasons:
+* We won't notice a big performance regression from transitioning from Tier0 to Tier0Instrumented
+* Tier0Instrumented is faster to compile
+* Its profile is more accurate - better performance for Tier1
+
+### 3) ``CallDispose` is promoted to Tier1
+
+``CallDispose` method is invoked more than 30 times again and this time it triggers the final promotion to the last tier - Tier1:
+```asm
+; Assembly listing for method Program:CallDispose(System.IDisposable)
+; Emitting BLENDED_CODE for X64 CPU with AVX - Windows
+; Tier-1 compilation
+; optimized code
+; optimized using profile data
+; with Dynamic PGO: edge weights are valid, and fgCalledCount is 47
+; 0 inlinees with PGO data; 1 single block inlinees; 0 inlinees without PGO data
+G_M10906_IG01: ;; offset=0000H
+ 4883EC28 sub rsp, 40
+ ;; size=4 bbWeight=1 PerfScore 0.25
+G_M10906_IG02: ;; offset=0004H
+ 4885C9 test rcx, rcx
+ 741F je SHORT G_M10906_IG04
+ ;; size=5 bbWeight=1 PerfScore 1.25
+G_M10906_IG03: ;; offset=0009H
+ 48B8E89FB33CFC7F0000 mov rax, 0x7FFC3CB39FE8 ; MyDisposableImpl
+ 483901 cmp qword ptr [rcx], rax
+ 7516 jne SHORT G_M10906_IG06
+ 48B9507B2D45C0020000 mov rcx, 0x2C0452D7B50 ; 'disposed'
+ FF1560346900 call [System.Console:WriteLine(System.String)]
+ ;; size=31 bbWeight=1.02 PerfScore 7.66
+G_M10906_IG04: ;; offset=0028H
+ 90 nop
+ ;; size=1 bbWeight=1.02 PerfScore 0.26disposed
+G_M10906_IG05: ;; offset=0029H
+ 4883C428 add rsp, 40
+ C3 ret
+ ;; size=5 bbWeight=1.02 PerfScore 1.28
+G_M10906_IG06: ;; offset=002EH
+ 49BB98020E3CFC7F0000 mov r11, 0x7FFC3C0E0298 ; code for System.IDisposable:Dispose():this
+ 41FF13 call [r11]System.IDisposable:Dispose():this
+ EBEB jmp SHORT G_M10906_IG04
+ ;; size=15 bbWeight=0 PerfScore 0.00
+; Total bytes of code 61
+; ============================================================
+```
+Just like in case of initially prejitte app, PGO helped us to optimize two things in the final tier:
+1) We know that `d` object is rarely/never null so we mark that path as cold
+2) We know that `d` is mostly/always `MyDisposableImpl` so we optimized an unknown interface call to basically this:
+```csharp
+if (d is MyDisposableImpl)
+ Console.WriteLine("disposed"); // MyDisposableImpl.Dispose inlined
+else
+ d.Dispose(); // fallback, interface call in case if a new type is added/loaded and used here
+```
+
+Again, to summarize the workflow for non-prejitted case let's take a look at this branch of the diagram:
+
+```mermaid
+flowchart
+ hasR2R("...") -->tier000
+ tier000["JIT to Tier0
(not optimized, not instrumented,
with patchpoints)"]-->|Running...|ishot555
+ ishot555{"Is hot?
(called >30 times)"}
+ ishot555-.->|No,
keep running...|ishot555
+ ishot555-->|Yes|tier0
+ tier0["JIT to Tier0Instrumented
(not optimized, instrumented,
with patchpoints)"]-->|Running...|ishot5
+ tier1pgo2["JIT to Tier1
(optimized with profile data)"]
+ ishot5{"Is hot?
(called >30 times)"}-->|Yes|tier1pgo2
+ ishot5-.->|No,
keep running...|ishot5
+```
+
+# Working Set Impact
+
+The general rule of thumb that only 10-20% of methods make it to Tier1 and about to 40-60% of all methods are less than 8 bytes of IL (e.g., getters/setters) so we're effectively double the size of Tier1 with this approach (including call counting stubs, etc.). How bad it can be compared to overall working set in various apps? let's consider these two examples:
+
+## 1) A large web app (internal Microsoft service)
+
+| Metric | Number of methods | Share, % | Total size, MB | Share, % |
+|------------------|-------------------|----------|----------------|----------|
+| **Tier0** | 115862 | 59.36% | 60.06 | 83.89% |
+| **Tier1** | 30942 | 15.85% | 8.22 | 11.48% |
+| **FullOpts** | 48384 | 24.79% | 3.26 | 4.55% |
+| **Contains OSR** | 55 | 0.03% | 0.06 | 0.08% |
+| **Total jitted** | 195188 | 100.00% | 71.60 | 100.00% |
+
+
+
+
+In this app Tier1 code occupies 8.22MB in the loader heap (we can add a few megabytes on top of it for call counting stubs, jump-stubs, etc.) meaning that Instrumented tier is expected to add a similar amount (~13MB). The total working set of the service is 10GB so Instrumented tiers contribute ~0.1% of that. We're adding +30k new jit compilations which we can fully compensate with https://github.com/dotnet/runtime/issues/76402 work to avoid potential problems connected with too big queues of methods pending call counting installation/promotions to tier1.
+
+## 2) A desktop OSS application [AvaloniaILSpy](https://github.com/icsharpcode/AvaloniaILSpy)
+
+`ReadyToRun=0`:
+
+| Metric | Number of methods | % | Total size, MB | % |
+|------------------|-------------------|----------|----------------|----------|
+| **Tier0** | 19968 | 79.09% | 4.58 | 84.69% |
+| **Tier1** | 4978 | 19.72% | **0.75** | 13.90% |
+| **FullOpts** | 300 | 1.19% | 0.08 | 1.39% |
+| **OSR** | 2 | 0.01% | 0.00 | 0.02% |
+| | | | | |
+| **Total** | 25248 | 100.00% | 5.41 | 100.00% |
+
+`ReadyToRun=1`:
+
+| Metric | Number of methods | % | Total size, MB | % |
+|------------------|-------------------|----------|----------------|----------|
+| **Tier0** | 4713 | 62.45% | 0.84 | 58.34% |
+| **Tier1** | 2516 | 33.34% | 0.56 | 38.75% |
+| **FullOpts** | 318 | 4.21% | 0.04 | 2.92% |
+| **OSR** | 0 | 0.00% | 0.00 | 0.00% |
+| | | | | |
+| **Total** | 7547 | 100.00% | 1.44 | 100.00% |
+
+In case of AvaloniaILSpy, instrumented tiers add around 1MB (stubs included) to the total working set and around 5k of new jit compilations.
+
+# Start time and performance impact
+
+## TechEmpower
+
+Overall, it is expected from instrumented tiers to improve startup speed when Dynamic PGO is enabled and improve performance (e.g. Latency/Throughput) for prejitted code. A good example demonstrating both is the following TechEmpower benchmark (plaintext-plaintext):
+
+
+
+Legend:
+* Red - `DOTNET_TieredPGO=0`, `DOTNET_ReadyToRun=1`
+* Black - `DOTNET_TieredPGO=1`, `DOTNET_ReadyToRun=1`
+* Yellow - `DOTNET_TieredPGO=1`, `DOTNET_ReadyToRun=0`
+
+Yellow line provides the highest level of performance (RPS) by sacrificing start up speed (and, hence, time it takes to process the first request). It happens because the benchmark is quite simple and most of its code is already prejitted so we can only instrument it when we completely drop R2R and compile everything from scratch. It also explains why the black line (when we enable Dynamic PGO but still rely on R2R) didn't really show a lot of improvements. With the separate Instrumented tiers for hot R2R we achieve "Yellow"-level of performance while maintaining the same start up speed as it was before. Also, for the mode where we have to compile a lot of code to Tier0, switching to "instrument only hot Tier0 code" strategy shows ~8% time-to-first-request reduction across all TE benchmarks.
+
+
+(_Predicted results according to local runs_. **UPD**: we observed the same on real benchmarks - [aka.ms/aspnet/benchmarks](aka.ms/aspnet/benchmarks))
+
+## AvaloniaILSpy
+
+For this experiment we modified the source code of the app to send an event once view is completely loaded to measure the real start time:
+
+| Mode | Start time |
+|----------------------------|------------|
+| R2R=0 | 2.03s |
+| R2R=0, PGO=1 | 2.26s |
+| R2R=0, PGO=1, Instr. Tiers | 2.03s |
+
+As we can see, Instrumented tiers help to mitigate the start time regression from Dynamic PGO.
+
+## Microsoft internal service
+
+Throughput of the service after startup:
+
+
+
+X axis - time in seconds after start, Y axis - Throughput in MB/s.
+
+Here Dynamic PGO without instrumented tiers (red line) is not able to show benefits because the service is prejitted thus prejitted code doesn't benefit from Dynamic PGO. Instrumented tiers help with that by instrumenting hot R2R code to achieve the best performance, hence, the throughput is higher (green line).
+
+## Known limitations
+* Methods with loop bypass non-instrumented Tier0 and are promoted to Instrumented Tier if they're eligible for OSR - we want to avoid cases where a cold method with a hot loop won't benefit from PGO because it itself won't be ever promoted, only the loop body part (via OSR). See https://github.com/dotnet/runtime/pull/81051 for more details.
+* Instrumentation after R2R is less efficient compared to Tier0 IL-only because of optimizations and e.g. inlinees aren't instrumented.
diff --git a/docs/design/features/DynamicPgo.md b/docs/design/features/DynamicPgo.md
index 464e87950cbece..2bd227d9618b8e 100644
--- a/docs/design/features/DynamicPgo.md
+++ b/docs/design/features/DynamicPgo.md
@@ -257,9 +257,9 @@ If we confidently could identify the top N% of methods (say 5%) then one could i
R2R methods bypass Tier0 and so don't get instrumentation in the current TieredPGO prototype. We probably don't want to instrument the code in the R2R image. And many of these R2R methods are key framework methods that are important for performance. So we need to find a way to get data for these methods.
There are a few basic ideas:
-* Leverage IBC. If there is IBC data in the R2R image then we can make that data available to the JIT. It may not be as relevant as in-process collected data, but it's quite likely better than synthetic data or no data.
-* Sampled instrumentation for R2R methods. Produce an instrumented version and run it every so often before the method gets promoted to Tier1. This may be costly, especially if we have to use unoptimized methods for instrumentation, as we'll do quite a bit of extra jitting.
-* Make R2R methods go through Tier0 on their way to Tier1. Likely introduces an unacceptable perf hit.
+1) Leverage IBC. If there is IBC data in the R2R image then we can make that data available to the JIT. It may not be as relevant as in-process collected data, but it's quite likely better than synthetic data or no data.
+2) Sampled instrumentation for R2R methods. Produce an instrumented version and run it every so often before the method gets promoted to Tier1. This may be costly, especially if we have to use unoptimized methods for instrumentation, as we'll do quite a bit of extra jitting.
+3) Make R2R methods go through a separate instrumentation tier on their way to Tier1, see [DynamicPgo-InstrumentedTiers.md](DynamicPgo-InstrumentedTiers.md) prototype.
#### Dynamic PGO, QuickJitForLoops, OSR
diff --git a/docs/design/features/Linux-Hugepage-Crossgen2.md b/docs/design/features/Linux-Hugepage-Crossgen2.md
index 32083cc39eba83..16dbe18cf32bf0 100644
--- a/docs/design/features/Linux-Hugepage-Crossgen2.md
+++ b/docs/design/features/Linux-Hugepage-Crossgen2.md
@@ -15,7 +15,7 @@ images using the hugetlbfs. Doing some requires several steps.
- This will increase the size of the image by up to 5 * the specified alignment. Typical increases will be more similar to 3 * the specified alignment
2. The composite image must be copied into a hugetlbfs filesystem which is visible to the .NET process instead of the composite image being loaded from the normal path.
- IMPORTANT: The composite image must NOT be located in the normal path next to the application binary, or that file will be used instead of the huge page version.
- - The environment variable `COMPlus_NativeImageSearchPaths` must be set to point at the location of the hugetlbfs in use. For instance, `COMPlus_NativeImageSearchPaths` might be set to `/var/lib/hugetlbfs/user/USER/pagesize-2MB`
+ - The environment variable `DOTNET_NativeImageSearchPaths` must be set to point at the location of the hugetlbfs in use. For instance, `DOTNET_NativeImageSearchPaths` might be set to `/var/lib/hugetlbfs/user/USER/pagesize-2MB`
- As the cp command does not support copying into a hugetlbfs due to lack of support for the write syscall in that file system, a custom copy application must be used. A sample application that may be used to perform this task has a source listing in Appendix A.
3. The machine must be configured to have sufficient huge pages available in the appropriate huge page pool. The memory requirements of huge page PE loading are as follows.
- Sufficient pages to hold the unmodified copy of the composite image in the hugetlbfs. These pages will be used by the initial copy which emplaces the composite image into huge pages.
diff --git a/docs/design/features/OsrDetailsAndDebugging.md b/docs/design/features/OsrDetailsAndDebugging.md
index 1b1303eccb402d..3ca35c2b9198eb 100644
--- a/docs/design/features/OsrDetailsAndDebugging.md
+++ b/docs/design/features/OsrDetailsAndDebugging.md
@@ -172,7 +172,7 @@ During the patchpoint phase, if any block was marked, the jit adds a
new integer local to the method (the patchpoint counter) and adds IR
to initialize the counter on method entry to the value of
`DOTNET_TC_OnStackReplacement_InitialCounter` (by default this is
-0x1000).
+1000).
At each marked block the JIT adds code to decrement the counter and
conditionally invoke `CORINFO_HELP_PATCHPOINT` if the counter value is zero
@@ -338,7 +338,7 @@ Note if a Tier0 method is recursive and has loops there can be some interesting
### Seeing which OSR methods are created
-* `DOTNET_DumpJittedMethods=1` will specially mark OSR methods with the inspiring IL offsets.
+* `DOTNET_JitDisasmSummary=1` will specially mark OSR methods with the inspiring IL offsets.
For example, running a libraries test with some stressful OSR settings, there ended up being 699 OSR methods jitted out of 160675 total methods. Grepping for OSR in the dump output, the last few lines were:
@@ -492,4 +492,4 @@ In the performance repo configurations we reduce the number of warmup iterations
## References
* [OSR Design Document](https://github.com/dotnet/runtime/blob/main/docs/design/features/OnStackReplacement.md). May be a bit dated in places.
-* [OSR Next Steps Issue](https://github.com/dotnet/runtime/issues/33658). Has a lot of information on issues encountered during bring-up, current limitations, and ideas for things we might revisit.
\ No newline at end of file
+* [OSR Next Steps Issue](https://github.com/dotnet/runtime/issues/33658). Has a lot of information on issues encountered during bring-up, current limitations, and ideas for things we might revisit.
diff --git a/docs/design/features/StringDeduplication.md b/docs/design/features/StringDeduplication.md
index fa69d2c21b8893..496d8252ac8dfb 100644
--- a/docs/design/features/StringDeduplication.md
+++ b/docs/design/features/StringDeduplication.md
@@ -197,7 +197,7 @@ We do have some libraries that rely on `ReferenceEquals`. We need to figure out
- Additional checks in heap verification
-Heap verification will now include checks to verify that no one changes the string content after it’s hash is computed. This can be turned on when a certain level of COMPlus_HeapVerify is specified.
+Heap verification will now include checks to verify that no one changes the string content after it’s hash is computed. This can be turned on when a certain level of DOTNET_HeapVerify is specified.
- Stress mode
diff --git a/docs/design/features/additional-deps.md b/docs/design/features/additional-deps.md
index 26654e186146b2..cd0d55ca575dff 100644
--- a/docs/design/features/additional-deps.md
+++ b/docs/design/features/additional-deps.md
@@ -3,9 +3,9 @@
## Summary
This document describes current (2.0) and proposed (2.1) behavior for "light-up" scenarios regarding additional-deps functionality. The proposed behavior resolves the following issues:
-https://github.com/dotnet/core-setup/issues/3889
+https://github.com/dotnet/runtime/issues/3093
-https://github.com/dotnet/core-setup/issues/3884
+https://github.com/dotnet/runtime/issues/3091
The `deps.json` file format specifies assets including managed assemblies, resource assemblies and native libraries to load.
@@ -102,7 +102,7 @@ The proposed ordering change for 2.1 is:
In addition, the additional-deps will always look for assembly and file version information present in the deps files in order to support "upgrade" scenarios where the additional-deps brings a newer version of a given assembly. Note that these version checks only occur for managed assemblies, not native files nor resource assemblies.
-## 2.1 proposal (add runtimeconfig knob to to disable `%DOTNET_ADDITIONAL_DEPS%`)
+## 2.1 proposal (add runtimeconfig knob to disable `%DOTNET_ADDITIONAL_DEPS%`)
Add an `additionalDepsLookup` option to the runtimeconfig with these values:
diff --git a/docs/design/features/byreflike-generics.md b/docs/design/features/byreflike-generics.md
new file mode 100644
index 00000000000000..d644a25e7f3f22
--- /dev/null
+++ b/docs/design/features/byreflike-generics.md
@@ -0,0 +1,129 @@
+# Generics parameters of ByRefLike types
+
+Using ByRefLike types in Generic parameters is possible by building upon support added for `ref` fields. Scenarios that would benefit most from this are those involving `Span`. For example, consider the following examples:
+
+- `Span` – Represents the general case where a ByRefLike type is used as a Generic parameter. This specific case would be desirable for a more efficient Reflection API.
+- `Span>` – Nested `Span` types would be of benefit in the parsing result of strings.
+
+## Runtime impact
+
+Supporting ByRefLike type as Generic parameters will impact the following IL instructions:
+
+- `box` – Types with ByRefLike parameters used in fields cannot be boxed.
+- `stsfld` / `ldsfld` – Type fields of a ByRefLike parameter cannot be marked `static`.
+- `newarr` / `stelem` / `ldelem` / `ldelema` – Arrays are not able to contain ByRefLike types.
+ - `newobj` – For multi-dimensional array construction.
+- `constrained.callvirt` – If this IL sequence resolves to a method implemented on `object` or default interface method, an error will occur during the attempt to box the instance.
+
+If any of the above instructions are attempted to be used with a ByRefLike type, the runtime will throw an `InvalidProgramException`. Sequences involving some of the above instructions are considered optimizations and represent cases that will remain valid regardless of a `T` being ByRefLike. See "Special IL Sequences" section below for details.
+
+The following instructions are already set up to support this feature since their behavior will fail as currently defined due to the inability to box a ByRefLike type.
+
+- `throw` – Requires an object reference to be on stack, which can never be a ByRefLike type.
+- `unbox` / `unbox.any` – Requires an object reference to be on stack, which can never be a ByRefLike type.
+- `isinst` – Will always place `null` on stack.
+- `castclass` – Will always throw `InvalidCastException`.
+
+The expansion of ByRefLike types as Generic parameters does not relax restrictions on where ByRefLike types can be used. When `T` is ByRefLike, the use of `T` as a field will require the enclosing type to be ByRefLike.
+
+## API Proposal
+
+Support for the following will be indicated by a new property. For .NET 7, the feature will be marked with `RequiresPreviewFeaturesAttribute` to indicate it is in [preview](https://github.com/dotnet/designs/blob/main/accepted/2021/preview-features/preview-features.md).
+
+```diff
+namespace System.Runtime.CompilerServices
+{
+ public static partial class RuntimeFeature
+ {
++ ///
++ /// Represents a runtime feature where byref-like types can be used in Generic parameters.
++ ///
++ public const string GenericsAcceptByRefLike = nameof(GenericsAcceptByRefLike);
+ }
+}
+```
+
+The compiler will need an indication for existing troublesome APIs where ByRefLike types will be permissable, but where the failure will be handled at runtime. An attribute will be created and added to these APIs.
+
+```csharp
+namespace System.Runtime.CompilerServices
+{
+ ///
+ /// Indicates to the compiler that constraint checks should be suppressed
+ /// and will instead be enforced at run-time.
+ ///
+ [AttributeUsage(AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property)]
+ internal sealed class SuppressConstraintChecksAttribute : Attribute
+ { }
+}
+```
+
+Troublesome APIs:
+
+- [`Span`](https://docs.microsoft.com/dotnet/api/system.span-1)
+ - `public Span(T[]? array);`
+ - `public Span(T[]? array, int start, int length);`
+ - `public T[] ToArray();`
+ - `public static implicit operator Span(ArraySegment segment);`
+ - `public static implicit operator Span(T[]? array);`
+- [`ReadOnlySpan`](https://docs.microsoft.com/dotnet/api/system.readonlyspan-1)
+ - `public ReadOnlySpan(T[]? array);`
+ - `public ReadOnlySpan(T[]? array, int start, int length);`
+ - `public T[] ToArray();`
+ - `public static implicit operator ReadOnlySpan(ArraySegment segment);`
+ - `public static implicit operator ReadOnlySpan(T[]? array);`
+
+A new `GenericParameterAttributes` value will be defined which also represents metadata defined in the `CorGenericParamAttr` enumeration.
+
+```diff
+namespace System.Reflection
+{
+ [Flags]
+ public enum GenericParameterAttributes
+ {
++ AcceptByRefLike = 0x0020
+ }
+}
+```
+
+```diff
+typedef enum CorGenericParamAttr
+{
++ gpAcceptByRefLike = 0x0020 // type argument can be ByRefLike
+} CorGenericParamAttr;
+```
+
+The expansion of metadata will impact at least the following:
+
+- ILDasm/ILAsm/`System.Reflection.Metadata`/`System.Reflection.Emit` – https://github.com/dotnet/runtime
+- Cecil – https://github.com/jbevain/cecil
+- IL Trimmer – https://github.com/dotnet/runtime/tree/main/src/tools/illink
+- F# – https://github.com/fsharp/fsharp
+- C++/CLI – The MSVC team
+
+## Semantic Proposal
+
+An API that is a JIT-time intrinsic will be needed to determine if a parameter is ByRefLike. This API would represent a check to occur at JIT time to avoid taking paths that would be invalid for some values of `T`. The existing `Type.IsByRefLike` property will be made an intrinsic (e.g., `typeof(T).IsByRefLike`).
+
+For dispatch to object implemented methods and to default interface methods, the behavior shall be that an `InvalidProgramException` should be thrown. The JIT will insert the following IL at code-gen time.
+
+```
+newobj instance void System.InvalidProgramException::.ctor()
+throw
+```
+
+Adding `gpAcceptByRefLike` to the metadata of a Generic parameter will be considered a non-breaking binary change.
+
+Enumerating of constructors/methods on `Span` and `ReadOnlySpan` may throw `TypeLoadException` if `T` is a ByRefLike type. See "Troublesome APIs" above for the list of APIs that cause this condition.
+
+## Special IL Sequences
+
+The following are IL sequences involving the `box` instruction. They are used for common C# language constructs and shall continue to be valid, even with ByRefLike types, in cases where the result can be computed at JIT time and elided safely. These sequences must now be elided when the target type is ByRefLike. The conditions where each sequence is elided are described below and each condition will be added to the ECMA-335 addendum.
+
+`box` ; `unbox.any` – The box target type is equal to the unboxed target type.
+
+`box` ; `br_true/false` – The box target type is non-`Nullable`.
+
+`box` ; `isinst` ; `unbox.any` – The box, `isint`, and unbox target types are all equal.
+
+`box` ; `isinst` ; `br_true/false` – The box target type is equal to the unboxed target type or the box target type is `Nullable` and target type equalities can be computed.
diff --git a/docs/design/features/cet-feature.md b/docs/design/features/cet-feature.md
new file mode 100644
index 00000000000000..11ca410a940252
--- /dev/null
+++ b/docs/design/features/cet-feature.md
@@ -0,0 +1,28 @@
+# .NET 7 support for Intel CET shadow stacks (requires Windows)
+
+Intel's [Control-flow Enforcement Technology (CET)](https://newsroom.intel.com/editorials/intel-cet-answers-call-protect-common-malware-threats/) is a security feature available in some newer Intel and AMD processors. It adds capabilities to the hardware that protect against some common types of attacks involving control-flow hijacking. With CET shadow stacks, the processor and operating system can track the control flow of calls and returns in a thread in the shadow stack in addition to the data stack, and detect unintended changes to the control flow. The shadow stack is protected from application code memory accesses and helps to defend against attacks involving return-oriented programming (ROP). Windows offers [Hardware-enforced Stack Protection](https://techcommunity.microsoft.com/t5/windows-kernel-internals/understanding-hardware-enforced-stack-protection/ba-p/1247815) for CET shadow stack compatibility and is available as an early preview in [Windows Insider preview builds (Beta channel)](https://insider.windows.com/en-us/understand-flighting).
+
+## Opting into CET shadow stack compatibility
+
+CET compatibility is enabled in .NET 7. In order to receive the security benefits of CET shadow stacks in .NET applications, ensure the following to opt into the feature for an executable:
+- Verify that your processor supports Intel CET. There are Intel and AMD processors currently available with the feature.
+- Ensure that the application is running on a recent build of Windows 11 or Windows Server (Version 22H2) that has Hardware-enforced Stack Protection. The latest versions from [Windows Insider preview builds (Beta channel)](https://insider.windows.com/en-us/understand-flighting) have the feature.
+- Install [.NET 7](https://dotnet.microsoft.com/download/dotnet) RC1 or a more recent release
+- Build or publish your application targeting framework `net7.0` and runtime `win-x64`
+- Open the Windows Security app
+ - Inside the "App & browser control" pane, select "Exploit protection settings"
+ - Under the "Program settings" tab, select "Add program to customize" and "Add by program name"
+ - Enter the file name of your application's executable file and select "Add"
+ - Select the following options and select "Apply":
+
+ 
+ - See the [Developer Guidance for Hardware-enforced Stack Protection](https://techcommunity.microsoft.com/t5/windows-kernel-internals/developer-guidance-for-hardware-enforced-stack-protection/ba-p/2163340) for more details
+- Task Managers Details tab has a new column "Hardware-enforced Stack Protection" that shows the compatibility level of a running process. If CET shadow stacks are enabled for the process, the column for the application should say "Compatible modules only".
+
+## Considerations
+
+CET shadow stack compatibility in .NET is new within 7 and should work for most features an opt-in for x64 applications.
+
+When opted in as above, CET shadow stacks are enabled in compatibility mode. Strict mode should be supported unless the application uses native libraries which are not CET compliant.
+
+CET shadow stack compatibility is available to try for Windows x64 applications (on Windows 11 and Server). Support for the feature on Linux is pending and something we will enable in upcoming .NET releases.
diff --git a/docs/design/features/dotnet-pgo.md b/docs/design/features/dotnet-pgo.md
index 6eac92a7c32830..319b5b99db2843 100644
--- a/docs/design/features/dotnet-pgo.md
+++ b/docs/design/features/dotnet-pgo.md
@@ -32,17 +32,17 @@ Given a project located in the current directory named pgotest, an example workf
```
dotnet build -p:Configuration=Release
-set COMPLUS_TieredPGO=1
-set COMPLUS_TC_QuickJitForLoops=1
-set COMPLUS_TC_CallCountThreshold=10000
-set COMPLUS_ReadyToRun=0
+set DOTNET_TieredPGO=1
+set DOTNET_TC_QuickJitForLoops=1
+set DOTNET_TC_CallCountThreshold=10000
+set DOTNET_ReadyToRun=0
dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:0x1E000080018:4 -- bin\Release\net6.0\pgotest.exe
-set COMPLUS_TieredPGO=
-set COMPLUS_TC_QuickJitForLoops=
-set COMPLUS_TC_CallCountThreshold=
-set COMPLUS_ReadyToRun=
+set DOTNET_TieredPGO=
+set DOTNET_TC_QuickJitForLoops=
+set DOTNET_TC_CallCountThreshold=
+set DOTNET_ReadyToRun=
dotnet-pgo create-mibc --trace trace.nettrace --output trace.mibc
diff --git a/docs/design/features/globalization-icu-wasm.md b/docs/design/features/globalization-icu-wasm.md
new file mode 100644
index 00000000000000..3b1e1ff4e03ff2
--- /dev/null
+++ b/docs/design/features/globalization-icu-wasm.md
@@ -0,0 +1,63 @@
+# WASM Globalization Icu
+
+In WASM applications when [globalization invariant mode](globalization-invariant-mode.md) is switched off, internalization data file is loaded. There are four basic types of these files:
+- `icudt.dat` - full data
+- `icudt_EFIGS.dat` - data for locales: "en-*", "fr-FR", "es-ES", "it-IT", and "de-DE".
+- `icudt_CJK.dat` - for locales: "en" "ja", "ko", and "zh".
+- `icudt_no_CJK.dat` - all locales from `icudt.dat`, excluding "ja", "ko", and "zh".
+
+## Wasm Console, Wasm Browser
+
+We can specify the file we want to load, e.g. `icudt_no_CJK.dat` by adding to .csproj:
+```
+icudt_no_CJK.dat
+```
+Only one value for `WasmIcuDataFileName` can be set. It can also be a custom file, created by the developer. To create a custom ICU file, see `Custom ICU` section below. If no `WasmIcuDataFileName` was specified, the application's culture will be checked and the corresponding file will be loaded, e.g. for `en-US` file `icudt_EFIGS.dat`, and for `zh-CN` - `icudt_CJK.dat`.
+
+## Custom ICU
+
+The easiest way to build ICU is to open https://github.com/dotnet/icu/ it in [Codespaces](docs\workflow\Codespaces.md). See files in https://github.com/dotnet/icu/tree/dotnet/main/icu-filters, and read https://unicode-org.github.io/icu/userguide/icu_data/buildtool.html#locale-slicing. Build your own filter or edit the existing file.
+We advise to edit the filters **only by adding/removing locales** from the `localeFilter/includelist` to avoid removing important data. We recommend not to remove "en-US" locale from the localeFilter/includelist because it is used as a fallback. Removing it for when
+- `true`: results in `Encountered infinite recursion while looking for resource in System.Private.Corelib.` exception
+- when predefined cultures only is not set: results in resolving data from ICU's `root.txt` files, e.g. `CultureInfo.DateTimeFormat.GetDayName(DateTime.Today.DayOfWeek)` will return an abbreviated form: `Mon` instead of `Monday`.
+Removing specific feature data might result in an exception that starts with `[CultureData.IcuGetLocaleInfo(LocaleStringData)] Failed`. It means you removed data necessary to extract basic information about the locale.
+
+ In the file `eng/icu.mk`, you can choose what filters to build. Choose the platform:
+
+### Building for Browser:
+* For prerequisites run `.devcontainer/postCreateCommand.sh` (it is run automatically on creation if using Codespaces)
+* Building:
+ ```
+ ./build.sh /p:TargetOS=Browser /p:TargetArchitecture=wasm /p:IcuTracing=true
+ ```
+ Output is located in `artifacts/bin/icu-browser-wasm`.
+
+### Building for Mobiles:
+* For prerequisites run:
+ ```bash
+ export ANDROID_NDK_ROOT=$PWD/artifacts/ndk/
+ mkdir $ANDROID_NDK_ROOT
+ wget https://dl.google.com/android/repository/android-ndk-r25b-linux.zip
+ unzip android-ndk-r25b-linux.zip -d $ANDROID_NDK_ROOT
+ rm android-ndk-r25b-linux.zip
+ mv $ANDROID_NDK_ROOT/*/* $ANDROID_NDK_ROOT
+ rmdir $ANDROID_NDK_ROOT/android-ndk-r25b
+ ```
+* Building:
+ ```bash
+ ./build.sh /p:TargetOS=Android /p:TargetArchitecture=x64 /p:IcuTracing=true
+ ```
+
+Output from both builds will be located in subdirectories of `artifacts/bin`. Copy the generated `.dat` files to a suitable location and provide the full path to it in the `.csproj`, e.g.:
+```xml
+C:\Users\wasmUser\icuSources\customIcu.dat
+```
+
+## Blazor
+
+In Blazor we are loading the file based on the applications's culture.
+To force the full data to be loaded, add this to your `.csproj`:
+```xml
+true
+```
+Custom files loading for Blazor is not possible.
diff --git a/docs/design/features/host-runtime-information.md b/docs/design/features/host-runtime-information.md
new file mode 100644
index 00000000000000..be57e04f8b7c27
--- /dev/null
+++ b/docs/design/features/host-runtime-information.md
@@ -0,0 +1,93 @@
+# Host: providing information to the runtime
+
+The host passes information to the runtime via a set of runtime properties - key and value strings. These properties include [runtime configuration settings](https://learn.microsoft.com/dotnet/core/runtime-config) that a user can specify in a [runtimeconfig.json](https://learn.microsoft.com/dotnet/core/runtime-config/#runtimeconfigjson) or [MSBuild properties](https://learn.microsoft.com/dotnet/core/project-sdk/msbuild-props#runtime-configuration-properties). The host itself also has a set of well-known properties that it will pass to the runtime when applicable.
+
+Starting with .NET 8, one of those properties represents a contract between the host and runtime. This document describes that contract and other well-known properties.
+
+## Host runtime contract
+
+Relying on key-value strings as part of initialization of the runtime comes with some drawbacks:
+
+- Any information has to be represented as a string. Other structured or non-string data becomes awkward to communicate.
+- Each property comes with non-trivial overhead. As the properties flow through the hosting layer, runtime, and libraries, multiple copies are made of each name and value.
+- Properties are pre-computed and set at startup. Every application, regardless of whether or not it requires a specific property, must pay the cost of all properties.
+
+To allow a more flexible and less costly way to pass information between the host and runtime, in .NET 8+, the host passes a contract to the runtime as a property. This contract servers as a mechanism for runtime to query for information from the host and for the host to provide structured information to the runtime.
+
+`HOST_RUNTIME_CONTRACT`
+
+Hex string representation of a pointer to a [`host_runtime_contract` struct](/src/native/corehost/host_runtime_contract.h).
+
+The `get_runtime_property` function provides key-value string information (like that provided for runtime initialization). This removes the requirement to pre-compute and store all properties. [Existing properties](#well-known-runtime-properties) can be migrated to go through this mechanism, allowing for pay-for-play properties and reducing the cost of properties.
+
+Some existing properties (for example, [probing path properties](#probing-paths)) would benefit from being structured data rather than a single string. The contract can be extended to allow querying for that specific, structured information rather than relying only on strings. For backwards compatibility for existing properties, we would still allow getting the string via `get_runtime_property`, but that would be an on-demand cost.
+
+## Well-known runtime properties
+
+These can be retrieved via the `host_runtime_contract.get_runtime_property` function. Before the introduction of the host runtime contract, these all had to be passed directly to `coreclr_initialize`.
+
+#### Path separator
+
+All properties that contain a list of paths use a platform-specific path separator. This corresponds to `;` on Windows and `:` on Unix.
+
+### App information
+
+`APP_CONTEXT_BASE_DIRECTORY`
+
+Directory containing the application. This is used for [`AppContext.BaseDirectory`](https://learn.microsoft.com/dotnet/api/system.appcontext.basedirectory).
+
+`RUNTIME_IDENTIFIER`
+
+[Runtime identifier](https://learn.microsoft.com/dotnet/core/rid-catalog) for the application. This is used for [`RuntimeInformation.RuntimeIdentifier`](https://learn.microsoft.com/dotnet/api/system.runtime.interopservices.runtimeinformation.runtimeidentifier).
+
+### Deps files
+
+`APP_CONTEXT_DEPS_FILES`
+
+Path to the `deps.json` file for the application. This is used by [`Microsoft.Extensions.DependencyModel`](https://learn.microsoft.com/dotnet/api/microsoft.extensions.dependencymodel).
+
+`FX_DEPS_FILE`
+
+Path to the `deps.json` file the root shared framework - `Microsoft.NETCore.App` - for framework-dependent applications. This is used by [`Microsoft.Extensions.DependencyModel`](https://learn.microsoft.com/dotnet/api/microsoft.extensions.dependencymodel).
+
+### Startup
+
+`STARTUP_HOOKS`
+
+List of assemblies (paths or names) containing a [`StartupHook`](./host-startup-hook.md) to be run before the application's main entry point. Paths are delimited by a [platform-specific path separator](#path-separator).
+
+### Probing paths
+
+`TRUSTED_PLATFORM_ASSEMBLIES`
+
+List of platform and application assembly file paths. Paths are delimited by a [platform-specific path separator](#path-separator). This is used in [managed assembly probing](https://learn.microsoft.com/dotnet/core/dependency-loading/default-probing#managed-assembly-default-probing).
+
+`NATIVE_DLL_SEARCH_DIRECTORIES`
+
+List of directory paths to search for unmanaged (native) libraries. Paths are delimited by a [platform-specific path separator](#path-separator). This is used in [unmanaged (native) assembly probing](https://learn.microsoft.com/dotnet/core/dependency-loading/default-probing#unmanaged-native-library-probing).
+
+`PLATFORM_RESOURCE_ROOTS`
+
+List of directory paths to search for satellite resource assemblies. Paths are delimited by a [platform-specific path separator](#path-separator). This is used in [satellite (resource) assembly probing](https://learn.microsoft.com/dotnet/core/dependency-loading/default-probing#satellite-resource-assembly-probing).
+
+`APP_PATHS`
+
+List of directory paths to search for managed assemblies. Paths are delimited by a [platform-specific path separator](#path-separator). This is not set by default.
+
+`PROBING_DIRECTORIES`
+
+List of directory paths corresponding to shared store paths and additional probing paths used by the host for [probing paths](./host-probing.md#probing-paths). Paths are delimited by a [platform-specific path separator](#path-separator).
+
+### Single-file
+
+`BUNDLE_PROBE`
+
+Hex string representation of a function pointer. It is set when running a single-file application. The function is called by the runtime to look for assemblies bundled into the application. The expected signature is defined as `BundleProbeFn` in [`coreclrhost.h`](/src/coreclr/hosts/inc/coreclrhost.h)
+
+`HOSTPOLICY_EMBEDDED`
+
+Indicates whether or not [`hostpolicy`](./host-components.md#host-policy) is embedded in the host executable. It is set to `true` when running a self-contained single-file application.
+
+`PINVOKE_OVERRIDE`
+
+Hex string representation of a function pointer. It is set when running a self-contained single-file application. The function is called by the runtime to check for redirected p/invokes. The expected signature is defined as `PInvokeOverrideFn` in [`coreclrhost.h`](/src/coreclr/hosts/inc/coreclrhost.h) and [`mono-private-unstable-types.h`](/src/native/public/mono/metadata/details/mono-private-unstable-types.h).
\ No newline at end of file
diff --git a/docs/design/features/hw-intrinsics.md b/docs/design/features/hw-intrinsics.md
index 3a651b22795fbc..3ed120d5142e5e 100644
--- a/docs/design/features/hw-intrinsics.md
+++ b/docs/design/features/hw-intrinsics.md
@@ -49,7 +49,7 @@ The bulk of the implementation work for hardware intrinsics is in the JIT.
### Platform Target Information
-The JIT depends on the VM and configuration settings to determine what target platform to generate code for. The VM settings are communicated in the `JitFlags` on `Compiler::opts` and the JIT checks the various `COMPlus_EnableXXX` configuration settings as well. See `Compiler::compSetProcessor()` and `jitconfigvalues.h`.
+The JIT depends on the VM and configuration settings to determine what target platform to generate code for. The VM settings are communicated in the `JitFlags` on `Compiler::opts` and the JIT checks the various `DOTNET_EnableXXX` configuration settings as well. See `Compiler::compSetProcessor()` and `jitconfigvalues.h`.
### Importation
diff --git a/docs/design/features/images/intel-cet-dotnet6-fig1.png b/docs/design/features/images/intel-cet-dotnet6-fig1.png
new file mode 100644
index 00000000000000..37d2aebb570397
Binary files /dev/null and b/docs/design/features/images/intel-cet-dotnet6-fig1.png differ
diff --git a/docs/design/features/jump-stubs.md b/docs/design/features/jump-stubs.md
index 057b37d8a827ec..c4d9128bbbcce6 100644
--- a/docs/design/features/jump-stubs.md
+++ b/docs/design/features/jump-stubs.md
@@ -91,7 +91,7 @@ space range, using OS virtual memory query/allocation APIs, to find and
allocate a new block of memory in the acceptable range. If this function
can't find and allocate space in the required range, we have, on AMD64,
one more fallback: if an emergency jump stub reserve was created using
-the `COMPlus_NGenReserveForjumpStubs` configuration (see below), we
+the `DOTNET_NGenReserveForjumpStubs` configuration (see below), we
attempt to find an appropriate, in range, allocation from that emergency
pool. If all attempts fail to create an allocation in the appropriate
range, we encounter a fatal error (and tear down the process), with a
@@ -105,12 +105,12 @@ occurrence of jump stub allocation failure. The following CLR
configuration variables are relevant (these can be set in the registry
as well as the environment, as usual):
-* `COMPlus_CodeHeapReserveForJumpStubs`. This value specifies a percentage
+* `DOTNET_CodeHeapReserveForJumpStubs`. This value specifies a percentage
of every code heap to reserve for jump stubs. When a non-jump stub
allocation in the code heap would eat into the reserved percentage, a
new code heap is allocated instead, leaving some buffer in the existing
code heap. The default value is 2.
-* `COMPlus_NGenReserveForjumpStubs`. This value, when non-zero, creates an
+* `DOTNET_NGenReserveForjumpStubs`. This value, when non-zero, creates an
"emergency jump stub reserve". For each NGEN image loaded, an emergency
jump stub reserve space is calculated by multiplying this number, as a
percentage, against the loaded native image size. This amount of space
@@ -124,14 +124,14 @@ looking to allocate jump stubs, the normal mechanisms for finding jump
stub space are followed, and only if they fail to find appropriate space
are the emergency jump stub reserve heaps tried. The default value is
zero.
-* `COMPlus_BreakOnOutOfMemoryWithinRange`. When set to 1, this breaks into
+* `DOTNET_BreakOnOutOfMemoryWithinRange`. When set to 1, this breaks into
the debugger when the specific jump stub allocation failure condition
occurs.
-The `COMPlus_NGenReserveForjumpStubs` mitigation is described publicly
+The `DOTNET_NGenReserveForjumpStubs` mitigation is described publicly
here:
https://support.microsoft.com/en-us/help/3152158/out-of-memory-exception-in-a-managed-application-that-s-running-on-the-64-bit-.net-framework.
-(It also mentions, in passing, `COMPlus_CodeHeapReserveForJumpStubs`, but
+(It also mentions, in passing, `DOTNET_CodeHeapReserveForJumpStubs`, but
only to say not to use it.)
## Jump stubs and the JIT
@@ -470,7 +470,7 @@ the pre-allocated space if a jump stub is required.
For non-LCG, we are reserving, but not allocating, a space at the end
of the code heap. This is similar and in addition to the reservation done by
-COMPlus_CodeHeapReserveForJumpStubs. (See https://github.com/dotnet/coreclr/pull/15296).
+DOTNET_CodeHeapReserveForJumpStubs. (See https://github.com/dotnet/coreclr/pull/15296).
## Ready2Run
@@ -491,7 +491,7 @@ compact entrypoints are not enabled for AMD64 currently.
## Stress modes
-Setting `COMPlus_ForceRelocs=1` forces jump stubs to be created in all
+Setting `DOTNET_ForceRelocs=1` forces jump stubs to be created in all
scenarios except for JIT generated code. As described previously, the
VM doesn't know when the JIT is reporting a rel32 data address or code
address, and in addition the JIT reports relocations for intra-function
@@ -503,5 +503,5 @@ We should improve the communication between the JIT and VM such that we
can reliably force jump stub creation for every rel32 call or jump. In
addition, we should make sure to enable code to stress the creation of
jump stubs for every mitigation that is implemented whether that be
-using the existing `COMPlus_ForceRelocs` configuration, or the creation of
+using the existing `DOTNET_ForceRelocs` configuration, or the creation of
a new configuration option.
diff --git a/docs/design/features/native-hosting.md b/docs/design/features/native-hosting.md
index 1d83c4b5cf5f51..efac89481445a6 100644
--- a/docs/design/features/native-hosting.md
+++ b/docs/design/features/native-hosting.md
@@ -188,6 +188,8 @@ The API should allow these scenarios:
* The native app can get back a native function pointer which calls specified managed method
* Get native function pointer for managed method
* From native code get a native function pointer to already loaded managed method
+* Load managed component
+ * From native code load an assembly
All the proposed APIs will be exports of the `hostfxr` library and will use the same calling convention and name mangling as existing `hostfxr` exports.
@@ -306,7 +308,7 @@ Returns the value of a runtime property specified by its name.
Trying to get a property which doesn't exist is an error and will return an appropriate error code.
-We're proposing a fix in `hostpolicy` which will make sure that there are no duplicates possible after initialization (see [dotnet/core-setup#5529](https://github.com/dotnet/core-setup/issues/5529)). With that `hostfxr_get_runtime_property_value` will work always (as there can only be one value).
+We're proposing a fix in `hostpolicy` which will make sure that there are no duplicates possible after initialization (see [dotnet/runtime#3514](https://github.com/dotnet/runtime/issues/3514)). With that `hostfxr_get_runtime_property_value` will work always (as there can only be one value).
``` C
@@ -371,12 +373,15 @@ Starts the runtime and returns a function pointer to specified functionality of
* `hdt_com_activation`, `hdt_com_register`, `hdt_com_unregister` - COM activation entry-points - see [COM activation](https://github.com/dotnet/runtime/tree/main/docs/design/features/COM-activation.md) for more details.
* `hdt_load_in_memory_assembly` - IJW entry-point - see [IJW activation](https://github.com/dotnet/runtime/tree/main/docs/design/features/IJW-activation.md) for more details.
* `hdt_winrt_activation` **[.NET 3.\* only]** - WinRT activation entry-point - see [WinRT activation](https://github.com/dotnet/runtime/tree/main/docs/design/features/WinRT-activation.md) for more details. The delegate is not supported for .NET 5 and above.
- * `hdt_get_function_pointer` **[.NET 5 and above]** - entry-point which finds a managed method and returns a function pointer to it. See below for details (Calling managed function).
+ * `hdt_get_function_pointer` **[.NET 5 and above]** - entry-point which finds a managed method and returns a function pointer to it. See [calling managed functions](#calling-managed-function-net-5-and-above) for details.
+ * `hdt_load_assembly` **[.NET 8 and above]** - entry-point which loads an assembly by its path. See [loading managed components](#loading-managed-components-net-8-and-above) for details.
+ * `hdt_load_assembly_bytes` **[.NET 8 and above]** - entry-point which loads an assembly from a byte array. See [loading managed components](#loading-managed-components-net-8-and-above) for details.
* `delegate` - when successful, the native function pointer to the requested runtime functionality.
In .NET Core 3.0 the function only works if `hostfxr_initialize_for_runtime_config` was used to initialize the host context.
In .NET 5 the function also works if `hostfxr_initialize_for_dotnet_command_line` was used to initialize the host context. Also for .NET 5 it will only be allowed to request `hdt_load_assembly_and_get_function_pointer` or `hdt_get_function_pointer` on a context initialized via `hostfxr_initialize_for_dotnet_command_line`, all other runtime delegates will not be supported in this case.
+All returned runtime delegates use the `__stdcall` calling convention on x86.
### Cleanup
``` C
@@ -459,6 +464,43 @@ It is allowed to call the returned runtime helper many times for different types
The returned native function pointer to managed method has the lifetime of the process and can be used to call the method many times over. Currently there's no way to "release" the native function pointer (and the respective managed delegate), this functionality may be added in a future release.
+### Loading managed components **[.NET 8 and above]**
+
+The runtime delegate type `hdt_load_assembly` allows loading a managed assembly by its path. Calling `hostfxr_get_runtime_delegate(handle, hdt_load_assembly, &helper)` returns a function pointer to the runtime helper with this signature:
+```C
+int load_assembly(
+ const char_t *assembly_path,
+ void *load_context,
+ void *reserved);
+```
+
+Calling this function will load the specified assembly in the default load context. It uses `AssemblyDependencyResolver` to register additional dependency resolution for the load context.
+* `assembly_path` - Path to the assembly to load - requirements match the `assemblyPath` parameter of [AssemblyLoadContext.LoadFromAssemblyPath](https://learn.microsoft.com/dotnet/api/system.runtime.loader.assemblyloadcontext.loadfromassemblypath). This path will also be used for dependency resolution via any `.deps.json` corresponding to the assembly.
+* `load_context` - the load context that will be used to load the assembly. For .NET 8 this parameter must be `NULL` and the API will only load the assembly in the default load context.
+* `reserved` - parameter reserved for future extensibility, currently unused and must be `NULL`.
+
+The runtime delegate type `hdt_load_assembly_bytes` allows loading a managed assembly from a byte array. Calling `hostfxr_get_runtime_delegate(handle, hdt_load_assembly_bytes, &helper)` returns a function pointer to the runtime helper with this signature:
+```C
+int load_assembly_bytes(
+ const void *assembly_bytes,
+ size_t assembly_bytes_len,
+ const void *symbols_bytes,
+ size_t symbols_bytes_len,
+ void *load_context,
+ void *reserved);
+```
+
+Calling this function will load the specified assembly in the default load context. It does not provide a mechanism for registering additional dependency resolution, as mechanisms like `.deps.json` and `AssemblyDependencyResolver` are file-based. Dependencies can be pre-loaded (for example, via a previous call to this function) or the specified assembly can explicitly register its own resolution logic (for example, via the [`AssemblyLodContext.Resolving`](https://learn.microsoft.com/dotnet/api/system.runtime.loader.assemblyloadcontext.resolving) event).
+* `assembly_bytes` - Bytes of the assembly to load.
+* `assembly_bytes_len` - Byte length of the assembly to load.
+* `symbols_bytes` - Bytes of the symbols for the assembly to load.
+* `symbols_bytes_len` - Byte length of the symbols for the assembly to load.
+* `load_context` - the load context that will be used to load the assembly. For .NET 8 this parameter must be `NULL` and the API will only load the assembly in the default load context.
+* `reserved` - parameter reserved for future extensibility, currently unused and must be `NULL`.
+
+These runtime delegates simply load the assembly. They do not return any representation of the loaded assembly and do not execute code in the assembly. To run code from the assembly, the delegate for [calling a managed function](#calling-managed-function-net-5-and-above) can be used to get a function pointer to a method in a loaded assembly by specifying the assembly-qualified type name containing the method.
+
+It is allowed to ask for this helper on any valid host context. The returned runtime helper can be called multiple times for different assemblies. It is not required to get the helper every time.
### Multiple host contexts interactions
diff --git a/docs/design/features/source-generator-com.md b/docs/design/features/source-generator-com.md
index 33acf0a83abeb4..239df73a7aacbb 100644
--- a/docs/design/features/source-generator-com.md
+++ b/docs/design/features/source-generator-com.md
@@ -3,8 +3,8 @@
The interop team has decided to invest some time into creating a source generator to help support COM scenarios. The basic goals of this work are as follows, in general order of importance:
1. Enable developers who use MCG to be able to move to the new source generator.
-2. Enable developers to interoperate with COM without needing to use linker-unsafe code (the built-in system is linker unsafe)
-3. Enable dotnet/runtime developers to migrate the hand-written linker-safe COM interop code to use the generator instead.
+2. Enable developers to interoperate with COM without needing to use trimming-unsafe code (the built-in system is trimming unsafe)
+3. Enable dotnet/runtime developers to migrate the hand-written trimming-safe COM interop code to use the generator instead.
4. Enable WinForms to move to the source generated COM support to help make it NativeAOT-compatible.
5. Generate .NET 6-compatible code for internal partners
@@ -213,7 +213,7 @@ Pros:
- The user only has to annotate the ComWrappers type to enable the source generation.
- The ComWrappers type exists in the user's source.
-- As the user can define multiple attributed ComWrappers-derived types, this design can be a little more linker optimized as it won't have type checks for every COM interface in the assembly.
+- As the user can define multiple attributed ComWrappers-derived types, this design can be a little more trimming optimized as it won't have type checks for every COM interface in the assembly.
- Well grouped sets of interfaces might all be able to be linked out completely.
Cons:
@@ -369,7 +369,7 @@ Pros:
Cons:
-- This implementation may be slightly less linker-friendly as the single ComWrappers implementation will reference all annotated interfaces.
+- This implementation may be slightly less trimming-friendly as the single ComWrappers implementation will reference all annotated interfaces.
- The `ComWrappers`-derived type is not defined by the user in their source, instead being generated from other inputs.
#### Option 3: Annotated `ComWrappers`-derived type and `GeneratedComImportAttribute`/`GeneratedComVisibleAttribute`
diff --git a/docs/design/features/source-generator-pinvokes.md b/docs/design/features/source-generator-pinvokes.md
index f3608e09252a3b..d13581b9353ff8 100644
--- a/docs/design/features/source-generator-pinvokes.md
+++ b/docs/design/features/source-generator-pinvokes.md
@@ -49,7 +49,7 @@ The P/Invoke algorithm is presented below using a simple example.
``` CSharp
/* A */ [DllImportAttribute("Kernel32.dll")]
-/* B */ extern static bool QueryPerformanceCounter(out long lpPerformanceCount);
+/* B */ static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
...
long count;
/* C */ QueryPerformanceCounter(out count);
@@ -81,7 +81,7 @@ An example of how the previous P/Invoke snippet could be transformed is below. T
``` CSharp
/* A */ [LibraryImportAttribute("Kernel32.dll")]
-/* B */ partial static bool QueryPerformanceCounter(out long lpPerformanceCount);
+/* B */ static partial bool QueryPerformanceCounter(out long lpPerformanceCount);
...
long count;
/* C*/ QueryPerformanceCounter(out count);
@@ -94,7 +94,7 @@ During the source generation process the metadata in the `LibraryImportAttribute
`Stubs.g.cs` (Source Generator code)
``` CSharp
-/* D */ partial static bool QueryPerformanceCounter(out long lpPerformanceCount)
+/* D */ static partial bool QueryPerformanceCounter(out long lpPerformanceCount)
{
unsafe
{
@@ -220,4 +220,4 @@ namespace System.Runtime.InteropServices
[il_stub_link]: https://mattwarren.org/2019/09/26/Stubs-in-the-.NET-Runtime/
[source_gen_link]: https://github.com/dotnet/roslyn/blob/features/source-generators/docs/features/source-generators.md
[blittable_link]: https://docs.microsoft.com/dotnet/framework/interop/blittable-and-non-blittable-types
-[ilinker_link]: https://github.com/mono/linker
+[il_linker_link]: https://github.com/dotnet/runtime/tree/main/src/tools/illink
diff --git a/docs/design/features/standalone-gc-loading.md b/docs/design/features/standalone-gc-loading.md
index 118b5cbf93e9f7..3c0b0e79be2489 100644
--- a/docs/design/features/standalone-gc-loading.md
+++ b/docs/design/features/standalone-gc-loading.md
@@ -89,11 +89,11 @@ can specify a specific environment variable to indicate that they are interested
loading a standalone GC.
There is one environment variable that governs the behavior of the standalone GC loader:
-`COMPlus_GCName`. It should be set to be a path to a dynamic shared library containing
+`DOTNET_GCName`. It should be set to be a path to a dynamic shared library containing
the GC that the EE intends to load. Its presence informs the EE that, first, a standalone GC
is to be loaded and, second, precisely where the EE should load it from.
-The EE will call `LoadLibrary` using the path given by `COMPlus_GCName`.
+The EE will call `LoadLibrary` using the path given by `DOTNET_GCName`.
If this succeeds, the EE will move to the next step in the loading process.
### Verifying the version of a candidate GC
@@ -110,7 +110,7 @@ struct VersionInfo {
const char* Name;
};
-extern "C" void GC_VersionInfo(
+extern "C" void LOCALGC_CALLCONV GC_VersionInfo(
/* Out */ VersionInfo*
);
```
@@ -142,7 +142,7 @@ Once the EE has verified that the version of the candidate GC is valid, it then
GC. It does so by loading (via `GetProcAddress`) and executing a function with this signature:
```c++
-extern "C" HRESULT GC_Initialize(
+extern "C" HRESULT LOCALGC_CALLCONV GC_Initialize(
/* In */ IGCToCLR*,
/* Out */ IGCHeap**.
/* Out */ IGCHandleManager**,
diff --git a/docs/design/libraries/ComInterfaceGenerator/UnmanagedToManagedEH.md b/docs/design/libraries/ComInterfaceGenerator/UnmanagedToManagedEH.md
new file mode 100644
index 00000000000000..2320941abbf5b2
--- /dev/null
+++ b/docs/design/libraries/ComInterfaceGenerator/UnmanagedToManagedEH.md
@@ -0,0 +1,59 @@
+# Unmanaged to Managed Exception Handling
+
+As part of building out the "vtable method stub" generator as the first steps on our path to the COM source generator, we need to determine how to handle exceptions at the managed code boundary in the unmanaged-calling-managed direction. When implementing a COM Callable Wrapper (or equivalent concept), the source generator will need to generate an `[UnmanagedCallersOnly]` wrapper of a method. We do not support propagating exceptions across an `[UnmanagedCallersOnly]` method on all platforms, so we need to determine how to handle exceptions.
+
+We determined that there were three options:
+
+1. Do nothing
+2. Match the existing behavior in the runtime for `[PreserveSig]` on a method on a `[ComImport]` interface.
+3. Allow the user to provide their own "exception -> return value" translation.
+
+We chose option 3 for a few reasons:
+
+1. Ecosystems like Swift don't use COM HResults as result types, so they may want different behavior for simple types like `int`.
+2. Not providing a customization option for exception handling would prevent dropping a single method down from the COM generator to the VTable generator to replicate the old `[PreserveSig]` behavior, and there's a desire to not support the `[PreserveSig]` attribute as it exists today.
+
+As a result, we decided to provide their own rules while providing an easy opt-in to the COM-style rules.
+
+## Option 1: Do Nothing
+
+This option seems the simplest option. The source generator will not emit a `try-catch` block and will just let the exception propogate when in a wrapper for a `VirtualMethodTableIndex` stub. There's a big problem with this path though. One goal of our COM source generator design is to let developers drop down a particular method from the "HRESULT-swapped, all nice COM defaults" mechanism to a `VirtualMethodTableIndex`-attributed method for particular methods when they do not match the expected default behaviors. This feature becomes untenable if we do not wrap the stub in a `try-catch`, as suddenly there is no mechanism to emulate the exception handling of exceptions thrown by marshallers. For cases where all marshallers are known to not throw exceptions except in cases where the process is unrecoverable (for example, `OutOfMemoryException`), this version may provide a slight performance improvement as there will be no exception handling in the generated stub.
+
+## Option 2: Match the existing behavior in the runtime for `[PreserveSig]` on a method on a `[ComImport]` interface
+
+The runtime has some existing built-in behavior for generating a return value from an `Exception` in an unmanaged-to-managed `COM` stub. The behavior depends on the return type, and matches the following table:
+
+| Type | Return Value in Exceptional Scenario |
+|-----------------|--------------------------------------|
+| `void` | Swallow the exception |
+| `int` | `exception.HResult` |
+| `uint` | `(uint)exception.HResult` |
+| `float` | `float.NaN` |
+| `double` | `double.NaN` |
+| All other types | `default` |
+
+We could match this behavior for all `VirtualMethodTableIndex`-attributed method stubs, but that would be forcibly encoding the rules of HResults and COM for our return types, and since COM is a Windows-centric technology, we don't want to lock users into this model in case they have different error code models that they want to integrate with. However, it does provide an exception handling boundary
+
+## Option 3: Allow the user to provide their own "exception -> return value" translation
+
+Another option would be to give the user control of how to handle the exception marshalling, with an option for some nice defaults to replicate the other options with an easy opt-in. We would provide the following enumeration and new members on `VirtualMethodTableIndexAttribute`:
+
+```diff
+namespace System.Runtime.InteropServices.Marshalling;
+
+public class VirtualMethodTableIndexAttribute
+{
++ public ExceptionMarshalling ExceptionMarshalling { get; }
++ public Type? ExceptionMarshallingType { get; } // When set to null or not set, equivalent to option 1
+}
+
++ public enum ExceptionMarshalling
++ {
++ Custom,
++ Com, // Match the COM-focused model described in Option 2
++ }
+```
+
+When the user sets `ExceptionMarshalling = ExceptionMarshalling.Custom`, they must specify a marshaller type in `ExceptionMarshallingType` that unmarshals a `System.Exception` to the same unmanaged return type as the marshaller of the return type in the method's signature.
+
+To implement the `ExceptionMarshalling.Com` option, we will provide some marshallers to implement the different rules above, and select the correct rule given the unmanaged return type from the return type's marshaller. By basing the decision on the unmanaged type instead of the managed type, this mechanism will be able to kick in correctly for projects that use their own custom `HResult` struct that wraps an `int` or `uint`, as the `HResult` will be marshalled to an `int` or `uint` if it is well-defined.
diff --git a/docs/design/libraries/ComInterfaceGenerator/VTableStubs.md b/docs/design/libraries/ComInterfaceGenerator/VTableStubs.md
new file mode 100644
index 00000000000000..3f5514d60694d7
--- /dev/null
+++ b/docs/design/libraries/ComInterfaceGenerator/VTableStubs.md
@@ -0,0 +1,408 @@
+# Generating Virtual Method Table Stubs
+
+As a building block for the COM interface source generator, we've decided to build a source generator that enables developers to mark that a given interface method should invoke a function pointer at a particular offset into an unmanaged virtual method table, or vtable. We've decided to build this generator as a building block for a few reasons:
+
+1. As part of the migration of dotnet/runtime to use source-generated P/Invokes, we encountered a few scenarios, particularly in the networking stacks, where non-blittable delegate interop was used because the native APIs do not have static entry points. For at least one of these scenarios, MsQuic, the native library provides a table of function pointers. From our experience, this mechanism for versioning is not uncommon and we feel that supporting native libraries that use a versioning scheme similar to this model is worthwhile for us to support.
+2. There are native APIs that we are likely to interoperate with in the future that use native vtables but are not COM-oriented. In particular, the Java Native Interface API, which both dotnet/runtime and xamarin/java.interop interface with in various capacities, uses a vtable model to support exposing their APIs to C and C++. Additionally, its API does not conform to a COM-style IUnknown-based API.
+3. Some COM-style APIs have some corner cases with non-COM-style interfaces. Specifically, some corners of the DirectX APIs are still vtable-based, but do not implement IUnknown. Providing this building block will allow developers to more easily consume these APIs with similar gestures as the rest of the DirectX API surface.
+4. Our future COM interface source generator can build on this building block to provide defaults while allowing developers to use the features of this generator to override any default settings provided by the COM generator.
+
+## Defined types
+
+To support this generator, we will define the following APIs.
+
+The `VirtualMethodIndexAttribute` can be applied to an interface method to trigger the generator. This method will provide the index into the vtable for the method, whether or not the method implicitly takes the native `this` pointer, and which marshalling directions to support. It also has many of the same members as `LibraryImportAttribute` to consistently provide the same marshalling support across source-generated marshalling.
+
+```csharp
+namespace System.Runtime.InteropServices;
+
+[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
+public class VirtualMethodIndexAttribute : Attribute
+{
+ public VirtualMethodIndexAttribute(int index)
+ {
+ Index = index;
+ }
+
+ public int Index { get; }
+
+ public bool ImplicitThisParameter { get; set; } = true;
+
+ public MarshalDirection Direction { get; set; } = MarshalDirection.Bidirectional;
+
+ ///
+ /// Gets or sets how to marshal string arguments to the method.
+ ///
+ ///
+ /// If this field is set to a value other than ,
+ /// must not be specified.
+ ///
+ public StringMarshalling StringMarshalling { get; set; }
+
+ ///
+ /// Gets or sets the used to control how string arguments to the method are marshalled.
+ ///
+ ///
+ /// If this field is specified, must not be specified
+ /// or must be set to .
+ ///
+ public Type? StringMarshallingCustomType { get; set; }
+
+ ///
+ /// Gets or sets whether the callee sets an error (SetLastError on Windows or errno
+ /// on other platforms) before returning from the attributed method.
+ ///
+ public bool SetLastError { get; set; }
+}
+
+```
+
+New interfaces will be defined and used by the source generator to fetch the native `this` pointer and the vtable that the function pointer is stored in. These interfaces are designed to provide an API that various native platforms, like COM, WinRT, or Swift, could use to provide support for multiple managed interface wrappers from a single native object. In particular, these interfaces are designed to ensure it is possible support a managed gesture to do an unmanaged "type cast" (i.e., `QueryInterface` in the COM and WinRT worlds).
+
+```csharp
+namespace System.Runtime.InteropServices;
+
+public readonly ref struct VirtualMethodTableInfo
+{
+ public VirtualMethodTableInfo(IntPtr thisPointer, ReadOnlySpan virtualMethodTable)
+ {
+ ThisPointer = thisPointer;
+ VirtualMethodTable = virtualMethodTable;
+ }
+
+ public IntPtr ThisPointer { get; }
+ public ReadOnlySpan VirtualMethodTable { get; }
+
+ public void Deconstruct(out IntPtr thisPointer, out ReadOnlySpan virtualMethodTable) // This method allows tuple-style `var (thisPtr, vtable) = virtualMethodTableInfo;` statements from this type.
+ {
+ thisPointer = ThisPointer;
+ virtualMethodTable = VirtualMethodTable;
+ }
+}
+
+public interface IUnmanagedVirtualMethodTableProvider
+{
+ protected VirtualMethodTableInfo GetVirtualMethodTableInfoForKey(Type type);
+
+ public sealed VirtualMethodTableInfo GetVirtualMethodTableInfoForKey()
+ where TUnmanagedInterfaceType : IUnmanagedInterfaceType
+ {
+ // Dispatch from a non-virtual generic to a virtual non-generic with System.Type
+ // to avoid generic virtual method dispatch, which is very slow.
+ return GetVirtualMethodTableInfoForKey(typeof(TUnmanagedInterfaceType));
+ }
+}
+
+public interface IUnmanagedInterfaceType where TUnmanagedInterfaceType : IUnmanagedInterfaceType
+{
+}
+```
+
+## Required API Shapes
+
+The user will be required to implement `IUnmanagedVirtualMethodTableProvider` on the type that provides the method tables, and `IUnmanagedInterfaceType` on the type that defines the unmanaged interface. The `TUnmanagedInterfaceType` follows the same design principles as the generic math designs as somewhat of a "self" type to enable us to use the derived interface type in any additional APIs we add to support unmanaged-to-managed stubs.
+
+Previously, each of these interface types were also generic on another type `T`. The `T` types were required to match between the two interfaces. This mechanism was designed to enable each native API platform to provide their own casting key, for example `IID`s in COM, without interfering with each other or requiring using reflection-based types like `System.Type`. However, practical implementation showed that providing just a "type key" was not enough information to cover any non-trivial scenarios (like COM) efficiently without effectively forcing a two-level lookup model or hard-coding type support in the `IUnmanagedVirtualMethodTableProvider` implementation. Additionally, we determined that using reflection to get to attributes is considered "okay" and using generic attributes would enable APIs that build on this model like COM to effectively retrieve information from the `System.Type` instance without causing additional problems.
+
+## Example Usage
+
+### Flat function table
+
+In this example, the native API provides a flat table of functions based on the provided version.
+
+```cpp
+// NativeAPI.cpp
+
+struct NativeAPI
+{
+ int(*getVersion)();
+ int(*add)(int x, int y);
+ int(*multiply)(int x, int y);
+};
+
+namespace
+{
+ int getVersion()
+ {
+ return 1;
+ }
+ int add(int x, int y)
+ {
+ return x + y;
+ }
+ int multiply(int x, int y)
+ {
+ return x * y;
+ }
+ const NativeAPI g_nativeAPI = {
+ &getVersion,
+ &add,
+ &multiply
+ };
+}
+
+extern "C" bool GetNativeAPI(int version, NativeAPI const** ppNativeAPI)
+{
+ if (version > getVersion())
+ {
+ *ppNativeAPI = nullptr;
+ return false;
+ }
+ *ppNativeAPI = &g_nativeAPI;
+ return true;
+}
+
+```
+
+```csharp
+// User-written code
+// NativeAPI.cs
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+[assembly:DisableRuntimeMarshalling]
+
+// Define the interface of the native API
+partial interface INativeAPI : IUnmanagedInterfaceType
+{
+
+ [VirtualMethodIndex(0, ImplicitThisParameter = false, Direction = CustomTypeMarshallerDirection.In)]
+ int GetVersion();
+
+ [VirtualMethodIndex(1, ImplicitThisParameter = false, Direction = CustomTypeMarshallerDirection.In)]
+ int Add(int x, int y);
+
+ [VirtualMethodIndex(2, ImplicitThisParameter = false, Direction = CustomTypeMarshallerDirection.In)]
+ int Multiply(int x, int y);
+}
+
+// Define our runtime wrapper type for the native interface.
+unsafe class NativeAPI : IUnmanagedVirtualMethodTableProvider, INativeAPI.Native
+{
+ private CNativeAPI* _nativeAPI;
+
+ public NativeAPI()
+ {
+ if (!CNativeAPI.GetNativeAPI(1, out _nativeAPI))
+ {
+ throw new InvalidOperationException();
+ }
+ }
+
+ VirtualMethodTableInfo IUnmanagedVirtualMethodTableProvider.GetVirtualMethodTableInfoForKey(Type _)
+ {
+ return new(IntPtr.Zero, MemoryMarshal.Cast(new ReadOnlySpan(_nativeAPI, 1)));
+ }
+}
+
+// This struct represent a flat table of function pointers that implements the native API.
+// This can either be returned by the API (MSQuic) or be constructed manually from calling
+// a method that returns function pointers and be used as a cache (OpenGL and Vulkan)
+unsafe partial struct CNativeAPI
+{
+ IntPtr getVersion;
+ IntPtr add;
+ IntPtr multiply;
+
+ [LibraryImport(nameof(NativeAPI))]
+ public static partial bool GetNativeAPI(int version, out CNativeAPI* ppNativeAPI);
+};
+
+// Generated code for VirtualMethodIndex generator
+
+// NativeInterfaces.g.cs
+partial interface INativeAPI
+{
+ [DynamicInterfaceCastableImplementation]
+ partial interface Native : INativeAPI
+ {
+ }
+}
+
+// ManagedToNativeStubs.g.cs
+partial interface INativeAPI
+{
+ unsafe partial interface Native
+ {
+ int INativeAPI.GetVersion()
+ {
+ var (_, vtable) = ((IUnmanagedVirtualMethodTableProvider)this).GetVirtualMethodTableInfoForKey();
+ int retVal;
+ retVal = ((delegate* unmanaged)vtable[0])();
+ return retVal;
+ }
+ }
+}
+partial interface INativeAPI
+{
+ unsafe partial interface Native
+ {
+ int INativeAPI.Add(int x, int y)
+ {
+ var (_, vtable) = ((IUnmanagedVirtualMethodTableProvider)this).GetVirtualMethodTableInfoForKey();
+ int retVal;
+ retVal = ((delegate* unmanaged)vtable[1])(x, y);
+ return retVal;
+ }
+ }
+}
+partial interface INativeAPI
+{
+ unsafe partial interface Native
+ {
+ int INativeAPI.Multiply(int x, int y)
+ {
+ var (_, vtable) = ((IUnmanagedVirtualMethodTableProvider)this).GetVirtualMethodTableInfoForKey();
+ int retVal;
+ retVal = ((delegate* unmanaged)vtable[2])(x, y);
+ return retVal;
+ }
+ }
+}
+
+// LibraryImport-generated code omitted for brevity
+```
+
+As this generator is primarily designed to provide building blocks for future work, it has a larger requirement on user-written code. In particular, this generator does not provide any support for authoring a runtime wrapper object that stores the native pointers for the underlying object or the virtual method table. However, this lack of support also provides significant flexibility for developers. The only requirement for the runtime wrapper object type is that it implements `IUnmanagedVirtualMethodTableProvider`.
+
+The emitted interface implementation can be used in two ways:
+
+1. The user's runtime wrapper object can directly implement the emitted `Native` interface. This method works for cases where all interfaces are statically known to exist (interfaces are not conditionally implemented on each object).
+2. The user's runtime wrapper object can implement `IDynamicInterfaceCastable` and can return the handle of `INativeAPI.Native` when user code casts the wrapper to `INativeAPI`. This style is more commonly used for COM-style APIs.
+
+### COM interface
+
+```cpp
+// C++ code
+struct IUnknown
+{
+ virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) = 0;
+ virtual ULONG AddRef() = 0;
+ virtual ULONG Release() = 0;
+};
+
+```
+```csharp
+// User-defined C# code
+using System;
+using System.Runtime.InteropServices;
+
+interface IUnknown: IUnmanagedInterfaceType
+{
+ [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvStdcall), typeof(CallConvMemberFunction) })]
+ [VirtualMethodIndex(0)]
+ int QueryInterface(in Guid riid, out IntPtr ppvObject);
+
+ [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvStdcall), typeof(CallConvMemberFunction) })]
+ [VirtualMethodIndex(1)]
+ uint AddRef();
+
+ [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvStdcall), typeof(CallConvMemberFunction) })]
+ [VirtualMethodIndex(2)]
+ uint Release();
+}
+
+class BaseIUnknownComObject : IUnmanagedVirtualMethodTableProvider, IDynamicInterfaceCastable
+{
+ private IntPtr _unknownPtr;
+
+ public BaseIUnknownComObject(IntPtr unknown)
+ {
+ _unknownPtr = unknown;
+ }
+
+ unsafe VirtualMethodTableInfo IUnmanagedVirtualMethodTableProvider.GetVirtualMethodTableInfoForKey(Type type)
+ {
+ if (type == typeof(IUnknown))
+ {
+ return new VirtualMethodTableInfo(_unknownPtr, new ReadOnlySpan(**(IntPtr***)_unknownPtr), 3);
+ }
+ return default;
+ }
+
+ RuntimeTypeHandle IDynamicInterfaceCastable.GetInterfaceImplementation(RuntimeTypeHandle interfaceType)
+ {
+ if (Type.GetTypeFromHandle(interfaceType) == typeof(IUnknown))
+ {
+ return typeof(IUnknown.Native).TypeHandle;
+ }
+ return default;
+ }
+
+ bool IDynamicInterfaceCastable.IsInterfaceImplemented(RuntimeTypeHandle interfaceType, bool throwIfNotImplemented)
+ {
+ return Type.GetTypeFromHandle(interfaceType) == typeof(IUnknown);
+ }
+}
+
+// Generated code for VirtualMethodIndex generator
+
+// NativeInterfaces.g.cs
+partial interface IUnknown
+{
+ [DynamicInterfaceCastableImplementation]
+ partial interface Native : IUnknown
+ {
+ }
+}
+
+// ManagedToNativeStubs.g.cs
+partial interface IUnknown
+{
+ partial interface Native
+ {
+ int IUnknown.QueryInterface(in Guid riid, out IntPtr ppvObject)
+ {
+ var (thisPtr, vtable) = ((IUnmanagedVirtualMethodTableProvider)this).GetVirtualMethodTableInfoForKey();
+ int retVal;
+ fixed (Guid* riid__gen_native = &riid)
+ fixed (IntPtr* ppvObject__gen_native = &ppvObject)
+ {
+ retVal = ((delegate* unmanaged[Stdcall, MemberFunction])vtable[0])(thisPtr, riid__gen_native, ppvObject__gen_native);
+ }
+ return retVal;
+ }
+ }
+}
+partial interface IUnknown
+{
+ partial interface Native
+ {
+ uint IUnknown.AddRef()
+ {
+ var (thisPtr, vtable) = ((IUnmanagedVirtualMethodTableProvider)this).GetVirtualMethodTableInfoForKey();
+ uint retVal;
+ retVal = ((delegate* unmanaged[Stdcall, MemberFunction])vtable[1])(thisPtr);
+ return retVal;
+ }
+ }
+}
+partial interface IUnknown
+{
+ partial interface Native
+ {
+ uint IUnknown.Release()
+ {
+ var (thisPtr, vtable) = ((IUnmanagedVirtualMethodTableProvider)this).GetVirtualMethodTableInfoForKey();
+ uint retVal;
+ retVal = ((delegate* unmanaged[Stdcall, MemberFunction])vtable[2])(thisPtr);
+ return retVal;
+ }
+ }
+}
+
+// Native-To-Managed code omitted as the design has not been finalized yet.
+```
+
+This example shows how we can build COM support on top of the vtable stub generator. The generator will support specifying a custom calling convention using the already-existing `UnmanagedCallConvAttribute`, so it will automatically support forwarding any calling conventions we implement with our extensible calling convention support to the function pointer signature.
+
+## FAQ
+
+- Why emit a nested interface instead of a DIM on the existing interface?
+ - By emitting a nested interface, we enable flexibility in the implementation of the user-defined interface without our implementations getting in the way. With the current design, a managed implementation of a given interface would require the user to implement all members. If we emitted the member implementations directly as DIM implementations, then the compiler would happily allow a developer to only override one method and leave the rest using the native implementation, which would make the development experience of a managed implementation more difficult as there would be no IDE/compiler assistance to fully implement the contract.
+
+## Open Questions
+
+- Should we automatically apply the `[DynamicInterfaceCastableImplementation]` attribute to the generated `Native` interface?
+ - It is a nice convenience, but it isn't applicable in all scenarios and bloats the metadata size. Additionally, since the generated interface is `partial`, we could direct users to add it themselves to the generated interface.
+
diff --git a/docs/design/mono/diagnostics-tracing.md b/docs/design/mono/diagnostics-tracing.md
index d6b21b4957ae97..9b5632c433fd77 100644
--- a/docs/design/mono/diagnostics-tracing.md
+++ b/docs/design/mono/diagnostics-tracing.md
@@ -10,8 +10,8 @@ MonoVM includes support for EventPipe and DiagnosticServer components used to ge
Due to differences between runtimes many of the NativeRuntimeEvents won't apply to MonoVM. Only a selected amount of NativeRuntimeEvents will initially be added to MonoVM. Current supported NativeRuntimeEvents can be viewed in MonoVM include file, https://github.com/dotnet/runtime/blob/main/src/mono/mono/eventpipe/gen-eventing-event-inc.lst. Since primary focus is EventPipe and mobile platforms (iOS/Android), ETW and LTTng providers have currently not been integrated/enabled for NativeRuntimeEvents on MonoVM.
-MonoVM runs on a variety of platforms and depending on platform capabilities MonoVM support different build configurations of EventPipe and DiagnosticServer. For desktop platforms (Windows, Linux, MacOS), MonoVM build DiagnosticServer using
-`NamedPipes` (Windows) or `UnixDomainSockets` (Linux, MacOS) support. This is in line with CoreCLR build configuration of the DiagnosticServer, working in the same way.
+MonoVM runs on a variety of platforms and depending on platform capabilities MonoVM support different build configurations of EventPipe and DiagnosticServer. For desktop platforms (Windows, Linux, macOS), MonoVM build DiagnosticServer using
+`NamedPipes` (Windows) or `UnixDomainSockets` (Linux, macOS) support. This is in line with CoreCLR build configuration of the DiagnosticServer, working in the same way.
On mobile platforms (Android/iOS) or other remote sandboxed environments, MonoVM DiagnosticServer component can be build using TCP/IP support to better handle remote targets. It also handles the connect scenario (runtime act as TCP/IP client connecting back to tooling), as well as the listening scenario (runtime act as a TCP/IP listener waiting for tooling to connect). Depending on platform, allowed capabilities (some platforms won't allow listening on sockets) and tracing scenarios (startup tracing needs suspended runtime), a combination of these scenarios can be used.
@@ -345,7 +345,7 @@ NOTE, iOS only support use of loopback interface when running DiagnosticServer i
### Application running single file based EventPipe session
-If application supports controlled runtime shutdown, `mono_jit_cleanup` gets called before terminating process, it is possible to run a single file based EventPipe session using environment variables as described in https://docs.microsoft.com/en-us/dotnet/core/diagnostics/eventpipe#trace-using-environment-variables. In .net6 an additional variable has been added, `COMPlus_EventPipeOutputStreaming`, making sure data is periodically flushed into the output file.
+If application supports controlled runtime shutdown, `mono_jit_cleanup` gets called before terminating process, it is possible to run a single file based EventPipe session using environment variables as described in https://docs.microsoft.com/en-us/dotnet/core/diagnostics/eventpipe#trace-using-environment-variables. In .net6 an additional variable has been added, `DOTNET_EventPipeOutputStreaming`, making sure data is periodically flushed into the output file.
If application doesn't support controlled runtime shutdown, this mode won't work, since it requires rundown events, only emitted when closing session and flushing memory manager. If application doesn't call `mono_jit_cleanup` before terminating, generated nettrace file will lack rundown events needed to produce callstacks including symbols.
diff --git a/docs/design/mono/llvm.md b/docs/design/mono/llvm.md
new file mode 100644
index 00000000000000..92318b2b40aa2f
--- /dev/null
+++ b/docs/design/mono/llvm.md
@@ -0,0 +1,90 @@
+# LLVM Support in Mono
+
+## Introduction
+
+The default mono code generator is a single tier JIT and thus it can't generate highly optimized machine code.
+To solve this problem, mono has support for emitting code using [LLVM](www.llvm.org).
+
+## Configurations
+
+LLVM can be used in multiple configurations in mono.
+
+### JIT
+
+In this mode, LLVM is used as a traditional JIT. First the JIT front end is used to generate LLVM
+bitcode, then the bitcode is compiled to native code using the LLVM JIT APIs. This is enabled by the
+`--llvm` command line option. Note that startup in this mode is pretty slow, so this is mostly useful for
+server side/perf sensitive applications.
+
+### AOT
+
+In this mode, the mono AOT compiler uses LLVM to compile IL code. For methods not supported by LLVM, it fails back
+to the JIT compiler. This mode is enabled by the `llvm` AOT option, i.e. `--aot=llvm` or by the normal `--llvm`
+command line option. The AOT compiler emits a LLVM bitcode (.bc) file and optionally compiles it to native code
+by invoking the LLVM command line tools (`opt`/`llc`).
+
+### LLVMOnly
+
+This mode is designed to target environments without runtime code generation/inline assembly. It is enabled by the
+`llvmonly` AOT option, i.e. `--aot=llvmonly`. The generated .bc file is compiled using stock `clang`.
+
+## The Mono LLVM fork
+
+Mono uses a fork of LLVM with a limited set of changes. The fork is available at `https://github.com/dotnet/llvm-project`.
+The mono changes are kept rebased on top of the corresponding upstream release branch, i.e. the `release/11.x` branch
+in the fork contains the mono changes on top of the upstream `release/11.x` branch.
+
+Some of the mono changes include:
+* Some calling convention extensions to allow passing arguments in non-ABI registers like in `x11` on `x86-64`. This is
+used by the runtime to implement various features like generic sharing.
+* Emission of exception handling tables. These tables are needed by the mono EH code to process LLVM frames during
+exception handling.
+* Integration into the dotnet build system.
+
+The mono runtime interacts with the fork in 2 ways:
+* Some of the LLVM libraries are linked into the runtime.
+* The `opt`/`llc` tools are used to compile .bc files to native code.
+
+## Source code structure
+
+Since the mono runtime is written in C, the parts written in C++ are kept in separate files and accessed through a
+C API.
+
+LLVM support is enabled in the runtime by setting the `LLVM_PREFIX` cmake variable to the root of the compiled LLVM
+tree, i.e. the directory which contains `bin`/`lib` etc.
+
+* `mini-llvm.c`: Contains the majority of the llvm backend code. This file uses the LLVM C API to generate bitcode.
+* `mini-llvm-cpp.cpp`: Contains helper functions missing from the LLVM C API.
+* `llvm-runtime.cpp`: Contains cpp functions used at runtime in llvmonly mode.
+* `llvm-jit.cpp`: Contains the JIT code which compiles the bitcode emitted by the LLVM backend into the final native code.
+
+## Compilation process
+
+* The .net IL is compiled to the same internal IR used by the mono JIT, with slight differences.
+* A set of optimization passes is ran including conversion to SSA form.
+* The LLVM backend converts the internal IR to LLVM bitcode.
+* The bicode is either saved to a .bc file (for AOT) or compiled to native code (for JIT).
+
+## Code generation issues
+
+### Null checks
+
+In .net, loads/stores from a null address are converted to a null reference exception. To achieve this with LLVM,
+explicit null checks are emitted, and the `implicit-null-checks` LLVM pass is used to fold the checks into loads/stores.
+
+### Passing arguments in non-ABI registers
+
+A new `mono` calling convention is added. In this calling convention, one argument can be marked with the `inreg` attribute.
+This argument will be passed in a platform specific non-abi register like `x11` on `x86-64` or `r15` on `arm64`.
+
+### Exception handling
+
+Mono implements its own unwinding/exception handling system. In LLVM code, exception handling clauses are implemented using the
+standard LLVM EH facilities like landing pads, invokes, etc. `llc` is modified to emit an exception handling table.
+This table contains the following:
+* A lookup table mapping addresses to a mono specific id, which is used by runtime to lookup the actual IL method corresponding
+to an LLVM function.
+* Dwarf unwind info for every LLVM function.
+* For methods which have EH clauses, the try-catch-finally offsets inside the generated code.
+* For shared methods, information on where to find the saved `this` pointer on the stack. This is used to construct the
+actual generic instance method i.e. `List.Add` + `this=List` -> `List.Add` for stack traces etc.
diff --git a/docs/design/mono/unloadability.md b/docs/design/mono/unloadability.md
new file mode 100644
index 00000000000000..3ed4639aea1def
--- /dev/null
+++ b/docs/design/mono/unloadability.md
@@ -0,0 +1,80 @@
+
+Design
+------
+
+The design is based on docs/design/features/unloadability.md.
+
+Memory managers
+---------------
+
+Most runtime memory is owned by MonoMemoryManager structures, which are owned by one or more ALCs. For example,
+if type T1 is from ALC1, and T2 is from ALC2, then the memory related to the generic instance T1 will
+be owned by the memory manager for [ALC1, ALC2]. A memory manager is collectible if one of its ALCs is collectible.
+
+LoaderAllocator objects
+-----------------------
+
+Each memory manager has a corresponding LoaderAllocator object. This object is referenced explicitly or
+implicitly by every managed object which is related to the memory manager. Until unloading starts,
+the memory manager keeps a strong reference to this object.
+
+For objects whose type is from a collectible ALC, the GC maintains an implicit reference by marking
+the LoaderAllocator object when the object is marked.
+
+Reflection objects referencing the ALC have an explicit 'keepalive' field which points to the
+corresponding LoaderAllocator object.
+
+When the LoaderAllocator object is collected by the GC, it means there are no more managed
+references to its memory allocator, so it can be unloaded.
+
+Reflection caches and static variables
+--------------------------------------
+
+Reflection objects are kept in caches inside the runtime. These caches keep strong references to the
+reflection objects. This doesn't work for collectible ALCs, since the objects keep the LoaderAllocator
+object alive. So for collectible ALCs, we use a different kind of hash table whose keys/values are
+stored in object[] arrays inside the LoaderAllocator object, and the hash table holds a weak reference
+to these arrays. This means that the reflection objects are only kept alive by the LoaderAllocator and
+by application code.
+
+Similarly, normal static variables are treated as GC roots so any static variable pointing to an object
+inside the ALC would keep the ALC alive. Instead, we store static variables inside arrays in the
+LoaderAllocator object. Normal reference type variable are allocated an entry in a pinned object[],
+and their address becomes an interior pointer to the pinned array element. For valuetypes, we
+allocate a pinned boxed object and the static variable address becomes the address of the unboxed
+object.
+
+Unloading process
+-----------------
+
+- The app calls AssemblyLoadContext.Unload ()
+- The runtime iterates over the memory managers of the ALC. Each ALC holds a strong reference to its
+LoaderAllocator object. We change the strong reference to a weak one, allowing the LoaderAllocator
+to the collected.
+- The app eventually drops all implicit and explicit references to the LoaderAllocator object.
+- The finalizer of the LoaderAllocator object calls into the runtime to free the corresponding
+memory manager.
+- When all memory managers referencing the ALC are freed, the ALC itself is freed.
+
+See the document in the Design section about the LoaderAllocatorScout object.
+
+Remaining work
+---------------
+
+- Managed frames
+Frames belonging to code in the ALC should keep the ALC alive. This can be implemented by
+having all methods allocate a volatile local variable and store a reference to their LoaderAllocator object
+into it.
+- Thread abort
+Although its not part of current .NET APIs, it might be useful to have a way to abort threads executing code
+in an ALC, similarly to how domain unloads worked previously.
+- Reflection pointers
+Icalls which take a assembly/type etc. handle as parameter need to keep the ALC alive, otherwise there will
+be subtle races.
+- Boehm GC support
+- TLS variables
+- Enable/disable compiler flag
+- Profiling, perf counters, etc. support
+- Diagnostics support, i.e. what keeps an ALC alive
+- Testing
+- Leak detection
diff --git a/docs/design/mono/wasm-aot.md b/docs/design/mono/wasm-aot.md
index 667d124ed9c6e5..ef907bfe0abe74 100644
--- a/docs/design/mono/wasm-aot.md
+++ b/docs/design/mono/wasm-aot.md
@@ -41,10 +41,10 @@ every generated AOT method has its address taken, which severely limits the inte
optimizations that LLVM can do, since it cannot determine the set of callers for a function.
This means that it cannot remove functions corresponding to unused IL methods, cannot
specialize functions for constant/nonnull arguments, etc.
-The dotnet linker includes some support for adding a [DisablePrivateReflection] attribute to
+The dotnet ILLink tool includes some support for adding a [DisablePrivateReflection] attribute to
methods which cannot be called using reflection, and the AOT compiler could use this
to avoid generating function pointers for methods which are not called from outside the
-AOT image. This is not enabled right now because the linker support is not complete.
+AOT image. This is not enabled right now because the ILLink tool support is not complete.
### Null checks
diff --git a/docs/design/mono/webcil.md b/docs/design/mono/webcil.md
new file mode 100644
index 00000000000000..3bcb7d6365353b
--- /dev/null
+++ b/docs/design/mono/webcil.md
@@ -0,0 +1,111 @@
+# WebCIL assembly format
+
+## Version
+
+This is version 0.0 of the Webcil format.
+
+## Motivation
+
+When deploying the .NET runtime to the browser using WebAssembly, we have received some reports from
+customers that certain users are unable to use their apps because firewalls and anti-virus software
+may prevent browsers from downloading or caching assemblies with a .DLL extension and PE contents.
+
+This document defines a new container format for ECMA-335 assemblies
+that uses the `.webcil` extension and uses a new WebCIL container
+format.
+
+
+## Specification
+
+As our starting point we take section II.25.1 "Structure of the
+runtime file format" from ECMA-335 6th Edition.
+
+| |
+|--------|
+| PE Headers |
+| CLI Header |
+| CLI Data |
+| Native Image Sections |
+| |
+
+
+
+A Webcil file follows a similar structure
+
+
+| |
+|--------|
+| Webcil Headers |
+| CLI Header |
+| CLI Data |
+| |
+
+## Webcil Headers
+
+The Webcil headers consist of a Webcil header followed by a sequence of section headers.
+(All multi-byte integers are in little endian format).
+
+### Webcil Header
+
+``` c
+struct WebcilHeader {
+ uint8_t id[4]; // 'W' 'b' 'I' 'L'
+ // 4 bytes
+ uint16_t version_major; // 0
+ uint16_t version_minor; // 0
+ // 8 bytes
+ uint16_t coff_sections;
+ uint16_t reserved0; // 0
+ // 12 bytes
+
+ uint32_t pe_cli_header_rva;
+ uint32_t pe_cli_header_size;
+ // 20 bytes
+
+ uint32_t pe_debug_rva;
+ uint32_t pe_debug_size;
+ // 28 bytes
+};
+```
+
+The Webcil header starts with the magic characters 'W' 'b' 'I' 'L' followed by the version in major
+minor format (must be 0 and 0). Then a count of the section headers and two reserved bytes.
+
+The next pairs of integers are a subset of the PE Header data directory specifying the RVA and size
+of the CLI header, as well as the directory entry for the PE debug directory.
+
+
+### Section header table
+
+Immediately following the Webcil header is a sequence (whose length is given by `coff_sections`
+above) of section headers giving their virtual address and virtual size, as well as the offset in
+the Webcil file and the size in the file. This is a subset of the PE section header that includes
+enough information to correctly interpret the RVAs from the webcil header and from the .NET
+metadata. Other information (such as the section names) are not included.
+
+``` c
+struct SectionHeader {
+ uint32_t st_virtual_size;
+ uint32_t st_virtual_address;
+ uint32_t st_raw_data_size;
+ uint32_t st_raw_data_ptr;
+};
+```
+
+### Sections
+
+Immediately following the section table are the sections. These are copied verbatim from the PE file.
+
+## Rationale
+
+The intention is to include only the information necessary for the runtime to locate the metadata
+root, and to resolve the RVA references in the metadata (for locating data declarations and method IL).
+
+A goal is for the files not to be executable by .NET Framework.
+
+Unlike PE files, mixing native and managed code is not a goal.
+
+Lossless conversion from Webcil back to PE is not intended to be supported. The format is being
+documented in order to support diagnostic tooling and utilities such as decompilers, disassemblers,
+file identification utilities, dependency analyzers, etc.
+
diff --git a/docs/design/security/unix-tmp.md b/docs/design/security/unix-tmp.md
index bea8cb8f11ae6a..70f57a894fc2ce 100644
--- a/docs/design/security/unix-tmp.md
+++ b/docs/design/security/unix-tmp.md
@@ -7,12 +7,12 @@ are used to Windows may inadvertently create security risk if they use the same
Most notably, the Windows model for temporary files is that the operating system provides each user with a *unique*, *user-owned* temporary directory.
Moreover, all Windows users, including the service and system users, have designated user folders, including temporary folders.
-The Unix model is very different. The temp directory, assuming there is one, is often a global folder (except on MacOS).
+The Unix model is very different. The temp directory, assuming there is one, is often a global folder (except on macOS).
If possible, prefer a library function like `GetTempPath()` to find the folder. Otherwise,
the `TMPDIR` environment variable is used to store the location of this folder. This variable is
widely used and supported, but it is not mandatory for all Unix implementations. It should be the preferred
mechanism for finding the Unix temporary folder if a library method is not available. It will commonly
-point to either the `/tmp` or `/var/tmp` folder. These folders are not used for MacOS, so it is not recommended
+point to either the `/tmp` or `/var/tmp` folder. These folders are not used for macOS, so it is not recommended
to use them directly.
Because the temporary directory is often global, any use of the temp directory should be carefully
diff --git a/docs/design/specs/Ecma-335-Augments.md b/docs/design/specs/Ecma-335-Augments.md
index c0511f7ccaa5ca..8847ab7285d8ae 100644
--- a/docs/design/specs/Ecma-335-Augments.md
+++ b/docs/design/specs/Ecma-335-Augments.md
@@ -801,7 +801,7 @@ to allow `callvirt` instructions to be made in a uniform way independent of whet
When followed by the `call` instruction or the `ldftn` instruction,
the method must refer to a virtual static method defined on an interface. The behavior of the
`constrained.` prefix is to change the method that the `call` or `ldftn`
-instruction refers to to be the method on `implementorType` which implements the
+instruction refers to be the method on `implementorType` which implements the
virtual static method (paragraph *II.10.3*).
(Edit the paragraph "Correctness:" second from the bottom of page 316:)
diff --git a/docs/design/specs/Memory-model.md b/docs/design/specs/Memory-model.md
new file mode 100644
index 00000000000000..6018d805f4c826
--- /dev/null
+++ b/docs/design/specs/Memory-model.md
@@ -0,0 +1,298 @@
+
+# .NET memory model
+
+## ECMA 335 vs. .NET memory models
+ECMA 335 standard defines a very weak memory model. After two decades the desire to have a flexible model did not result in considerable benefits due to hardware being more strict. On the other hand programming against ECMA model requires extra complexity to handle scenarios that are hard to comprehend and not possible to test.
+
+In the course of multiple releases .NET runtime implementations settled around a memory model that is a practical compromise between what can be implemented efficiently on the current hardware, while staying reasonably approachable by the developers. This document rationalizes the invariants provided and expected by the .NET runtimes in their current implementation with expectation of that being carried to future releases.
+
+## Alignment
+When managed by the .NET runtime, variables of built-in primitive types are *properly aligned* according to the data type size. This applies to both heap and stack allocated memory.
+
+1-byte, 2-byte, 4-byte variables are stored at 1-byte, 2-byte, 4-byte boundary, respectively.
+8-byte variables are 8-byte aligned on 64 bit platforms.
+Native-sized integer types and pointers have alignment that matches their size on the given platform.
+
+The alignment of fields is not guaranteed when `FieldOffsetAttribute` is used to explicitly adjust field offsets.
+
+## Atomic memory accesses
+Memory accesses to *properly aligned* data of primitive and Enum types with size with sizes up to the platform pointer size are always atomic. The value that is observed is always a result of complete read and write operations.
+
+Primitive types: bool, char, int8, uint8, int16, uint16, int32, uint32, int64, uint64, float32, float64, native int, native unsigned int.
+
+Values of unmanaged pointers are treated as native integer primitive types. Memory accesses to *properly aligned* values of unmanaged pointers are atomic.
+
+Managed references are always aligned to their size on the given platform and accesses are atomic.
+
+The following methods perform atomic memory accesses regardless of the platform when the location of the variable is managed by the runtime.
+- `System.Threading.Interlocked` methods
+- `System.Threading.Volatile` methods
+
+**Example:** `Volatile.Read(ref location)` on a 32 bit platform is atomic, while an ordinary read of `location` may not be.
+
+## Unmanaged memory access
+As unmanaged pointers can point to any addressable memory, operations with such pointers may violate guarantees provided by the runtime and expose undefined or platform-specific behavior.
+**Example:** memory accesses through pointers whose target address is *not properly aligned* to the data access size may be not atomic or cause faults depending on the platform and hardware configuration.
+
+Although rare, unaligned access is a realistic scenario and thus there is some limited support for unaligned memory accesses, such as:
+* `unaligned.` IL prefix
+* `Unsafe.ReadUnaligned`, `Unsafe.WriteUnaligned` and ` Unsafe.CopyBlockUnaligned` helpers.
+
+These facilities ensure fault-free access to potentially unaligned locations, but do not ensure atomicity.
+
+As of this writing there is no specific support for operating with incoherent memory, device memory or similar. Passing non-ordinary memory to the runtime by the means of pointer operations or native interop results in Undefined Behavior.
+
+## Side-effects and optimizations of memory accesses
+.NET runtime assumes that the side-effects of memory reads and writes include only observing and changing values at specified memory locations. This applies to all reads and writes - volatile or not. **This is different from ECMA model.**
+
+As a consequence:
+* Speculative writes are not allowed.
+* Reads cannot be introduced.
+* Unused reads can be elided. (note: if a read can cause a fault it is not "unused")
+* Adjacent non-volatile reads from the same location can be coalesced.
+* Adjacent non-volatile writes to the same location can be coalesced.
+
+The practical motivations for these rules are:
+- We can't allow speculative writes as we consider changing the value to be observable, thus effects of a speculative write may not be possible to undo.
+- A read cannot be re-done, since it could fetch a different value and thus introduce a data race that the program did not have.
+- Reading from a variable and not observing sideeffects of the read is the same as not performing a read, thus unused reads can be removed.
+- Coalescing of adjacent ordinary memory accesses to the same location is ok because most programs do not rely on presence of data races thus, unlike introducing, removing data races is ok. Programs that do rely on observing data races shall use `volatile` accesses.
+
+## Thread-local memory accesses
+It may be possible for an optimizing compiler to prove that some data is accessible only by a single thread. In such case it is permitted to perform further optimizations such as duplicating or removal of memory accesses.
+
+## Cross-thread access to local variables
+- There is no type-safe mechanism for accessing locations on one thread’s stack from another thread.
+- Accessing managed references located on the stack of a different thread by the means of unsafe code will result in Undefined Behavior.
+
+## Order of memory operations
+* **Ordinary memory accesses**
+The effects of ordinary reads and writes can be reordered as long as that preserves single-thread consistency. Such reordering can happen both due to code generation strategy of the compiler or due to weak memory ordering in the hardware.
+
+* **Volatile reads** have "acquire semantics" - no read or write that is later in the program order may be speculatively executed ahead of a volatile read.
+ Operations with acquire semantics:
+ - IL load instructions with `volatile.` prefix when instruction supports such prefix
+ - `System.Threading.Volatile.Read`
+ - `System.Thread.VolatileRead`
+ - Acquiring a lock (`System.Threading.Monitor.Enter` or entering a synchronized method)
+
+* **Volatile writes** have "release semantics" - the effects of a volatile write will not be observable before effects of all previous, in program order, reads and writes become observable.
+ Operations with release semantics:
+ - IL store instructions with `volatile.` prefix when such prefix is supported
+ - `System.Threading.Volatile.Write`
+ - `System.Thread.VolatileWrite`
+ - Releasing a lock (`System.Threading.Monitor.Exit` or leaving a synchronized method)
+
+* **volatile. initblk** has "release semantics" - the effects of `.volatile initblk` will not be observable earlier than the effects of preceeding reads and writes.
+
+* **volatile. cpblk** combines ordering semantics of a volatile read and write with respect to the read and written memory locations.
+ - The writes performed by `volatile. cpblk` will not be observable earlier than the effects of preceeding reads and writes.
+ - No read or write that is later in the program order may be speculatively executed before the reads performed by `volatile. cpblk`
+ - `cpblk` may be implemented as a sequence of reads and writes. The granularity and mutual order of such reads and writes is unspecified.
+
+Note that volatile semantics does not by itself imply that operation is atomic or has any effect on how soon the operation is committed to the coherent memory. It only specifies the order of effects when they eventually become observable.
+
+`volatile.` and `unaligned.` IL prefixes can be combined where both are permitted.
+
+It may be possible for an optimizing compiler to prove that some data is accessible only by a single thread. In such case it is permitted to omit volatile semantics when accessing such data.
+
+* **Full-fence operations**
+ Full-fence operations have "full-fence semantics" - effects of reads and writes must be observable no later or no earlier than a full-fence operation according to their relative program order.
+ Operations with full-fence semantics:
+ - `System.Thread.MemoryBarrier`
+ - `System.Threading.Interlocked` methods
+
+## C# `volatile` feature
+One common way to introduce volatile memory accesses is by using C# `volatile` language feature. Declaring a field as `volatile` does not have any effect on how .NET runtime treats the field. The decoration works as a hint to the C# compiler itself (and compilers for other .Net languages) to emit reads and writes of such field as reads and writes with `volatile.` prefix.
+
+## Process-wide barrier
+Process-wide barrier has full-fence semantics with an additional guarantee that each thread in the program effectively performs a full fence at arbitrary point synchronized with the process-wide barrier in such a way that effects of writes that precede both barriers are observable by memory operations that follow the barriers.
+
+The actual implementation may vary depending on the platform. For example interrupting the execution of every core in the current process' affinity mask could be a suitable implementation.
+
+## Synchronized methods
+Methods decorated with ```MethodImpl(MethodImplOptions.Synchronized)``` attribute have the same memory access semantics as if a lock is acquired at an entrance to the method and released upon leaving the method.
+
+## Data-dependent reads are ordered
+Memory ordering honors data dependency. When performing indirect reads from a location derived from a reference, it is guaranteed that reading of the data will not happen ahead of obtaining the reference. This guarantee applies to both managed references and unmanaged pointers.
+
+**Example:** reading a field, will not use a cached value fetched from the location of the field prior obtaining a reference to the instance.
+ ```cs
+var x = nonlocal.a.b;
+var y = nonlocal.a;
+var z = y.b;
+
+// cannot have execution order as:
+
+var x = nonlocal.a.b;
+var y = nonlocal.a;
+var z = x;
+```
+
+## Object assignment
+Object assignment to a location potentially accessible by other threads is a release with respect to accesses to the instance’s fields/elements and metadata. An optimizing compiler must preserve the order of object assignment and data-dependent memory accesses.
+
+The motivation is to ensure that storing an object reference to shared memory acts as a "committing point" to all modifications that are reachable through the instance reference. It also guarantees that a freshly allocated instance is valid (for example, method table and necessary flags are set) when other threads, including background GC threads are able to access the instance.
+The reading thread does not need to perform an acquiring read before accessing the content of an instance since runtime guarantees ordering of data-dependent reads.
+
+The ordering side-effects of reference assignment should not be used for general ordering purposes because:
+- independent nonvolatile reference assignments could be reordered by the compiler.
+- an optimizing compiler can omit the release semantics if it can prove that the instance is not shared with other threads.
+
+There was a lot of ambiguity around the guarantees provided by object assignments. Going forward the runtimes will only provide the guarantees described in this document.
+
+_It is believed that compiler optimizations do not violate the ordering guarantees in sections about [data-dependent reads](#data-dependent-reads-are-ordered) and [object assignments](#object-assignment), but further investigations are needed to ensure compliance or to fix possible violations. That is tracked by the following issue:_ https://github.com/dotnet/runtime/issues/79764
+
+## Instance constructors
+.NET runtime does not specify any ordering effects to the instance constructors.
+
+## Static constructors
+All side-effects of static constructor execution will become observable no later than effects of accessing any member of the type. Other member methods of the type, when invoked, will observe complete results of the type's static constructor execution.
+
+## Hardware considerations
+Currently supported implementations of .NET runtime and system libraries make a few expectations about the hardware memory model. These conditions are present on all supported platforms and transparently passed to the user of the runtime. The future supported platforms will likely support these as well because the large body of preexisting software will make it burdensome to break common assumptions.
+
+* Naturally aligned reads and writes with sizes up to the platform pointer size are atomic.
+That applies even for locations targeted by overlapping aligned reads and writes of different sizes.
+**Example:** a read of a 4-byte aligned int32 variable will yield a value that existed prior to some write or after some write. It will never be a mix of before/after bytes.
+
+* The memory is cache-coherent and writes to a single location will be seen by all cores in the same order (multicopy atomic).
+**Example:** when the same location is updated with values in ascending order (for example, 1,2,3,4,...), no observer will see a descending sequence.
+
+* It may be possible for a thread to see its own writes before they appear to other cores (store buffer forwarding), as long as the single-thread consistency is not violated.
+
+* The memory managed by the runtime is ordinary memory (not device register file or the like) and the only side-effects of memory operations are storing and reading of values.
+
+* It is possible to implement release consistency memory model.
+Either the platform defaults to release consistency or stronger (that is, x64 is TSO, which is stronger), or provides means to implement release consistency via fencing operations.
+
+* It is possible to guarantee ordering of data-dependent reads.
+Either the platform honors data dependedncy by default (all currently supported platforms), or provides means to order data-dependent reads via fencing operations.
+
+## Examples and common patterns
+The following examples work correctly on all supported implementations of .NET runtime regardless of the target OS or architecture.
+
+* Constructing an instance and sharing with another thread is safe and does not require explicit fences.
+
+```cs
+
+static MyClass obj;
+
+// thread #1
+void ThreadFunc1()
+{
+ while (true)
+ {
+ obj = new MyClass();
+ }
+}
+
+// thread #2
+void ThreadFunc1()
+{
+ while (true)
+ {
+ obj = null;
+ }
+}
+
+// thread #3
+void ThreadFunc2()
+{
+ MyClass localObj = obj;
+ if (localObj != null)
+ {
+ // accessing members of the local object is safe because
+ // - reads cannot be introduced, thus localObj cannot be re-read and become null
+ // - publishing assignment to obj will not become visible earlier than write operations in the MyClass constructor
+ // - indirect accesses via an instance are data-dependent reads, thus we will see results of constructor's writes
+ System.Console.WriteLine(localObj.ToString());
+ }
+}
+
+```
+
+* Singleton (using a lock)
+
+```cs
+public class Singleton
+{
+ private static readonly object _lock = new object();
+ private static Singleton _inst;
+
+ private Singleton() { }
+
+ public static Singleton GetInstance()
+ {
+ if (_inst == null)
+ {
+ lock (_lock)
+ {
+ // taking a lock is an acquire, the read of _inst will happen after taking the lock
+ // releasing a lock is a release, if another thread assigned _inst, the write will be observed no later than the release of the lock
+ // thus if another thread initialized the _inst, the current thread is guaranteed to see that here.
+
+ if (_inst == null)
+ {
+ _inst = new Singleton();
+ }
+ }
+ }
+
+ return _inst;
+ }
+}
+
+```
+
+
+* Singleton (using an interlocked operation)
+
+```cs
+public class Singleton
+{
+ private static Singleton _inst;
+
+ private Singleton() { }
+
+ public static Singleton GetInstance()
+ {
+ Singleton localInst = _inst;
+ if (localInst == null)
+ {
+ // unlike the example with the lock, we may construct multiple instances
+ // only one will "win" and become a unique singleton object
+ Interlocked.CompareExchange(ref _inst, new Singleton(), null);
+
+ // since Interlocked.CompareExchange is a full fence,
+ // we cannot possibly read null or some other spurious instance that is not the singleton
+ localInst = _inst;
+ }
+
+ return localInst;
+ }
+}
+```
+
+* Communicating with another thread by checking a flag
+
+```cs
+internal class Program
+{
+ static bool flag;
+
+ static void Main(string[] args)
+ {
+ Task.Run(() => flag = true);
+
+ // the repeated read will eventually see that the value of 'flag' has changed,
+ // but the read must be Volatile to ensure all reads are not coalesced
+ // into one read prior entering the while loop.
+ while (!Volatile.Read(ref flag))
+ {
+ }
+
+ System.Console.WriteLine("done");
+ }
+}
+```
diff --git a/docs/design/specs/PortablePdb-Metadata.md b/docs/design/specs/PortablePdb-Metadata.md
index c1d8e3c4420660..5ccfda76b79ad2 100644
--- a/docs/design/specs/PortablePdb-Metadata.md
+++ b/docs/design/specs/PortablePdb-Metadata.md
@@ -9,23 +9,23 @@ The format is based on the ECMA-335 Partition II metadata standard. The physical
The ECMA-335-II standard is amended by an addition of the following tables to the “#~” metadata stream:
-* [Document](#DocumentTable)
-* [MethodDebugInformation](#MethodDebugInformationTable)
-* [LocalScope](#LocalScopeTable)
-* [LocalVariable](#LocalVariableTable)
-* [LocalConstant](#LocalConstantTable)
-* [ImportScope](#ImportScopeTable)
-* [StateMachineMethod](#StateMachineMethodTable)
-* [CustomDebugInformation](#CustomDebugInformationTable)
- * [StateMachineHoistedLocalScopes](#StateMachineHoistedLocalScopes)
- * [DynamicLocalVariables](#DynamicLocalVariables)
- * [DefaultNamespace](#DefaultNamespace)
- * [EditAndContinueLocalSlotMap](#EditAndContinueLocalSlotMap)
- * [EditAndContinueLambdaAndClosureMap](#EditAndContinueLambdaAndClosureMap)
- * [EmbeddedSource](#EmbeddedSource)
- * [SourceLink](#SourceLink)
- * [CompilationMetadataReferences](#CompilationMetadataReferences)
- * [CompilationOptions](#CompilationOptions)
+* [Document](#document-table-0x30)
+* [MethodDebugInformation](#methoddebuginformation-table-0x31)
+* [LocalScope](#localscope-table-0x32)
+* [LocalVariable](#localvariable-table-0x33)
+* [LocalConstant](#localconstant-table-0x34)
+* [ImportScope](#importscope-table-0x35)
+* [StateMachineMethod](#statemachinemethod-table-0x36)
+* [CustomDebugInformation](#customdebuginformation-table-0x37)
+ * [StateMachineHoistedLocalScopes](#state-machine-hoisted-local-scopes-c--vb-compilers)
+ * [DynamicLocalVariables](#dynamic-local-variables-c-compiler)
+ * [DefaultNamespace](#default-namespace-vb-compiler)
+ * [EditAndContinueLocalSlotMap](#edit-and-continue-local-slot-map-c-and-vb-compilers)
+ * [EditAndContinueLambdaAndClosureMap](#edit-and-continue-lambda-and-closure-map-c-and-vb-compilers)
+ * [EmbeddedSource](#embedded-source-c-and-vb-compilers)
+ * [SourceLink](#source-link-c-and-vb-compilers)
+ * [CompilationMetadataReferences](#compilation-metadata-references-c-and-vb-compilers)
+ * [CompilationOptions](#compilation-options-c-and-vb-compilers)
Debugging metadata tables may be embedded into type system metadata (and part of a PE file), or they may be stored separately in a metadata blob contained in a .pdb file. In the latter case additional information is included that connects the debugging metadata to the type system metadata.
@@ -33,7 +33,7 @@ Debugging metadata tables may be embedded into type system metadata (and part of
When debugging metadata is generated to a separate data blob "#Pdb" and "#~" streams shall be present. The standalone debugging metadata may also include #Guid, #String and #Blob heaps, which have the same physical layout but are distinct from the corresponding streams of the type system metadata.
-#### #Pdb stream
+#### #Pdb stream
The #Pdb stream has the following structure:
@@ -50,10 +50,10 @@ The #Pdb stream has the following structure:
References to heaps (strings, blobs, guids) are references to heaps of the debugging metadata. The sizes of references to type system tables are determined using the algorithm described in ECMA-335-II Chapter 24.2.6, except their respective row counts are found in _TypeSystemTableRows_ field of the #Pdb stream.
-### Document Table: 0x30
+### Document Table: 0x30
The Document table has the following columns:
-* _Name_ (Blob heap index of [document name blob](#DocumentNameBlob))
+* _Name_ (Blob heap index of [document name blob](#document-name-blob))
* _HashAlgorithm_ (Guid heap index)
* _Hash_ (Blob heap index)
* _Language_ (Guid heap index)
@@ -83,7 +83,7 @@ The values for which _HashAlgorithm_ has defined meaning are listed in the follo
Otherwise, the meaning of _Language_, _HashAlgorithm_ and _Hash_ values is undefined and the reader can interpret them arbitrarily.
-#### Document Name Blob
+#### Document Name Blob
Document name blob is a sequence:
@@ -100,16 +100,16 @@ The document name is a concatenation of the _parts_ separated by the _separator_
The representation is optimized for an efficient deserialization of the name into a UTF8 encoded string while minimizing the overall storage space for document names.
- - -
-### MethodDebugInformation Table: 0x31
+### MethodDebugInformation Table: 0x31
MethodDebugInformation table is either empty (missing) or has exactly as many rows as MethodDef table and the following column:
* _Document_ (The row id of the single document containing all sequence points of the method, or 0 if the method doesn't have sequence points or spans multiple documents)
-* _SequencePoints_ (Blob heap index, 0 if the method doesn’t have sequence points, encoding: [sequence points blob](#SequencePointsBlob))
+* _SequencePoints_ (Blob heap index, 0 if the method doesn’t have sequence points, encoding: [sequence points blob](#sequence-points-blob))
The table is a logical extension of MethodDef table (adding a column to the table) and as such can be indexed by MethodDef row id.
-#### Sequence Points Blob
+#### Sequence Points Blob
Sequence point is a quintuple of integers and a document reference:
* IL Offset
@@ -178,7 +178,7 @@ Each _SequencePointRecord_ represents a single sequence point. The sequence poin
The values of _Start Line_, _Start Column_, _End Line_ and _End Column_ of a non-hidden sequence point are calculated based upon the values of the previous non-hidden sequence point (if any) and the data stored in the record.
-### LocalScope Table: 0x32
+### LocalScope Table: 0x32
The LocalScope table has the following columns:
@@ -220,7 +220,7 @@ _StartOffset_ + _Length_ shall point to the starting byte of an instruction of t
For each pair of scopes belonging to the same _Method_ the intersection of their respective ranges _R1_ and _R2_ shall be either _R1_ or _R2_ or empty.
-### LocalVariable Table: 0x33
+### LocalVariable Table: 0x33
The LocalVariable table has the following columns:
@@ -236,23 +236,23 @@ There shall be no duplicate rows in the LocalVariable table, based upon owner an
There shall be no duplicate rows in the LocalVariable table, based upon owner and _Name_.
-##### LocalVariableAttributes
+##### LocalVariableAttributes
| flag | value | description |
|:------|:------|:------------|
| DebuggerHidden | 0x0001 | Variable shouldn’t appear in the list of variables displayed by the debugger |
-### LocalConstant Table: 0x34
+### LocalConstant Table: 0x34
The LocalConstant table has the following columns:
* _Name_ (String heap index)
-* _Signature_ (Blob heap index, [LocalConstantSig blob](#LocalConstantSig))
+* _Signature_ (Blob heap index, [LocalConstantSig blob](#localconstantsig-blob))
Conceptually, every row in the LocalConstant table is owned by one, and only one, row in the LocalScope table.
There shall be no duplicate rows in the LocalConstant table, based upon owner and _Name_.
-#### LocalConstantSig Blob
+#### LocalConstantSig Blob
The structure of the blob is
@@ -306,13 +306,13 @@ The encoding of the _GeneralValue_ is determined based upon the type expressed b
| System | Decimal | sign (highest bit), scale (bits 0..7), low (uint32), mid (uint32), high (uint32) |
| System | DateTime | int64: ticks |
-### ImportScope Table: 0x35
+### ImportScope Table: 0x35
The ImportScope table has the following columns:
* Parent (ImportScope row id or nil)
-* Imports (Blob index, encoding: [Imports blob](#ImportsBlob))
+* Imports (Blob index, encoding: [Imports blob](#imports-blob))
-#### Imports Blob
+#### Imports Blob
Imports blob represents all imports declared by an import scope.
Imports blob has the following structure:
@@ -344,7 +344,7 @@ The exact import semantics are language specific.
The blob may be empty. An empty import scope may still be target of custom debug information record.
-### StateMachineMethod Table: 0x36
+### StateMachineMethod Table: 0x36
The StateMachineMethod table has the following columns:
@@ -359,7 +359,7 @@ There shall be no duplicate rows in the StateMachineMethod table, based upon _Mo
There shall be no duplicate rows in the StateMachineMethod table, based upon _KickoffMethod_.
-### CustomDebugInformation Table: 0x37
+### CustomDebugInformation Table: 0x37
The CustomDebugInformation table has the following columns:
* _Parent_ ([HasCustomDebugInformation](#HasCustomDebugInformation) coded index)
@@ -404,7 +404,7 @@ Kind is an id defined by the tool producing the information.
The following _Custom Debug Information_ records are currently produced by C#, VB and F# compilers. In future the compilers and other tools may define new records. Once specified they may not change. If a change is needed the owner has to define a new record with a new kind (GUID).
-##### State Machine Hoisted Local Scopes (C# & VB compilers)
+##### State Machine Hoisted Local Scopes (C# & VB compilers)
Parent: MethodDef
Kind: {6DA9A61E-F8C7-4874-BE62-68BC5630DF71}
@@ -427,7 +427,7 @@ _start-offset_ shall point to the starting byte of an instruction of the MoveNex
_start-offset_ + _length_ shall point to the starting byte of an instruction or be equal to the size of the IL stream of the MoveNext method of the state machine type.
-##### Dynamic Local Variables (C# compiler)
+##### Dynamic Local Variables (C# compiler)
Parent: LocalVariable or LocalConstant
Kind: {83C563C4-B4F3-47D5-B824-BA5441477EA8}
@@ -442,7 +442,7 @@ Bits of the sequence are grouped by 8. If the sequence length is not a multiple
TODO: Specify the meaning of the bits in the sequence.
-##### Default Namespace (VB compiler)
+##### Default Namespace (VB compiler)
Parent: Module
Kind: {58b2eab6-209f-4e4e-a22c-b2d0f910c782}
@@ -455,7 +455,7 @@ Structure:
|:---------|:---------|:-----------|
| _namespace_ | UTF8 string | The default namespace for the module/project. |
-##### Edit and Continue Local Slot Map (C# and VB compilers)
+##### Edit and Continue Local Slot Map (C# and VB compilers)
Parent: MethodDef
Kind: {755F52A8-91C5-45BE-B4B8-209571E552BD}
@@ -480,7 +480,7 @@ The blob has the following structure:
The exact algorithm used to calculate syntax offsets and the algorithm that maps slots to syntax nodes is language and implementation specific and may change in future versions of the compiler.
-##### Edit and Continue Lambda and Closure Map (C# and VB compilers)
+##### Edit and Continue Lambda and Closure Map (C# and VB compilers)
Parent: MethodDef
Kind: {A643004C-0240-496F-A783-30D64F4979DE}
@@ -505,7 +505,7 @@ The number of lambda entries is determined by the size of the blob (the reader s
The exact algorithm used to calculate syntax offsets and the algorithm that maps lambdas/closures to their implementing methods, types and syntax nodes is language and implementation specific and may change in future versions of the compiler.
-##### Embedded Source (C# and VB compilers)
+##### Embedded Source (C# and VB compilers)
Parent: Document
Kind: {0E8A571B-6926-466E-B4AD-8AB04611F5FE}
@@ -521,14 +521,14 @@ The blob has the following structure:
| _format_ | int32 | Indicates how the content is serialized. 0 = raw bytes, uncompressed. Positive value = compressed by deflate algorithm and value indicates uncompressed size. Negative values reserved for future formats. |
| _content_ | format-specific | The text of the document in the specified format. The length is implied by the length of the blob minus four bytes for the format. |
-##### Source Link (C# and VB compilers)
+##### Source Link (C# and VB compilers)
Parent: Module
Kind: {CC110556-A091-4D38-9FEC-25AB9A351A6A}
The blob stores UTF8 encoded text file in JSON format that includes information on how to locate the content of documents listed in Document table on a source server.
-##### Compilation Metadata References (C# and VB compilers)
+##### Compilation Metadata References (C# and VB compilers)
Parent: Module
Kind: {7E4D4708-096E-4C5C-AEDA-CB10BA6A740D}
@@ -562,7 +562,7 @@ The remaining bits are reserved for future use and have currently no meaning.
> For example, the [Simple Symbol Query Protocol](https://github.com/dotnet/symstore/blob/master/docs/specs/Simple_Symbol_Query_Protocol.md) uses a combination of _file-name_, _time-stamp_ and _file-size_ as a [key](https://github.com/dotnet/symstore/blob/master/docs/specs/SSQP_Key_Conventions.md#pe-timestamp-filesize).
> Other services might use the MVID as it uniquely identifies the module.
-##### Compilation Options (C# and VB compilers)
+##### Compilation Options (C# and VB compilers)
Parent: Module
Kind: {B5FEEC05-8CD0-4A83-96DA-466284BB4BD8}
@@ -596,5 +596,5 @@ The order of the options in the list is insignificant.
> The `runtime-version` is significant since the compiler may have used certain functionality from the runtime that impacts the compilation output (e.g. Unicode tables, etc.)
> The purpose of this data is to allow a tool to reconstruct the compilation the module was built from.
-> The source files for the compilation are expected to be recovered from the source server using [SourceLink](#SourceLink) and/or from [sources embedded](#EmbeddedSource) in the PDB.
-> The metadata references for the compilation are expected to be recovered from a file indexing service (e.g. symbol server) using information in [Compilation Metadata References](#CompilationMetadataReferences) record.
+> The source files for the compilation are expected to be recovered from the source server using [SourceLink](#source-link-c-and-vb-compilers) and/or from [sources embedded](#embedded-source-c-and-vb-compilers) in the PDB.
+> The metadata references for the compilation are expected to be recovered from a file indexing service (e.g. symbol server) using information in [Compilation Metadata References](#compilation-metadata-references-c-and-vb-compilers) record.
diff --git a/docs/design/tools/illink/DAM-on-type-and-RUC-interaction.md b/docs/design/tools/illink/DAM-on-type-and-RUC-interaction.md
new file mode 100644
index 00000000000000..d9f8cff2d31b36
--- /dev/null
+++ b/docs/design/tools/illink/DAM-on-type-and-RUC-interaction.md
@@ -0,0 +1,168 @@
+# Interaction of DAM and RUC on type and members
+
+DAM = `DynamicallyAccessedMembers` attribute
+RUC = `RequiresUnreferencedCode` attribute
+
+## Existing rules
+
+* RUC on method suppresses warnings from the method's body and attributes.
+* RUC on method doesn't suppress warnings about the method usage (call to the method, accessing the method via reflection, ...)
+* RUC on type externally behaves as if all static members and constructors have RUC
+* RUC on type suppresses warnings as if all methods in the type have RUC on them (so method bodies and attributes)
+* RUC on type does NOT suppress warnings about/on nested types in any way
+
+## DAM on type behavior
+
+Annotating type with DAM effectively creates a reflection access to all affected members (depends on the annotation). The behavior in terms of getting a warning or not should be equivalent to accessing the member directly through reflection (`GetMethod` or similar).
+Applying "reflection access" on a member can produce additional warnings. Specifically if the member in question has RUC on it (or if itself has DAM annotation somewhere in it, like method parameters for example).
+
+For better warning UX and suppression we decided to generate the warnings with this origin:
+
+* The member itself if the type or one of its base types is annotated with a DAM which accesses the member in question
+* The type which adds DAM annotation which accesses a member on a base type (so unlike the above rule, we don't warn on the member, but on the type which added the DAM)
+
+*Note: the reasoning behind this behavior is to warn on the thing which is to blame for the problem. If type derives from annotated type, then the source of the problem is adding a member which will be accessed by such DAM and has issues (like RUC on it). If type adds DAM on itself, but such DAM causes access to a problematic member on base type, then the one to blame is the annotated type.*
+
+## RUC on type and interaction with DAM on type
+
+RUC on type doesn't suppress warnings caused by DAM on type.
+
+```csharp
+[DAM(All)]
+class AnnotatedBase {}
+
+[RUC]
+class DerivedWithRUC : AnnotatedBase
+{
+ public DerivedWithRUC () {}
+
+ [RUC]
+ public void MethodWithRUC() {}
+
+ public void MethodWithDAM([DAM(Fields)] Type type) {}
+
+ private static void StaticMethod() {}
+}
+```
+
+Following the existing rules, accessing `MethodWithRUC` or `MethodWithDAM` via reflection will generate a warning, regardless of the RUC on type.
+Since DAM on type is meant to behave as if accessing the members via reflection, those warnings should not be affected by the RUC on type either.
+
+Note that RUC on type as mentioned above is equivalent to applying RUC to all static members and constructors. So following that logic it means
+that the DAM will cause warnings generated by static members and .ctors. So in the above example both `DerivedWithRUC..ctor` and `DerivedWithRUC.StaticMethod`
+should generate warning due to the `RUC` on the type.
+
+## RUC on method and interaction with DAM on type
+
+RUC on a method which is made accessible due to DAM on type will generate a warning (the method is "accessed").
+
+```csharp
+[DAM(All)]
+class AnnotatedBase {}
+
+class Derived : AnnotatedBase
+{
+ [RUC]
+ public void MethodWithRUC() {}
+
+ public void MethodWithDAM([DAM(Fields)] Type type) {}
+
+ [RUC]
+ public void MethodWithRUCAndDAM([DAM(Fields)] Type type) {}
+}
+```
+
+Following the existing rules, accessing `MethodWithRUC` or `MethodWithDAM` via reflection will generate a warning. The same rules also imply that accessing `MethodWithRUCAndDAM` via reflection will also generate a warning (actually two of them).
+RUC on method does not affect usage of the method (other than it should generate a warning on the usage).
+
+## RUC or DAM on nested type
+
+```csharp
+[DAM(All)]
+class AnnotatedBase {}
+
+class Derived : AnnotatedBase
+{
+ [RUC]
+ class NestedWithRUC {}
+
+ [DAM]
+ class NestedWithDAM {}
+}
+```
+
+This is probably an existing hole. Accessing a RUC or DAM type itself via reflection is not problematic on its own (since both annotations should behave as applying to members only). But using such type can be problematic.
+Since just asking for the type of a DAM annotated type is considered reflection access to all of the members affected by the DAM, RUC on nested types must be reported if the nested type has any static members or .ctors.
+
+```csharp
+void TestMethod(Derived instance)
+{
+ // This will warn that it's accessing NestedWithRUC..ctor
+ Type typeOfDerived = instance.GetType(); // The type value is effectively annotated with All
+ Type nestedWithRUC = typeOfDerived.GetNestedType("NestedWithRUC"); // The resulting type value is effectively annotated with All
+ Activator.CreateInstance(nestedWithRUC); // No warning - nestedWithRUC has All annotation on it
+}
+```
+
+DAM on nested type doesn't seem to have a problem mainly because for marking purposes it's not needed (the DAM on the outer type if it applies to the nested type will mark the entire nested type, so DAM on it can't mark more).
+Also accessing DAM annotated types themselves is not a problem, and accessing their members is driven by the DAM annotation.
+
+## Conclusion
+
+Personally I'm not a big fan of the fact that RUC on type doesn't suppress the new warnings on the type's members - as a normal user I would expect that to happen. That said, doing so would introduce an "Exception" to the existing rules, which is not ideal either. If we warn more (RUC on type doesn't affect the new warnings), it sort of creates noise, but it's not exactly wrong. And we can change our mind later on (by not warning anymore some day in the future).
+
+In the end the interaction is very simple, the new warnings caused by DAM on type are not affected by RUC in any way (as in, they're never suppressed by RUC).
+
+**Important note:** Suppressing the new warnings is very likely to create unexpected breaks in the app. The DAM annotation on the type is effectively "public" in that anybody can use it. So for example reasoning like "This warning is OK because the one use where the DAM is utilized will not actually access this method." is very problematic, since if there's more than one use of the DAM (either already, or in the future), the trimmer will not generate new warnings. The DAM on type is effectively part of the type's contract, and as such the type should fulfill the contract. And part of such contract is that none of the members referenced by the DAM is dangerous to use in trimmed apps.
+
+## Samples
+
+```csharp
+[DAM(All)]
+class AnnotatedBase {}
+
+[RUC]
+class DerivedWithRUC : AnnotatedBase
+{
+ // IL2112
+ [RUC]
+ public void MethodWithRUC() {}
+
+ // IL2114
+ public static void MethodWithDAM([DAM] Type type) {}
+
+ // IL2112
+ // IL2114
+ [RUC]
+ public void MethodWithDAMAndRUC([DAM] Type type) {}
+
+ // IL2114
+ [DAM]
+ public Type FieldWithDAM;
+
+ // IL2112 - we must do this here, since we won't be able to see the RUC anywhere else
+ [RUC]
+ public class NestedWithRUC {}
+
+ // No warnings - ??? Probably ??? - I think the DAM on the outer type effectively implies DAM(All) on the nested type
+ // and thus declaring it explicitly has no effect. But this needs validation specifically for cases where the outer type
+ // has DAM(PublicNestedTypes) on it (the new behavior should still imply All on the nested type in such case I think)
+ [DAM(Fields)]
+ public class NestedWithDAM {}
+}
+
+class Derived : AnnotatedBase
+{
+ // IL2112
+ [RUC]
+ public void MethodWithRUC() {}
+
+ // IL2114
+ public static void MethodWithDAM([DAM] Type type) {}
+
+ // IL2112
+ // IL2114
+ [RUC]
+ public void MethodWithDAMAndRUC([DAM] Type type) {}
+}
+```
diff --git a/docs/design/tools/illink/compiler-generated-code-handling.md b/docs/design/tools/illink/compiler-generated-code-handling.md
new file mode 100644
index 00000000000000..4ed908db0eab76
--- /dev/null
+++ b/docs/design/tools/illink/compiler-generated-code-handling.md
@@ -0,0 +1,628 @@
+# Handling of compiler generated code
+
+Modern compilers provide language features which require lot of fancy code generation by the compiler. Not just pure IL generation, but producing new types, methods and fields. An example is `async`/`await` in C# which turns the body of the method into a separate class which implements a state machine.
+
+Lot of the trimming logic relies on attributes authored by the developer. These provide hints to the trimmer especially around areas which are otherwise problematic, like reflection. For example see [reflection-flow](reflection-flow.md) for an example of such attribute.
+
+## Problem
+
+User authored attributes are not propagated to the compiler generated code. For example (using C# async feature):
+
+```csharp
+[RequiresUnreferencedCode ("--MethodRequiresUnreferencedCode--")]
+static void MethodRequiresUnreferencedCode () { }
+
+[UnconditionalSuppressMessage ("IL2026", "")]
+static async void TestBeforeAwait ()
+{
+ MethodRequiresUnreferencedCode ();
+ await AsyncMethod ();
+}
+```
+
+This code should not produce any warning, because the `IL2026` is suppressed via an attribute. But currently this will produce the `IL2026` warning from a different method:
+
+```console
+ILLink: Trim analysis warning IL2026: SuppressWarningsInAsyncCode.d__1.MoveNext(): Using method 'MethodRequiresUnreferencedCode()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code.
+```
+
+Note that the warning comes from a compiler generated method `MoveNext` on class `d__1`. The `UnconditionalSuppressMessage` attribute is not propagated and so from a trimmer perspective this is completely unrelated code and thus the warning is not suppressed.
+
+### Method body attributes
+
+The trimmer currently recognizes two attributes which effectively apply to entire method body:
+
+#### `RequiresUnreferencedCodeAttribute`
+
+The `RequiresUnreferencedCodeAttribute` marks the method as incompatible with trimming and at the same time it suppressed trim analysis warnings from the entire method's body. So for example (using C# iterator feature):
+
+```csharp
+[RequiresUnreferencedCode ("Incompatible with trimming")]
+static IEnumerable TestBeforeIterator ()
+{
+ MethodRequiresUnreferencedCode ();
+ yield return 1;
+}
+```
+
+Should not produce a warning.
+
+#### `UnconditionalSuppressMessageAttribute`
+
+The `UnconditionalSuppressMessageAttribute` can target lot of scopes, but the smallest one is a method. It can't target specific statements within a method. It is supposed to suppress a specific warning from the method's body, for example:
+
+```csharp
+[UnconditionalSuppressMessage("IL2026", "")]
+static async void TestAfterAwait ()
+{
+ await AsyncMethod ();
+ MethodRequiresUnreferencedCode ();
+}
+```
+
+Should not produce a warning.
+
+### Data flow analysis
+
+The trimmer performs data flow analysis within a single method's body, mostly around track the flow of `System.Type` and related instances to be able to detect recursion usage.
+
+#### `DynamicallyAccessedMembersAttribute`
+
+The `DynamicallyAccessedMembersAttribute` annotates values (local variables, method parameters, ...) of type `System.Type` to hint the trimmer that the type will have its methods accessed dynamically (through reflection). Such annotation doesn't propagate currently. For example:
+
+```csharp
+static IEnumerable TestParameter ([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] Type type)
+{
+ type.GetMethod ("BeforeIteratorMethod");
+ yield return 1;
+ type.GetMethod ("AfterIteratorMethod");
+}
+```
+
+Should not produce any warnings, because the `type` variable is properly annotated.
+
+#### Intrinsic data flow
+
+The trimmer also intrinsically recognizes certain patterns and perform data flow analysis around them. This allows full analysis of certain reflection usage even without annotations. For example, intrinsic handling of the `typeof` keyword:
+
+```csharp
+static IEnumerable TestLocalVariable ()
+{
+ Type type = typeof (TestType);
+ type.GetMethod ("BeforeIteratorMethod");
+ yield return 1;
+ type.GetMethod ("AfterIteratorMethod");
+}
+```
+
+### Compiler dependent behavior
+
+Since the problems are all caused by compiler generated code, the behaviors depend on the specific compiler in use. The main focus of this document is the Roslyn C# compiler right now. Mainly since it's by far the most used compiler for .NET code. That said, we would like to design the solution in such a way that other compilers using similar patterns could also benefit from it.
+
+It is expected that other compilers (for example the F# compiler) might have other patterns which are also problematic for trimmers. These should be eventually added to the document as well, but may require new solutions not discussed in here yet.
+
+## A - Roslyn closure rewrite expected behavior
+
+In order to create a lambda method with captured variables, the Roslyn compiler will generate a closure class which stores the captured values and the lambda method is then generated as a method on that class. Currently compiler doesn't propagate attributes to the generated methods.
+
+### A1 - `RequiresUnreferencedCode` with lambda
+
+```csharp
+[RequiresUnreferencedCode ("--TestLambdaWithCapture--")]
+static void TestLambdaWithCapture (int p)
+{
+ Action a = () => MethodRequiresUnreferencedCode (p);
+}
+```
+
+Trimmer should suppress trim analysis warnings due to `RequiresUnreferencedCode` even inside the lambda. In C# 10 it will be possible to add an attribute onto the lambda directly. The attribute should be propagated only if it's not already there.
+**Open question Q1a**: Should method body attributes propagate to lambdas? Maybe we should rely on C# 10 and explicit attributes only.
+
+### A2 - `UnconditionalSuppressMessage` with lambda
+
+```csharp
+[UnconditionalSuppressMessage ("IL2026", "")]
+static void TestLambdaWithCapture (int p)
+{
+ Action a = () => MethodRequiresUnreferencedCode (p);
+}
+```
+
+Trimmer should suppress `IL2026` due to the suppression attribute. In C# 10 it will be possible to add an attribute onto the lambda directly. The attribute should be propagated only if it's not already there.
+**Open question Q1a**: Should method body attributes propagate to lambdas? Maybe we should rely on C# 10 and explicit attributes only.
+
+### A3 - Data flow annotations with lambda
+
+```csharp
+static void TestParameterInLambda ([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] Type type)
+{
+ Action a = () => {
+ type.GetMethod ("InLambdaMethod");
+ };
+}
+```
+
+Trimmer should be able to flow the annotation from the parameter into the closure for the lambda and thus avoid warning in this case.
+
+### A4 - Intrinsic data flow with lambda
+
+```csharp
+static void TestLocalVariableInLambda ()
+{
+ Type type = typeof (TestType);
+ Action a = () => {
+ type.GetMethod ("InLambdaMethod");
+ };
+}
+```
+
+Internal data flow tracking should propagate into lambdas.
+
+### A5 - Generic parameter data flow with lambda
+
+```csharp
+static void TestGenericParameterInLambda<[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] T> ()
+{
+ Action a = () => {
+ typeof (T).GetMethod ("InLocalMethod");
+ };
+}
+```
+
+Annotations should flow with the generic parameter into lambdas.
+
+### A6 - `RequiresUnreferencedCode` with local function
+
+```csharp
+[RequiresUnreferencedCode ("--TestLocalFunctionWithNoCapture--")]
+static void TestLocalFunctionWithNoCapture ()
+{
+ LocalFunction ();
+
+ void LocalFunction()
+ {
+ MethodRequiresUnreferencedCode ();
+ }
+}
+```
+
+The trimmer could propagate the `RequiresUnreferencedCode` to the local function. Unless the function already has that attribute present.
+**Question Q1b**: Should method body attributes propagate to local functions? It's possible to add the attribute manually to the local function, so maybe we should simply rely on that.
+
+### A7 - `UnconditionalSuppressMessage` with local function
+
+```csharp
+[UnconditionalSuppressMessage ("IL2026", "")]
+static void TestLocalFunctionWithNoCapture ()
+{
+ LocalFunction ();
+
+ void LocalFunction ()
+ {
+ MethodRequiresUnreferencedCode ();
+ }
+}
+```
+
+Similarly to the A5 case, the trimmer could propagate the warning suppression to the local function. Unless the function already has suppressions.
+**Question Q1b**: Should method body attributes propagate to local functions? It's possible to add the attribute manually to the local function, so maybe we should simply rely on that.
+
+### A8 - Data flow annotations with local function
+
+```csharp
+static void TestParameterInLocalFunction ([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] Type type)
+{
+ LocalFunction ();
+
+ void LocalFunction ()
+ {
+ type.GetMethod ("InLocalMethod");
+ }
+}
+```
+
+Identical to A3, annotations should propagate into local functions.
+
+### A9 - Intrinsic data flow with local function
+
+```csharp
+static void TestLocalVariableInLocalFunction ()
+{
+ Type type = typeof (TestType);
+ LocalFunction ();
+
+ void LocalFunction ()
+ {
+ type.GetMethod ("InLocalMethod");
+ }
+}
+```
+
+Identical to A4 - Internal data flow tracking should propagate into local functions.
+
+### A10 - Generic parameter data flow with local functions
+
+```csharp
+static void TestGenericParameterInLocalFunction<[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] T> ()
+{
+ LocalFunction ();
+
+ void LocalFunction ()
+ {
+ typeof (T).GetMethod ("InLocalMethod");
+ }
+}
+```
+
+Generic parameter annotations should flow into local methods.
+
+## B Roslyn iterator rewrites expected behavior
+
+Specifically the C# compiler will rewrite entire method bodies. Iterators which return enumeration and use `yield return` will rewrite entire method body and move it into a separate class. This has similar problems as closures since it effectively behaves a lot like closure, but has additional challenges due to different syntax.
+
+### B1 - `RequiresUnreferencedCode` with iterator body
+
+```csharp
+[RequiresUnreferencedCode ("--TestAfterIterator--")]
+static IEnumerable TestAfterIterator ()
+{
+ yield return 1;
+ MethodRequiresUnreferencedCode ();
+}
+```
+
+The attribute should apply to the entire method body and thus suppress trim analysis warnings. Even if the body is spread by the compiler into different methods.
+
+### B2 - `UnconditionalSuppressMessage` with iterator body
+
+```csharp
+[UnconditionalSuppressMessage ("IL2026", "")]
+static IEnumerable TestBeforeIterator ()
+{
+ MethodRequiresUnreferencedCode ();
+ yield return 1;
+}
+```
+
+The attribute should apply to the entire method body and thus suppress trim analysis warnings. Even if the body is spread by the compiler into different methods.
+
+### B3 - Data flow annotations in iterator body
+
+```csharp
+static IEnumerable TestParameter ([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] Type type)
+{
+ type.GetMethod ("BeforeIteratorMethod");
+ yield return 1;
+ type.GetMethod ("AfterIteratorMethod");
+}
+```
+
+The data flow annotation from method parameter should flow through the entire body.
+
+### B4 - Intrinsic data flow in iterator body
+
+```csharp
+static IEnumerable TestLocalVariable ()
+{
+ Type type = typeof (TestType);
+ type.GetMethod ("BeforeIteratorMethod");
+ yield return 1;
+ type.GetMethod ("AfterIteratorMethod");
+}
+```
+
+The intrinsic annotations should flow through the entire body.
+
+### B5 - Generic parameter data flow in iterator body
+
+```csharp
+static IEnumerable TestGenericParameter<[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] T> ()
+{
+ typeof (T).GetMethod ("BeforeIteratorMethod");
+ yield return 1;
+ typeof (T).GetMethod ("AfterIteratorMethod");
+}
+```
+
+Generic parameter annotations should flow through the entire body.
+
+## C Roslyn async rewrites expected behavior
+
+Similarly to iterators, C# compiler also rewrites method bodies which use `async`/`await`. This has similar problems as closures since it effectively behaves a lot like closure, but has additional challenges due to different syntax.
+
+### C1 - `RequiresUnreferencedCode` with async body
+
+```csharp
+[RequiresUnreferencedCode ("--TestAfterAwait--")]
+static async void TestAfterAwait ()
+{
+ await AsyncMethod ();
+ MethodRequiresUnreferencedCode ();
+}
+```
+
+The attribute should apply to the entire method body and thus suppress trim analysis warnings. Even if the body is spread by the compiler into different methods. Very similar to B1.
+
+### C2 - `UnconditionalSuppressMessage` with iterator body
+
+```csharp
+[UnconditionalSuppressMessage("IL2026", "")]
+static async void TestBeforeAwait()
+{
+ MethodRequiresUnreferencedCode ();
+ await AsyncMethod ();
+}
+```
+
+The attribute should apply to the entire method body and thus suppress trim analysis warnings. Even if the body is spread by the compiler into different methods. Very similar to B2.
+
+### C3 = Data flow annotations in async body
+
+```csharp
+static async void TestParameter ([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type type)
+{
+ type.GetMethod ("BeforeAsyncMethod");
+ await AsyncMethod ();
+ type.GetMethod ("AfterAsyncMethod");
+}
+```
+
+The data flow annotation from method parameter should flow through the entire body. Very similar to B3.
+
+### C4 - Intrinsic data flow in async body
+
+```csharp
+static async void TestLocalVariable ()
+{
+ Type type = typeof (TestClass);
+ type.GetMethod ("BeforeAsyncMethod");
+ await AsyncMethod ();
+ type.GetMethod ("AfterAsyncMethod");
+}
+```
+
+The intrinsic annotations should flow through the entire body. Very similar to B4.
+
+### C5 - Generic parameter data flow in async body
+
+```csharp
+static async void TestGenericParameter<[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] T> ()
+{
+ typeof (T).GetMethod ("BeforeIteratorMethod");
+ await AsyncMethod ();
+ typeof (T).GetMethod ("AfterIteratorMethod");
+}
+```
+
+Generic parameter annotations should flow through the entire body. Very similar to B5.
+
+## D Roslyn closure class and method naming behavior
+
+When the Roslyn compiler generates a closure and moves the code in the method into a method on the closure trimming tools should have enough information to provide correct information about the source of a warning (if there's any).
+
+### D1 - Lambda methods
+
+```csharp
+static void TestInLambda ()
+{
+ Action a = () => MethodRequiresUnreferencedCode (); // Warning should point to this line
+}
+```
+
+Given symbols this should produce a warning pointing to the source file, but should not include the method name which looks like `<>c.b__1_0()`. This should produce a warning which looks like:
+
+```console
+Source.cs(3,22): Trim analysis warning IL2026: Using method 'MethodRequiresUnreferencedCode()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code.
+```
+
+Similarly for all other warnings originating from trim analysis.
+
+**Open question Q2a:** Should we try to display a better name for lambdas if there are no symbols available for the assembly?
+
+### D2 - Local functions
+
+```csharp
+static void TestInLocalFunction ()
+{
+ LocalFunction ();
+
+ void LocalFunction()
+ {
+ MethodRequiresUnreferencedCode (); // Warning should point to this line
+ }
+}
+```
+
+Just like with lambdas, if there are symbols the warning should point to the source location and not include the compiler generated method name which in this case looks something like `Type.g__LocalFunction|2_0()`. The produced warning should look like this:
+
+```console
+Source.cs(7,9): Using method 'MethodRequiresUnreferencedCode()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code.
+```
+
+**Open question Q2b:** Should we try to display a better name for local functions if there are no symbols available for the assembly?
+
+### D3 - Iterators
+
+```csharp
+static IEnumerable TestIterator ()
+{
+ MethodRequiresUnreferencedCode (); // Warning should point to this line
+ yield return 1;
+}
+```
+
+In this case as well, the trimmer should report the warning pointing to the source and avoid including the compiler generated name which looks like `d__3.MoveNext()`. The warning should look like this:
+
+```console
+Source.cs(3,5): Using method 'MethodRequiresUnreferencedCode()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code.
+```
+
+**Open question Q2c:** Should we try to display a better name for iterator methods if there are no symbols available for the assembly?
+
+### D4 - Async
+
+```csharp
+static async void TestAsync ()
+{
+ MethodRequiresUnreferencedCode ();
+ await AsyncMethod ();
+}
+```
+
+Just like in the above cases the warning should point to source and not include the compiler generated name, which looks like `d__4.MoveNext()`. The warning should look like:
+
+```console
+Source.cs(3,5): Using method 'MethodRequiresUnreferencedCode()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code.
+```
+
+**Open question Q2d:** Should we try to display a better name for async methods if there are no symbols available for the assembly?
+
+## E Reporting user visible names from data flow analysis
+
+Data flow analysis in the trimmer reports warnings which point to sources of data values, for example method parameters, fields and so on. With closure classes generated by the compiler the warning might be in a spot where the immediate value is read from a field on the closure class, but that field is compiler generated. Ideally the warning would point to the actual source of the value for that field which is visible in user code.
+
+### E1 - Lambda methods
+
+```csharp
+static void TestWarningInLambda (Type typeParameter)
+{
+ Action a = () => typeParameter.GetMethod ("InLambdaMethod");
+}
+```
+
+The above should produce warning blaming `typeParameter` as the source of the unannotated value.
+
+### E2 - Local functions
+
+```csharp
+static void TestWarningInLocalFunction ()
+{
+ Action a = () => typeof(TInput).GetMethod ("InLambdaMethod");
+}
+```
+
+In this case the warning should blame `TInput` as the unannotated value.
+
+### E3 - Iterators
+
+```csharp
+static IEnumerable TestWarning(Type typeParameter)
+{
+ typeParameter.GetMethod ("InIteratorMethod");
+ yield return 1;
+}
+```
+
+This should produce warning blaming `typeParameter`.
+
+### E4 - Async
+
+```csharp
+static async void TestWarning()
+{
+ typeof (TInput).GetMethod ("InAsyncMethod");
+ await AsyncMethod ();
+}
+```
+
+And this one should blame `TInput`.
+
+## Recommended solution
+
+The solution needs to solve two problems:
+
+* How to propagate warning suppression and `RequiresUnreferencedCode` suppression from
+the user method to all of the compiler generated methods/types which are called by that method.
+This is called "suppression propagation" below.
+* How to implement data flow analysis across the user method's body and all of the compiler generated
+methods, types and fields. This is called "data flow analysis" below.
+
+In both cases the first thing the trimmer needs to figure out is for a given user method
+what are all of the compiler generated items which were used to implement that method
+in the IL. This can include:
+
+* New types - for example closure types
+* New methods - for example methods on the closure types, or methods on the parent type for local functions
+* New fields - fields on the closure types
+* New generic parameters - closure types and methods may be generic if the user method is generic
+
+To correctly handle warning suppression, the trimmer needs to apply the same warning suppressions
+on warnings generated due to all of the compiler generated items as if those were coming
+directly from the user method's body.
+
+To correctly handle data flow analysis, the trimmer needs to be able to track values across all of the
+compiler generated items as if they implement a single unit. This almost inevitable leads to
+cross method data flow analysis. Since that is a very expensive thing to do, being able to confine
+it to only the compiler generated code for a given user method is almost necessary. On top of that
+the trimmer needs to be able to track values as they traverse local variables, method parameters
+and fields on the closure types.
+
+### Long term solution
+
+Detecting which compiler generated items are used by any given user method is currently relatively tricky.
+There's no definitive marker in the IL which would let the trimmer confidently determine this information.
+Good long term solution will need the compilers to produce some kind of marker in the IL so that
+static analysis tools can reliably detect all of the compiler generated items.
+
+This ask can be described as:
+For a given user method, ability to determine all of the items (methods, fields, types, IL code) which were
+used by the compiler to generate the functionality of the method into an IL assembly.
+
+This should be things which are directly generated from the user's code. It should NOT include compiler
+helpers and other infrastructure which may be needed but is not directly attributable to a user code.
+
+This should be enough to implement solutions for both suppression propagation and data flow analysis.
+
+### Possible short term solution
+
+#### Heuristic based solution
+
+Without compiler provided markers, there's no existing way to 100% reliably implement the required
+functionality in the trimmer. That said, it should be possible to implement a reasonably good
+approximation. This approximation will necessarily make assumptions about the compilers used
+to produce the analyzed code. So for the purposes of a short term solution, Roslyn CSharp compiler
+should be treated as first priority (since it's by far the most common compiler to produce analyzed IL).
+Second in row should be the FSharp compiler.
+
+It is also much simpler to implement suppression propagation, so that should be done first.
+
+The general idea how to detect compiler generated code for a given user method:
+
+* Ability to detect compiler generated code. Can be done by detecting identifiers which are invalid
+in a given language. For CSharp, the compiler uses `<` and `>` characters in the identifiers
+of a compiler generated items. In FSharp this role is served by the `@` character.
+* Any compiler generated item (as detected per above) referenced from a user method
+will be considered to belong to that user method.
+
+Pros:
+
+* Can handle all cases for warning suppressions - async, iterator, lambdas and local functions
+* Can work on not just Roslyn generated IL
+
+Cons:
+
+* Heuristic - it may get it wrong in which case the trimmer may report less warnings than it should
+* Complex implementation mainly due to issues with reflection accessed code. For example if the closure class
+is marked only due to reflection access (for example `DynamicallyAccessedMemberType.All`) and the actual
+user method is not marked at all then there's no good way to determine the user method to figure out suppression
+context. Again can lead to reporting less warnings.
+
+#### Deterministic partial solution based on attributes
+
+For state machines the Roslyn compiler currently generates `IteratorStateMachineAttribute`, `AsyncStateMachineAttribute` and `AsyncIteratorStateMachineAttribute` attributes onto the "user method" and the attribute points to the generated state machine type.
+
+This can be used to completely deterministically figure out the mapping between state machine code and user methods.
+
+Pros:
+
+* Deterministic and reliable - as long as Roslyn generates these attributes (which is considered internal behavior)
+* Relatively simple implementation in the trimmer for suppressions
+
+Cons:
+
+* Partial solution - only works on async and iterator methods, doesn't work on lambdas and local functions
+
+The recommended solution is to use the deterministic approach via attributes. This solution doesn't have the reflection access problem (which is very problematic).
+The fact that it doesn't solve lambdas and local functions has a reasonable workaround. Both can be annotated
+manually by the developer by adding attributes to them. This introduces a discrepancy between analyzer
+and trimmer (as analyzer would not have this problem), but it's acceptable behavior for .NET 6.
\ No newline at end of file
diff --git a/docs/design/tools/illink/constant-propagation-and-branch-removal.md b/docs/design/tools/illink/constant-propagation-and-branch-removal.md
new file mode 100644
index 00000000000000..028de1f1f8bc0d
--- /dev/null
+++ b/docs/design/tools/illink/constant-propagation-and-branch-removal.md
@@ -0,0 +1,199 @@
+# Constant propagation and unreachable branch removal
+
+ILLink implements optimization which can propagate constant values across methods and based on these constants determine unreachable branches in code and remove those. This means that the code in the removed branch is not scanned for its dependencies which in turn won't be marked and can potentially be trimmed as well.
+
+## Desired behavior
+
+### Constant propagation
+
+Method can return constant value if its code will always return the same value (and it's possible to statically analyze that as a fact), for example:
+
+```csharp
+ public bool Is32Bit { get => false; }
+```
+
+On 64bit platforms the property is compiled with constant value, and ILLInk can determine this. It's also possible to use substitutions to overwrite method's return value to a constant via the [substitutions XML file](../../../tools/illink/data-formats.md#substitution-format).
+
+If such method is used in another method and it influences its return value, it can mean that the caller method will itself always return the same value. For example:
+
+```csharp
+ public int SizeOfIntPtr {
+ get {
+ if (Is32Bit)
+ return 4;
+ else
+ return 8;
+ }
+ }
+```
+
+ILLink will be able to determine that the call to `Is32Bit` getter will always return `false` and thus the `SizeOfIntPtr` will in turn always return `8`.
+
+### Unreachable branch removal
+
+If some method's return value is detected as constant, it can be possible to optimize conditions in which the return value is used and potentially even remove entire branches of code. For example:
+
+```csharp
+ public void CopyMemory ()
+ {
+ if (Is32Bit)
+ {
+ CopyUsingDWords ();
+ }
+ else
+ {
+ CopyUsingQWords ();
+ }
+ }
+```
+
+In this case if building for 64bit platform the condition will be evaluated as `false` always, and thus the `true` branch of the `if` can be removed. This will in turn lead to also trimming `CopyUsingDWords` method (assuming it's not used from some other place).
+
+### Explicit non-goals
+
+For now ILLink will not inline any method calls. It's relatively tricky to determine if it's possible without breaking the application and leaving the actual calls in place makes debugging more predictable and easier (it's possible to set a breakpoint into the callee's body and it will be hit always).
+
+## Algorithm
+
+The implementation of this optimization is relatively complex since it's solving a potentially global problem in that results of optimization of one method potentially influence results of all methods which call it and so on. But we need the algorithm to work locally without global view. This is necessary because of lazy loading of assemblies, which means that before and during marking it's not guaranteed that all assemblies were discovered and loaded. At the same time this optimization must be complete before a given method is processed by `MarkStep` since we want to not mark dependencies from removed branches.
+
+### Used data structures
+
+* Dictionary of method -> value for all processed methods. The value of a method can be several things depending on the result of processing it:
+ * Sentinel value "Processed but not changed" which means the method has been processed and no optimization was done on it. It's unknown if the method returns a constant value or not (yet, analysis hasn't occurred). If nothing needs to know the return value of the method then this can be a final state.
+ * Sentinel value "Processed and is not constant" which means the method has been processed and its return value was not detected as constant. This is a final state.
+ * Instruction which represents the constant return value of the method if it was detected as returning constant value. This is a final state.
+
+* Processing stack which stores ordered list of processing node, each node representing a method and additional data about it. The stack is processed by always taking the top of the stack and attempting to process that node. Nodes are always added to the top of the stack and are always removed from the top of the stack. In some cases nodes are "moved", that is a node which is not on the top of the stack is moved to the top of the stack. For this reason the stack is implemented as a linked list (so that it's easy to point to nodes in it as well as moves nodes around).
+
+* Helper structure for method -> stack node fast lookups.
+
+### Processing methods
+
+It starts by placing the requested method on top of the stack and then processing the stack until it's empty (at which point the requested method is guaranteed to be processed).
+
+Processing the stack is a loop where:
+
+* Loop until stack is empty
+* The top of the stack is peeked (not actually popped) and the method there is processed
+ 1. The last attempt version of the method is set to the current version of the stack (for loop detection, see below)
+ 2. The method's body is scanned and all callees which can be used for constant propagation are detected
+ * If the called method is already processed its value is used (if it has one)
+ * There's an optimization here where methods are only marked as processed without analyzing for their return value. If such method is encountered here, the return value analyzer will run in-place to determine the value of the method (and the result is stored)
+ * If the called method is not yet processed and is not on the stack, it's added to the top of the stack
+ * If the called method is not yet processed but it's already on the stack, it's moved to the top of the stack - this makes it efficient since this promotes processing of dependencies before the dependents and thus reduces the number of times the dependents must be re-scanned.
+ 3. If the scan was not fully done because some callees are not yet processed, give up on this method and loop (pick up the new top of the stack)
+ 4. If the scan was successful
+ * If there were not callees with constant values detected, mark the method as "Processed and unchanged" and remove it from the stack - loop
+ 5. If the method had any constants detected, run the branch removal logic to remove unused branches
+ 6. Regardless of branch removal results (even if nothing happened) use the new method body and the detected constants to analyze the method if it returns a constant itself - store the result
+ 7. Mark the method as processed and remove it from the stack - loop
+
+### Dependency loop detection
+
+The above algorithm could lead to endless loops if there's a recursion between multiple methods. For example code like this:
+
+```csharp
+void A () {
+ if (Helper ())
+ DoSomeWork ();
+
+ return B ();
+}
+
+void B () {
+ if (Helper ())
+ DoSomeWork ();
+
+ return A ();
+}
+```
+
+In this case when `A`'s body is scanned (step 2 above) it will find a call to `B` and add it for processing and back off. Then `B` is top of the stack so it's scanned, and finds `A` to be on the stack but not yet processed. So it moves it to the top of the stack and backs off. Then `A` is processed... and so on.
+
+To avoid this a versioning scheme is used to detect loops. There's a global version number maintained alongside the stack. Every time a new item is added or removed from the stack the stack version is incremented. This is used to detect "something has changed". Each node on the stack stores the stack version from the last time it was attempted to process that node/method. So in the above sample the flow would be something like:
+
+* Stack `StackVersion = 0`
+* `A` is added to the stack - `StackVersion = 1`
+* `A` is attempted to be processed - `A.LastAttemptVersion = 1`
+* `A` detects dependency on `B` and adds `B` to the top of the stack - `StackVersion = 2`
+* `B` is attempted to be processed - `B.LastAttemptVersion = 2`
+* `B` detects dependency on `A` and moves `A` to the top of the stack - no version changes - still 2
+* `A` is attempted to be processed - `A.LastAttemptVersion = 2`
+* `A` detects dependency on `B` and moves `B` to the top of the stack - no version changes - still 2
+* `B` is attempted to be processed - at this point `B.LastAttemptVersion == 2` and also `StackVersion == 2`
+
+To detect the loop each time a node is about to be processed its `LastAttemptVersion` is checked against the current stack version. If they're equal it means that nothing changes since last time the node was attempted to be processed. So it's expected that processing it again would produce the same results (that is no results, still has unprocessed dependencies). That's the cases where loop is detected.
+
+### Dependency loop resolution
+
+Once the loop is detected the algorithm has to make some changes to avoid looping forever. This is done by force processing one of the methods in the loop and thus removing it from the stack. To do this:
+
+* The method at the top of stack at point of loop detections is processed
+* When scanning its dependencies (step 2) it treats all unprocessed dependencies as "processed with non-constant result"
+* This means the scan will always succeed (there won't be any unprocessed dependencies blocking the scan from finishing successfully)
+* At this point the method is processed as normal - starting with step 4 above. This means the method will be marked as processed with some result and will be removed from the stack
+* Since it will be removed from the stack, the stack version will be incremented - this means that the other methods on the stack will not detect loop again and will try to process again
+
+Since this resolves one of the method in the loop, it should break the loop and he algorithm should be able to move on. If that's not the case, the loop detection will kick in with some higher version again and another method will be force-processed and so on.
+
+### Complex loop cases
+
+The above could still lead to undesirable behavior. In the sample above both `A` and `B` have a dependency on `Helper`. So far this was ignored in the description, but given the algorithm above, `Helper` will not be processed before the loop is detected. It will be added onto the stack, but at the end of scanning either `A` or `B` it will never become the top of the stack (since `A` ends with added `B` to the top, and `B` ends with adding `A` to the top). So it will never be even attempted to be processed. So if `Helper` is constant `false` the method which we force-process (`B` in the above example) will not see it that way and will treat it as non-const. This leads to not removing the call to `DoSomeWork`. This is wrong in the sense that the optimization should remove this call. Especially if `Helper` is driven by a [feature switch](https://github.com/dotnet/designs/blob/main/accepted/2020/feature-switch.md) such behavior is highly undesirable (it's not only a size issue where it keeps more code than necessary, but it could mean generating warnings from the code which should be removed).
+
+To mitigate this the algorithm will do one more step before breaking the loop. If the loop is detected it will go over the stack from top to bottom and it will look for the last node with the current version (so basically the last node which is part of the loop, since all nodes which are part of the loop will end up with the same current version). Once it finds that node (there should be at least one more except the one on top of the stack) it will go over all the nodes from that node to the top of the stack and if it finds a node which doesn't have a current version (meaning it's not part of the loop and was not attempted to be processed recently) it will move it to the top of the stack - no version change.
+
+If any such node is found, normal processing will resume. In the above example this will mean that `Helper` gets to the top of the stack, will be processed and removed from the stack (stack version increments). Now `A` and `B` will be processed again, eventually detecting the loop again. At this point the search for nodes which are not current version will end up empty. Only at that point the loop will be broken by force-processing one of the methods in the loop.
+
+For illustration the flow with `Helper` being considered. A `Main` is added to put another method which illustrates the algorithm better:
+
+* Stack `StackVersion = 0`
+* `Main` is added to the stack - `StackVersion = 1`
+* `Main` is attempted to be processed - `Main.LastAttemptVersion = 1`
+* `A` is added to the stack - `StackVersion = 2`
+* `A` is attempted to be processed - `A.LastAttemptVersion = 2`
+* `A` detects dependency on `Helper` and adds `Helper` to the top of the stack - `StackVersion = 3`
+* `A` detects dependency on `B` and adds `B` to the top of the stack - `StackVersion = 4`
+* `B` is attempted to be processed - `B.LastAttemptVersion = 4`
+* `B` detects dependency on `Helper` and moves `Helper` to the top of the stack - no version change - still 4
+* `B` detects dependency on `A` and moves `A` to the top of the stack - no version changes - still 4
+* `A` is attempted to be processed - `A.LastAttemptVersion = 4`
+* `A` detects dependency on `Helper` and moves `Helper` to the top of the stack - no version change - still 4
+* `A` detects dependency on `B` and moves `B` to the top of the stack - no version changes - still 4
+* `B` is attempted to be processed - at this point `B.LastAttemptVersion == 4` and also `StackVersion == 4`
+
+At this point the stack looks like this (top is the first line below) - `StackVersion == 4`:
+
+* `B` - `LastAttemptVersion = 4`
+* `Helper` - `LastAttemptVersion = -1` (never attempted to be processed)
+* `A` - `LastAttemptVersion = 4`
+* `Main` - `LastAttemptVersion = 1`
+
+The algorithm above will go over the stack to find the "oldest" node with version `4` (the current version) - and will find `A`. Then it will go from `A` back to the top searching for nodes with version `!= 4`, it will find `Helper`. It moves `Helper` to the top of the stack. Then normal processing resumes
+
+* `Helper` is processed fully (no dependencies) - removed from the stack - `StackVersion = 5`
+* `B` is attempted to be processed - `B.LastAttemptVersion = 5`
+* `B` detects dependency on `A` and moves `A` to the top of the stack - no version changes - still 5
+* `A` is attempted to be processed - `A.LastAttemptVersion = 5`
+* `A` detects dependency on `B` and moves `B` to the top of the stack - no version changes - still 5
+* `B` is attempted to be processed - at this point `B.LastAttemptVersion == 5` and also `StackVersion == 5`
+
+A loop is detected again - `StackVersion == 5` - the stack looks like this:
+
+* `B` - `LastAttemptVersion = 5`
+* `A` - `LastAttemptVersion = 5`
+* `Main` - `LastAttemptVersion = 1`
+
+The scan over the stack won't find any methods to move to the top. So it will break the loop by force-processing `B` and considering its dependency on `A` as non-const. `B` is removed from the stack - `StackVersion = 6`. Processing removes and now `A` will process fully since all of its dependencies are resolved and so on...
+
+## Alternatives and improvements
+
+### Use actual recursion in the analyzer
+
+The processing of methods is recursive in nature since callers needs to know results of processing callees. To avoid actual recursion in the analyzer, the nodes are stored in the processing stack. If the necessary results are not yet known for a given method, the current method is postponed (moves down on the stack) and it will be retried later on. This is potentially expensive. An optimization would be to allow a limited recursion within the analyzer and only rely on the processing stack in cases a recursion limit is reached.
+
+### Avoid scanning of potentially removed branches
+
+Currently the scanning (step 2 above) goes over all instructions in the method's body and will request processing of all called methods. This means that even if the called method is behind a feature check which is disabled, it will still be processed (and all of its dependencies will be processed as well). In the end that branch will be removed and none of those methods will end up being marked. All the processing of those methods will be effectively thrown away.
+
+To improve this behavior we would need to merge the scanning with the constant condition detection and branch removal. Basically steps 2-5 would have to become one. The idea is that the scanning would only request processing for methods which are on the main path through the method or in branches which can't be removed. This would probably mean that scanning would have to give up sooner (currently it always goes over the whole method body requesting processing of all dependencies) which wold likely lead to more frequent re-scanning of the method (to eventually reach the end). The advantage would be the potential to not process methods which are not needed. An experiment would have to be done to measure the numbers to determine if this is actually a beneficial change.
diff --git a/docs/design/tools/illink/feature-attribute-semantics.md b/docs/design/tools/illink/feature-attribute-semantics.md
new file mode 100644
index 00000000000000..4f38bb41aa7eac
--- /dev/null
+++ b/docs/design/tools/illink/feature-attribute-semantics.md
@@ -0,0 +1,206 @@
+# Feature attribute semantics
+
+This specification defines the semantics of "feature attributes", in terms of a hypothetical `RequiresFeature` attribute type. The rules described here are designed to be applicable to any attribute that describes a feature or capability of the code or the platform.
+
+## Terminology
+
+There's a history in .NET of using the terms "features" and "capabilities" to describe closely related concepts.
+
+In runtime we often refer to "feature switches", which are toggles that can tell illink and NativeAot to treat specific predefined properties as constants. There are also "runtime features" such as support for new language features like byref fields.
+
+We also often refer to "platform capabilities" such as the ability to run dynamic code, or the ability to create new threads. Sometimes the deployment model may restrict the set of available APIs; in that case we also may refer to "capabilities" (for example the ability to access files on disk, which is not available in single-file apps).
+
+Capabilities will often have associated attributes and/or feature switches. For example, `RequiresDynamicCodeAttribute` is used to annotate code which requires support for running dynamic code, and `RuntimeFeature.IsDynamicCodeSupported` can be used to check for this support and guard access to annotated code. We also have many feature switches for features which depend on the availablility of so-called unreferenced code (that is, code which may be removed by trimming), which is attributed with `RequiresUnreferencedCodeAttribute`.
+
+Feature switch settings may also be determined by explicit configuration (in addition to the choice of target platform or deployment model). For example, the `System.Globalization.Invariant` feature switch can be used to disable support for culture-specific globalization behavior.
+
+This design takes the view that "features" and "capabilities" are essentially the same concept. We use the terminology "features" for these attribute semantics, because it seems to have slightly more general usage. "Features" as used today often includes runtime features which don't have feature switches or attributes, whereas "capabilities" is most often used to refer to capabilities of the platform or deployment model and do usually come with feature switches.
+
+The intention is for this specification to be generally applicable to any feature which would benefit from an attribute used to annotate code that should only be run when a given feature is available. The decision whether to introduce such a feature attribute is of course determined case by case by the feature owners.
+
+## Motivation
+
+Existing attributes like `RequiresUnreferencedCodeAttribute`, `RequiresDynamicCodeAttribute`, and `RequiresAssemblyFilesAttribute` have behavior close to what is described below. The behavior differs slightly between illink and NativeAot in the details, so this is an attempt to specify the semantics as clearly as possible, so that both tools can converge to match this.
+
+The ILLink Roslyn analyzer also produces warnings for these attributes, but doesn't have insight into the compilation strategy used for compiler-generated code. These rules are designed so that the warnings produced by a Roslyn analyzer are matched by the IL analysis, but IL analysis may include additional warnings (specifically for reflection access to compiler-generated code).
+
+There is also the possibility that we will create an attribute-based model which allows users to define their own feature attributes; see this draft for example: https://github.com/dotnet/designs/pull/261. The semantics outlined here could be extended to those attributes if we determine that they are appropriate there.
+
+We would also like to share as much code as possible for this logic between the ILLink, NativeAot, the corresponding analyzers, and possibly future analyzers.
+
+## Goals
+
+- Define the semantics of feature attributes
+- Define the access patterns which are allowed and disallowed by these semantics
+
+## Non-goals
+
+- Specify the warning codes or wording of the specific warnings for disallowed access
+- Define a model for defining new feature attributes
+- Define an attribute-based model for feature switches
+- Specify the relationship between feature switches and feature attributes
+- Define the interactions between `RequiresUnreferencedCodeAttribute` and `DynamicallyAccessedMembersAttribute`
+
+## RequiresFeatureAttribute
+
+`RequiresFeatureAttribute` may be used on methods, constructors, or classes only.
+
+The use of this attribute establishes a [_feature requirement_](#feature-requirement) for the attributed type or member, which restricts access to the attributed type or member (and in some cases to other related IL) in certain ways. It also establishes a [_feature available_](#feature-available-scope) scope (which includes the attributed member but may also include other related IL) wherein access to members with a _feature requirement_ is allowed.
+
+Access to members with a _feature requirement_ is always allowed from a _feature available_ scope, and never produces feature warnings. The restrictions created by _feature requirement_ only limit access from scopes outside of _feature available_, where certain access patterns produce warnings.
+
+## Feature available scope
+
+The following constructs with a _feature requirement_ are also in a _feature available_ scope:
+- Methods
+- Constructors (including static constructors)
+
+When a class or struct has a _feature requirement_, the following members are in a _feature available_ scope:
+- Methods
+- Constructors (including static constructors)
+- Fields
+- Properties
+- Events
+
+Note that the _feature available_ scope for a type does not extend to nested types or to members of base classes or interfaces implemented by the type.
+
+## Feature requirement
+
+### Methods
+
+When `RequiresFeature` is used on a method or constructor (except static constructors), this declares a _feature requirement_ for the method.
+
+`RequiresFeature` on a static constructor is not supported. Note however that static constructors may have a _feature requirement_ due to the declaring type having a _feature requirement_.
+
+### Classes
+
+When `RequiresFeature` is used on a class, this declares a _feature requirement_ for the class.
+
+When a class has a _feature requirement_, this creates a _feature requirement_ for the following members of the class:
+ - static methods
+ - all constructors (static and instance)
+ - static fields
+ - static properties
+ - static events
+
+Note that this does not create a _feature requirement_ for nested types or for members of base classes or interfaces implemented by the type.
+Note also that this may create a _feature requirement_ for fields, properties, and events, which cannot have `RequiresFeature` used on them directly.
+
+### Structs
+
+When a struct has a _feature requirement_, this creates a _feature requirement_ for the following members of the struct:
+ - all methods
+ - all constructors (static and instance)
+ - all fields
+ - all properties
+ - all events
+
+Note that structs may have _feature requirement_ due to compiler-generated code, even though they can not have `RequiresFeature`.
+Note also that this does not create a _feature requirement_ for members of interfaces implemented by the type.
+
+### State machine types
+
+When an iterator or async method is in a _feature available_ scope, the compiler-generated state machine class or type has a _feature requirement_.
+
+### Nested functions
+
+When a method is in a _feature available_ scope, lambdas and local functions declared in the method have a _feature requirement_.
+
+When a lambda or local function is in a _feature available_ scope, lambdas and local functions declared in it have a _feature requirement_.
+
+When a lambda or local function is declared in a method or nested function which is in a _feature available_ scope, then the following compiler-generated type or members have a _feature requirement_:
+
+- The generated closure environment type, if it is unique to the lambda or local function, OR
+
+- The generated method for the lambda or local function, if the compiler does not generate a type for the closure environment, OR
+
+- The generated method and delegate cache field for the lambda or local function, if these are generated into a static closure environment type.
+
+Note that IL analysis tools currently deviate from this specification because the IL does not always contain enough information to reconstruct the original nesting of lambdas and local functions. (For ILLink, lambdas and local functions inherit _feature requirement_ from the enclosing user method, not from an enclosing lambda or local function if one is present.)
+
+## Validation behavior
+
+### RequiresFeature attribute
+
+`RequiresFeature` on a static constructor is disallowed.
+
+`RequiresFeature` on a method that already has a _feature requirement_ due to another attribute is allowed.
+
+`RequiresFeature` on a method that is in a _feature available_ scope is allowed. This establishes a _feature requirement_ for the method even if there was not one previously. (Note: this could be made stricter by warning about redundant `RequiresFeature` on methods that are already in a _feature available_ scope.)
+
+### Virtual methods
+
+- Overriding a method that has a _feature requirement_ with a method outside of a _feature available_ scope is disallowed.
+- Overriding a method outside of a _feature available_ scope with a method that has a _feature requirement_ is disallowed.
+
+### Member access
+
+Access to a _feature requirement_ method, constructor, field, property, or event outside of a _feature available_ scope is disallowed.
+
+## Feature checks
+
+Some feature attributes also come with corresponding feature checks that can be evaluated as constant at the time of trimming, with the guarded code removed when a feature is disabled. This effectivtely places the guarded code in a _feature available_ scope for the purposes of this analysis. However, the definition of such feature checks is left unspecified for now.
+
+## Trimming
+
+These semantics have been designed with trimming in mind. When a feature is disabled (by user configuration, or based on limitations of the target platform), trimming an app that will remove most or all of the feature-related code. Specifically, when a feature is disabled and an app has no trim warnings (including suppressed warnings):
+
+- Methods, fields, properties, and events which have a _feature requirement_ for the disabled feature may be removed.
+
+- Methods which are in a _feature available_ scope for the disabled feature, but aren't entirely removed, may have the method body replaced with a throwing instruction sequence.
+
+Thie latter can happen for methods in a type with _feature requirement_ (but that do not themselves have _feature requirement_) that are referenced outside of a _feature available_ scope. The reference to such a method may remain even though the type is never constructed. The callsite would produce a `NullReferenceException` and the method body is unreachable.
+
+## Alternatives
+
+One simplification would be to unify the concepts of _feature requirement_ with _feature available_, and treat both as similar to preprocessor symbols, where _any_ reference to a guarded type or member from an unguarded context is disallowed.
+
+The advantage of the specified model is that it allows some references without warning, giving some extra flexibility and making it easier to migrate existing code. The downside is that it might lead to preserving more code, whereas a simplified model could guarantee that all code related to a disabled feature is removed.
+
+Here is an example of a pattern which does not warn in the current model, but would warn with a simplified model. Assume that the code under `SomeFeatureIsSupported` is removed when the feature is unavailable.
+
+```csharp
+class FeatureConsumer {
+ static void Run() {
+ SomeFeatureProvider? some;
+ if (Features.SomeFeatureIsSupported)
+ some = new SomeFeatureProvider();
+ OtherFeatureProvider other = new();
+ Helper(some, other);
+ }
+
+ static void Helper(SomeFeatureProvider? some, OtherFeatureProvider other) {
+ some?.Use(); // This callsite would warn with the simplified model.
+ other.Use();
+ }
+}
+
+[RequiresSomeFeature]
+class SomeFeatureProvider {
+ public void Use() {}
+}
+
+class OtherFeatureProvider {
+ public void Use() {}
+}
+```
+
+Note that the `SomeFeatureProvider` type and its `Use` method are kept, but the `Use` method will be rewritten to throw.
+
+The simplified model would encourage the above to be rewritten as follows, resulting in the entire type `SomeFeatureProvider` being removed:
+
+```csharp
+
+class FeatureConsumer {
+ static void Run() {
+ if (Features.SomeFeatureIsSupported) {
+ var some = new SomeFeatureProvider();
+ some.Use();
+ }
+ OtherFeatureProvider other = new();
+ other.Use();
+ }
+}
+```
+
+Perhaps we could introduce the simplified model as an optional strict mode for people who are interested in rewriting their code for maximal size savings.
\ No newline at end of file
diff --git a/docs/design/tools/illink/redundant-suppressions.md b/docs/design/tools/illink/redundant-suppressions.md
new file mode 100644
index 00000000000000..fccff18c712000
--- /dev/null
+++ b/docs/design/tools/illink/redundant-suppressions.md
@@ -0,0 +1,91 @@
+# Redundant Warning Suppression Detection
+
+Dynamic reflection patterns pose a serious challenge to trimming capabilities. The tool is able to infer simple reflection patterns; but there are still cases which the tool will not be able to reason about. When the trimming tool fails to recognize a certain pattern, a warning appears informing the user that the trimming process may break the functionality of the app.
+
+There are cases where the developer is confident about the safety of a given pattern, but the trimming tool is unable to reason about it and still produces a warning. The developer may use warning suppression to silence the warning. An example of such pattern may be using methods from a class using reflection.
+```csharp
+ [DynamicDependency(DynamicallyAccessedMemberTypes.PublicMethods, typeof(NameProvider))]
+ public void Test()
+ {
+ PrintName(typeof(NameProvider));
+ }
+
+ [UnconditionalSuppressMessage("trim", "IL2070", Justification = "DynamicDependency attribute will instruct the trimming tool to keep the public methods on NameProvider.")]
+ public void PrintName(Type type)
+ {
+ string name = (string)type.GetMethod("GetName")!.Invoke(null, null)!;
+ Console.WriteLine(name);
+ }
+
+ private class NameProvider
+ {
+ public static string GetName() => "NiceName";
+ public static string suffix = "no really";
+ }
+```
+
+## Redundant warnings
+The warning suppression could present a challenge to the software development lifecycle. Let us again consider the above example of accessing methods of a private class. We can rewrite the code in such a way, that the trimming tool is able to reason about it. Then, the warning is no longer issued and the suppression becomes redundant. We should remove it.
+
+```csharp
+ // Now the DynamicDependencyAttribute can be removed as well as the suppression here
+ [UnconditionalSuppressMessage("trim", "IL2070", Justification = "DynamicDependency attribute will instruct the trimming tool to keep the public methods on NameProvider.")]
+ public void PrintName([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type type)
+ {
+ string name = (string)type.GetMethod("GetName")!.Invoke(null, null)!;
+ Console.WriteLine(name);
+ }
+```
+
+If we keep the warning suppression on this trimmer-compatible code, we will end up with a potentially dangerous case. Should we later add some trimmer-incompatible code within the scope of the suppression which triggers the suppressed warning, we will not be informed about it during the trimming process. That is, the warning issued by the trimming tool will be silenced by the suppression we left over and it will not be displayed. This may result in a scenario in which the trimming completes with no warnings, yet errors occur at runtime.
+
+This can be illustrated with the following example. Let us extend the above code to also print the value of `suffix` field.
+
+```csharp
+ [UnconditionalSuppressMessage("trim", "IL2070", Justification = "DynamicDependency attribute will instruct the trimming tool to keep the public methods on NameProvider.")]
+ public void PrintName([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type type)
+ {
+ string name = (string)type.GetMethod("GetName")!.Invoke(null, null)!;
+ string suffix = (string)type.GetField("suffix")!.GetValue(null)!; // IL2070 - only public methods are guaranteed to be kept
+ Console.WriteLine(name);
+ Console.WriteLine(suffix);
+ }
+```
+
+Now the code is again trimmer-incompatible, the `GetField("suffix")` call will trigger a `IL2070` warning. However, as we forgot to remove the suppression silencing the `IL2070` warnings, the warning will be suppressed. We will not be informed about this trimmer-incompatible pattern during trimming.
+
+
+## Detecting redundant warning suppressions
+
+In order to avoid the above scenario, we would like to have an option to detect and report the warning suppressions which are not tied to any warnings caused by trim-incompatible patterns.
+
+This may be achieved by extending the trimming tool functionality to check which suppression do in fact suppress warnings and reporting those which do not.
+
+Running the tool with the redundant warning suppressions detection enabled will report all of the warning suppressions which do not suppress any warnings. The way to turn it on is TBD.
+
+***NOTE:*** We will only process suppressions produced by the trimming tool, other suppressions will be ignored.
+### Example:
+Let us again consider the example of the trimmer-compatible code with a redundant warning suppression.
+
+```csharp
+ [UnconditionalSuppressMessage("trim", "IL2070", Justification = "DynamicDependency attribute will instruct the trimming tool to keep the public methods on NameProvider.")] // This should be removed
+ public void PrintName([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type type)
+ {
+ string name = (string)type.GetMethod("GetName")!.Invoke(null, null)!;
+ Console.WriteLine(name);
+ }
+```
+
+In order to detect the warning suppression not tied to any trimmer-incompatible pattern we should run the trimming tool with the redundant warning suppressions detection enabled.
+
+The warning should be reported in the output of the command.
+
+```
+Trim analysis warning IL2021: Program.PrintName(Type): Unused UnconditionalSuppressMessageAttribute suppressing the IL2070 warning found. Consider removing the unused warning suppression.
+```
+
+## Other solutions
+
+The proposed solution operates by extending the functionality of the trimming tool. On one hand, this allows for reusing the existing components leading to a simple implementation, on the other hand this may lead to potential problems. The trimming tool sees only a part of code which is actually used, that means that the solution would not be able to identify the warning suppressions on the code which is trimmed away. Also, the trimming tool may visit parts of the code which were not authored by the developer (e.g. used libraries) and look for the redundant suppressions there. This may cause the output warnings to be noisy and not useful to the developer. Moreover, the dependencies identified by the trimming tool may be different depending on the environment the tool is run in. Hence, the proposed solution may report different redundant suppressions on different environments.
+
+Alternatively, we could make the analyzer do the unused warning suppressions detection. The analyzer operates on a single assembly level but it has a full view of the processed assembly, as opposed to the trimming tools which only sees the code which is actually used within the assembly. Making the solution part of the analyzer, would allow us then to detect the unused warning suppression on assembly level with higher precision. Also, an advantage of such solution would be a shorter feedback loop; we would learn about the redundant suppressions way before we run the publish command. The drawback of this approach is the added complexity. We would not be able to reuse the existing components. What is more, the analyzer has a different view of the code than the trimming tools. We may not be able to identify the same set of trimmer-incompatible patterns using the analyzer as we do using the trimming tools.
diff --git a/docs/design/tools/illink/reflection-flow.md b/docs/design/tools/illink/reflection-flow.md
new file mode 100644
index 00000000000000..219948439fe352
--- /dev/null
+++ b/docs/design/tools/illink/reflection-flow.md
@@ -0,0 +1,238 @@
+# Reflection Handling in ILLink
+
+Unconstrained reflection in .NET presents a challenge for discovering parts of .NET apps that are (or are not) used. We had multiple attempts to solve the problem – probably the most complex one was in .NET Native. .NET Native was trying to make arbitrary reflection "just work" by using a combination of:
+
+* cross-method dataflow analysis framework (that could e.g. model the `dynamic` keyword in C#, or reason about cascading reflection patterns like `Type.GetType("Foo").GetMethod("Bar").ReturnType.GetMethod("Baz")`)
+* expressive annotation format (RD.XML) that could express things like "keep all properties and constructors on types passed as a parameter to this method, recursively". The idea was that library developers would annotate their libraries and things would "just work" for the user.
+
+Even with the level of investment in .NET Native it wasn't possible to make arbitrary reflection "just work" – before shipping, we had to make a decision to not do any tree-shaking on user assemblies by default because the reflection patterns were often (~20% of the Store app catalog) arbitrary enough that it wasn't possible to describe them in generic ways or detect them. The .NET Native compiler did not warn the user about presence of unrecognized patterns either because we expected there would be too much noise due to the disconnect between RD.XML (that simply described what to keep) and the dataflow analysis (that focused on reflection API usage).
+
+## Trimming-friendly reflection
+
+Note: While this document mostly talks about reflection, this includes reflection-like APIs with impact on the trimming analysis such as `RuntimeHelpers.GetUninitializedObject`, `Marshal.PtrToStructure`, or `RuntimeHelpers.RunClassConstructor`.
+
+In .NET 5, we would like to carve out a _subset_ of reflection patterns that can be made compatible in the presence of ILLink. Since trimming is optional, users do not have to adhere to this subset. They can still use ILLink if they do not adhere to this subset, but we will not provide guarantees that trimming won't change the semantics of their app. Trimming tools will warn if a reflection pattern within the app is not compatible.
+
+To achieve compatibility, we'll logically classify methods into following categories:
+
+* Trimming-friendly: most code will fall into this category. Trimming can be done safely based on information in the static callgraph.
+* Potentially unfriendly: call to the method is unsafe if the trimming tool cannot reason about a parameter value (e.g. `Type.GetType` with a type name string that could be unknown)
+* Always unfriendly: calls to these methods are never safe in the presence of trimming tools (e.g. `Assembly.ExportedTypes`).
+
+Explicit non-goals of this proposal:
+
+* Provide a mechanism to solve reflection based serializer (and similar patterns)
+* Provide a mechanism to solve dependency injection patterns
+
+It is our belief that _trimming-friendly_ serialization and dependency injection would be better solved by source generators.
+
+## Analyzing calls to potentially unfriendly methods
+
+The most interesting category to discuss are the "potentially unfriendly" methods: reasoning about a parameter to a method call requires being able to trace the value of the parameter through the method body. ILLink is currently capable of doing this in a limited way. We'll be expanding this functionality further so that it can cover patterns like:
+
+```csharp
+Type t;
+if (isNullable)
+{
+ t = typeof(NullableAccessor);
+}
+else
+{
+ t = typeof(ObjectAccessor);
+}
+
+// Trimmer should infer we need the default constructor for the 2 types above
+Activator.CreateInstance(t);
+// Trimmer should infer we need method Foo on the 2 types above
+var mi = t.GetMethod("Foo");
+// Trimmer should infer we need field Bar on the 2 types above
+var fi = t.GetField("Bar");
+```
+
+In an ideal world, this would be the extent of the reflection that can be made safe by the trimmer. Such small subset would not be practical because reflection often happens across method bodies. Instead of introducing cross-method dataflow analysis, we'll help the trimming tool reason about reflection happening across method bodies with annotations.
+
+## Cross-method annotations
+
+To document reflection use across methods, we'll introduce a new attribute `DynamicallyAccessedMembersAttribute` that can be attached to method parameters, the method return parameter, fields, and properties (whose type is `System.Type`, or `System.String`). The attribute will provide additional metadata related to trimming-friendliness of the parameter or field.
+
+(When the attribute is applied to a location of type `System.String`, the assumption is that the string represents a fully qualified type name.)
+
+```csharp
+public sealed class DynamicallyAccessedMembersAttribute : Attribute
+{
+ public DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes memberKinds)
+ {
+ MemberTypes = memberTypes;
+ }
+
+ public DynamicallyAccessedMemberTypes MemberTypes { get; }
+}
+
+[Flags]
+public enum DynamicallyAccessedMemberTypes
+{
+ DefaultConstructor = 0x0001,
+ PublicConstructors = 0x0002 | DefaultConstructor,
+ NonPublicConstructors = 0x0004,
+ // ...
+}
+```
+
+When a method or field is annotated with this attribute, two things will happen:
+* The method/field becomes potentially trimming-friendly. the trimming tool will ensure that the values logically written to the annotated location (i.e. passed as a parameter, returned from the method, written to the field) can be statically reasoned about, or a warning will be generated.
+* The analysis of the value read from the annotated location will have richer information available and the trimming tool can assume that trimming-unfriendly operations with an otherwise unknown value could still be safe.
+
+Example:
+
+```csharp
+class Program
+{
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)]
+ private static readonly Type _otherType;
+
+ static Program()
+ {
+ // _otherType is marked DynamicallyAccessedMembers - the trimming tool
+ // ensures that the value written to this can be statically reasoned about
+ // and meets the MemberKinds restriction. So it will keep all methods on Foo.
+ _otherType = Type.GetType("Foo, FooAssembly");
+ }
+
+ static void Main()
+ {
+ // SAFE: _otherType was annotated as "some type that has all methods kept"
+ _otherType.GetMethod("RandomMethod");
+ }
+}
+```
+
+(The above pattern exists in CoreLib and is currently unfriendly.)
+
+More details discussed in https://github.com/dotnet/runtime/issues/33861.
+
+TODO: Creating a delegate to a potentially trimming unfriendly method could be solvable. Reflection invoking a potentially trimming unfriendly method is hard. Both out of scope?
+TODO: It might be possible to apply similar pattern to generic parameters. The DynamicallyAccessedMembers could be added to the generic parameter declaration and the trimming tool could make sure that when it's "assigned to" the requirements are met.
+
+## Intrinsic recognition of reflection APIs
+
+While it would be possible to annotate reflection primitives with the proposed DynamicallyAccessedMembers attribute, the trimming tool is going to intrinsically recongnize some of the reflection primitives so that it can do a better job at preserving just the pieces that are really needed. For example:
+
+* `Type.GetMethod`
+* `Type.GetProperty`
+* `Type.GetField`
+* `Type.GetMember`
+* `Type.GetNestedType`
+
+are going to be special cased so that if the type and name is exactly known at trimming time, only the specific member will be preserved. If the name is not known, all matching members are going to be preserved instead. The trimming tool may look at other parameters to these methods, such as the binding flags and parameter counts to further restrict the set of members preserved.
+
+The special casing will also help in situations such as when the type is not statically known and we only have an annotated value - e.g. calling `GetMethod(...BindingFlags.Public)` on a `System.Type` instance annotated as `DynamicallyAccessedMemberTypes.PublicMethods` should be considered valid.
+
+## Trimming unfriendly annotations
+
+Another annotation will be used to mark methods that are never trimming friendly:
+
+```csharp
+public sealed class RequiresUnreferencedCodeAttribute : Attribute
+{
+ ///
+ /// Initializes a new instance of the class
+ /// with the specified message.
+ ///
+ ///
+ /// A message that contains information about the usage of unreferenced code.
+ ///
+ public RequiresUnreferencedCodeAttribute(string message)
+ {
+ Message = message;
+ }
+
+ ///
+ /// Gets a message that contains information about the usage of unreferenced code.
+ ///
+ public string Message { get; }
+
+ ///
+ /// Gets or sets an optional URL that contains more information about the method,
+ /// why it requires unreferenced code, and what options a consumer has to deal with it.
+ ///
+ public string? Url { get; set; }
+}
+```
+
+All calls to methods annotated with RequiresUnreferencedCode will result in a warning and the trimming tool will not analyze trimming-friendliness within the method body or the parts of the static callgraph that are only reachable through this method.
+
+TODO: Do we care about localization issues connected with the message string? Do we need an enum with possible messages ("this is never friendly", "use different overload", "use different method", etc.) This is probably the same bucket as `ObsoleteAttribute`.
+
+## Escape hatch: Warning supression
+
+We will provide a way to supress reflection flow related warnings within the trimming tools. This is meant to be used in cases where we know that a pattern is safe, but the trimming tool is not smart enough to reason about it.
+
+A good example of such pattern could be caches and maps using System.Type. If the cache only stores values that have a certain annotation, all values read from the cache should be annotated the same way, but trimming tool won't be able to see this though.
+
+```csharp
+private Dictionary _interfaceToImpl;
+
+public void RegisterInterface(Type intface, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.DefaultConstructor)]Type impl)
+{
+ _interfaceToImpl.Add(intface, impl);
+}
+
+[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2006:UnrecognizedReflectionPattern", MessageId = "CreateInstance")]
+public object Activate(Type intface)
+{
+ // This would normally warn because value retrieved from the dictionary is not annotated, but since
+ // all values placed into the dictionary were annotated, this is safe.
+ return Activator.CreateInstance(_interfaceToImpl[intface]);
+}
+
+```
+
+More details discussed in https://github.com/dotnet/runtime/issues/35339.
+
+## Escape hatch: DynamicDependencyAttribute annotation
+
+This is an existing custom attribute (known as `DynamicDependencyAttribute`) understood by the trimming tools. This attribute allows the user to declare the type name, method/field name, and signature (all as a string) of a method or field that the method dynamically depends on.
+
+When the trimming tool sees a method/constructor/field annotated with this attribute as necessary, it also marks the referenced member as necessary. It also suppresses all analysis within the method.
+See issue https://github.com/dotnet/runtime/issues/30902 for details.
+
+## Case study: Custom attributes
+
+Custom attributes are going to be analyzed same way as method calls – the act of applying a custom attribute is a method call to the attribute constructor. The act of setting a property is a call to the property setter.
+
+Trimming tools currently special case the `TypeConverterAttribute` to make sure we always keep the default constructor of the type referenced by the attribute. With the proposed annotations, it's possible to express what's necessary without the special casing. It will also make it possible for the consuming code to safely pass the value of `TypeConverterAttribute.ConverterTypeName` to `Type.GetType`/`Activator.CreateInstance`, since the location is annotated as known to keep the type and the default constructor.
+
+```csharp
+public sealed class TypeConverterAttribute : Attribute
+{
+ public TypeConverterAttribute()
+ {
+ ConverterTypeName = string.Empty;
+ }
+
+ public TypeConverterAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.DefaultConstructor)] Type type)
+ {
+ if (type == null)
+ {
+ throw new ArgumentNullException(nameof(type));
+ }
+
+ // SAFE: assigning AssemblyQualifiedName of a type that is known to have default ctor available
+ ConverterTypeName = type.AssemblyQualifiedName!;
+ }
+
+ public TypeConverterAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.DefaultConstructor)] string typeName)
+ {
+ if (typeName == null)
+ {
+ throw new ArgumentNullException(nameof(typeName));
+ }
+
+ // SAFE: assigning a known type name string
+ ConverterTypeName = typeName;
+ }
+
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.DefaultConstructor)]
+ public string ConverterTypeName { get; }
+}
+```
diff --git a/docs/design/tools/illink/trimmed-assemblies.md b/docs/design/tools/illink/trimmed-assemblies.md
new file mode 100644
index 00000000000000..007d24a33129bf
--- /dev/null
+++ b/docs/design/tools/illink/trimmed-assemblies.md
@@ -0,0 +1,221 @@
+# Controlling trimmed assemblies
+
+## Background
+
+The SDK publish targets run `ILLink`, which has subtargets that process `ResolvedFileToPublish`. This list gets filtered down to the managed assemblies with `PostProcessAssemblies == true`, which are passed to the IL Linker. Those with `IsTrimmable != true` by default are rooted and linked with the `copy` action, and the rest have the action determined by `TrimMode`.
+
+It is worth reiterating that there are three conditions that influence the behavior:
+1. `PostProcessAssemblies` controls whether the IL Linker will see the assembly at all
+2. `IsTrimmable` controls whether the IL Linker will tree-shake the assembly (if not, it gets rooted, and gets action `copy`)
+3. the action (per-assembly `TrimMode` metadata, or global `TrimMode`) controls the level of tree-shaking
+
+Different SDKs have different defaults for these options. The .NET Core sets `TrimMode` to `copyused`, which does assembly-level trimming, by default, but the Blazor SDK sets it to `link` for more aggressive trimming. Blazor also uses extension points to control which assemblies are trimmed by filtering on the assembly name, and to generate custom "type-granularity" roots for some assemblies.
+
+## .NET Core 3 options
+
+### IsTrimmable metadata
+
+An SDK target runs before the IL Linker to populate an ItemGroup of assemblies passed to the IL Linker. Assemblies in this ItemGroup with metadata `IsTrimmable` set to `true` are trimmed with the default mode. In 3.x, there are no public extension points for developers to set this metadata, but SDK authors can set `IsTrimmable` on `KnownFrameworkReference` and it is applied to all of the assemblies that are part of the framework reference. In 3.x, this was used to enable trimming of netcoreapp assemblies.
+
+## .NET 5 options
+
+### `TrimMode`
+To enable aggressive trimming instead of assembly-level trimming, we provide a public property `TrimMode`. Setting this to`link` changes the default behavior from `copyused` to `link` (aggressive trimming) for assemblies that don't have per-assembly `TrimMode`. `TrimMode` can also be set as Item metadata to override the global property per-assembly.
+
+### `PrepareForILLink`
+There is a public target `PrepareForILLink` that runs before the `ILLink` target, and provides a convenient place to hook into the pipeline to modify metadata for trimming. SDK components can use this as an extension point via `BeforeTargets` and `AfterTargets`.
+
+The global `TrimMode` may be set any time before `PrepareForILLink` runs, which sets it to a default value if not set previously.
+
+### `ManagedAssemblyToLink`
+The `PrepareForILLink` has a dependency that creates the ItemGroup `ManagedAssemblyToLink`, which represents the set of assemblies that will be passed to the IL Linker. Custom targets may modify `IsTrimmable` and `TrimMode` metadata on these assemblies before `PrepareForILLink`, which sets the assembly action based on this metadata, or they may modify the metadata after `PrepareForILLink` has run.
+
+It is not possible to change the items in `ManagedAssemblyToLink`, since this represents the set that needs to be filtered and replaced in the publish output. To change which assemblies are passed to the IL Linker, a different extension point should be used to set `PostProcessAssemblies` metadata.
+
+### Examples
+
+This shows how a developer can turn on aggressive trimming for framework assemblies (which are defined to be `IsTrimmable` by the SDK):
+
+```xml
+
+ link
+
+```
+
+This shows how Blazor (or a developer) can hook into the build to opt assemblies into different levels of trimming based on the filename:
+
+```xml
+
+
+
+ link
+
+
+
+
+ true
+
+
+
+ copyused
+
+
+
+```
+
+### Other options
+
+.NET 5 introduced a host of additional SDK options that map directly to the underlying illink options. The full list is documented at https://docs.microsoft.com/en-us/dotnet/core/deploying/trimming-options.
+
+## .NET 6
+
+### `AssemblyMetadata("IsTrimmable", "True")`
+
+An assembly-level `AssemblyMetadataAttribute` may be placed on an assembly to indicate that it can be trimmed:
+
+```csharp
+[assembly: AssemblyMetadata("IsTrimmable", "True")]
+```
+
+The behavior is the same as the `IsTrimmable` MSBuild metadata, so that:
+- Assemblies with this attribute are trimmed with the global `TrimMode`
+- Assemblies without this attribute are rooted, and given the `copy` action
+
+The only understood value is `True` (case-insensitive). Adding `[assembly: AssemblyMetadata("IsTrimmable", "False")]` will have no effect on the IL Linker's behavior, because unattributed assemblies are assumed not to be trimmable by default. We will issue a warning in this case, to discourage misleading use of the attribute.
+
+The attribute survives trimming like other assembly-level attributes do.
+
+If `IsTrimmable` MSBuild metadata is set for an assembly, this overrides the `IsTrimmable` attribute. This allows a developer to opt an assembly into trimming even if it does not have the attribute, or to disable trimming of an assembly that has the attribute.
+
+Instead of using `IsTrimmable` metadata in the SDK to control trimmable assemblies, we will move to a model where all trimmable SDK assemblies are built with `[assembly: AssemblyMetadata("IsTrimmable", "True")]`.
+
+### `TrimmableAssembly`
+
+This ItemGroup contains assembly names that get opted into trimming via `IsTrimmable` metadata. For simple cases, this provides an easier way to enable trimming of additional assemblies, without requiring a custom MSBuild target. It exists purely as a convenience because we expect this to be commonly done as .NET transitions to becoming more trim ready.
+
+```xml
+
+
+
+```
+
+The above opts `MyAssembly.dll` into trimming. Note that the ItemGroup should contain assembly names without an extension, similar to [`TrimmerRootAssembly`](https://docs.microsoft.com/en-us/dotnet/core/deploying/trimming-options#root-assemblies). Before .NET 6 this would have been done with a target:
+
+```xml
+
+
+
+ true
+
+
+
+```
+
+## Future evolution
+
+As the .NET ecosystem shifts to support trimming of more libraries, we will be able to rely more on the trim analysis warnings to provide correctness guarantees. Since these guarantees are the same regardless of the `TrimMode`, we expect SDKs to move to more aggressive trimming defaults.
+
+We expect that the .NET SDK will eventually set `TrimMode` to `link` instead of `copyused` as it does today. Long-term, we may even go as far as enabling trimming of all assemblies by default when using ILLink. Existing MSBuild `IsTrimmable` and `TrimMode` metadata will continue to make it possible for the developer to opt in or out of trimming. We could additionally provide further knobs to simplify controlling trimming behavior and opting out of such defaults.
+
+### `TrimAllAssemblies` global opt-in
+
+We could make it it easier to enable trimming for all assemblies with a simple boolean. This would be equivalent to setting `IsTrimmable` to `true` on every assembly that is input to the IL Linker. For example:
+
+```xml
+
+ true
+
+```
+
+could be used instead of
+
+```xml
+
+
+
+
+ true
+
+
+
+```
+
+This could be set by default in future SDKs, or it could be set by the developer in SDKs where it is not the default. We prefer not to introduce such a property at the moment, because it makes it too easy to enable this more "dangerous" behavior. We may consider adding this in the future when more of the .NET ecosystem has been made compatible with trimming.
+
+### `AssemblyMetadata("IsTrimmable", "False")`
+
+With more aggressive defaults, it could make sense to support an attribute opt-out via `[assembly: AssemblyMetadata("IsTrimmable", "False")]`. This would provide a way for developers to indicate that their assemblies should not be trimmed.
+
+Its semantics should be the same as setting `IsTrimmable` MSBuild metadata to `false` for the assembly. These semantics currently result in the assembly getting rooted and getting the `copy` action, which keeps all members in the assembly but can still rewrite it to fix references to removed type forwarders.
+
+The attribute opt-out would be useful for a scenario where multiple projects with aggressive trimming (not uncommon in Xamarin.iOS) reference a shared assembly which should not be trimmed. Instead of requiring MSBuild metadata in each referencing project, the attribute could opt the shared assembly out of trimming once and for all.
+
+We would like to avoid a situation where developers overuse the attribute, and we end up with many libraries that can't be trimmed because of it. This would be especially counterproductive for developers interested in aggressive trimming. Its use should be reserved for cases where a library is intrinsically not trimmable - but it's not obvious when this would be the case. Typically, whether a library is safe to trim depends on the context of the application that uses it. We should discourage use of the assembly-level opt-out in cases where one might reasonably use only a part of the assembly.
+
+We may also consider whether the opt-out should instead prevent the IL Linker from rewriting the attributed assembly. A developer might reasonably expect that adding this attribute would prevent modification by the IL Linker. This could be useful as a way to preserve assemblies that have invariants which would be broken by rewriting, or which contain data that would be removed by the IL Linker even with the `copy` action. We would need to decide how to handle removed type forwarders - we could preserve referenced type forwarders, or produce an error if the assembly references a removed type forwarder.
+
+### `NonTrimmableAssembly` opt-out
+
+Similar to `TrimmableAssembly`, we could introduce an ItemGroup to simplify opting out of trimming for an assembly. It would work the same way, setting `IsTrimmable` to `false` on the specified assembly. With the current defaults that don't trim unattributed assemblies, we expect this to be significantly less useful than the `TrimmableAssembly`, but it would be useful to opt out of more aggressive defaults.
+
+We would also need to decide the precedence betwen `TrimmableAssembly` and `NonTrimmableAssembly`, or issue a warning if an assembly is in both ItemGroups.
+
+An alternative to a separate ItemGroup would be to support `IsTrimmable` metadata on the `TrimmableAssembly` ItemGroup, which could be set to `false` to opt out of trimming.
+
+## Alternatives considered
+
+### `IsTrimmable` MSBuild metadata vs ItemGroup vs Property
+
+It is not always obvious from the project file which assemblies will be included in the published application. Some assemblies are shipped as part of a framework reference, and others as OOB packages. Additionally, the SDK has its own configuration knobs that control whether files are eligible for post-processing. The final list is only "known" until the publish targets run, which is why the most flexible way to control the set of trimmed assemblies is during `PrepareForILLink`. Per-item metadata is a natural way to do this in MSBuild, and can be used for example to filter on the filenames in `ManagedAssemblyToLink`.
+
+However, sometimes developers know beforehand that a particular assembly will be a part of the published app. In such cases, it doesn't make sense to require them to write a target, hence the proposal for a simplified opt-in via the `TrimmableAssembly` ItemGroup. This option does not replace `IsTrimmable` metadata, but works on top of it.
+
+We also considered making the simplified option a property instead of an ItemGroup - defining a syntax for the property (for example, semicolon-delimited assembly names), and parsing it into an ItemGroup before applying it as metadata to `ManagedAssemblyToLink`. MSBuild properties have the advantage that they can be passed on the command-line, not just from the project file. However, it's not common practice to use a property to represent multiple entities in MSBuild (`NoWarn` and other warning options are an exception), especially when they relate to files.
+
+If there is a use case for specifying trimmable assemblies on the command-line, we can always add a property as well.
+
+### `AssemblyMetadataAttribute` vs `IsTrimmableAttribute`
+
+We will use `AssemblyMetadataAttribute` to specify `IsTrimmable` on an assembly, instead of introducing a new attribute. The existing attribute seems well-suited for this use case, as it is already similarly used to control servicing for framework assemblies, for example via:
+
+```csharp
+[assembly: AssemblyMetadata(".NETFrameworkAssembly", "")]
+[assembly: AssemblyMetadata("Serviceable", "True")]
+[assembly: AssemblyMetadata("PreferInbox", "True")]
+```
+
+This way there is no need to define a new attribute in the framework, and library authors targeting previous versions of .NET will not need to inject the attribute definition into their own assemblies.
+
+### `IsTrimmable` attribute vs `DefaultTrimMode` attribute
+
+We considered allowing the assembly-level attribute to specify the IL Linker "action" to take, instead of making it a simple opt-in. This is a more flexible option, which would allow library authors to precisely control the default trimming behavior for their libraries. However, we prefer a simple `IsTrimmable` opt-in because this:
+- Simplifies the IL Linker configuration options (it is already possible to specify the action from MSBuild)
+- Handles the common scenario of enabling trimming by default for an assembly that is trimming friendly
+- Avoids baking knowledge of the IL Linker "actions" into assembly metadata
+
+We also anticipate that the SDK may in the future move to using `link` by default (like in Blazor today), deprecating `TrimMode` as a configuration knob.
+
+### `IsTrimmable` attribute vs metadata priority
+
+The `IsTrimmable` MSBuild metadata takes precedence over `IsTrimmable` `AssemblyMetadataAttribute`. We also considered allowing the attribute to override the metadata set in MSBuild, so that newer versions of an assembly can override default settings in the SDK. For example, if we ship with SDK defaults that set `IsTrimmable` MSBuild metadata on an assembly, this would allow a future version of the assembly to opt out of trimming. However, we are intending the MSBuild metadata to be used by developers to override defaults, and we will move away from setting this by default in the SDK, using attributes instead.
+## Notes on the .NET 5 options
+
+### `IsTrimmable` vs `TrimMode`
+
+`IsTrimmable` exists in addition to `TrimMode` so that there can be a global default for assemblies without a per-assembly `TrimMode`. This lets the global property be used to set the mode for all `IsTrimmable` assemblies, and it lets individual assemblies be opted into trimming using the default mode set by the SDK for the target form factor.
+
+### Naming of `TrimMode` values
+
+We have considered a few naming conventions for the `TrimMode` values:
+- `Conservative`/`Aggressive` - avoids complex terminology and would be easy to use for app developers without requiring an understanding of the IL Linker, and might let us change optimization levels in the future, but hides details from developers who are interested in the underlying behavior
+- `TrimAssembly`/`TrimMembers` - describes what the IL Linker is doing in each mode, but is incomplete because it doesn't mention the various optimizations that are turned on
+- `copyused`/`link` - maps directly to the underlying terminology used in the IL Linker, letting developers who understand the IL Linker make informed decisions, but requires more understanding of the IL Linker
+
+We chose to stay with the `copyused`/`link` terminology that is used by the tool itself. `IsTrimmable` allows opting into or out of trimming without referencing this terminology. If we add higher-level options to the IL Linker in the future, we could expose those as new `TrimMode` values, or aliases for existing values.
+
+### `Build` vs `Publish`
+
+The public properties and targets exposed in this design do not require modifying `ResolvedFileToPublish` or other MSBuild entities that are related to publish, leaving some room for us to potentially reuse targets if we ever need to run the IL Linker during build instead of publish.
diff --git a/docs/infra/test-configurations.md b/docs/infra/test-configurations.md
index 37fc5e4a05ecd0..3b96e74e66c82b 100644
--- a/docs/infra/test-configurations.md
+++ b/docs/infra/test-configurations.md
@@ -38,7 +38,7 @@ All builds are
- Linux arm32 Release
- Linux arm32 musl Release
- FreeBSD x64 (build only)
-- MacOS 11.6.4 x64
+- macOS 11.6.4 x64
- x64 Release
- arm64 Release
diff --git a/docs/manpages/host/dotnet.1 b/docs/manpages/host/dotnet.1
deleted file mode 100644
index 78c1b0f7418e7d..00000000000000
--- a/docs/manpages/host/dotnet.1
+++ /dev/null
@@ -1,152 +0,0 @@
-.\" Automatically generated by Pandoc 1.15.1
-.\"
-.hy
-.TH "dotnet-cli" "1" "January 2016" "" ""
-.SH NAME
-.PP
-dotnet \-\- general driver for running the command\-line commands
-.SH SYNOPSIS
-.PP
-dotnet [\-\-version] [\-\-help] [\-\-verbose] < command > [< args >]
-.SH DESCRIPTION
-.PP
-dotnet is a generic driver for the CLI toolchain.
-Invoked on its own, it will give out brief usage instructions.
-.PP
-Each specific feature is implemented as a command.
-In order to use the feature, it is specified after dotnet, i.e.
-\f[C]dotnet\ compile\f[].
-All of the arguments following the command are command\[aq]s own
-arguments.
-.SH OPTIONS
-.PP
-\f[C]\-v,\ \-\-verbose\f[]
-.IP
-.nf
-\f[C]
-Enable\ verbose\ output.
-\f[]
-.fi
-.PP
-\f[C]\-\-version\f[]
-.IP
-.nf
-\f[C]
-Print\ out\ the\ version\ of\ the\ CLI\ tooling
-\f[]
-.fi
-.PP
-\f[C]\-h,\ \-\-help\f[]
-.IP
-.nf
-\f[C]
-Print\ out\ a\ short\ help\ and\ a\ list\ of\ current\ commands.\
-\f[]
-.fi
-.SH DOTNET COMMANDS
-.PP
-The following commands exist for dotnet.
-.PP
-\f[C]dotnet\-compile(1)\f[]
-.IP
-.nf
-\f[C]
-Compile\ the\ application\ to\ either\ an\ intermediate\ language\ (IL)\ or\ to\ a\ native\ binary.\
-\f[]
-.fi
-.PP
-\f[C]dotnet\-restore(1)\f[]
-.IP
-.nf
-\f[C]
-Restores\ the\ dependencies\ for\ a\ given\ application.\
-\f[]
-.fi
-.PP
-\f[C]dotnet\-run(1)\f[]
-.IP
-.nf
-\f[C]
-Runs\ the\ application\ from\ source.
-\f[]
-.fi
-.PP
-\f[C]dotnet\-publish(1)\f[]
-.IP
-.nf
-\f[C]
-Publishes\ a\ flat\ directory\ that\ contains\ the\ application\ and\ its\ dependencies,\ including\ the\ runtime\ binaries.\
-\f[]
-.fi
-.PP
-\f[C]dotnet\-test(1)\f[]
-.IP
-.nf
-\f[C]
-Runs\ tests\ using\ a\ test\ runner\ specified\ in\ project.json.
-\f[]
-.fi
-.PP
-\f[C]dotnet\-new(1)\f[]
-.IP
-.nf
-\f[C]
-Initializes\ a\ sample\ .NET\ Core\ console\ application.\
-\f[]
-.fi
-.SH EXAMPLES
-.PP
-\f[C]dotnew\ new\f[]
-.IP
-.nf
-\f[C]
-Initializes\ a\ sample\ .NET\ Core\ console\ application\ that\ can\ be\ compiled\ and\ ran.
-\f[]
-.fi
-.PP
-\f[C]dotnet\ restore\f[]
-.IP
-.nf
-\f[C]
-Restores\ dependencies\ for\ a\ given\ application.\
-\f[]
-.fi
-.PP
-\f[C]dotnet\ compile\f[]
-.IP
-.nf
-\f[C]
-Compiles\ the\ application\ in\ a\ given\ directory.\
-\f[]
-.fi
-.SH ENVIRONMENT
-.PP
-\f[C]DOTNET_PACKAGES\f[]
-.IP
-.nf
-\f[C]
-The\ primary\ package\ cache.\ If\ not\ set,\ defaults\ to\ $HOME/.nuget/packages\ on\ Unix\ or\ %LOCALAPPDATA%\\NuGet\\Packages\ (TBD)\ on\ Windows.
-\f[]
-.fi
-.PP
-\f[C]DOTNET_PACKAGES_CACHE\f[]
-.IP
-.nf
-\f[C]
-The\ secondary\ cache.\ This\ is\ used\ by\ shared\ hosters\ (such\ as\ Azure)\ to\ provide\ a\ cache\ of\ pre\-downloaded\ common\ packages\ on\ a\ faster\ disk.\ If\ not\ set\ it\ is\ not\ used.
-\f[]
-.fi
-.PP
-\f[C]DOTNET_SERVICING\f[]
-.IP
-.nf
-\f[C]
-Specifies\ the\ location\ of\ the\ servicing\ index\ to\ use\ by\ the\ shared\ host\ when\ loading\ the\ runtime.\
-\f[]
-.fi
-.SH SEE ALSO
-.PP
-dotnet\-compile(1), dotnet\-run(1), dotnet\-publish(1),
-dotnet\-restore(1)
-.SH AUTHORS
-Zlatko Knezevic zlakne\@microsoft.com.
diff --git a/docs/pr-builds.md b/docs/pr-builds.md
index 08aba85361d2dc..e7d6e5968b0f65 100644
--- a/docs/pr-builds.md
+++ b/docs/pr-builds.md
@@ -14,7 +14,7 @@ For mobile platforms and wasm we run some smoke tests that aim to protect the qu
This pipeline is also required, and its intent is to cover a developer innerloop scenarios that could be affected by any change, like running a specific build command or running tests inside Visual Studio, etc.
### Dotnet-linker-tests
-This is also a required pipeline. The purpose of this pipeline is to test that the libraries code is linker friendly. Meaning that when we trim our libraries using the ILLink, we don't have any trimming bugs, like a required method on a specific scenario is trimmed away by accident.
+This is also a required pipeline. The purpose of this pipeline is to test that the libraries code is ILLink friendly. Meaning that when we trim our libraries using the ILLink, we don't have any trimming bugs, like a required method on a specific scenario is trimmed away by accident.
### Runtime-staging
This pipeline runs on every change, however it behaves a little different than the other pipelines. This pipeline, will not fail if there are test failures, however it will fail if there is a timeout or a build failure. The reason why we fail on build failures is because we want to protect the developer innerloop (building the repository) for this platform.
@@ -33,7 +33,9 @@ We have various pipelines that their names contain `Outerloop` on them. These pi
These pipelines will run tests that take very long, that are not very stable (i.e some networking tests), or that modify machine state. Such tests are called `Outerloop` tests rather than `innerloop`.
-## Rerunning Validation
+## Analyzing Failures
+
+The PR Build Analysis tab has summary of all failures, including matches with the list of known issues. This tab should be your first stop for analyzing the PR failures.
Validation may fail for several reasons:
@@ -77,6 +79,7 @@ Validation may fail for several reasons:
If you have determined the failure is definitely not caused by changes in your PR, please do this:
+* If the failure is identified as a known issue in the Build Analysis tab, no further action is required.
* Search for an [existing issue](https://github.com/dotnet/runtime/issues). Usually the test method name or (if a crash/hang) the test assembly name are good search parameters.
* If there's an existing issue, add a comment with
* a) the link to the build
@@ -84,9 +87,10 @@ If you have determined the failure is definitely not caused by changes in your P
* c) all console output including the error message and stack trace from the Azure DevOps tab (This is necessary as retention policies are in place that recycle old builds.)
* d) if there's a dump file (see Attachments tab in Azure DevOps) include that
* If the issue is already closed, reopen it and update the labels to reflect the current failure state.
+ * If possible, please [update the failure signature](https://github.com/dotnet/arcade/blob/main/Documentation/Projects/Build%20Analysis/KnownIssues.md#how-to-fill-out-a-known-issue-error-message-section) to have it automatically identified by the Build Analysis as known issue next time.
* If there's no existing issue, create an issue with the same information listed above.
* Update the original pull request with a comment linking to the new or existing issue.
-* In a follow-up Pull Request, disable the failing test(s) with the corresponding issue link tracking the disable.
+* If the failure is occuring frequently, please disable the failing test(s) with the corresponding issue link tracking the disable in a follow-up Pull Request
* Update the tracking issue with the label `disabled-test`.
* For libraries tests add a [`[ActiveIssue(link)]`](https://github.com/dotnet/arcade/blob/master/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ActiveIssueAttribute.cs) attribute on the test method. You can narrow the disabling down to runtime variant, flavor, and platform. For an example see [File_AppendAllLinesAsync_Encoded](https://github.com/dotnet/runtime/blob/cf49643711ad8aa4685a8054286c1348cef6e1d8/src/libraries/System.IO.FileSystem/tests/File/AppendAsync.cs#L74)
* For runtime tests found under `src/tests`, please edit [`issues.targets`](https://github.com/dotnet/runtime/blob/main/src/tests/issues.targets). There are several groups for different types of disable (mono vs. coreclr, different platforms, different scenarios). Add the folder containing the test and issue mimicking any of the samples in the file.
diff --git a/docs/project/analyzers.md b/docs/project/analyzers.md
index d423a6193e1236..61318e8cfe63e2 100644
--- a/docs/project/analyzers.md
+++ b/docs/project/analyzers.md
@@ -1,23 +1,16 @@
## Adding new analyzers to the build
-This repo relies on [.NET Compiler Platform analyzers](https://docs.microsoft.com/en-us/visualstudio/code-quality/roslyn-analyzers-overview?view=vs-2019) to help validate the correctness, performance, and maintainability of the code. Several existing analyzer packages are wired into the build, but it is easy to augment the utilized packages in order to experiment with additional analyzers.
+This repo relies on [.NET Compiler Platform analyzers](https://learn.microsoft.com/visualstudio/code-quality/roslyn-analyzers-overview) to help validate the correctness, performance, and maintainability of the code. Several existing analyzer packages are wired into the build, but it is easy to augment the utilized packages in order to experiment with additional analyzers.
To add an analyzer package to the build:
-1. Select a package you want to employ, for example https://www.nuget.org/packages/SonarAnalyzer.CSharp/. This analyzer package's name is `SonarAnalyzer.CSharp` and the latest version as of this edit is `7.15.0.8572`.
-2. Add a PackageReference entry to https://github.com/dotnet/runtime/blob/main/eng/Analyzers.props, e.g.
-```XML
-
-```
-3. After that point, all builds will employ all rules in that analyzer package that are enabled by default. Rules can be disabled by adding entries to the https://github.com/dotnet/runtime/blob/main/src/libraries/CodeAnalysis.ruleset file, e.g.
-```XML
-
-
-
- ...
-
-```
+1. Select a package you want to employ, for example https://www.nuget.org/packages/SonarAnalyzer.CSharp/. This analyzer package's name is `SonarAnalyzer.CSharp` and the latest version as of this edit is `8.50.0.58025`.
+2. Add a `PackageReference` entry to , e.g.
+ ```XML
+
+ ```
+3. After that point, all builds will employ all rules in that analyzer package that are enabled by default. You can change the severity for rules by adding entries to the globalconfig files [CodeAnalysis.src.globalconfig](https://github.com/dotnet/runtime/blob/main/eng/CodeAnalysis.src.globalconfig) or [CodeAnalysis.test.globalconfig](https://github.com/dotnet/runtime/blob/main/eng/CodeAnalysis.test.globalconfig).
-The build system in this repo defaults to treating all warnings as errors. It can be helpful when enabling a new rule to temporarily allow warnings to be warnings rather than errors, while you proceed to fix all of them across the repo. Instead of building from the root of the repo with:
+The build system in this repo defaults to treating all warnings as errors. It can be helpful when enabling a new rule to temporarily allow warnings to be warnings rather than errors, while you proceed to fix all of them across the repo. Instead of building from the root of the repo with:
```
build.cmd
```
diff --git a/docs/project/api-review-process.md b/docs/project/api-review-process.md
index 673ec1f890e7e4..c1d25bd8271cb5 100644
--- a/docs/project/api-review-process.md
+++ b/docs/project/api-review-process.md
@@ -4,7 +4,7 @@
## Which APIs should be reviewed?
-The rule of thumb is that we (**dotnet/runtime**) review every API that is being added to the `System.*` namespaces. In some cases, we also review APIs that are added to other namespaces, such as `Microsoft.*`. We mostly do this for high impact APIs, such as Roslyn, and when both the owner of the technology and we feel there is win-win for both sides if we review the APIs. However, we can't scale to review all APIs being added to .NET.
+We review all publicly exposed API proposed to be added to the product components that are built out of this repo. Those are in both the `System.*` and `Microsoft.*` namespaces. In some cases, we also review APIs that are added to other components outside of this repo. We mostly do this for high impact APIs, such as Roslyn, and when both the owner of the technology and we feel there is win-win for both sides if we review the APIs. However, we can't scale to review all APIs being added to the .NET ecosystem.
## Process
diff --git a/docs/project/copyright.md b/docs/project/copyright.md
index 2333165f3d2c22..c2948ec308462d 100644
--- a/docs/project/copyright.md
+++ b/docs/project/copyright.md
@@ -1,33 +1,36 @@
-Copyright
-=========
+# Copyright
-The .NET project copyright is held by ".NET Foundation and Contributors".
+.NET is a member project of the [.NET Foundation](http://www.dotnetfoundation.org/).
-The [.NET Foundation](http://www.dotnetfoundation.org/) is an independent organization that encourages open development and collaboration around the .NET ecosystem.
+Source copyright is held by ".NET Foundation and Contributors", while binary distributions (and associated copyright) are provided by a variety of parties.
-Source License
---------------
+## Source License
-The .NET project uses multiple licenses for the various project repositories.
+The .NET project primarily uses the [MIT License](https://opensource.org/licenses/MIT) for code and [Creative Commons licenses](https://creativecommons.org/) for non-code assets, like [documentation](https://github.com/dotnet/docs/), [swag](https://github.com/dotnet/swag), and [brand](https://github.com/dotnet/brand) content.
-- The [MIT License](https://opensource.org/licenses/MIT) is used for [code](https://github.com/dotnet/runtime/).
-- The [Creative Commons Attribution 4.0 International Public License (CC-BY)](https://creativecommons.org/licenses/by/4.0/) is used for [documentation](https://github.com/dotnet/docs/) and [swag](https://github.com/dotnet/swag).
+We use the following approach for code contributions:
-Binary License
---------------
+- New code is licensed as MIT, per [repo license](/LICENSE.TXT) and via [file headers](/src/libraries/System.Private.CoreLib/src/System/Collections/Generic/List.cs).
+- Contributions (like ports) can be based on existing code or algorithms that are licensed with a permissive [OSI-approved licenses](https://opensource.org/licenses) (for example, [MIT](https://opensource.org/licenses/MIT), [Apache 2](https://opensource.org/licenses/Apache-2.0), and [BSD](https://opensource.org/licenses/BSD-3-Clause)) and should be ackowledged in the [repo THIRD-PARTY-NOTICE](/THIRD-PARTY-NOTICES.TXT) file.
+- Non-product contributions (like tests) can be based on existing code or algorithms that are licensed with any OSI-approved license (including [GPL](https://opensource.org/licenses/GPL-2.0)) and should be acknowleged in a local THIRD-PARTY-NOTICE file (for example, [SciMark/THIRD-PARTY-NOTICES](/src/tests/JIT/Performance/CodeQuality/SciMark/THIRD-PARTY-NOTICES)).
+- We will typically reject the use of product code licensed with [Creative Commons](https://creativecommons.org/) or [public domain licenses](https://en.wikipedia.org/wiki/Public-domain-equivalent_license) given their lack of universal acceptance.
+- The [.NET Foundation Contribution License Agreement (CLA)](https://cla.dotnetfoundation.org) is used to license contributions from contributors.
-.NET distributions are licensed with a variety of licenses, dependent on the content. By default, the MIT license is used, the exact same as the [source license](https://github.com/dotnet/core/blob/master/LICENSE.TXT), with the same copyright holder. There are some cases where that isn't possible because a given component includes a proprietary Microsoft binary. This is typically only the case for Windows distributions.
+References:
-The following rules are used for determining the binary license:
+- https://opensource.org/faq#cc-zero
+- https://opensource.org/faq#public-domain
+- https://opensource.stackexchange.com/questions/1717/why-is-cc-by-sa-discouraged-for-code
+- https://gitlab.com/fedora/legal/fedora-license-data/-/issues/104
+- https://gitlab.com/fedora/legal/fedora-license-data/-/blob/11a7b58ea6d92e1ae06d7d9e44e4a2f2257b687e/data/CC0-1.0.toml#L11
-- .NET binary distributions (zips, nuget packages, …) are licensed as MIT (identical to the [.NET source license](https://github.com/dotnet/core/blob/master/LICENSE.TXT)).
-- The license link (if there is one) should point to the repository where the file came from, for example: [dotnet/runtime](https://github.com/dotnet/runtime/blob/main/LICENSE.TXT).
-- If the contained binaries are built from multiple .NET repositories, the license should point to [dotnet/core](https://github.com/dotnet/core/blob/master/LICENSE.TXT).
-- If the contents are not 100% open source, the distribution should be licensed with the [.NET Library license](https://www.microsoft.com/net/dotnet_library_license.htm).
-- It is OK for licensing to be asymmetric for a single distribution type. For example, it’s possible that the .NET SDK distribution might be fully open source for Linux but include a closed-source component on Windows. In this case, the SDK would be licensed as MIT on Linux and use the .NET Library License on Windows. It is better to have more open licenses than less.
-- It is OK for the source and binary licenses not to match. For example, the source might be Apache 2 but ships as an MIT binary. The third party notices file should capture the Apache 2 license. This only works for a permissive licenses, however, we have limited the project to that class of licenses already. The value of this approach is that binary licenses are uniform.
+## Binary License
-Patents
--------
+Microsoft distributes binary builds of .NET per the following description. Distributions from other parties may differ.
+
+- Binary archives, installers, packages, and containers are licensed as MIT (same as the [.NET source license](https://github.com/dotnet/core/blob/master/LICENSE.TXT)).
+- Windows-based distributions include closed-source assets, per [License information for .NET on Windows](https://github.com/dotnet/core/blob/main/license-information-windows.md)
+
+## Patents
Microsoft has issued a [Patent Promise for .NET Libraries and Runtime Components](/PATENTS.TXT).
diff --git a/docs/project/dogfooding.md b/docs/project/dogfooding.md
index 3b8ac4fd696ed9..791da96c190b1c 100644
--- a/docs/project/dogfooding.md
+++ b/docs/project/dogfooding.md
@@ -1,7 +1,7 @@
# Dogfooding daily builds of .NET
This document provides the steps necessary to consume a latest development build of .NET runtime and SDK.
-Example below is for 7.0 but similar steps should work for other versions as well.
+Example below is for 8.0 but similar steps should work for other versions as well.
## Obtaining daily builds of NuGet packages
@@ -14,29 +14,29 @@ dotnet new nugetconfig
Next, add the package source to NuGet.Config with the [dotnet nuget add source](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-add-source) command:
```
-dotnet nuget add source -n dotnet7 https://dnceng.pkgs.visualstudio.com/public/_packaging/dotnet7/nuget/v3/index.json
+dotnet nuget add source -n dotnet8 https://dnceng.pkgs.visualstudio.com/public/_packaging/dotnet8/nuget/v3/index.json
```
Then, you will be able to add the latest prerelease version of the desired package to your project.
-**Example:** To add version 7.0-preview.5.22226.4 of the System.Data.OleDb package, use the [dotnet add package](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-add-package) command:
+**Example:** To add version 8.0-preview.5.22226.4 of the System.Data.OleDb package, use the [dotnet add package](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-add-package) command:
```
-dotnet add package System.Data.OleDb -v 7.0-preview.5.22226.4
+dotnet add package System.Data.OleDb -v 8.0-preview.5.22226.4
```
To use daily builds of the entire runtime, follow the steps given in the rest of this document instead.
## Install prerequisites
-1. Acquire the latest development .NET SDK by downloading and extracting a zip/tarball or using an installer from the [installers and binaries table in dotnet/installer](https://github.com/dotnet/installer#installers-and-binaries) (for example, https://aka.ms/dotnet/7.0/daily/dotnet-sdk-win-x64.zip).
+1. Acquire the latest development .NET SDK by downloading and extracting a zip/tarball or using an installer from the [installers and binaries table in dotnet/installer](https://github.com/dotnet/installer#installers-and-binaries) (for example, https://aka.ms/dotnet/8.0/daily/dotnet-sdk-win-x64.zip).
-2. If you are using a local copy of the dotnet CLI, take care that when you type `dotnet` you do not inadvertently pick up a different copy that you may have in your path. On Windows, for example, if you use a Command Prompt, a global copy may be in the path, so use the fully qualified path to your local `dotnet` (e.g. `C:\dotnet\dotnet.exe`). If you receive an error "error NETSDK1045: The current .NET SDK does not support targeting .NET 7.0." then you may be executing an older `dotnet`.
+2. If you are using a local copy of the dotnet CLI, take care that when you type `dotnet` you do not inadvertently pick up a different copy that you may have in your path. On Windows, for example, if you use a Command Prompt, a global copy may be in the path, so use the fully qualified path to your local `dotnet` (e.g. `C:\dotnet\dotnet.exe`). If you receive an error "error NETSDK1045: The current .NET SDK does not support targeting .NET 8.0." then you may be executing an older `dotnet`.
After setting up dotnet you can verify you are using the dogfooding version by executing `dotnet --info`. Here is an example output at the time of writing:
```
>dotnet --info
.NET SDK:
- Version: 7.0.100-preview.5.22226.4
+ Version: 8.0.100-preview.5.22226.4
Commit: fc127ac5a4
Runtime Environment:
@@ -44,21 +44,21 @@ Runtime Environment:
OS Version: 10.0.22616
OS Platform: Windows
RID: win10-x64
- Base Path: C:\Program Files\dotnet\sdk\7.0.100-preview.5.22226.4\
+ Base Path: C:\Program Files\dotnet\sdk\8.0.100-preview.5.22226.4\
global.json file:
Not found
Host:
- Version: 7.0.0-preview.5.22224.3
+ Version: 8.0.0-preview.5.22224.3
Architecture: x64
Commit: 47d9c43ab1
.NET SDKs installed:
- 7.0.100-preview.5.22226.4 [C:\Program Files\dotnet\sdk]
+ 8.0.100-preview.5.22226.4 [C:\Program Files\dotnet\sdk]
.NET runtimes installed:
- Microsoft.NETCore.App 7.0.0-preview.5.22224.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
+ Microsoft.NETCore.App 8.0.0-preview.5.22224.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Download .NET:
https://aka.ms/dotnet-download
@@ -71,7 +71,7 @@ Learn about .NET Runtimes and SDKs:
3. Our daily builds are uploaded to development feed, not NuGet - so ensure the development feed is in your nuget configuration in case you need other packages that aren't included in the download. For example, on Windows you could edit `%userprofile%\appdata\roaming\nuget\nuget.config` or on Linux edit `~/.nuget/NuGet/NuGet.Config` to add these lines:
```xml
-
+
...
```
@@ -116,10 +116,10 @@ This is the default case for applications - running against an installed .NET ru
```XML
Exe
-
- net7.0
+
+ net8.0
- 7.0.0-preview.5.22224.3
+ 8.0.0-preview.5.22224.3
```
@@ -139,11 +139,11 @@ make it self-contained by adding a RuntimeIdentifier (RID).
```XML
Exe
-
- net7.0
+
+ net8.0
-
- 7.0.0-preview.5.22224.3
+
+ 8.0.0-preview.5.22224.3
win-x64
```
@@ -151,7 +151,7 @@ make it self-contained by adding a RuntimeIdentifier (RID).
```
$ dotnet restore
$ dotnet publish
-$ bin\Debug\net7.0\win-x64\publish\App.exe
+$ bin\Debug\net8.0\win-x64\publish\App.exe
```
### Daily builds table
@@ -165,23 +165,23 @@ $ bin\Debug\net7.0\win-x64\publish\App.exe
| Platform | Main |
| --- | :---: |
-| **Windows (x64)** |
[Installer][win-x64-installer-7.0.X] ([Checksum][win-x64-installer-checksum-7.0.X])
[zip][win-x64-zip-7.0.X] ([Checksum][win-x64-zip-checksum-7.0.X]) |
-| **Windows (x86)** |
[Installer][win-x86-installer-7.0.X] ([Checksum][win-x86-installer-checksum-7.0.X])
[zip][win-x86-zip-7.0.X] ([Checksum][win-x86-zip-checksum-7.0.X]) |
-| **Windows (arm64)** |
[Installer][win-arm64-installer-7.0.X] ([Checksum][win-arm64-installer-checksum-7.0.X])
[zip][win-arm64-zip-7.0.X] ([Checksum][win-arm64-zip-checksum-7.0.X]) |
-| **macOS (x64)** |
[Installer][osx-x64-installer-7.0.X] ([Checksum][osx-x64-installer-checksum-7.0.X])
[tar.gz][osx-x64-targz-7.0.X] ([Checksum][osx-x64-targz-checksum-7.0.X]) |
-| **macOS (arm64)** |
[Installer][osx-arm64-installer-7.0.X] ([Checksum][osx-arm64-installer-checksum-7.0.X])
[tar.gz][osx-arm64-targz-7.0.X] ([Checksum][osx-arm64-targz-checksum-7.0.X]) |
-| **Linux (x64)** (for glibc based OS) |
[tar.gz][linux-x64-targz-7.0.X] ([Checksum][linux-x64-targz-checksum-7.0.X]) |
-| **Linux (armhf)** (for glibc based OS) |
[tar.gz][linux-arm-targz-7.0.X] ([Checksum][linux-arm-targz-checksum-7.0.X]) |
-| **Linux (arm64)** (for glibc based OS) |
[tar.gz][linux-arm64-targz-7.0.X] ([Checksum][linux-arm64-targz-checksum-7.0.X]) |
-| **Linux-musl (x64)** |
[tar.gz][linux-musl-x64-targz-7.0.X] ([Checksum][linux-musl-x64-targz-checksum-7.0.X]) |
-| **Linux-musl (arm)** |
[tar.gz][linux-musl-arm-targz-7.0.X] ([Checksum][linux-musl-arm-targz-checksum-7.0.X]) |
-| **Linux-musl (arm64)** |
[tar.gz][linux-musl-arm64-targz-7.0.X] ([Checksum][linux-musl-arm64-targz-checksum-7.0.X]) |
-| **Dpkg Based Systems (x64)** |
[Runtime-Deps][deb-runtime-deps-7.0.X] ([Checksum][deb-runtime-deps-checksum-7.0.X])
[Host][deb-host-7.0.X] ([Checksum][deb-host-checksum-7.0.X])
[App Hosts][deb-apphost-pack-7.0.X] ([Checksum][deb-apphost-pack-checksum-7.0.X])
[Host FX Resolver][deb-hostfxr-7.0.X] ([Checksum][deb-hostfxr-checksum-7.0.X])
[Targeting Pack][deb-targeting-pack-7.0.X] ([Checksum][deb-targeting-pack-checksum-7.0.X])
[Shared Framework][deb-sharedfx-7.0.X] ([Checksum][deb-sharedfx-checksum-7.0.X]) |
-| **CentOS 7 (x64)** |
[Runtime-Deps][centos-7-runtime-deps-7.0.X] ([Checksum][centos-7-runtime-deps-checksum-7.0.X])
[Host][centos-7-host-7.0.X] ([Checksum][centos-7-host-checksum-7.0.X])
[App Hosts][centos-7-apphost-pack-7.0.X] ([Checksum][centos-7-apphost-pack-checksum-7.0.X])
[Host FX Resolver][centos-7-hostfxr-7.0.X] ([Checksum][centos-7-hostfxr-checksum-7.0.X])
[Targeting Pack][centos-7-targeting-pack-7.0.X] ([Checksum][centos-7-targeting-pack-checksum-7.0.X])
[Shared Framework][centos-7-sharedfx-7.0.X] ([Checksum][centos-7-sharedfx-checksum-7.0.X]) |
-| **RHEL 7.2 (x64)** |
[Host][rhel7-host-7.0.X] ([Checksum][rhel7-host-checksum-7.0.X])
[App Hosts][rhel7-apphost-pack-7.0.X] ([Checksum][rhel7-apphost-pack-checksum-7.0.X])
[Host FX Resolver][rhel7-hostfxr-7.0.X] ([Checksum][rhel7-hostfxr-checksum-7.0.X])
[Targeting Pack][rhel7-targeting-pack-7.0.X] ([Checksum][rhel7-targeting-pack-checksum-7.0.X])
[Shared Framework][rhel7-sharedfx-7.0.X] ([Checksum][rhel7-sharedfx-checksum-7.0.X]) |
-| **Fedora 27 (x64)** |
[Runtime-Deps][fedora-27-runtime-deps-7.0.X] ([Checksum][fedora-27-runtime-deps-checksum-7.0.X])
[Host][fedora-27-host-7.0.X] ([Checksum][fedora-27-host-checksum-7.0.X])
[App Hosts][fedora-27-apphost-pack-7.0.X] ([Checksum][fedora-27-apphost-pack-checksum-7.0.X])
[Host FX Resolver][fedora-27-hostfxr-7.0.X] ([Checksum][fedora-27-hostfxr-checksum-7.0.X])
[Targeting Pack][fedora-27-targeting-pack-7.0.X] ([Checksum][fedora-27-targeting-pack-checksum-7.0.X])
[Shared Framework][fedora-27-sharedfx-7.0.X] ([Checksum][fedora-27-sharedfx-checksum-7.0.X]) |
-| **SLES 12 (x64)** |
[Runtime-Deps][sles-12-runtime-deps-7.0.X] ([Checksum][sles-12-runtime-deps-checksum-7.0.X])
[Host][sles-12-host-7.0.X] ([Checksum][sles-12-host-checksum-7.0.X])
[App Hosts][sles-12-apphost-pack-7.0.X] ([Checksum][sles-12-apphost-pack-checksum-7.0.X])
[Host FX Resolver][sles-12-hostfxr-7.0.X] ([Checksum][sles-12-hostfxr-checksum-7.0.X])
[Targeting Pack][sles-12-targeting-pack-7.0.X] ([Checksum][sles-12-targeting-pack-checksum-7.0.X])
[Shared Framework][sles-12-sharedfx-7.0.X] ([Checksum][sles-12-sharedfx-checksum-7.0.X]) |
-| **OpenSUSE 42 (x64)** |
[Runtime-Deps][OpenSUSE-42-runtime-deps-7.0.X] ([Checksum][OpenSUSE-42-runtime-deps-checksum-7.0.X])
[Host][OpenSUSE-42-host-7.0.X] ([Checksum][OpenSUSE-42-host-checksum-7.0.X])
[App Hosts][OpenSUSE-42-apphost-pack-7.0.X] ([Checksum][OpenSUSE-42-apphost-pack-checksum-7.0.X])
[Host FX Resolver][OpenSUSE-42-hostfxr-7.0.X] ([Checksum][OpenSUSE-42-hostfxr-checksum-7.0.X])
[Targeting Pack][OpenSUSE-42-targeting-pack-7.0.X] ([Checksum][OpenSUSE-42-targeting-pack-checksum-7.0.X])
[Shared Framework][OpenSUSE-42-sharedfx-7.0.X] ([Checksum][OpenSUSE-42-sharedfx-checksum-7.0.X]) |
+| **Windows (x64)** |
[Installer][win-x64-installer-8.0.X] ([Checksum][win-x64-installer-checksum-8.0.X])
[zip][win-x64-zip-8.0.X] ([Checksum][win-x64-zip-checksum-8.0.X]) |
+| **Windows (x86)** |
[Installer][win-x86-installer-8.0.X] ([Checksum][win-x86-installer-checksum-8.0.X])
[zip][win-x86-zip-8.0.X] ([Checksum][win-x86-zip-checksum-8.0.X]) |
+| **Windows (arm64)** |
[Installer][win-arm64-installer-8.0.X] ([Checksum][win-arm64-installer-checksum-8.0.X])
[zip][win-arm64-zip-8.0.X] ([Checksum][win-arm64-zip-checksum-8.0.X]) |
+| **macOS (x64)** |
[Installer][osx-x64-installer-8.0.X] ([Checksum][osx-x64-installer-checksum-8.0.X])
[tar.gz][osx-x64-targz-8.0.X] ([Checksum][osx-x64-targz-checksum-8.0.X]) |
+| **macOS (arm64)** |
[Installer][osx-arm64-installer-8.0.X] ([Checksum][osx-arm64-installer-checksum-8.0.X])
[tar.gz][osx-arm64-targz-8.0.X] ([Checksum][osx-arm64-targz-checksum-8.0.X]) |
+| **Linux (x64)** (for glibc based OS) |
[tar.gz][linux-x64-targz-8.0.X] ([Checksum][linux-x64-targz-checksum-8.0.X]) |
+| **Linux (armhf)** (for glibc based OS) |
[tar.gz][linux-arm-targz-8.0.X] ([Checksum][linux-arm-targz-checksum-8.0.X]) |
+| **Linux (arm64)** (for glibc based OS) |
[tar.gz][linux-arm64-targz-8.0.X] ([Checksum][linux-arm64-targz-checksum-8.0.X]) |
+| **Linux-musl (x64)** |
[tar.gz][linux-musl-x64-targz-8.0.X] ([Checksum][linux-musl-x64-targz-checksum-8.0.X]) |
+| **Linux-musl (arm)** |
[tar.gz][linux-musl-arm-targz-8.0.X] ([Checksum][linux-musl-arm-targz-checksum-8.0.X]) |
+| **Linux-musl (arm64)** |
[tar.gz][linux-musl-arm64-targz-8.0.X] ([Checksum][linux-musl-arm64-targz-checksum-8.0.X]) |
+| **Dpkg Based Systems (x64)** |
[Runtime-Deps][deb-runtime-deps-8.0.X] ([Checksum][deb-runtime-deps-checksum-8.0.X])
[Host][deb-host-8.0.X] ([Checksum][deb-host-checksum-8.0.X])
[App Hosts][deb-apphost-pack-8.0.X] ([Checksum][deb-apphost-pack-checksum-8.0.X])
[Host FX Resolver][deb-hostfxr-8.0.X] ([Checksum][deb-hostfxr-checksum-8.0.X])
[Targeting Pack][deb-targeting-pack-8.0.X] ([Checksum][deb-targeting-pack-checksum-8.0.X])
[Shared Framework][deb-sharedfx-8.0.X] ([Checksum][deb-sharedfx-checksum-8.0.X]) |
+| **CentOS 7 (x64)** |
[Runtime-Deps][centos-7-runtime-deps-8.0.X] ([Checksum][centos-7-runtime-deps-checksum-8.0.X])
[Host][centos-7-host-8.0.X] ([Checksum][centos-7-host-checksum-8.0.X])
[App Hosts][centos-7-apphost-pack-8.0.X] ([Checksum][centos-7-apphost-pack-checksum-8.0.X])
[Host FX Resolver][centos-7-hostfxr-8.0.X] ([Checksum][centos-7-hostfxr-checksum-8.0.X])
[Targeting Pack][centos-7-targeting-pack-8.0.X] ([Checksum][centos-7-targeting-pack-checksum-8.0.X])
[Shared Framework][centos-7-sharedfx-8.0.X] ([Checksum][centos-7-sharedfx-checksum-8.0.X]) |
+| **RHEL 7.2 (x64)** |
[Host][rhel7-host-8.0.X] ([Checksum][rhel7-host-checksum-8.0.X])
[App Hosts][rhel7-apphost-pack-8.0.X] ([Checksum][rhel7-apphost-pack-checksum-8.0.X])
[Host FX Resolver][rhel7-hostfxr-8.0.X] ([Checksum][rhel7-hostfxr-checksum-8.0.X])
[Targeting Pack][rhel7-targeting-pack-8.0.X] ([Checksum][rhel7-targeting-pack-checksum-8.0.X])
[Shared Framework][rhel7-sharedfx-8.0.X] ([Checksum][rhel7-sharedfx-checksum-8.0.X]) |
+| **Fedora 27 (x64)** |
[Runtime-Deps][fedora-27-runtime-deps-8.0.X] ([Checksum][fedora-27-runtime-deps-checksum-8.0.X])
[Host][fedora-27-host-8.0.X] ([Checksum][fedora-27-host-checksum-8.0.X])
[App Hosts][fedora-27-apphost-pack-8.0.X] ([Checksum][fedora-27-apphost-pack-checksum-8.0.X])
[Host FX Resolver][fedora-27-hostfxr-8.0.X] ([Checksum][fedora-27-hostfxr-checksum-8.0.X])
[Targeting Pack][fedora-27-targeting-pack-8.0.X] ([Checksum][fedora-27-targeting-pack-checksum-8.0.X])
[Shared Framework][fedora-27-sharedfx-8.0.X] ([Checksum][fedora-27-sharedfx-checksum-8.0.X]) |
+| **SLES 12 (x64)** |
[Runtime-Deps][sles-12-runtime-deps-8.0.X] ([Checksum][sles-12-runtime-deps-checksum-8.0.X])
[Host][sles-12-host-8.0.X] ([Checksum][sles-12-host-checksum-8.0.X])
[App Hosts][sles-12-apphost-pack-8.0.X] ([Checksum][sles-12-apphost-pack-checksum-8.0.X])
[Host FX Resolver][sles-12-hostfxr-8.0.X] ([Checksum][sles-12-hostfxr-checksum-8.0.X])
[Targeting Pack][sles-12-targeting-pack-8.0.X] ([Checksum][sles-12-targeting-pack-checksum-8.0.X])
[Shared Framework][sles-12-sharedfx-8.0.X] ([Checksum][sles-12-sharedfx-checksum-8.0.X]) |
+| **OpenSUSE 42 (x64)** |
[Runtime-Deps][OpenSUSE-42-runtime-deps-8.0.X] ([Checksum][OpenSUSE-42-runtime-deps-checksum-8.0.X])
[Host][OpenSUSE-42-host-8.0.X] ([Checksum][OpenSUSE-42-host-checksum-8.0.X])
[App Hosts][OpenSUSE-42-apphost-pack-8.0.X] ([Checksum][OpenSUSE-42-apphost-pack-checksum-8.0.X])
[Host FX Resolver][OpenSUSE-42-hostfxr-8.0.X] ([Checksum][OpenSUSE-42-hostfxr-checksum-8.0.X])
[Targeting Pack][OpenSUSE-42-targeting-pack-8.0.X] ([Checksum][OpenSUSE-42-targeting-pack-checksum-8.0.X])
[Shared Framework][OpenSUSE-42-sharedfx-8.0.X] ([Checksum][OpenSUSE-42-sharedfx-checksum-8.0.X]) |
@@ -189,186 +189,186 @@ $ bin\Debug\net7.0\win-x64\publish\App.exe
-[win-x64-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_win-x64_Release_version_badge.svg?no-cache
-[win-x64-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[win-x64-sdkinstaller-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-sdk-win-x64.exe
-[win-x64-installer-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-x64.exe
-[win-x64-installer-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-x64.exe.sha512
-[win-x64-zip-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-x64.zip
-[win-x64-zip-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-x64.zip.sha512
-[win-x64-nethost-zip-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-nethost-win-x64.zip
-[win-x64-symbols-zip-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-symbols-win-x64.zip
-
-[win-x86-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_win-x86_Release_version_badge.svg?no-cache
-[win-x86-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[win-x86-sdkinstaller-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-sdk-win-x86.exe
-[win-x86-installer-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-x86.exe
-[win-x86-installer-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-x86.exe.sha512
-[win-x86-zip-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-x86.zip
-[win-x86-zip-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-x86.zip.sha512
-[win-x86-nethost-zip-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-nethost-win-x86.zip
-[win-x86-symbols-zip-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-symbols-win-x86.zip
-
-[win-arm64-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_win-arm64_Release_version_badge.svg?no-cache
-[win-arm64-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[win-arm64-sdkinstaller-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-sdk-win-arm64.exe
-[win-arm64-installer-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-arm64.exe
-[win-arm64-installer-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-arm64.exe.sha512
-[win-arm64-zip-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-arm64.zip
-[win-arm64-zip-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-win-arm64.zip.sha512
-[win-arm64-nethost-zip-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-nethost-win-arm64.zip
-[win-arm64-symbols-zip-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-symbols-win-arm64.zip
-
-[osx-x64-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_osx-x64_Release_version_badge.svg?no-cache
-[osx-x64-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[osx-x64-sdkinstaller-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-sdk-osx-x64.pkg
-[osx-x64-installer-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-osx-x64.pkg
-[osx-x64-installer-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-osx-x64.pkg.sha512
-[osx-x64-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-osx-x64.tar.gz
-[osx-x64-targz-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-osx-x64.tar.gz.sha512
-[osx-x64-nethost-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-nethost-osx-x64.tar.gz
-[osx-x64-symbols-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-symbols-osx-x64.tar.gz
-
-[osx-arm64-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_osx-arm64_Release_version_badge.svg?no-cache
-[osx-arm64-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[osx-arm64-sdkinstaller-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-sdk-osx-arm64.pkg
-[osx-arm64-installer-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-osx-arm64.pkg
-[osx-arm64-installer-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-osx-arm64.pkg.sha512
-[osx-arm64-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-osx-arm64.tar.gz
-[osx-arm64-targz-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-osx-arm64.tar.gz.sha512
-[osx-arm64-nethost-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-nethost-osx-arm64.tar.gz
-[osx-arm64-symbols-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-symbols-osx-arm64.tar.gz
-
-[linux-x64-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_linux-x64_Release_version_badge.svg?no-cache
-[linux-x64-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[linux-x64-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-x64.tar.gz
-[linux-x64-targz-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-x64.tar.gz.sha512
-[linux-x64-nethost-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-nethost-linux-x64.tar.gz
-[linux-x64-symbols-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-symbols-linux-x64.tar.gz
-
-[linux-arm-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_linux-arm_Release_version_badge.svg?no-cache
-[linux-arm-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[linux-arm-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-arm.tar.gz
-[linux-arm-targz-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-arm.tar.gz.sha512
-[linux-arm-nethost-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-nethost-linux-arm.tar.gz
-[linux-arm-symbols-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-symbols-linux-arm.tar.gz
-
-[linux-arm64-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_linux-arm64_Release_version_badge.svg?no-cache
-[linux-arm64-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[linux-arm64-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-arm64.tar.gz
-[linux-arm64-targz-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-arm64.tar.gz.sha512
-[linux-arm64-nethost-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-nethost-linux-arm64.tar.gz
-[linux-arm64-symbols-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-symbols-linux-arm64.tar.gz
-
-[deb-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_ubuntu.14.04-x64_Release_version_badge.svg?no-cache
-[deb-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[deb-apphost-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.deb
-[deb-apphost-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.deb.sha512
-[deb-host-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.deb
-[deb-runtime-deps-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-x64.deb
-[deb-runtime-deps-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-x64.deb.sha512
-[deb-host-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.deb.sha512
-[deb-hostfxr-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.deb
-[deb-hostfxr-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.deb.sha512
-[deb-sharedfx-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.deb
-[deb-sharedfx-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.deb.sha512
-[deb-targeting-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.deb
-[deb-targeting-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.deb.sha512
-
-[rhel7-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_rhel.7-x64_Release_version_badge.svg?no-cache
-[rhel7-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[rhel7-runtime-deps-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-centos.7-x64.rpm
-[rhel7-runtime-deps-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-centos.7-x64.rpm.sha512
-[rhel7-apphost-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.rpm
-[rhel7-apphost-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.rpm.sha512
-[rhel7-host-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.rpm
-[rhel7-host-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.rpm.sha512
-[rhel7-hostfxr-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.rpm
-[rhel7-hostfxr-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.rpm.sha512
-[rhel7-sharedfx-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.rpm
-[rhel7-sharedfx-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.rpm.sha512
-[rhel7-targeting-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.rpm
-[rhel7-targeting-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.rpm.sha512
-
-[centos-7-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_centos.7-x64_Release_version_badge.svg?no-cache
-[centos-7-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[centos-7-runtime-deps-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-centos.7-x64.rpm
-[centos-7-runtime-deps-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-centos.7-x64.rpm.sha512
-[centos-7-apphost-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.rpm
-[centos-7-apphost-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.rpm.sha512
-[centos-7-host-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.rpm
-[centos-7-host-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.rpm.sha512
-[centos-7-hostfxr-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.rpm
-[centos-7-hostfxr-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.rpm.sha512
-[centos-7-sharedfx-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.rpm
-[centos-7-sharedfx-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.rpm.sha512
-[centos-7-targeting-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.rpm
-[centos-7-targeting-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.rpm.sha512
-
-[fedora-27-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_fedora.27-x64_Release_version_badge.svg?no-cache
-[fedora-27-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[fedora-27-runtime-deps-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-fedora.27-x64.rpm
-[fedora-27-runtime-deps-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-fedora.27-x64.rpm.sha512
-[fedora-27-apphost-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.rpm
-[fedora-27-apphost-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.rpm.sha512
-[fedora-27-host-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.rpm
-[fedora-27-host-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.rpm.sha512
-[fedora-27-hostfxr-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.rpm
-[fedora-27-hostfxr-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.rpm.sha512
-[fedora-27-sharedfx-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.rpm
-[fedora-27-sharedfx-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.rpm.sha512
-[fedora-27-targeting-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.rpm
-[fedora-27-targeting-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.rpm.sha512
-
-[sles-12-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_sles.12-x64_Release_version_badge.svg?no-cache
-[sles-12-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[sles-12-runtime-deps-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-sles.12-x64.rpm
-[sles-12-runtime-deps-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-sles.12-x64.rpm.sha512
-[sles-12-apphost-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.rpm
-[sles-12-apphost-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.rpm.sha512
-[sles-12-host-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.rpm
-[sles-12-host-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.rpm.sha512
-[sles-12-hostfxr-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.rpm
-[sles-12-hostfxr-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.rpm.sha512
-[sles-12-sharedfx-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.rpm
-[sles-12-sharedfx-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.rpm.sha512
-[sles-12-targeting-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.rpm
-[sles-12-targeting-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.rpm.sha512
-
-[OpenSUSE-42-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_opensuse.42-x64_Release_version_badge.svg?no-cache
-[OpenSUSE-42-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[OpenSUSE-42-runtime-deps-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-opensuse.42-x64.rpm
-[OpenSUSE-42-runtime-deps-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-deps-opensuse.42-x64.rpm.sha512
-[OpenSUSE-42-apphost-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.rpm
-[OpenSUSE-42-apphost-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-apphost-pack-x64.rpm.sha512
-[OpenSUSE-42-host-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.rpm
-[OpenSUSE-42-host-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-host-x64.rpm.sha512
-[OpenSUSE-42-hostfxr-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.rpm
-[OpenSUSE-42-hostfxr-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-hostfxr-x64.rpm.sha512
-[OpenSUSE-42-sharedfx-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.rpm
-[OpenSUSE-42-sharedfx-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-x64.rpm.sha512
-[OpenSUSE-42-targeting-pack-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.rpm
-[OpenSUSE-42-targeting-pack-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-targeting-pack-x64.rpm.sha512
-
-[linux-musl-x64-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_linux-musl-x64_Release_version_badge.svg?no-cache
-[linux-musl-x64-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[linux-musl-x64-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-musl-x64.tar.gz
-[linux-musl-x64-targz-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-musl-x64.tar.gz.sha512
-[linux-musl-x64-nethost-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-nethost-linux-musl-x64.tar.gz
-[linux-musl-x64-symbols-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-symbols-linux-musl-x64.tar.gz
-
-[linux-musl-arm-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_linux-musl-arm_Release_version_badge.svg?no-cache
-[linux-musl-arm-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[linux-musl-arm-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-musl-arm.tar.gz
-[linux-musl-arm-targz-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-musl-arm.tar.gz.sha512
-[linux-musl-arm-nethost-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-nethost-linux-musl-arm.tar.gz
-[linux-musl-arm-symbols-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-symbols-linux-musl-arm.tar.gz
-
-[linux-musl-arm64-badge-7.0.X]: https://aka.ms/dotnet/7.0/daily/sharedfx_linux-musl-arm64_Release_version_badge.svg?no-cache
-[linux-musl-arm64-version-7.0.X]: https://aka.ms/dotnet/7.0/daily/runtime-productVersion.txt
-[linux-musl-arm64-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-musl-arm64.tar.gz
-[linux-musl-arm64-targz-checksum-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-linux-musl-arm64.tar.gz.sha512
-[linux-musl-arm64-nethost-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-nethost-linux-musl-arm64.tar.gz
-[linux-musl-arm64-symbols-targz-7.0.X]: https://aka.ms/dotnet/7.0/daily/dotnet-runtime-symbols-linux-musl-arm64.tar.gz
+[win-x64-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_win-x64_Release_version_badge.svg?no-cache
+[win-x64-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[win-x64-sdkinstaller-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-sdk-win-x64.exe
+[win-x64-installer-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-x64.exe
+[win-x64-installer-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-x64.exe.sha512
+[win-x64-zip-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-x64.zip
+[win-x64-zip-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-x64.zip.sha512
+[win-x64-nethost-zip-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-nethost-win-x64.zip
+[win-x64-symbols-zip-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-symbols-win-x64.zip
+
+[win-x86-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_win-x86_Release_version_badge.svg?no-cache
+[win-x86-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[win-x86-sdkinstaller-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-sdk-win-x86.exe
+[win-x86-installer-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-x86.exe
+[win-x86-installer-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-x86.exe.sha512
+[win-x86-zip-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-x86.zip
+[win-x86-zip-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-x86.zip.sha512
+[win-x86-nethost-zip-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-nethost-win-x86.zip
+[win-x86-symbols-zip-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-symbols-win-x86.zip
+
+[win-arm64-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_win-arm64_Release_version_badge.svg?no-cache
+[win-arm64-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[win-arm64-sdkinstaller-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-sdk-win-arm64.exe
+[win-arm64-installer-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-arm64.exe
+[win-arm64-installer-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-arm64.exe.sha512
+[win-arm64-zip-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-arm64.zip
+[win-arm64-zip-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-win-arm64.zip.sha512
+[win-arm64-nethost-zip-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-nethost-win-arm64.zip
+[win-arm64-symbols-zip-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-symbols-win-arm64.zip
+
+[osx-x64-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_osx-x64_Release_version_badge.svg?no-cache
+[osx-x64-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[osx-x64-sdkinstaller-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-sdk-osx-x64.pkg
+[osx-x64-installer-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-osx-x64.pkg
+[osx-x64-installer-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-osx-x64.pkg.sha512
+[osx-x64-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-osx-x64.tar.gz
+[osx-x64-targz-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-osx-x64.tar.gz.sha512
+[osx-x64-nethost-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-nethost-osx-x64.tar.gz
+[osx-x64-symbols-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-symbols-osx-x64.tar.gz
+
+[osx-arm64-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_osx-arm64_Release_version_badge.svg?no-cache
+[osx-arm64-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[osx-arm64-sdkinstaller-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-sdk-osx-arm64.pkg
+[osx-arm64-installer-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-osx-arm64.pkg
+[osx-arm64-installer-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-osx-arm64.pkg.sha512
+[osx-arm64-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-osx-arm64.tar.gz
+[osx-arm64-targz-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-osx-arm64.tar.gz.sha512
+[osx-arm64-nethost-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-nethost-osx-arm64.tar.gz
+[osx-arm64-symbols-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-symbols-osx-arm64.tar.gz
+
+[linux-x64-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_linux-x64_Release_version_badge.svg?no-cache
+[linux-x64-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[linux-x64-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-x64.tar.gz
+[linux-x64-targz-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-x64.tar.gz.sha512
+[linux-x64-nethost-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-nethost-linux-x64.tar.gz
+[linux-x64-symbols-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-symbols-linux-x64.tar.gz
+
+[linux-arm-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_linux-arm_Release_version_badge.svg?no-cache
+[linux-arm-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[linux-arm-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-arm.tar.gz
+[linux-arm-targz-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-arm.tar.gz.sha512
+[linux-arm-nethost-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-nethost-linux-arm.tar.gz
+[linux-arm-symbols-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-symbols-linux-arm.tar.gz
+
+[linux-arm64-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_linux-arm64_Release_version_badge.svg?no-cache
+[linux-arm64-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[linux-arm64-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-arm64.tar.gz
+[linux-arm64-targz-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-arm64.tar.gz.sha512
+[linux-arm64-nethost-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-nethost-linux-arm64.tar.gz
+[linux-arm64-symbols-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-symbols-linux-arm64.tar.gz
+
+[deb-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_ubuntu.14.04-x64_Release_version_badge.svg?no-cache
+[deb-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[deb-apphost-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.deb
+[deb-apphost-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.deb.sha512
+[deb-host-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.deb
+[deb-runtime-deps-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-x64.deb
+[deb-runtime-deps-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-x64.deb.sha512
+[deb-host-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.deb.sha512
+[deb-hostfxr-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.deb
+[deb-hostfxr-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.deb.sha512
+[deb-sharedfx-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.deb
+[deb-sharedfx-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.deb.sha512
+[deb-targeting-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.deb
+[deb-targeting-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.deb.sha512
+
+[rhel7-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_rhel.7-x64_Release_version_badge.svg?no-cache
+[rhel7-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[rhel7-runtime-deps-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-centos.7-x64.rpm
+[rhel7-runtime-deps-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-centos.7-x64.rpm.sha512
+[rhel7-apphost-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.rpm
+[rhel7-apphost-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.rpm.sha512
+[rhel7-host-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.rpm
+[rhel7-host-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.rpm.sha512
+[rhel7-hostfxr-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.rpm
+[rhel7-hostfxr-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.rpm.sha512
+[rhel7-sharedfx-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.rpm
+[rhel7-sharedfx-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.rpm.sha512
+[rhel7-targeting-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.rpm
+[rhel7-targeting-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.rpm.sha512
+
+[centos-7-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_centos.7-x64_Release_version_badge.svg?no-cache
+[centos-7-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[centos-7-runtime-deps-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-centos.7-x64.rpm
+[centos-7-runtime-deps-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-centos.7-x64.rpm.sha512
+[centos-7-apphost-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.rpm
+[centos-7-apphost-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.rpm.sha512
+[centos-7-host-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.rpm
+[centos-7-host-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.rpm.sha512
+[centos-7-hostfxr-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.rpm
+[centos-7-hostfxr-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.rpm.sha512
+[centos-7-sharedfx-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.rpm
+[centos-7-sharedfx-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.rpm.sha512
+[centos-7-targeting-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.rpm
+[centos-7-targeting-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.rpm.sha512
+
+[fedora-27-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_fedora.27-x64_Release_version_badge.svg?no-cache
+[fedora-27-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[fedora-27-runtime-deps-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-fedora.27-x64.rpm
+[fedora-27-runtime-deps-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-fedora.27-x64.rpm.sha512
+[fedora-27-apphost-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.rpm
+[fedora-27-apphost-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.rpm.sha512
+[fedora-27-host-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.rpm
+[fedora-27-host-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.rpm.sha512
+[fedora-27-hostfxr-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.rpm
+[fedora-27-hostfxr-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.rpm.sha512
+[fedora-27-sharedfx-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.rpm
+[fedora-27-sharedfx-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.rpm.sha512
+[fedora-27-targeting-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.rpm
+[fedora-27-targeting-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.rpm.sha512
+
+[sles-12-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_sles.12-x64_Release_version_badge.svg?no-cache
+[sles-12-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[sles-12-runtime-deps-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-sles.12-x64.rpm
+[sles-12-runtime-deps-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-sles.12-x64.rpm.sha512
+[sles-12-apphost-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.rpm
+[sles-12-apphost-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.rpm.sha512
+[sles-12-host-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.rpm
+[sles-12-host-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.rpm.sha512
+[sles-12-hostfxr-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.rpm
+[sles-12-hostfxr-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.rpm.sha512
+[sles-12-sharedfx-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.rpm
+[sles-12-sharedfx-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.rpm.sha512
+[sles-12-targeting-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.rpm
+[sles-12-targeting-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.rpm.sha512
+
+[OpenSUSE-42-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_opensuse.42-x64_Release_version_badge.svg?no-cache
+[OpenSUSE-42-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[OpenSUSE-42-runtime-deps-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-opensuse.42-x64.rpm
+[OpenSUSE-42-runtime-deps-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-deps-opensuse.42-x64.rpm.sha512
+[OpenSUSE-42-apphost-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.rpm
+[OpenSUSE-42-apphost-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-apphost-pack-x64.rpm.sha512
+[OpenSUSE-42-host-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.rpm
+[OpenSUSE-42-host-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-host-x64.rpm.sha512
+[OpenSUSE-42-hostfxr-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.rpm
+[OpenSUSE-42-hostfxr-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-hostfxr-x64.rpm.sha512
+[OpenSUSE-42-sharedfx-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.rpm
+[OpenSUSE-42-sharedfx-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-x64.rpm.sha512
+[OpenSUSE-42-targeting-pack-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.rpm
+[OpenSUSE-42-targeting-pack-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-targeting-pack-x64.rpm.sha512
+
+[linux-musl-x64-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_linux-musl-x64_Release_version_badge.svg?no-cache
+[linux-musl-x64-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[linux-musl-x64-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-musl-x64.tar.gz
+[linux-musl-x64-targz-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-musl-x64.tar.gz.sha512
+[linux-musl-x64-nethost-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-nethost-linux-musl-x64.tar.gz
+[linux-musl-x64-symbols-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-symbols-linux-musl-x64.tar.gz
+
+[linux-musl-arm-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_linux-musl-arm_Release_version_badge.svg?no-cache
+[linux-musl-arm-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[linux-musl-arm-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-musl-arm.tar.gz
+[linux-musl-arm-targz-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-musl-arm.tar.gz.sha512
+[linux-musl-arm-nethost-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-nethost-linux-musl-arm.tar.gz
+[linux-musl-arm-symbols-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-symbols-linux-musl-arm.tar.gz
+
+[linux-musl-arm64-badge-8.0.X]: https://aka.ms/dotnet/8.0/daily/sharedfx_linux-musl-arm64_Release_version_badge.svg?no-cache
+[linux-musl-arm64-version-8.0.X]: https://aka.ms/dotnet/8.0/daily/runtime-productVersion.txt
+[linux-musl-arm64-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-musl-arm64.tar.gz
+[linux-musl-arm64-targz-checksum-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-linux-musl-arm64.tar.gz.sha512
+[linux-musl-arm64-nethost-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-nethost-linux-musl-arm64.tar.gz
+[linux-musl-arm64-symbols-targz-8.0.X]: https://aka.ms/dotnet/8.0/daily/dotnet-runtime-symbols-linux-musl-arm64.tar.gz
diff --git a/docs/project/glossary.md b/docs/project/glossary.md
index ef25a3f45f768d..cec9d3cdf8b361 100644
--- a/docs/project/glossary.md
+++ b/docs/project/glossary.md
@@ -44,7 +44,7 @@ terminology.
| Redhawk | Codename for experimental minimal managed code runtime that evolved into [CoreRT](https://github.com/dotnet/corert/). |
| SDK | Software Development Kit. The [.NET SDK](https://docs.microsoft.com/dotnet/core/sdk) contains the .NET CLI, .NET libraries and runtime, and the dotnet driver. |
| SEH | [Structured Exception Handling](https://docs.microsoft.com/windows/win32/debug/structured-exception-handling). Unified mechanism for handling hardware and software exceptions on Windows. |
-| SOS | [Son of Strike](https://docs.microsoft.com/archive/blogs/jasonz/sos-debugging-of-the-clr-part-1). The debugging extension for DbgEng based debuggers. Uses the DAC as an abstraction layer for its operation. |
+| SOS | [Son of Strike](https://learn.microsoft.com/dotnet/framework/tools/sos-dll-sos-debugging-extension). The debugging extension for DbgEng based debuggers. Uses the DAC as an abstraction layer for its operation. The obscure name derives from the original nickname for the CLR team at Microsoft: "Lightning". The team built a debugging tool humorously named "Strike", and a subset of that dubbed "Son of Strike". |
| SPCL | `System.Private.CoreLib` - the lowest managed assembly in the libraries stack that contains `System.Object`, `String`, etc. |
| SuperPMI | JIT component test framework (super fast JIT testing - it mocks/replays EE in EE-JIT interface) - see [SuperPMI details](https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/superpmi/readme.md). |
| SVR | The CLR used to be built as two variants, with one called "mscorsvr.dll", to mean the "server" version. In particular, it contained the server GC implementation, which was intended for multi-threaded apps capable of taking advantage of multiple processors. In the .NET Framework 2 release, the two variants were merged into "mscorwks.dll". The WKS version was the default, however the SVR version remained available. |
diff --git a/docs/project/issue-guide.md b/docs/project/issue-guide.md
index 3d140429b5b3a3..2af1afee69d186 100644
--- a/docs/project/issue-guide.md
+++ b/docs/project/issue-guide.md
@@ -10,7 +10,7 @@ As noted above, we don't close issues just because we don't plan to address them
2. Cross cutting work better suited for another team. Sometimes the line between the framework, languages and runtime blurs. For some issues, we may feel that the work is better suited for the runtime team, language team or other partner. In these cases, we'll close the issue and open it with the partner team. If they end up not deciding to take on the issue, we can reconsider it here.
3. Nebulous and Large open issues. Large open issues are sometimes better suited for [User Voice](http://visualstudio.uservoice.com/forums/121579-visual-studio/category/31481--net), especially when the work will cross the boundaries of the framework, language and runtime. A good example of this is the SIMD support we recently added to CoreFx. This started as a [User Voice request](https://visualstudio.uservoice.com/forums/121579-visual-studio-2015/suggestions/2212443-c-and-simd), and eventually turned into work for both the core libraries and runtime.
-Sometimes after debate, we'll decide an issue isn't a good fit for CoreFx. In that case, we'll also close it. Because of this, we ask that you don't start working on an issue until it's tagged with [up-for-grabs](https://github.com/dotnet/runtime/labels/up-for-grabs) or [api-approved](https://github.com/dotnet/runtime/labels/api-approved). Both you and the team will be unhappy if you spend time and effort working on a change we'll ultimately be unable to take. We try to avoid that.
+Sometimes after debate, we'll decide an issue isn't a good fit for the .NET runtime codebase. In that case, we'll also close it. Because of this, we ask that you don't start working on an issue until it's tagged with [help wanted](https://github.com/dotnet/runtime/labels/help%20wanted) or [api-approved](https://github.com/dotnet/runtime/labels/api-approved). Both you and the team will be unhappy if you spend time and effort working on a change we'll ultimately be unable to take. We try to avoid that.
### Labels
We use GitHub [labels](https://github.com/dotnet/runtime/labels) on our issues in order to classify them. We have the following categories per issue:
@@ -25,7 +25,7 @@ We use GitHub [labels](https://github.com/dotnet/runtime/labels) on our issues i
* [question](https://github.com/dotnet/runtime/labels/question): Questions about the product, source code, etc.
* **Other**:
* [easy](https://github.com/dotnet/runtime/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Aeasy%20no%3Aassignee) - Good for starting contributors.
- * [up-for-grabs](https://github.com/dotnet/runtime/labels/up-for-grabs): Small sections of work which we believe are well scoped. These sorts of issues are a good place to start if you are new. Anyone is free to work on these issues.
+ * [help wanted](https://github.com/dotnet/runtime/labels/help%20wanted): Small sections of work which we believe are well scoped. These sorts of issues are a good place to start if you are new. Anyone is free to work on these issues.
* [needs more info](https://github.com/dotnet/runtime/labels/needs%20more%20info): Issues which need more information to be actionable. Usually this will be because we can't reproduce a reported bug. We'll close these issues after a little bit if we haven't gotten actionable information, but we welcome folks who have acquired more information to reopen the issue.
* [wishlist](https://github.com/dotnet/runtime/issues?q=is%3Aissue+is%3Aopen+label%3Awishlist) - Issues on top of our backlog we won't likely get to. Warning: Might not be easy.
@@ -50,7 +50,7 @@ Areas are tracked by labels area-* (e.g. area-System.Collections). Each area
1. Each issue has exactly one **area-*** label
1. Issue has no **Assignee**, unless someone is working on the issue at the moment
-1. Use **up-for-grabs** as much as possible, ideally with a quick note about next steps / complexity of the issue
+1. Use **help wanted** as much as possible, ideally notes about next steps / complexity of the issue / acceptance criteria
1. Set milestone to **Future**, unless you can 95%-commit you can fund the issue in specific milestone
1. Each issue has exactly one "*issue type*" label (**bug**, **enhancement**, **api-needs-work**, **test bug**, **test enhancement**, **question**, **documentation**, etc.)
1. Don't be afraid to say no, or close issues - just explain why and be polite
@@ -64,7 +64,7 @@ Feel free to use other labels if it helps your triage efforts (e.g. **needs more
* Motivation: Issues with multiple areas have loose responsibility (everyone blames the other side) and issues are double counted in reports.
1. Issue has no **Assignee**, unless someone is working on the issue at the moment
* Motivation: Observation is that contributors are less likely to grab assigned issues, no matter what the repo rules say.
-1. Use **up-for-grabs** as much as possible, ideally with a quick note about next steps / complexity of the issue
+1. Use **help wanted** as much as possible, ideally with a quick note about next steps / complexity of the issue
* Note: Per http://up-for-grabs.net, such issues should be no longer than few nights' worth of work. They should be actionable (i.e. no mysterious CI failures or UWP issues that can't be tested in the open).
1. Set milestone to **Future**, unless you can 95%-commit you can fund the issue in specific milestone
* Motivation: Helps communicate desire/timeline to community. Can spark further priority/impact discussion.
diff --git a/docs/project/linux-performance-tracing.md b/docs/project/linux-performance-tracing.md
index 8cb7add8a5b26f..3419e2edfdd0bf 100644
--- a/docs/project/linux-performance-tracing.md
+++ b/docs/project/linux-performance-tracing.md
@@ -49,12 +49,12 @@ Follow these steps to prepare your machine to collect a performance trace.
2. **[App]** Setup the application shell - this enables tracing configuration inside of CoreCLR.
> ```bash
- > export COMPlus_PerfMapEnabled=1
- > export COMPlus_EnableEventLog=1
+ > export DOTNET_PerfMapEnabled=1
+ > export DOTNET_EnableEventLog=1
> ```
Note:
- COMPlus_PerfMapEnabled will cause the .NET runtime to write a file containing symbolic information for managed code to the disk. Depending on the performance of your disk and the amount of managed code in the application this could have a significant performance overhead.
+ DOTNET_PerfMapEnabled will cause the .NET runtime to write a file containing symbolic information for managed code to the disk. Depending on the performance of your disk and the amount of managed code in the application this could have a significant performance overhead.
3. **[Trace]** Start collection.
@@ -152,7 +152,7 @@ is not needed. This works, but will increase startup time for your code by som
can tolerate that (you probably can), then this is an alternative. You were already setting environment variables
in order to get symbols, you simply need to add one more.
> ```bash
- > export COMPlus_ZapDisable=1
+ > export DOTNET_ZapDisable=1
> ```
With this change you should get the symbols for all .NET code.
@@ -165,28 +165,22 @@ symbols for these when it converts its data, but ONLY if the symbols for these n
the library they are for).
There is a global command called [dotnet symbol](https://github.com/dotnet/symstore/blob/master/src/dotnet-symbol/README.md#symbol-downloader-dotnet-cli-extension) which does this. This tool was mostly desiged to download symbols
-for debugging, but it works for perfcollect as well. There are three steps to getting the symbols
+for debugging, but it works for perfcollect as well. There are two steps to getting the symbols:
- 1. Install dotnet symbol
+ 1. Install dotnet symbol.
2. Download the symbols.
- 3. Copy the symbols to the correct place
To install dotnet symbol issue the command
```
dotnet tool install -g dotnet-symbol
```
-With that installed download the symbols to a local directory. if your installed version of the .NET Core runtime is
-2.1.0 the command to do this is
-```
- mkdir mySymbols
- dotnet symbol --symbols --output mySymbols /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0/lib*.so
-```
-Now all the symbols for those native dlls are in mySymbols. You then have to copy them (as super user next to the
-dlls that they are for.
+
+To download symbols for **all native libraries** (including .NET runtime/framework as well as any other installed frameworks like ASP.NET) and store them next to them:
+
```
- sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0
+ sudo dotnet symbol --recurse-subdirectories --symbols '/usr/share/dotnet/*.so'
```
-After this, you should get symbolic names for the native dlls when you run perfcollect.
+
## Collecting in a Docker Container ##
Perfcollect can be used to collect data for an application running inside a Docker container. The main thing to know is that collecting a trace requires elevated privileges because the [default seccomp profile](https://docs.docker.com/engine/security/seccomp/) blocks a required syscall - perf_events_open.
@@ -205,8 +199,8 @@ Filtering is implemented on Windows through the latest mechanisms provided with
On Linux those mechanisms are not available yet. Instead, there are two environment variables that exist just on linux to do some basic filtering.
-* COMPlus_EventSourceFilter – filter event sources by name
-* COMPlus_EventNameFilter – filter events by name
+* DOTNET_EventSourceFilter – filter event sources by name
+* DOTNET_EventNameFilter – filter events by name
Setting one or both of these variables will only enable collecting events that contain the name you specify as a substring. Strings are treated as case insensitive.
@@ -275,5 +269,5 @@ dotnet-trace collect --process-id
The resulting trace can be viewed in [PerfView](https://aka.ms/perfview) on Windows. Alternatively on Linux/macOS, it can be viewed on [SpeedScope](https://speedscope.app) if you convert the trace format to speedscope by passing `--format speedscope` argument when collecting the trace.
## More Information ##
-To read more about how to use dotnet-trace, please refer to the [dotnet-trace documentation](https://github.com/dotnet/diagnostics/blob/master/documentation/dotnet-trace-instructions.md).
+To read more about how to use dotnet-trace, please refer to the [dotnet-trace documentation](https://github.com/dotnet/diagnostics/blob/main/documentation/dotnet-trace-instructions.md).
diff --git a/docs/project/list-of-diagnostics.md b/docs/project/list-of-diagnostics.md
index 63d28d5989674f..f0c0b533c0a1c9 100644
--- a/docs/project/list-of-diagnostics.md
+++ b/docs/project/list-of-diagnostics.md
@@ -101,6 +101,8 @@ The PR that reveals the implementation of the `true' |
-| __`SYSLIB1063`__ | *_`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._* |
-| __`SYSLIB1064`__ | *_`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._* |
-| __`SYSLIB1065`__ | *_`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._* |
-| __`SYSLIB1066`__ | *_`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._* |
-| __`SYSLIB1067`__ | *_`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._* |
-| __`SYSLIB1068`__ | *_`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._* |
-| __`SYSLIB1069`__ | *_`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._* |
+| __`SYSLIB1063`__ | _`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._ |
+| __`SYSLIB1064`__ | _`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._ |
+| __`SYSLIB1065`__ | _`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._ |
+| __`SYSLIB1066`__ | _`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._ |
+| __`SYSLIB1067`__ | _`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._ |
+| __`SYSLIB1068`__ | _`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._ |
+| __`SYSLIB1069`__ | _`SYSLIB1063`-`SYSLIB1069` reserved for Microsoft.Interop.LibraryImportGenerator._ |
| __`SYSLIB1070`__ | Invalid 'JSImportAttribute' usage |
| __`SYSLIB1071`__ | Invalid 'JSExportAttribute' usage |
| __`SYSLIB1072`__ | Specified type is not supported by source-generated JavaScript interop |
| __`SYSLIB1073`__ | Specified configuration is not supported by source-generated JavaScript interop |
| __`SYSLIB1074`__ | JSImportAttribute requires unsafe code |
| __`SYSLIB1075`__ | JSExportAttribute requires unsafe code |
-| __`SYSLIB1076`__ | *_`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator.* |
-| __`SYSLIB1077`__ | *_`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator.* |
-| __`SYSLIB1078`__ | *_`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator.* |
-| __`SYSLIB1079`__ | *_`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator.* |
-| __`SYSLIB1080`__ | *_`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator.* |
+| __`SYSLIB1076`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1077`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1078`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1079`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1080`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1081`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1082`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1083`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1084`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1085`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1086`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1087`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1088`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1089`__ | _`SYSLIB1070`-`SYSLIB1089` reserved for System.Runtime.InteropServices.JavaScript.JSImportGenerator._ |
+| __`SYSLIB1090`__ | Invalid 'GeneratedComInterfaceAttribute' usage |
+| __`SYSLIB1091`__ | Method is declared in different partial declaration than the 'GeneratedComInterface' attribute. |
+| __`SYSLIB1092`__ | _`SYSLIB1092`-`SYSLIB1099` reserved for Microsoft.Interop.ComInteropGenerator._ |
+| __`SYSLIB1093`__ | _`SYSLIB1092`-`SYSLIB1099` reserved for Microsoft.Interop.ComInteropGenerator._ |
+| __`SYSLIB1094`__ | _`SYSLIB1092`-`SYSLIB1099` reserved for Microsoft.Interop.ComInteropGenerator._ |
+| __`SYSLIB1095`__ | _`SYSLIB1092`-`SYSLIB1099` reserved for Microsoft.Interop.ComInteropGenerator._ |
+| __`SYSLIB1096`__ | _`SYSLIB1092`-`SYSLIB1099` reserved for Microsoft.Interop.ComInteropGenerator._ |
+| __`SYSLIB1097`__ | _`SYSLIB1092`-`SYSLIB1099` reserved for Microsoft.Interop.ComInteropGenerator._ |
+| __`SYSLIB1098`__ | _`SYSLIB1092`-`SYSLIB1099` reserved for Microsoft.Interop.ComInteropGenerator._ |
+| __`SYSLIB1099`__ | _`SYSLIB1092`-`SYSLIB1099` reserved for Microsoft.Interop.ComInteropGenerator._ |
+| __`SYSLIB1100`__ | Configuration binding generator: type is not supported. |
+| __`SYSLIB1101`__ | Configuration binding generator: property on type is not supported. |
+| __`SYSLIB1102`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
+| __`SYSLIB1103`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
+| __`SYSLIB1104`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
+| __`SYSLIB1105`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
+| __`SYSLIB1106`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
+| __`SYSLIB1107`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
+| __`SYSLIB1108`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
+| __`SYSLIB1109`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
+| __`SYSLIB1110`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
+| __`SYSLIB1111`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
+| __`SYSLIB1112`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
+| __`SYSLIB1113`__ | *_`SYSLIB1101`-`SYSLIB1113` reserved for Microsoft.Extensions.Configuration.Binder.SourceGeneration.* |
### Diagnostic Suppressions (`SYSLIBSUPPRESS****`)
-| Suppression ID | Suppressed Diagnostic ID | Description |
-| :----------------- | :----------------------- | :---------- |
-| __`SYSLIBSUPPRESS0001`__ | CA1822 | Do not offer to make methods static when the methods need to be instance methods for a custom marshaller shape. |
+| Suppression ID | Suppressed Diagnostic ID | Description |
+| :----------------------- | :----------------------- | :---------- |
+| __`SYSLIBSUPPRESS0001`__ | CA1822 | Do not offer to make methods static when the methods need to be instance methods for a custom marshaller shape. |
diff --git a/docs/project/public-signing.md b/docs/project/public-signing.md
index 7372021819f8c3..5e40bc5d4020ae 100644
--- a/docs/project/public-signing.md
+++ b/docs/project/public-signing.md
@@ -16,6 +16,7 @@ Known issues when debugging and testing public signed assemblies on .NET Framewo
- You will not be able to install the assembly to the [Global Assembly Cache (GAC)](https://msdn.microsoft.com/en-us/library/yf1d93sz.aspx)
- You will not be able to load the assembly in an AppDomain where shadow copying is turned on.
- You will not be able to load the assembly in a partially trusted AppDomain
+- You will not be able to pre-compile ASP.NET applications
The `corflags.exe` tool that ships with the .NET Framework SDK can show whether a binary is delay-signed or strong-named. For a delay-signed assembly it may show:
diff --git a/docs/project/updating-jitinterface.md b/docs/project/updating-jitinterface.md
index b3750e533c5464..56ced8bc094298 100644
--- a/docs/project/updating-jitinterface.md
+++ b/docs/project/updating-jitinterface.md
@@ -12,7 +12,7 @@ There are several components that consume the JIT outside of the runtime. Since
The JitInterface is versioned by a GUID. Any change to JitInterface is required to update the JitInterface GUID located in jiteeversionguid.h (look for `JITEEVersionIdentifier`). Not doing so has consequences that are sometimes hard to debug.
-If a method was added or modified in ICorStaticInfo or ICorDynamicInfo, port the change to src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt. Functions must be in the same order in ThunkInput.txt as they exist in corinfo.h and corjit.h. Run gen.bat or gen.sh to regenerate CorInfoBase.cs, jitinterface.h, ICorJitInfo_API_names.h, ICorJitInfo_API_wrapper.hpp, superpmi-shared\icorjitinfoimpl.h, superpmi-shim-counter\icorjitinfo.cpp, and superpmi-shim-simple\icorjitinfo.cpp from ThunkInput.txt. Provide a managed implementation of the method in CorInfoImpl.cs.
+If a method was added or modified in ICorStaticInfo or ICorDynamicInfo, port the change to src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt. Functions must be in the same order in ThunkInput.txt as they exist in corinfo.h and corjit.h. Run gen.bat or gen.sh to regenerate all \*_generated.\* files from ThunkInput.txt. Provide a managed implementation of the method in CorInfoImpl.cs.
## Porting JitInterface changes to crossgen2
diff --git a/docs/tools/illink/README.md b/docs/tools/illink/README.md
new file mode 100644
index 00000000000000..7aed29d0ea76de
--- /dev/null
+++ b/docs/tools/illink/README.md
@@ -0,0 +1,16 @@
+# Documentation Index
+
+This folder includes several documents that explain both high-level and low-level concepts about the IL trimmer and related tools.
+
+## Official Docs
+View the official trimming docs at [docs.microsoft.com](https://docs.microsoft.com/en-us/dotnet/core/deploying/trimming/trim-self-contained)
+
+## Usage Docs
+- [MSBuild Integration](illink-tasks.md)
+- [Available Command Line Options](illink-options.md)
+- [Error and Warning Codes](error-codes.md)
+- [Data Formats](data-formats.md)
+- [Authoring Custom Steps](custom-steps.md)
+
+## Design Docs
+- [Reflection Handling](../../design/tools/illink/reflection-flow.md)
diff --git a/docs/tools/illink/custom-steps.md b/docs/tools/illink/custom-steps.md
new file mode 100644
index 00000000000000..d7ce8576c90681
--- /dev/null
+++ b/docs/tools/illink/custom-steps.md
@@ -0,0 +1,57 @@
+# Authoring Custom IL trimmer Steps
+
+The IL trimmer behaviour can be altered not only using existing options but also by
+adding custom steps to the processing pipeline. This advanced technique is not necessary
+for most scenarious but can be used by additional framework or SDKs which need very
+custom behaviour or have other special needs for the processing.
+
+## Building
+
+Custom steps can be registered to the trimmer as ordinary .NET dlls which implement the
+required `Mono.Linker.Steps.IStep` interface. There is also more convenient base class
+called `Mono.Linker.Steps.BaseStep` which implements the interface and exposes more
+functionality.
+
+To create such project you create a library project and add package reference to
+`Microsoft.NET.ILLink` package.
+
+Such library then need to be registered with the trimmer using `--custom-step` option or
+using `_TrimmerCustomSteps` msbuild `ItemGroup`.
+
+## Custom Step Example
+
+A simple example below demonstrates how to create a trivial custom step which only reads
+ custom data and outputs them to the log.
+
+```csharp
+using System;
+
+using Mono.Linker;
+using Mono.Linker.Steps;
+
+namespace MyLinkerExtension
+{
+ public class FooStep : IStep
+ {
+ public void Process (LinkContext context)
+ {
+ if (context.TryGetCustomData ("TestKey", out var value))
+ context.LogMessage ($"Custom step with custom data of {value}");
+ }
+ }
+}
+```
+
+### Consuming External Data
+
+When building a custom step which needs interaction with external values (for example for the custom step
+configuration), there is an option `--custom-data` which allows passing the data to the trimmer. The data are
+stored inside a trimmer context and can be obtained in the custom step using `context.TryGetCustomData` method.
+
+### Reporting Custom Errors and Warnings
+
+The common operation in the custom steps is to run additional checks on the IL to verify it meets
+required constraints. The outcome of such operation is then usually some indication to the end user about
+the incompatible code. This can be done by reporting the error or warning message using `context.LogMessage`
+method. It's good practice to use error or warning code which does not conflict with existing codes as
+listed [here](error-codes.md).
diff --git a/docs/tools/illink/data-formats.md b/docs/tools/illink/data-formats.md
new file mode 100644
index 00000000000000..e360a914b14445
--- /dev/null
+++ b/docs/tools/illink/data-formats.md
@@ -0,0 +1,589 @@
+# Data Formats
+
+## Input Data Formats
+
+ILLink uses several data formats to control or influence the trimming process. The data formats are not versioned but are backward compatible.
+
+- [Descriptors](#descriptor-format)
+- [Substitutions](#substitution-format)
+- [Custom Attributes Annotations](#custom-attributes-annotations-format)
+
+## Output Data Formats
+
+- [Dependencies Trace](#dependencies-trace-format)
+
+# Format Details
+
+## Descriptor Format
+
+Descriptors are used to direct the trimmer to always keep some items in the assembly, regardless of if the trimmer can find any references to them.
+
+Descriptor XML can be embedded in an assembly. In that case it must be stored as an embedded resource with logical name `ILLink.Descriptors.xml`. To achieve this when building an assembly use this in the project file to include the XML:
+
+```xml
+
+
+ ILLink.Descriptors.xml
+
+
+```
+
+Embedded descriptors only take effect if the containing assembly is included in the trimmer output, so if something from that assembly is marked to be kept.
+
+Descriptor XML can also be passed to the trimmer on the command via the [`-x` parameter](illink-options.md#trimming-from-an-xml-descriptor).
+
+### XML Examples
+
+### Preserve entire assembly
+
+```xml
+
+
+
+
+
+
+```
+
+### Preserve assembly using fully qualified name
+
+```xml
+
+
+
+
+
+```
+
+### Preserve a type
+
+The `required` attribute specifies that if the type is not marked, during the mark operation, it will not be trimmed. Both `required` and `preserve` can be combined together.
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Preserve all methods or all fields on a type
+
+```xml
+
+
+
+
+
+
+
+
+
+
+```
+
+### Preserve more than one type within an assembly
+
+```xml
+
+
+
+
+
+
+
+
+
+
+```
+
+### Preserve only selected fields on a type
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Preserve only selected methods on a type
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Preserve only selected properties on type
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Preserve only selected events on a type
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## Substitution Format
+
+Substitutions direct the trimmer to replace specific method's body with either a throw or return constant statements.
+
+Substitutions have effect only on assemblies which are trimmed with assembly action `link`, any other assembly will not be affected. That said it is possible to have a `copy` assembly with the substitution on a method in it, and then a separate `link` assembly which calls such method. The `link` assembly will see the constant value of the method after the substitution and potentially remove unused branches and such.
+
+Substitutions XML can be embedded in an assembly by including it as an embedded resource with logical name `ILLink.Substitutions.xml`. To include an XML file in an assembly this way, use this in the project file:
+
+```xml
+
+
+ ILLink.Substitutions.xml
+
+
+```
+
+Embedded substitutions only take effect if the containing assembly is included in the trimmer output. Embedded substitutions should only address methods from the containing assembly.
+
+Substitutions XML can be specified on the command line via the [`--substitutions` parameter](illink-options.md#using-custom-substitutions). Using substitutions with `ipconstprop` optimization (enabled by default) can help reduce output size as any dependencies under conditional logic which will be evaluated as unreachable will be removed.
+
+### Substitute method body with a constant
+
+The `value` attribute is optional and only required when the method should be hardcoded to return a non-default value and the return type is not `void`.
+
+```xml
+
+
+
+
+
+
+
+```
+
+### Remove method
+
+Entire method body is replaces with `throw` instruction when method is referenced.
+
+```xml
+
+
+
+
+
+
+
+```
+
+### Override static field value with a constant
+
+The `initialize` attribute is optional and when not specified the code to set the static field to the value will not be generated.
+
+```xml
+
+
+
+
+
+
+
+```
+
+### Remove embedded resources
+
+```xml
+
+
+
+
+
+```
+
+### Conditional substitutions and descriptors
+
+The `feature` and `featurevalue` attributes are optional, but must be used together when used.
+They can be applied to any element to specify conditions under which the contained substitutions or descriptors
+are applied, based on feature settings passed via `--feature FeatureName bool`
+
+```xml
+
+
+
+
+
+
+
+
+```
+
+`featuredefault="true"` can be used to indicate that this `featurevalue` is the default value for `feature`,
+causing the contained substitutions or descriptors to be applied even when the feature setting is not passed to the trimmer.
+Note that this will only have an effect where it is applied - the default value is not remembered or reused for other elements.
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## Custom Attributes Annotations Format
+
+Attribute annotations direct the trimmer to behave as if the specified item has the specified attribute.
+
+Attribute annotations can only be used to add attributes which have effect on trimmer behavior, all other attributes will be ignored. Attributes added via attribute annotations only influence trimmer behavior, they are never added to the output assembly.
+
+Attribute annotation XML can be embedded in an assembly by including it as an embedded resource with logical name `ILLink.LinkAttributes.xml`. To include an XML file in an assembly this way, use this in the project file:
+
+```xml
+
+
+ ILLink.LinkAttributes.xml
+
+
+```
+
+Embedded attribute annotations should only address methods from the containing assembly. Whereas attribute annotations specified on the command line via the [`--link-attributes` parameter](illink-options.md#supplementary-custom-attributes) can alter types and members in any assembly.
+
+The attribute element requires 'fullname' attribute without it trimmer will generate a warning and skip the attribute. Optionally you can use the 'assembly' attribute to point to certain assembly to look
+for the attribute, if not specified the trimmer will look up the attribute in any loaded assembly.
+
+Inside an attribute element in the xml you can further define argument, field and property elements used as an input for the attribute. An attribute can have several arguments, several fields or several properties. When writing custom attribute with multiple arguments you need to write the xml elements in an order-dependent form. That is, the first xml argument element corresponds to the first custom attribute argument, second xml argument element correspond to the second custom attribute argument and so on. When argument type is not specified it's considered to be of `string` type. Any other custom attribute value has to have its type specified for trimmer to find the correct constructor overload.
+
+```xml
+
+ StringValue
+ -45
+ Sunday
+ StringValue
+ 200
+
+```
+
+### Custom attribute on assembly
+
+```xml
+
+
+
+ Argument
+
+
+
+```
+
+### Custom attribute on type
+
+This allows to add a custom attribute to a class, interface, delegate, struct or enum.
+
+```xml
+
+
+
+
+ Argument
+
+
+
+
+```
+
+### Custom attribute on type field
+
+```xml
+
+
+
+
+
+ DefaultConstructor
+
+
+
+
+
+```
+
+### Custom attribute on property
+
+```xml
+
+
+
+
+
+ DefaultConstructor
+
+
+
+
+
+```
+
+### Custom attribute on event
+
+```xml
+
+
+
+
+
+ DefaultConstructor
+
+
+
+
+
+```
+
+### Custom attribute on method parameter
+
+```xml
+
+
+
+
+
+
+ DefaultConstructor
+
+
+
+
+
+
+ PublicConstructors
+
+
+
+
+
+
+ DefaultConstructor
+
+
+
+
+
+
+```
+
+### Custom attribute in multiple method parameters
+
+```xml
+
+
+
+
+
+
+ DefaultConstructor
+
+
+
+
+ DefaultConstructor
+
+
+
+
+ PublicConstructors
+
+
+
+
+
+
+```
+
+### Custom attribute on nested type
+
+```xml
+
+
+
+
+
+
+ DefaultConstructor
+
+
+
+
+
+
+```
+
+### Custom attribute on type in all assemblies
+
+```xml
+
+
+
+
+ DefaultConstructor
+
+
+
+
+```
+
+### Conditional custom attributes
+
+The `feature` and `featurevalue` attributes are optional, but must be used together when used.
+They can be applied to any element to specify conditions under which the contained custom
+attributes are applied.
+
+```xml
+
+
+
+
+
+
+
+ PublicConstructors
+
+
+
+
+
+
+```
+
+### Custom attributes with feature
+
+```xml
+
+```
+
+### Removing custom attributes
+
+Any custom attribute can be annotated with a special custom attribute which can be used to specify
+that all instances of the attribute can be removed by the trimmer. To do this use `internal="RemoveAttributeInstances"`
+instead of specifying `fullname` in the attribute as described in the following example:
+
+```xml
+
+
+
+
+
+
+
+```
+
+In some cases, it's useful to remove only specific usage of the attribute. This can be achieved by specifying the value
+or values of the arguments to match. In the example below only `System.Reflection.AssemblyMetadataAttribute` custom attributes
+with the first argument equal to `RemovableValue` will be removed.
+
+```xml
+
+
+
+
+
+ RemovableValue
+
+
+
+
+
+```
+
+Notice that a descriptor file containing the custom attribute type overrides this behavior. In case the
+custom attribute type is being referenced in a descriptor file and in the attribute annotations file
+for removal, the custom attribute will not be removed.
+
+## Dependencies Trace Format
+
+This is the format of data used to capture trimmer logic about why
+members, types, and other metadata elements were marked by the trimmer
+as required and persisted in the trimmed output. The format includes edges
+of the graph for every dependency which was tracked by the trimmer.
diff --git a/docs/tools/illink/error-codes.md b/docs/tools/illink/error-codes.md
new file mode 100644
index 00000000000000..4850f92152b874
--- /dev/null
+++ b/docs/tools/illink/error-codes.md
@@ -0,0 +1,1982 @@
+# ILLink Errors and Warnings
+
+Every error and warning has an assigned unique error code for easier
+identification. The known codes are in the range 1000 to 6000. Custom
+steps should avoid using this range not to collide with existing or future
+error and warning codes.
+
+For versioned warnings, the warning version is indicated in parentheses following
+the error code. For example:
+
+#### `ILXXXX` (version): Message
+- Description of the error code including more details.
+
+## Error Codes
+
+#### `IL1001`: Failed to process 'XML document location'. Feature 'feature' does not specify a "featurevalue" attribute
+
+- The substitution or descriptor in 'XML document location' with feature value 'feature' does not use the `featurevalue` attribute. These attributes have to be used together.
+
+#### `IL1002`: Failed to process 'XML document location'. Unsupported non-boolean feature definition 'feature'
+
+- The substitution or descriptor in 'XML document location' with feature value 'feature' sets the attribute `featurevalue` to a non-boolean value. Only boolean values are supported for this attribute.
+
+#### `IL1003`: Error processing 'XML document name': 'XmlException'
+
+- There was an error processing a resource descriptor, embedded resource descriptor or external substitution XML (`ILLink.Substitutions.xml`). The most likely reason for this is that the descriptor file has syntactical errors.
+
+#### `IL1005`: Error processing method 'method' in assembly 'assembly'
+
+- There was an error processing method 'method'. An exception with more details is printed.
+
+#### `IL1006`: Cannot stub constructor on 'type' when base type does not have default constructor
+
+- There was an error trying to create a new instance of type 'type'. Its constructor was marked for substitution in a substitution XML, but the base type of 'type' doesn't have a default constructor. Constructors of derived types marked for substitution require to have a default constructor in its base type.
+
+#### `IL1007`: Missing predefined 'type' type
+
+#### `IL1008`: Could not find constructor on 'type'
+
+#### `IL1009`: Assembly reference 'name' could not be resolved
+
+- There was an error resolving assembly 'name'. Consider adding missing reference to your project or pass `--skip-unresolved` option if you are sure the dependencies don't need to be analyzed.
+
+#### `IL1010`: Assembly 'assembly' cannot be loaded due to failure in processing 'reference' reference
+
+- The assembly 'assembly' could not be loaded due to an error processing the reference assembly 'reference'. An exception with more details is printed.
+
+#### `IL1011`: Failed to write 'output'
+
+- There was an error writing the linked assembly 'output'. An exception with more details is printed.
+
+#### `IL1012`: IL Linker has encountered an unexpected error. Please report the issue at https://aka.ms/report-illink
+
+- There was an unexpected error while trimming. An exception with more details is printed to the MSBuild log. Please share this stack trace with the IL Linker team to further investigate the cause and possible solution.
+
+#### `IL1013`: Error processing 'XML document location': 'XmlException'
+
+- There was an error processing 'XML document location' xml file. The most likely reason for this is that the XML file has syntactical errors.
+
+#### `IL1014`: Failed to process 'XML document location`. Unsupported value for featuredefault attribute
+
+- Element in 'XML document location' contains a 'featuredefault' attribute with an invalid value. This attribute only supports the true value, to indicate that this is the default behavior for a feature when a value is not given.
+
+#### `IL1015`: Unrecognized command-line option: 'option'
+
+- The IL Linker was passed a string that was not a IL Linker option.
+
+#### `IL1016`: Invalid warning version 'version'
+
+- The value given for the --warn argument was not a valid warning version. Valid versions include integers in the range 0-9999, though not all of these map to distinct warning waves.
+
+#### `IL1017`: Invalid value 'value' for '--generate-warning-suppressions' option
+
+- Invalid value 'value' was used for command-line option '--generate-warning-suppressions'; must be 'cs' or 'xml'.
+
+#### `IL1018`: Missing argument for '{optionName}' option
+
+- The command-line option 'optionName' was specified but no argument was given.
+
+#### `IL1019`: Value used with '--custom-data' has to be in the KEY=VALUE format
+
+- The command-line option --custom-data receives a key-value pair using the format KEY=VALUE.
+
+#### `IL1020`: No files to link were specified. Use one of '{resolvers}' options
+
+#### `IL1021`: Options '--new-mvid' and '--deterministic' cannot be used at the same time
+
+#### `IL1022`: The assembly '{arg}' specified for '--custom-step' option could not be found
+
+#### `IL1023`: The path to the assembly '{arg}' specified for '--custom-step' must be fully qualified
+
+#### `IL1024`: Invalid value '{arg}' specified for '--custom-step' option
+
+- There was an error in the format of the custom step 'arg' given.
+
+#### `IL1025`: Expected '+' or '-' to control new step insertion
+
+- A custom step that is inserted relative to an existing step in the pipeline must specify whether to be added before (-) or after (+) the step it's relative to.
+
+#### `IL1026`: Pipeline step '{name}' could not be found
+
+- A custom step was specified for insertion relative to a non existent step 'name'.
+
+#### `IL1027`: Custom step '{type}' could not be found
+
+- The custom step 'type' could not be found in the given assembly.
+
+#### `IL1028`: Custom step '{type}' is incompatible with this ILLink version
+
+#### `IL1029`: Invalid optimization value '{text}'
+
+- The optimization 'text' is invalid. Optimization values can either be 'beforefieldinit', 'overrideremoval', 'unreachablebodies', 'unusedinterfaces', 'ipconstprop', or 'sealer'.
+
+#### `IL1030`: Invalid argument for '{token}' option
+
+#### `IL1031`: Invalid assembly action '{action}'
+
+#### `IL1032`: Root assembly '{assemblyFile}' could not be found
+
+#### `IL1033`: XML descriptor file '{xmlFile}' could not be found
+
+#### `IL1034`: Root assembly '{name}' does not have entry point
+
+#### `IL1035`: Root assembly '{name}' cannot use action '{action}'
+
+#### `IL1036`: Invalid assembly name '{assemblyName}'
+
+#### `IL1037`: Invalid assembly root mode '{mode}'
+
+#### `IL1038`: Exported type '{type.Name}' cannot be resolved
+
+#### `IL1039`: Reference assembly '{assemblyPath}' could not be loaded
+
+- A reference assembly input passed via -reference could not be loaded.
+
+#### `IL1040`: Failed to resolve {name}
+
+- Metadata element 'name' cannot be resolved. This usually means there is a version mismatch between dependencies.
+
+#### `IL1041`: The type '{typeName}' used with attribute value 'value' could not be found
+
+- The type name used to define custom attribute value could not be resolved. This can mean the assembly reference is missing or that the type does not exist.
+
+#### `IL1042`: Cannot convert value '{value}' to type '{typeName}'
+
+- The 'value' specified for the custom attribute value cannot be converted to specified argument type 'typeName'.
+
+#### `IL1043`: Custom attribute argument for 'type' type requires nested 'argument' node
+
+- The syntax for custom attribute value for 'type' requires to also specify the underlying attribute type.
+
+#### `IL1044`: Could not resolve custom attribute type value '{value}'
+
+- The 'value' specified for the custom attribute of `System.Type` type could not be resolved.
+
+#### `IL1045`: Unexpected attribute argument type 'type'
+
+- The type name used with attribute type is not one of the supported types.
+
+#### `IL1046`: Invalid metadata '{name}' option
+
+----
+## Warning Codes
+
+#### `IL2001`: Type 'type' has no fields to preserve
+
+- The XML descriptor preserves fields on type 'type', but this type has no fields.
+ ```XML
+
+
+
+
+
+ ```
+ ```C#
+ // IL2001: Type 'TestType' has no fields to preserve
+ class TestType
+ {
+ void OnlyMethod() {}
+ }
+ ```
+
+
+#### `IL2002`: Type 'type' has no methods to preserve
+
+- The XML descriptor preserves methods on type 'type', but this type has no methods.
+
+ ```XML
+
+
+
+
+
+ ```
+ ```C#
+ // IL2001: Type 'TestType' has no methods to preserve
+ struct TestType
+ {
+ public int Number;
+ }
+ ```
+
+#### `IL2003`: Could not resolve dependency assembly 'assembly name' specified in a 'PreserveDependency' attribute
+
+- The assembly 'assembly' in `PreserveDependency` attribute could not be resolved.
+
+ ```C#
+ // IL2003: Could not resolve dependency assembly 'NonExistentAssembly' specified in a 'PreserveDependency' attribute
+ [PreserveDependency("MyMethod", "MyType", "NonExistentAssembly")]
+ void TestMethod()
+ {
+ }
+ ```
+
+#### `IL2004`: Could not resolve dependency type 'type' specified in a 'PreserveDependency' attribute
+
+- The type 'type' in `PreserveDependency` attribute could not be resolved.
+
+ ```C#
+ // IL2004: Could not resolve dependency type 'NonExistentType' specified in a 'PreserveDependency' attribute
+ [PreserveDependency("MyMethod", "NonExistentType", "MyAssembly")]
+ void TestMethod()
+ {
+ }
+ ```
+
+#### `IL2005`: Could not resolve dependency member 'member' declared in type 'type' specified in a 'PreserveDependency' attribute
+
+- The member 'member' in `PreserveDependency` attribute could not be resolved.
+
+ ```C#
+ // IL2005: Could not resolve dependency member 'NonExistentMethod' declared on type 'MyType' specified in a 'PreserveDependency' attribute
+ [PreserveDependency("NonExistentMethod", "MyType", "MyAssembly")]
+ void TestMethod()
+ {
+ }
+ ```
+
+#### `IL2007`: Could not resolve assembly 'assembly'
+
+- The assembly 'assembly' in the XML could not be resolved.
+
+ ```XML
+
+
+
+
+ ```
+
+#### `IL2008`: Could not resolve type 'type'
+
+- The type 'type' in the XML could not be resolved.
+
+ ```XML
+
+
+
+
+
+
+ ```
+
+#### `IL2009`: Could not find method 'method' on type 'type'
+
+- The 'XML document location' defined a method 'method' on type 'type', but the method was not found.
+
+ ```XML
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2010`: Invalid value for 'signature' stub
+
+- The value used in the substitution XML for method 'signature' does not represent a value of a built-in type, or does not match the return type of the method.
+
+ ```XML
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2011`: Unknown body modification 'action' for 'signature'
+
+- The value 'action' of the body attribute used in the substitution XML is invalid (the only supported options are `remove` and `stub`).
+
+ ```XML
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2012`: Could not find field 'field' on type 'type'
+
+- The 'XML document location' defined a field 'field' on type 'type', but the field was not found.
+
+ ```XML
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2013`: Substituted field 'field' needs to be static field
+
+- The substituted field 'field' was non-static or constant. Only static non-constant fields are supported.
+
+ ```XML
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2014`: Missing 'value' attribute for field 'field'
+
+- A field was specified for substitution but no value to be substituted was given.
+
+ ```XML
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2015`: Invalid value 'value' for 'field'
+
+- The value 'value' used in the substitution XML for field 'field' is not a built-in type, or does not match the type of 'field'.
+
+ ```XML
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2016`: Could not find event 'event' on type 'type'
+
+- The 'XML document location' defined a event 'event' on type 'type', but the event was not found.
+
+ ```XML
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2017`: Could not find property 'property' on type 'type'
+
+- The 'XML document location' defined a property 'property' on type 'type', but the property was not found.
+
+ ```XML
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2018`: Could not find the get accessor of property 'property' on type 'type'
+
+- The 'XML document location' defined the get accessor of property 'property' on type 'type', but the accessor was not found.
+
+ ```XML
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2019`: Could not find the set accessor of property 'property' on type 'type'
+
+- The 'XML document location' defined the set accessor of property 'property' on type 'type', but the accessor was not found.
+
+ ```XML
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2022`: Could not find matching constructor for custom attribute 'attribute-type' arguments
+
+- The XML attribute arguments for attribute type 'attribute-type' use values or types which don't match to any constructor on 'attribute-type'
+
+ ```XML
+
+
+
+
+
+ ExtraArgumentValue
+
+
+
+
+ ```
+
+#### `IL2023`: There is more than one 'return' child element specified for method 'method'
+
+- Method 'method' has more than one `return` element specified. There can only be one `return` element to specify attribute on the return parameter of the method.
+
+ ```XML
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2024`: More than one value specified for parameter 'parameter' of method 'method'
+
+- Method 'method' has more than one `parameter` element for parameter 'parameter'. There can only be one value specified for each parameter.
+
+ ```XML
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2025`: Duplicate preserve of 'member'
+
+- The XML descriptor marks for preservation the member or type 'member' more than once.
+
+ ```XML
+
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2026` Trim analysis: Using member 'method' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. [message]. [url]
+
+- The linker found a call to a member which is annotated with `RequiresUnreferencedCodeAttribute` which can break functionality of a trimmed application.
+
+ ```C#
+ [RequiresUnreferencedCode("Use 'MethodFriendlyToTrimming' instead", Url="http://help/unreferencedcode")]
+ void MethodWithUnreferencedCodeUsage()
+ {
+ }
+
+ void TestMethod()
+ {
+ // IL2026: Using member 'MethodWithUnreferencedCodeUsage' which has 'RequiresUnreferencedCodeAttribute'
+ // can break functionality when trimming application code. Use 'MethodFriendlyToTrimming' instead. http://help/unreferencedcode
+ MethodWithUnreferencedCodeUsage();
+ }
+ ```
+
+#### `IL2027`: Attribute 'attribute' should only be used once on 'member'.
+
+- The trimming tool found multiple instances of attribute 'attribute' on 'member'. This attribute is only allowed to have one instance, it will only use the fist instance and ignore the rest.
+
+ ```C#
+ // Note: C# won't allow this because RequiresUnreferencedCodeAttribute only allows one instantiation,
+ // but it's a good demonstration (it's possible to get to this state using LinkAttributes.xml)
+
+ // IL2027: Attribute 'RequiresUnreferencedCodeAttribute' should only be used once on 'MethodWithUnreferencedCodeUsage()'.
+ [RequiresUnreferencedCode("Use A instead")]
+ [RequiresUnreferencedCode("Use B instead")]
+ void MethodWithUnreferencedCodeUsage()
+ {
+ }
+ ```
+
+#### `IL2028`: Attribute 'attribute' doesn't have the required number of parameters specified
+
+- The trimmer found an instance of attribute 'attribute' on 'method' but it lacks a required constructor parameter or it has more parameters than accepted. The trimmer will ignore this attribute.
+This is technically possible if a custom assembly defines for example the `RequiresUnreferencedCodeAttribute` type with parameterless constructor and uses it. ILLink will recognize the attribute since it only does a namespace and type name match, but it expects it to have exactly one parameter in its constructor.
+
+#### `IL2029`: 'attribute' element does not contain required attribute 'fullname' or it's empty
+
+- An 'attribute' element must have an attribute 'fullname' with a non-empty value
+
+ ```XML
+
+
+
+
+
+
+ ```
+
+#### `IL2030`: Could not resolve assembly 'assembly' for attribute 'attribute'
+
+- The assembly name 'assembly' specified for attribute with full name 'attribute' could not be resolved
+
+ ```XML
+
+
+
+
+
+
+ ```
+
+#### `IL2031`: Attribute type 'attribute type' could not be found
+
+- The described 'attribute type' could not be found in the assemblies
+
+ ```XML
+
+
+
+
+
+
+ ```
+
+#### `IL2032`: Trim analysis: Unrecognized value passed to the parameter 'parameter' of method 'CreateInstance'. It's not possible to guarantee the availability of the target type.
+
+- The value passed as the assembly name or type name to the `CreateInstance` method can't be statically analyzed, ILLink can't make sure that the type is available.
+
+ ``` C#
+ void TestMethod(string assemblyName, string typeName)
+ {
+ // IL2032 Trim analysis: Unrecognized value passed to the parameter 'typeName' of method 'System.Activator.CreateInstance(string, string)'. It's not possible to guarantee the availability of the target type.
+ Activator.CreateInstance("MyAssembly", typeName);
+
+ // IL2032 Trim analysis: Unrecognized value passed to the parameter 'assemblyName' of method 'System.Activator.CreateInstance(string, string)'. It's not possible to guarantee the availability of the target type.
+ Activator.CreateInstance(assemblyName, "MyType");
+ }
+ ```
+
+#### `IL2033`: 'PreserveDependencyAttribute' is deprecated. Use 'DynamicDependencyAttribute' instead.
+
+- `PreserveDependencyAttribute` was an internal attribute that was never officially supported. Instead, use the similar `DynamicDependencyAttribute`.
+
+ ```C#
+ // IL2033: 'PreserveDependencyAttribute' is deprecated. Use 'DynamicDependencyAttribute' instead.
+ [PreserveDependency("OtherMethod")]
+ public void TestMethod()
+ {
+ }
+ ```
+
+#### `IL2034`: The 'DynamicDependencyAttribute' could not be analyzed
+
+- The input contains an invalid use of `DynamicDependencyAttribute`. Ensure that you are using one of the officially supported constructors.
+This is technically possible if a custom assembly defines `DynamicDependencyAttribute` with a different constructor than the one the ILLink recognizes. ILLink will recognize the attribute since it only does a namespace and type name match, but the actual instantiation was not recognized.
+
+#### `IL2035`: Unresolved assembly 'assemblyName' in 'DynamicDependencyAttribute'
+
+- The assembly string 'assemblyName' given in a `DynamicDependencyAttribute` constructor could not be resolved. Ensure that the argument specifies a valid assembly name, and that the assembly is available to the trimming tool.
+
+ ```C#
+ // IL2035: Unresolved assembly 'NonExistentAssembly' in 'DynamicDependencyAttribute'
+ [DynamicDependency("Method", "Type", "NonExistentAssembly")]
+ public void TestMethod()
+ {
+ }
+ ```
+
+#### `IL2036`: Unresolved type 'typeName' in 'DynamicDependencyAttribute'
+
+- The type in a `DynamicDependencyAttribute` constructor could not be resolved. Ensure that the argument specifies a valid type name or type reference, that the type exists in the specified assembly, and that the assembly is available to the trimming tool.
+
+ ```C#
+ // IL2036: Unresolved type 'NonExistentType' in 'DynamicDependencyAttribute'
+ [DynamicDependency("Method", "NonExistentType", "MyAssembly")]
+ public void TestMethod()
+ {
+ }
+ ```
+
+#### `IL2037`: No members were resolved for 'memberSignature/memberTypes'.
+
+- The member signature or `DynamicallyAccessedMemberTypes` in a `DynamicDependencyAttribute` constructor did not resolve to any members on the type. If you are using a signature, ensure that it refers to an existing member, and that it uses the format defined at https://github.com/dotnet/csharplang/blob/master/spec/documentation-comments.md#id-string-format. If using `DynamicallyAccessedMemberTypes`, ensure that the type contains members of the specified member types.
+
+ ```C#
+ // IL2036: No members were resolved for 'NonExistingMethod'.
+ [DynamicDependency("NonExistingMethod", "MyType", "MyAssembly")]
+ public void TestMethod()
+ {
+ }
+ ```
+
+#### `IL2038`: Missing 'name' attribute for resource.
+
+- The `resource` element in a substitution file did not have a `name` attribute. Add a `name` attribute with the name of the resource to remove.
+
+ ```XML
+
+
+
+
+
+
+ ```
+
+#### `IL2039`: Invalid value 'value' for attribute 'action' for resource 'resource'.
+
+- The resource element in a substitution file did not have a valid 'action' attribute. Add an 'action' attribute to this element, with value 'remove' to tell the linker to remove this resource.
+
+ ```XML
+
+
+
+
+
+
+ ```
+
+#### `IL2040`: Could not find embedded resource 'resource' to remove in assembly 'assembly'.
+
+- The resource name in a substitution file could not be found in the specified assembly. Ensure that the resource name matches the name of an embedded resource in the assembly.
+
+ ```XML
+
+
+
+
+
+
+ ```
+
+#### `IL2041` Trim analysis: The 'DynamicallyAccessedMembersAttribute' is not allowed on methods. It is allowed on method return value or method parameters though.
+
+- `DynamicallyAccessedMembersAttribute` was put directly on the method itself. This is only allowed for instance methods on System.Type and similar classes. Usually this means the attribute should be placed on the return value of the method or one of the method parameters.
+
+ ```C#
+ // IL2041: The 'DynamicallyAccessedMembersAttribute' is not allowed on methods. It is allowed on method return value or method parameters though.
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberType.PublicMethods)]
+
+ // Instead if it is meant for the return value it should be done like this:
+ [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberType.PublicMethods)]
+ public Type GetInterestingType()
+ {
+ // ...
+ }
+ ```
+
+#### `IL2042` Trim analysis: Could not find a unique backing field for property 'property' to propagate 'DynamicallyAccessedMembersAttribute'
+
+- The property 'property' has `DynamicallyAccessedMembersAttribute` on it, but the trimming tool could not determine the backing field for the property to propagate the attribute to the field.
+
+ ```C#
+ // IL2042: Could not find a unique backing field for property 'MyProperty' to propagate 'DynamicallyAccessedMembersAttribute'
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberType.PublicMethods)]
+ public Type MyProperty
+ {
+ get { return GetTheValue(); }
+ set { }
+ }
+
+ // To fix this annotate the accessors manually:
+ public Type MyProperty
+ {
+ [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberType.PublicMethods)]
+ get { return GetTheValue(); }
+
+ [param: DynamicallyAccessedMembers(DynamicallyAccessedMemberType.PublicMethods)]
+ set { }
+ }
+ ```
+
+#### `IL2043` Trim analysis: 'DynamicallyAccessedMembersAttribute' on property 'property' conflicts with the same attribute on its accessor 'method'.
+
+- Propagating `DynamicallyAccessedMembersAttribute` from property 'property' to its accessor 'method' found that the accessor already has such an attribute. The existing attribute will be used.
+
+ ```C#
+ // IL2043: 'DynamicallyAccessedMembersAttribute' on property 'MyProperty' conflicts with the same attribute on its accessor 'get_MyProperty'.
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberType.PublicMethods)]
+ public Type MyProperty
+ {
+ [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberType.PublicFields)]
+ get { return GetTheValue(); }
+ }
+ ```
+
+#### `IL2044`: Could not find any type in namespace 'namespace'
+
+- The XML descriptor specifies a namespace 'namespace' but there are no types found in such namespace. This typically means that the namespace is misspelled.
+
+ ```XML
+
+
+
+
+
+
+ ```
+
+#### `IL2045` Trim analysis: Attribute 'type' is being referenced in code but the linker was instructed to remove all instances of this attribute. If the attribute instances are necessary make sure to either remove the linker attribute XML portion which removes the attribute instances, or override the removal by using the linker XML descriptor to keep the attribute type (which in turn keeps all of its instances).
+
+- Attribute 'type' is being referenced in the code but the attribute instances have been removed using the 'RemoveAttributeInstances' internal attribute inside the LinkAttributes XML.
+
+ ```XML
+
+
+
+
+
+
+
+ ```
+
+ ```C#
+ // This attribute instance will be removed
+ [MyAttribute]
+ class MyType
+ {
+ }
+
+ public void TestMethod()
+ {
+ // IL2045 for 'MyAttribute' reference
+ typeof(MyType).GetCustomAttributes(typeof(MyAttribute), false);
+ }
+ ```
+
+#### `IL2046`: Trim analysis: Member 'member' with 'RequiresUnreferencedCodeAttribute' has a member 'member' without 'RequiresUnreferencedCodeAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
+
+- For all interfaces and overrides the implementation 'RequiresUnreferencedCodeAttribute' must match the definition 'RequiresUnreferecedCodeAttribute', either all the members contain the attribute o none of them.
+
+ Here is a list of posible scenarios where the warning can be generated:
+
+ A base member has the attribute but the derived member does not have the attribute
+ ```C#
+ public class Base
+ {
+ [RequiresUnreferencedCode("Message")]
+ public virtual void TestMethod() {}
+ }
+
+ public class Derived : Base
+ {
+ // IL2046: Base member 'Base.TestMethod' with 'RequiresUnreferencedCodeAttribute' has a derived member 'Derived.TestMethod()' without 'RequiresUnreferencedCodeAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
+ public override void TestMethod() {}
+ }
+ ```
+ A derived member has the attribute but the overriden base member does not have the attribute
+ ```C#
+ public class Base
+ {
+ public virtual void TestMethod() {}
+ }
+
+ public class Derived : Base
+ {
+ // IL2046: Member 'Derived.TestMethod()' with 'RequiresUnreferencedCodeAttribute' overrides base member 'Base.TestMethod()' without 'RequiresUnreferencedCodeAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
+ [RequireUnreferencedCode("Message")]
+ public override void TestMethod() {}
+ }
+ ```
+ An interface member has the attribute but it's implementation does not have the attribute
+ ```C#
+ interface IRUC
+ {
+ [RequiresUnreferencedCode("Message")]
+ void TestMethod();
+ }
+
+ class Implementation : IRUC
+ {
+ // IL2046: Interface member 'IRUC.TestMethod()' with 'RequiresUnreferencedCodeAttribute' has an implementation member 'Implementation.TestMethod()' without 'RequiresUnreferencedCodeAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
+ public void TestMethod () { }
+ }
+ ```
+ An implementation member has the attribute but the interface that implementes does not have the attribute
+
+ ```C#
+ interface IRUC
+ {
+ void TestMethod();
+ }
+
+ class Implementation : IRUC
+ {
+ [RequiresUnreferencedCode("Message")]
+ // IL2046: Member 'Implementation.TestMethod()' with 'RequiresUnreferencedCodeAttribute' implements interface member 'IRUC.TestMethod()' without 'RequiresUnreferencedCodeAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
+ public void TestMethod () { }
+ }
+ ```
+
+#### `IL2048`: Internal attribute 'RemoveAttributeInstances' can only be used on a type, but is being used on 'member'
+
+- Internal attribute 'RemoveAttributeInstances' is a special attribute that should only be used on custom attribute types and is being used on 'member'.
+
+ ```XML
+
+
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2049`: Unrecognized internal attribute 'attribute'
+
+- The internal attribute name 'attribute' being used in the xml is not supported by the linker, check the spelling and the supported internal attributes.
+
+ ```XML
+
+
+
+
+
+
+
+
+
+
+ ```
+
+#### `IL2050`: Trim analysis: Correctness of COM interop cannot be guaranteed
+
+- P/invoke method 'method' declares a parameter with COM marshalling. Correctness of COM interop cannot be guaranteed after trimming. Interfaces and interface members might be removed.
+
+#### `IL2051`: Property element does not contain attribute 'name'
+
+- An attribute element declares a property but this does not specify its name or is empty.
+
+ ```XML
+
+
+
+
+
+ UnspecifiedPropertyName
+
+
+
+
+ ```
+
+#### `IL2052`: Property 'propertyName' could not be found
+
+- An attribute element has property 'propertyName' but this could not be found.
+
+ ```XML
+
+
+
+
+
+ SomeValue
+
+
+
+
+ ```
+
+#### `IL2053`: Invalid value 'propertyValue' for property 'propertyName'
+
+- The value 'propertyValue' used in a custom attribute annotation does not match the type of the attribute's property 'propertyName'.
+
+ ```XML
+
+
+
+
+
+ StringValue
+
+
+
+
+ ```
+
+#### `IL2054`: Invalid argument value 'argumentValue' for parameter of type 'parameterType' of attribute 'attribute'
+
+- The value 'argumentValue' used in a custom attribute annotation does not match the type of one of the attribute's constructor arguments. The arguments used for a custom attribute annotation should be declared in the same order the constructor uses.
+
+ ```XML
+
+
+
+
+
+ NonExistentEnumValue
+
+
+
+
+ ```
+
+#### `IL2055`: Trim analysis: Call to 'System.Type.MakeGenericType' can not be statically analyzed. It's not possible to guarantee the availability of requirements of the generic type.
+
+- This can be either that the type on which the `MakeGenericType` is called can't be statically determined, or that the type parameters to be used for generic arguments can't be statically determined. If the open generic type has `DynamicallyAccessedMembersAttribute` on any of its generic parameters, ILLink currently can't validate that the requirements are fulfilled by the calling method.
+
+ ``` C#
+ class Lazy<[DynamicallyAccessedMembers(DynamicallyAccessedMemberType.PublicParameterlessConstructor)] T>
+ {
+ // ...
+ }
+
+ void TestMethod(Type unknownType)
+ {
+ // IL2055 Trim analysis: Call to `System.Type.MakeGenericType(Type[])` can not be statically analyzed. It's not possible to guarantee the availability of requirements of the generic type.
+ typeof(Lazy<>).MakeGenericType(new Type[] { typeof(TestType) });
+
+ // IL2055 Trim analysis: Call to `System.Type.MakeGenericType(Type[])` can not be statically analyzed. It's not possible to guarantee the availability of requirements of the generic type.
+ unknownType.MakeGenericType(new Type[] { typeof(TestType) });
+ }
+ ```
+
+#### `IL2056`: Trim analysis: 'DynamicallyAccessedMemberAttribute' on property 'property' conflicts with the same attribute on its backing field 'field'.
+
+- Propagating `DynamicallyAccessedMembersAttribute` from property 'property' to its backing field 'field' found that the field already has such an attribute. The existing attribute will be used.
+ Since ILLink will only propagate to a compiler generated backing field this warning should basically never happen. The one known way requires the user code to explicitly specify the `CompilerGeneratedAttribute` on the field to get ILLink to treat it as the compiler generated backing field.
+
+#### `IL2057`: Trim analysis: Unrecognized value passed to the parameter 'typeName' of method 'System.Type.GetType(Type typeName)'. It's not possible to guarantee the availability of the target type.
+
+- If the type name passed to the `System.Type.GetType` is statically known ILLink can make sure it's preserved and the application code will work after trimming. But if the type name is unknown, it could point to a type which ILLink will not see being used anywhere else and would remove it from the application, potentially breaking the application.
+
+ ``` C#
+ void TestMethod()
+ {
+ string typeName = ReadName();
+
+ // IL2057 Trim analysis: Unrecognized value passed to the parameter 'typeName' of method 'System.Type.GetType(Type typeName)'
+ Type.GetType(typeName);
+ }
+ ```
+
+#### `IL2058`: Trim analysis: Parameters passed to method 'Assembly.CreateInstance' cannot be analyzed. Consider using methods 'System.Type.GetType' and `System.Activator.CreateInstance` instead.
+
+- ILLink currently doesn't analyze assembly instances and thus it doesn't know on which assembly the `Assembly.CreateInstance` was called. ILLink has support for `Type.GetType` instead, for cases where the parameter is a string literal. The result of which can be passed to `Activator.CreateInstance` to create an instance of the type.
+
+ ``` C#
+ void TestMethod()
+ {
+ // IL2058 Trim analysis: Parameters passed to method 'Assembly.CreateInstance(string)' cannot be analyzed. Consider using methods 'System.Type.GetType' and `System.Activator.CreateInstance` instead.
+ AssemblyLoadContext.Default.Assemblies.First(a => a.Name == "MyAssembly").CreateInstance("MyType");
+
+ // This can be replaced by
+ Activator.CreateInstance(Type.GetType("MyType, MyAssembly"));
+ }
+ ```
+
+#### `IL2059`: Trim analysis: Unrecognized value passed to the parameter 'type' of method 'System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor'. It's not possible to guarantee the availability of the target static constructor.
+
+- If the type passed to the `RunClassConstructor` is not statically known, ILLink can't make sure that its static constructor is available.
+
+ ``` C#
+ void TestMethod(Type type)
+ {
+ // IL2059 Trim analysis: Unrecognized value passed to the parameter 'type' of method 'System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle type)'.
+ // It's not possible to guarantee the availability of the target static constructor.
+ RuntimeHelpers.RunClassConstructor(type.TypeHandle);
+ }
+ ```
+
+#### `IL2060`: Trim analysis: Call to 'System.Reflection.MethodInfo.MakeGenericMethod' can not be statically analyzed. It's not possible to guarantee the availability of requirements of the generic method
+
+- This can be either that the method on which the `MakeGenericMethod` is called can't be statically determined, or that the type parameters to be used for generic arguments can't be statically determined. If the open generic method has `DynamicallyAccessedMembersAttribute` on any of its generic parameters, ILLink currently can't validate that the requirements are fulfilled by the calling method.
+
+``` C#
+class Test
+{
+ public static void TestGenericMethod<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] T>()
+ {
+ }
+
+ void TestMethod(Type unknownType)
+ {
+ // IL2060 Trim analysis: Call to 'System.Reflection.MethodInfo.MakeGenericMethod' can not be statically analyzed. It's not possible to guarantee the availability of requirements of the generic method
+ typeof(Test).GetMethod("TestGenericMethod").MakeGenericMethod(new Type[] { typeof(TestType) });
+
+ // IL2060 Trim analysis: Call to 'System.Reflection.MethodInfo.MakeGenericMethod' can not be statically analyzed. It's not possible to guarantee the availability of requirements of the generic method
+ unknownMethod.MakeGenericMethod(new Type[] { typeof(TestType) });
+ }
+}
+```
+
+#### `IL2061`: Trim analysis: The assembly name 'assembly name' passed to method 'method' references assembly which is not available.
+
+- Calling `CreateInstance` with assembly name 'assembly name' which can't be resolved.
+
+ ``` C#
+ void TestMethod()
+ {
+ // IL2061 Trim analysis: The assembly name 'NonExistentAssembly' passed to method 'System.Activator.CreateInstance(string, string)' references assembly which is not available.
+ Activator.CreateInstance("NonExistentAssembly", "MyType");
+ }
+ ```
+
+#### `IL2062` Trim analysis: Value passed to parameter 'parameter' of method 'method' can not be statically determined and may not meet 'DynamicallyAccessedMembersAttribute' requirements.
+
+- The parameter 'parameter' of method 'method' has a `DynamicallyAccessedMembersAttribute`, but the value passed to it can not be statically analyzed. ILLink can't make sure that the requirements declared by the `DynamicallyAccessedMembersAttribute` are met by the argument value.
+
+ ``` C#
+ void NeedsPublicConstructors([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type)
+ {
+ // ...
+ }
+
+ void TestMethod(Type[] types)
+ {
+ // IL2062: Value passed to parameter 'type' of method 'NeedsPublicConstructors' can not be statically determined and may not meet 'DynamicallyAccessedMembersAttribute' requirements.
+ NeedsPublicConstructors(types[1]);
+ }
+ ```
+
+#### `IL2063`: Trim analysis: Value returned from method 'method' can not be statically determined and may not meet 'DynamicallyAccessedMembersAttribute' requirements.
+
+- The return value of method 'method' has a `DynamicallyAccessedMembersAttribute`, but the value returned from the method can not be statically analyzed. ILLink can't make sure that the requirements declared by the `DynamicallyAccessedMembersAttribute` are met by the returned value.
+
+ ``` C#
+ [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type TestMethod(Type[] types)
+ {
+ // IL2063 Trim analysis: Value returned from method 'TestMethod' can not be statically determined and may not meet 'DynamicallyAccessedMembersAttribute' requirements.
+ NeedsPublicConstructors(types[1]);
+ }
+ ```
+
+#### `IL2064`: Trim analysis: Value assigned to field 'field' can not be statically determined and may not meet 'DynamicallyAccessedMembersAttribute' requirements.
+
+- The field 'field' has a `DynamicallyAccessedMembersAttribute`, but the value assigned to it can not be statically analyzed. ILLink can't make sure that the requirements declared by the `DynamicallyAccessedMembersAttribute` are met by the assigned value.
+
+ ``` C#
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type _typeField;
+
+ void TestMethod(Type[] types)
+ {
+ // IL2064 Trim analysis: Value assigned to field '_typeField' can not be statically determined and may not meet 'DynamicallyAccessedMembersAttribute' requirements.
+ _typeField = _types[1];
+ }
+ ```
+
+#### `IL2065`: Trim analysis: Value passed to implicit 'this' parameter of method 'method' can not be statically determined and may not meet 'DynamicallyAccessedMembersAttribute' requirements.
+
+- The method 'method' has a `DynamicallyAccessedMembersAttribute` (which applies to the implicit 'this' parameter), but the value used for the 'this' parameter can not be statically analyzed. ILLink can't make sure that the requirements declared by the `DynamicallyAccessedMembersAttribute` are met by the 'this' value.
+
+ ``` C#
+ void TestMethod(Type[] types)
+ {
+ // IL2065 Trim analysis: Value passed to implicit 'this' parameter of method 'Type.GetMethods()' can not be statically determined and may not meet 'DynamicallyAccessedMembersAttribute' requirements.
+ _types[1].GetMethods (); // Type.GetMethods has [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] attribute
+ }
+ ```
+
+#### `IL2066`: Trim analysis: Type passed to generic parameter 'parameter' of 'type or method' can not be statically determined and may not meet 'DynamicallyAccessedMembersAttribute' requirements.
+
+- The generic parameter 'parameter' of 'type or method' has a `DynamicallyAccessedMembersAttribute`, but the value used for it can not be statically analyzed. ILLink can't make sure that the requirements declared by the `DynamicallyAccessedMembersAttribute` are met by the value.
+
+*Note: this warning can't be currently produced as there's no pure IL way to pass unknown value to a generic parameter. Once ILLInk supports full analysis of arguments for `MakeGenericType`/`MakeGenericMethod` this warnings would become active.*
+
+#### `IL2067`: Trim analysis: 'target parameter' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The parameter 'source parameter' of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ void NeedsPublicConstructors([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type)
+ {
+ // ...
+ }
+
+ void TestMethod(Type type)
+ {
+ // IL2067 Trim analysis: 'target parameter' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The parameter 'source parameter' of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ NeedsPublicConstructors(type);
+ }
+ ```
+
+#### `IL2068`: Trim analysis: 'target method' method return value does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The parameter 'source parameter' of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type TestMethod(Type type)
+ {
+ // IL2068 Trim analysis: 'target method' method return value does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The parameter 'source parameter' of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ return type;
+ }
+ ```
+
+#### `IL2069`: Trim analysis: value stored in field 'target field' does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The parameter 'source parameter' of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type _typeField;
+
+ void TestMethod(Type type)
+ {
+ // IL2069 Trim analysis: value stored in field 'target field' does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The parameter 'source parameter' of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ _typeField = type;
+ }
+ ```
+
+#### `IL2070`: Trim analysis: 'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The parameter 'source parameter' of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ void TestMethod(Type type)
+ {
+ // IL2070 Trim analysis: 'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The parameter 'source parameter' of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ }
+ ```
+
+#### `IL2071`: Trim analysis: 'target generic parameter' generic argument does not satisfy 'DynamicallyAccessedMembersAttribute' in 'target method or type'. The parameter 'source parameter' of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- Currently this is never generated, once ILLink supports full analysis of MakeGenericType/MakeGenericMethod this will be used
+
+#### `IL2072`: Trim analysis: 'target parameter' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The return value of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ Type GetCustomType() { return typeof(CustomType); }
+
+ void NeedsPublicConstructors([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type)
+ {
+ // ...
+ }
+
+ void TestMethod()
+ {
+ // IL2072 Trim analysis: 'target parameter' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The return value of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ NeedsPublicConstructors(GetCustomType());
+ }
+ ```
+
+#### `IL2073`: Trim analysis: 'target method' method return value does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The return value of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ Type GetCustomType() { return typeof(CustomType); }
+
+ [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type TestMethod()
+ {
+ // IL2073 Trim analysis: 'target method' method return value does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The return value of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ return GetCustomType();
+ }
+ ```
+
+#### `IL2074`: Trim analysis: value stored in field 'target field' does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The return value of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ Type GetCustomType() { return typeof(CustomType); }
+
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type _typeField;
+
+ void TestMethod()
+ {
+ // IL2074 Trim analysis: value stored in field 'target field' does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The return value of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ _typeField = GetCustomType();
+ }
+ ```
+
+#### `IL2075`: Trim analysis: 'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The return value of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ Type GetCustomType() { return typeof(CustomType); }
+
+ void TestMethod()
+ {
+ // IL2075 Trim analysis: 'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The return value of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ GetCustomType().GetMethods(); // Type.GetMethods is annotated with DynamicallyAccessedMemberTypes.PublicMethods
+ }
+ ```
+
+#### `IL2076`: Trim analysis: 'target generic parameter' generic argument does not satisfy 'DynamicallyAccessedMembersAttribute' in 'target method or type'. The return value of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- Currently this is never generated, once ILLink supports full analysis of MakeGenericType/MakeGenericMethod this will be used
+
+#### `IL2077`: Trim analysis: 'target parameter' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The field 'source field' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ void NeedsPublicConstructors([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type)
+ {
+ // ...
+ }
+
+ Type _typeField;
+
+ void TestMethod()
+ {
+ // IL2075 Trim analysis: 'target parameter' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The field 'source field' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ NeedsPublicConstructors(_typeField);
+ }
+ ```
+
+#### `IL2078`: Trim analysis: 'target method' method return value does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The field 'source field' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ Type _typeField;
+
+ [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type TestMethod()
+ {
+ // IL2076 Trim analysis: 'TestMethod' method return value does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The field '_typeField' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ return _typeField;
+ }
+ ```
+
+#### `IL2079`: Trim analysis: value stored in field 'target field' does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The field 'source field' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ Type _typeField;
+
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type _typeFieldWithRequirements;
+
+ void TestMethod()
+ {
+ // IL2077 Trim analysis: value stored in field 'target field' does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The field 'source field' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ _typeFieldWithRequirements = _typeField;
+ }
+ ```
+
+#### `IL2080`: Trim analysis: 'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The field 'source field' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ Type _typeField;
+
+ void TestMethod()
+ {
+ // IL2078 Trim analysis: 'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The field 'source field' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ }
+ ```
+
+#### `IL2081`: Trim analysis: 'target generic parameter' generic argument does not satisfy 'DynamicallyAccessedMembersAttribute' in 'target method or type'. The field 'source field' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- Currently this is never generated, once ILLink supports full analysis of MakeGenericType/MakeGenericMethod this will be used
+
+#### `IL2082`: Trim analysis: 'target parameter' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The implicit 'this' argument of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ void NeedsPublicConstructors([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type)
+ {
+ // ...
+ }
+
+ // This can only happen within methods of System.Type type (or derived types). Assume the below method is declared on System.Type
+ void TestMethod()
+ {
+ // IL2082 Trim analysis: 'target parameter' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The implicit 'this' argument of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ NeedsPublicConstructors(this);
+ }
+ ```
+
+#### `IL2083`: Trim analysis: 'target method' method return value does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The implicit 'this' argument of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ // This can only happen within methods of System.Type type (or derived types). Assume the below method is declared on System.Type
+ [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type TestMethod()
+ {
+ // IL2083 Trim analysis: 'target method' method return value does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The implicit 'this' argument of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ return this;
+ }
+ ```
+
+#### `IL2084`: Trim analysis: value stored in field 'target field' does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The implicit 'this' argument of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type _typeFieldWithRequirements;
+
+ // This can only happen within methods of System.Type type (or derived types). Assume the below method is declared on System.Type
+ void TestMethod()
+ {
+ // IL2084 Trim analysis: value stored in field 'target field' does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The implicit 'this' argument of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ _typeFieldWithRequirements = this;
+ }
+ ```
+
+#### `IL2085`: Trim analysis: 'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The implicit 'this' argument of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ // This can only happen within methods of System.Type type (or derived types). Assume the below method is declared on System.Type
+ void TestMethod()
+ {
+ // IL2085 Trim analysis: 'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The implicit 'this' argument of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ this.GetMethods(); // Type.GetMethods is annotated with DynamicallyAccessedMemberTypes.PublicMethods
+ }
+ ```
+
+#### `IL2086`: Trim analysis: 'target generic parameter' generic argument does not satisfy 'DynamicallyAccessedMembersAttribute' in 'target method or type'. The implicit 'this' argument of method 'source method' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- Currently this is never generated, once ILLink supports full analysis of MakeGenericType/MakeGenericMethod this will be used
+
+
+#### `IL2087`: Trim analysis: 'target parameter' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The generic parameter 'source generic parameter' of 'source method or type' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ void NeedsPublicConstructors([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type)
+ {
+ // ...
+ }
+
+ void TestMethod()
+ {
+ // IL2087 Trim analysis: 'target parameter' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The generic parameter 'source generic parameter' of 'source method or type' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ NeedsPublicConstructors(typeof(TSource));
+ }
+ ```
+
+#### `IL2088`: Trim analysis: 'target method' method return value does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The generic parameter 'source generic parameter' of 'source method or type' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type TestMethod()
+ {
+ // IL2088 Trim analysis: 'target method' method return value does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The generic parameter 'source generic parameter' of 'source method or type' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ return typeof(TSource);
+ }
+ ```
+
+#### `IL2089`: Trim analysis: value stored in field 'target field' does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The generic parameter 'source generic parameter' of 'source method or type' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ Type _typeFieldWithRequirements;
+
+ void TestMethod()
+ {
+ // IL2089 Trim analysis: value stored in field 'target field' does not satisfy 'DynamicallyAccessedMembersAttribute' requirements. The generic parameter 'source generic parameter' of 'source method or type' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ _typeFieldWithRequirements = typeof(TSource);
+ }
+ ```
+
+#### `IL2090`: Trim analysis: 'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The generic parameter 'source generic parameter' of 'source method or type' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ void TestMethod()
+ {
+ // IL2090 Trim analysis: 'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to 'target method'. The generic parameter 'source generic parameter' of 'source method or type' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ typeof(TSource).GetMethods(); // Type.GetMethods is annotated with DynamicallyAccessedMemberTypes.PublicMethods
+ }
+ ```
+
+#### `IL2091`: Trim analysis: 'target generic parameter' generic argument does not satisfy 'DynamicallyAccessedMembersAttribute' in 'target method or type'. The generic parameter 'source target parameter' of 'source method or type' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+
+- The target location declares some requirements on the type value via its `DynamicallyAccessedMembersAttribute`. Those requirements must be met by those declared on the source value also via the `DynamicallyAccessedMembersAttribute`. The source value can declare more requirements than the source if necessary.
+
+ ```C#
+ void NeedsPublicConstructors<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TTarget>()
+ {
+ // ...
+ }
+
+ void TestMethod()
+ {
+ // IL2091 Trim analysis: 'target generic parameter' generic argument does not satisfy 'DynamicallyAccessedMembersAttribute' in 'target method or type'. The generic parameter 'source target parameter' of 'source method or type' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to.
+ NeedsPublicConstructors();
+ }
+ ```
+
+#### `IL2092`: Trim analysis: 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the parameter 'parameter' of method 'method' don't match overridden parameter 'parameter' of method 'base method'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
+
+- All overrides of a virtual method including the base method must have the same `DynamicallyAccessedMemberAttribute` usage on all it's components (return value, parameters and generic parameters).
+
+ ```C#
+ public class Base
+ {
+ public virtual void TestMethod([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type type) {}
+ }
+
+ public class Derived : Base
+ {
+ // IL2092: 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the parameter 'type' of method 'Derived.TestMethod' don't match overridden parameter 'type' of method 'Base.TestMethod'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
+ public override void TestMethod([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] Type type) {}
+ }
+ ```
+
+#### `IL2093`: Trim analysis: 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the return value of method 'method' don't match overridden return value of method 'base method'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
+
+- All overrides of a virtual method including the base method must have the same `DynamicallyAccessedMemberAttribute` usage on all it's components (return value, parameters and generic parameters).
+
+ ```C#
+ public class Base
+ {
+ [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)]
+ public virtual Type TestMethod() {}
+ }
+
+ public class Derived : Base
+ {
+ // IL2093: 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the return value of method 'Derived.TestMethod' don't match overridden return value of method 'Base.TestMethod'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
+ [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)]
+ public override Type TestMethod() {}
+ }
+ ```
+
+#### `IL2094`: Trim analysis: 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the implicit 'this' parameter of method 'method' don't match overridden implicit 'this' parameter of method 'base method'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
+
+- All overrides of a virtual method including the base method must have the same `DynamicallyAccessedMemberAttribute` usage on all it's components (return value, parameters and generic parameters).
+
+ ```C#
+ // This only works on methods in System.Type and derived classes - this is just an example
+ public class Type
+ {
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)]
+ public virtual void TestMethod() {}
+ }
+
+ public class DerivedType : Type
+ {
+ // IL2094: 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the implicit 'this' parameter of method 'DerivedType.TestMethod' don't match overridden implicit 'this' parameter of method 'Type.TestMethod'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)]
+ public override void TestMethod() {}
+ }
+ ```
+
+#### `IL2095`: Trim analysis: 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the generic parameter 'generic parameter' of 'method' don't match overridden generic parameter 'generic parameter' of 'base method'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
+
+- All overrides of a virtual method including the base method must have the same `DynamicallyAccessedMemberAttribute` usage on all it's components (return value, parameters and generic parameters).
+
+ ```C#
+ public class Base
+ {
+ public virtual void TestMethod<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] T>() {}
+ }
+
+ public class Derived : Base
+ {
+ // IL2095: 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the generic parameter 'T' of method 'Derived.TestMethod' don't match overridden generic parameter 'T' of method 'Base.TestMethod'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
+ public override void TestMethod<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] T>() {}
+ }
+ ```
+
+#### `IL2096`: Trim analysis: Call to 'Type.GetType method' can perform case insensitive lookup of the type, currently ILLink can not guarantee presence of all the matching types"
+
+- Specifying a case-insensitive search on an overload of `System.Type.GetType` is not supported by ILLink. Specify false to perform a case-sensitive search or use an overload that does not use a ignoreCase bolean.
+
+ ``` C#
+ void TestMethod()
+ {
+ // IL2096 Trim analysis: Call to 'System.Type.GetType(String,Boolean,Boolean)' can perform case insensitive lookup of the type, currently ILLink can not guarantee presence of all the matching types
+ Type.GetType ("typeName", false, true);
+ }
+ ```
+
+#### `IL2097`: Trim analysis: Field 'field' has 'DynamicallyAccessedMembersAttribute', but that attribute can only be applied to fields of type 'System.Type' or 'System.String'
+
+- `DynamicallyAccessedMembersAttribute` is only applicable to items of type `System.Type` or `System.String` (or derived), on all other types the attribute will be ignored. Using the attribute on any other type is likely incorrect and unintentional.
+
+ ```C#
+ // IL2097: Field '_valueField' has 'DynamicallyAccessedMembersAttribute', but that attribute can only be applied to fields of type 'System.Type' or 'System.String'
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)]
+ object _valueField;
+ ```
+
+#### `IL2098`: Trim analysis: Parameter 'parameter' of method 'method' has 'DynamicallyAccessedMembersAttribute', but that attribute can only be applied to parameters of type 'System.Type' or 'System.String'
+
+- `DynamicallyAccessedMembersAttribute` is only applicable to items of type `System.Type` or `System.String` (or derived), on all other types the attribute will be ignored. Using the attribute on any other type is likely incorrect and unintentional.
+
+ ```C#
+ // IL2098: Parameter 'param' of method 'TestMethod' has 'DynamicallyAccessedMembersAttribute', but that attribute can only be applied to parameters of type 'System.Type' or 'System.String'
+ void TestMethod([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] object param)
+ {
+ // param.GetType()....
+ }
+ ```
+
+#### `IL2099`: Trim analysis: Property 'property' has 'DynamicallyAccessedMembersAttribute', but that attribute can only be applied to properties of type 'System.Type' or 'System.String'
+
+- `DynamicallyAccessedMembersAttribute` is only applicable to items of type `System.Type` or `System.String` (or derived), on all other types the attribute will be ignored. Using the attribute on any other type is likely incorrect and unintentional.
+
+ ```C#
+ // IL2099: Parameter 'param' of method 'TestMethod' has 'DynamicallyAccessedMembersAttribute', but that attribute can only be applied to properties of type 'System.Type' or 'System.String'
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)]
+ object TestProperty { get; set; }
+ ```
+
+#### `IL2100`: XML contains unsupported wildcard for assembly "fullname" attribute
+
+- A wildcard "fullname" for an assembly in XML is only valid for link attribute XML on the command-line, not for descriptor or substitution XML or for embedded attribute XML. Specify a specific assembly name instead.
+
+ ```XML
+
+
+
+
+
+
+ ```
+
+#### `IL2101`: Embedded XML in assembly 'assembly' contains assembly "fullname" attribute for another assembly 'assembly'
+
+- Embedded attribute or substitution XML may only contain elements that apply to the containing assembly. Attempting to modify another assembly will not have any effect.
+
+ ```XML
+
+
+
+
+
+
+ ```
+
+#### `IL2102`: Invalid AssemblyMetadata("IsTrimmable", ...) attribute in assembly 'assembly'. Value must be "True"
+
+- AssemblyMetadataAttribute may be used at the assembly level to turn on trimming for the assembly. The only supported value is "True", but the attribute contained an unsupported value.
+
+ ``` C#
+ // IL2102: Invalid AssemblyMetadata("IsTrimmable", "False") attribute in assembly 'assembly'. Value must be "True"
+ [assembly: AssemblyMetadata("IsTrimmable", "False")]
+ ```
+
+#### `IL2103`: Trim analysis: Value passed to the 'propertyAccessor' parameter of method 'System.Linq.Expressions.Expression.Property(Expression, MethodInfo)' cannot be statically determined as a property accessor
+
+- The value passed to the `propertyAccessor` parameter of `Expression.Property(expression, propertyAccessor)` was not recognized as a property accessor method. Trimmer can't guarantee the presence of the property.
+
+ ```C#
+ void TestMethod(MethodInfo methodInfo)
+ {
+ // IL2103: Value passed to the 'propertyAccessor' parameter of method 'System.Linq.Expressions.Expression.Property(Expression, MethodInfo)' cannot be statically determined as a property accessor.
+ Expression.Property(null, methodInfo);
+ }
+ ```
+
+#### `IL2104`: Assembly 'assembly' produced trim warnings. For more information see https://aka.ms/dotnet-illink/libraries
+
+- The assembly 'assembly' produced trim analysis warnings in the context of the app. This means the assembly has not been fully annotated for trimming. Consider contacting the library author to request they add trim annotations to the library. To see detailed warnings for this assembly, turn off grouped warnings by passing either `--singlewarn-` to show detailed warnings for all assemblies, or `--singlewarn- "assembly"` to show detailed warnings for that assembly. https://aka.ms/dotnet-illink/libraries has more information on annotating libraries for trimming.
+
+#### `IL2105`: Type 'type' was not found in the caller assembly nor in the base library. Type name strings used for dynamically accessing a type should be assembly qualified.
+
+- Type name strings representing dynamically accessed types must be assembly qualified, otherwise trimmer will first search for the type name in the caller's assembly and then in System.Private.CoreLib.
+ If the trimmer fails to resolve the type name, null will be returned.
+
+ ```C#
+ void TestInvalidTypeName()
+ {
+ RequirePublicMethodOnAType("Foo.Unqualified.TypeName");
+ }
+ void RequirePublicMethodOnAType(
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)]
+ string typeName)
+ {
+ }
+ ```
+
+#### `IL2106`: Trim analysis: Return type of method 'method' has 'DynamicallyAccessedMembersAttribute', but that attribute can only be applied to properties of type 'System.Type' or 'System.String'
+
+- `DynamicallyAccessedMembersAttribute` is only applicable to items of type `System.Type` or `System.String` (or derived), on all other types the attribute will be ignored. Using the attribute on any other type is likely incorrect and unintentional.
+
+ ```C#
+ // IL2106: Return type of method 'TestMethod' has 'DynamicallyAccessedMembersAttribute', but that attribute can only be applied to properties of type 'System.Type' or 'System.String'
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] object TestMethod()
+ {
+ return typeof(TestType);
+ }
+ ```
+
+#### `IL2107`: Trim analysis: Methods 'method1' and 'method2' are both associated with state machine type 'type'. This is currently unsupported and may lead to incorrectly reported warnings.
+
+- Trimmer currently can't correctly handle if the same compiler generated state machine type is associated (via the state machine attributes) with two different methods.
+ Since the trimmer currently derives warning suppressions from the method which produced the state machine and currently doesn't support reprocessing the same method/type more than once.
+
+ Only a meta-sample:
+
+ ```C#
+ class _type {
+ void MoveNext()
+ {
+ // This should normally produce IL2026
+ CallSomethingWhichRequiresUnreferencedCode ();
+ }
+ }
+
+ [RequiresUnreferencedCode ("")] // This should suppress all warnings from the method
+ [IteratorStateMachine(typeof(_type))]
+ IEnumerable UserDefinedMethod()
+ {
+ // Uses the state machine type
+ // The IL2026 from the state machine should be suppressed in this case
+ }
+
+ // IL2107: Methods 'UserDefinedMethod' and 'SecondUserDefinedMethod' are both associated with state machine type '_type'.
+ [IteratorStateMachine(typeof(_type))]
+ IEnumerable SecondUserDefinedMethod()
+ {
+ // Uses the state machine type
+ // The IL2026 from the state should be reported in this case
+ }
+ ```
+
+#### `IL2108`: Invalid scope 'scope' used in 'UnconditionalSuppressMessageAttribute' on module 'module' with target 'target'.
+
+The only scopes supported on global unconditional suppressions are 'module', 'type' and 'member'. If the scope and target arguments are null or missing on a global suppression,
+it is assumed that the suppression is put on the module. Global unconditional suppressions using invalid scopes are ignored.
+
+```C#
+// IL2108: Invalid scope 'method' used in 'UnconditionalSuppressMessageAttribute' on module 'Warning' with target 'MyTarget'.
+[module: UnconditionalSuppressMessage ("Test suppression with invalid scope", "IL2026", Scope = "method", Target = "MyTarget")]
+
+class Warning
+{
+ static void Main(string[] args)
+ {
+ Foo();
+ }
+
+ [RequiresUnreferencedCode("Warn when Foo() is called")]
+ static void Foo()
+ {
+ }
+}
+```
+
+#### `IL2109` Trim analysis: Type 'type' derives from 'BaseType' which has 'RequiresUnreferencedCodeAttribute'. [message]. [url]
+
+- A type is being referenced in code, and this type derives from a base type with 'RequiresUnreferencedCodeAttribute' which can break functionality of a trimmed application.
+ Types that derive from a base class with 'RequiresUnreferencedCodeAttribute' need to explicitly use the 'RequiresUnreferencedCodeAttribute' or suppress this warning
+
+ ```C#
+ [RequiresUnreferencedCode("Using any of the members inside this class is trim unsafe", Url="http://help/unreferencedcode")]
+ public class UnsafeClass {
+ public UnsafeClass () {}
+ public static void UnsafeMethod();
+ }
+
+ // IL2109: Type 'Derived' derives from 'UnsafeClass' which has 'RequiresUnreferencedCodeAttribute'. Using any of the members inside this class is trim unsafe. http://help/unreferencedcode
+ class Derived : UnsafeClass {}
+ ```
+
+#### `IL2110`: Trim analysis: Field 'field' with 'DynamicallyAccessedMembersAttribute' is accessed via reflection. Trimmer can't guarantee availability of the requirements of the field.
+
+- Trimmer currently can't guarantee that all requirements of the `DynamicallyAccessedMembersAttribute` are fulfilled if the field is accessed via reflection.
+
+```C#
+[DynamicallyAccessedMembers(DynamicallyAccessedMemeberTypes.PublicMethods)]
+Type _field;
+
+void TestMethod()
+{
+ // IL2110: Field '_field' with 'DynamicallyAccessedMembersAttribute' is accessed via reflection. Trimmer can't guarantee availability of the requirements of the field.
+ typeof(Test).GetField("_field");
+}
+```
+
+#### `IL2111`: Trim analysis: Method 'method' with parameters or return value with `DynamicallyAccessedMembersAttribute` is accessed via reflection. Trimmer can't guarantee availability of the requirements of the method.
+
+- Trimmer currently can't guarantee that all requirements of the `DynamicallyAccessedMembersAttribute` are fulfilled if the method is accessed via reflection.
+
+```C#
+void MethodWithRequirements([DynamicallyAccessedMembers(DynamicallyAccessedMemeberTypes.PublicMethods)] Type type)
+{
+}
+
+void TestMethod()
+{
+ // IL2111: Method 'MethodWithRequirements' with parameters or return value with `DynamicallyAccessedMembersAttribute` is accessed via reflection. Trimmer can't guarantee availability of the requirements of the method.
+ typeof(Test).GetMethod("MethodWithRequirements");
+}
+```
+
+#### `IL2112` Trim analysis: 'DynamicallyAccessedMembersAttribute' on 'type' or one of its base types references 'member' which requires unreferenced code. [message]. [url]
+
+- A type is annotated with `DynamicallyAccessedMembersAttribute` indicating that the type may dynamically access some members declared on the type or its derived types. This instructs the trimmer to keep the specified members, but one of them is annotated with `RequiresUnreferencedCodeAttribute` which can break functionality when trimming. The `DynamicallyAccessedMembersAttribute` annotation may be directly on the type, or implied by an annotation on one of its base or interface types. This warning originates from the member with `RequiresUnreferencedCodeAttribute`.
+
+ ```C#
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)]
+ public class AnnotatedType {
+ // Trim analysis warning IL2112: AnnotatedType.Method(): 'DynamicallyAccessedMembersAttribute' on 'AnnotatedType' or one of its
+ // base types references 'AnnotatedType.Method()' which requires unreferenced code. Using this member is trim unsafe.
+ [RequiresUnreferencedCode("Using this member is trim unsafe")]
+ public static void Method() { }
+ }
+ ```
+
+#### `IL2113` Trim analysis: 'DynamicallyAccessedMembersAttribute' on 'type' or one of its base types references 'member' which requires unreferenced code. [message]. [url]
+
+- A type is annotated with `DynamicallyAccessedMembersAttribute` indicating that the type may dynamically access some members declared on the type or its derived types. This instructs the trimmer to keep the specified members, but a member of one of the base or interface types is annotated with `RequiresUnreferencedCodeAttribute` which can break functionality when trimming. The `DynamicallyAccessedMembersAttribute` annotation may be directly on the type, or implied by an annotation on one of its base or interface types. This warning originates from the type which has `DynamicallyAccessedMembersAttribute` requirements.
+
+ ```C#
+ public class BaseType {
+ [RequiresUnreferencedCode("Using this member is trim unsafe")]
+ public static void Method() { }
+ }
+
+ // Trim analysis warning IL2113: AnnotatedType: 'DynamicallyAccessedMembersAttribute' on 'AnnotatedType' or one of its
+ // base types references 'BaseType.Method()' which requires unreferenced code. Using this member is trim unsafe.
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)]
+ public class AnnotatedType : BaseType {
+ }
+ ```
+
+#### `IL2114 ` Trim analysis: 'DynamicallyAccessedMembersAttribute' on 'type' or one of its base types references 'member' which has 'DynamicallyAccessedMembersAttribute' requirements.
+
+- A type is annotated with `DynamicallyAccessedMembersAttribute` indicating that the type may dynamically access some members declared on the type or its derived types. This instructs the trimmer to keep the specified members, but one of them is annotated with `DynamicallyAccessedMembersAttribute` which can not be statically verified. The `DynamicallyAccessedMembersAttribute` annotation may be directly on the type, or implied by an annotation on one of its base or interface types. This warning originates from the member with `DynamicallyAccessedMembersAttribute` requirements.
+
+ ```C#
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)]
+ public class AnnotatedType {
+ // Trim analysis warning IL2114: System.Type AnnotatedType::Field: 'DynamicallyAccessedMembersAttribute' on 'AnnotatedType' or one of its
+ // base types references 'System.Type AnnotatedType::Field' which has 'DynamicallyAccessedMembersAttribute' requirements .
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+ public static Type Field;
+ }
+ ```
+
+#### `IL2115` Trim analysis: 'DynamicallyAccessedMembersAttribute' on 'type' or one of its base types references 'member' which has 'DynamicallyAccessedMembersAttribute' requirements.
+
+- A type is annotated with `DynamicallyAccessedMembersAttribute` indicating that the type may dynamically access some members declared on the type or its derived types. This instructs the trimmer to keep the specified members, but a member of one of the base or interface types is annotated with `DynamicallyAccessedMembersAttribute` which can not be statically verified. The `DynamicallyAccessedMembersAttribute` annotation may be directly on the type, or implied by an annotation on one of its base or interface types. This warning originates from the type which has `DynamicallyAccessedMembersAttribute` requirements.
+
+ ```C#
+ public class BaseType {
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+ public static Type Field;
+ }
+
+ // Trim analysis warning IL2115: AnnotatedType: 'DynamicallyAccessedMembersAttribute' on 'AnnotatedType' or one of its
+ // base types references 'System.Type BaseType::Field' which has 'DynamicallyAccessedMembersAttribute' requirements .
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)]
+ public class AnnotatedType : BaseType {
+ }
+ ```
+
+#### `IL2116` Trim analysis: 'RequiresUnreferencedCodeAttribute' cannot be placed directly on static constructor 'static constructor', consider placing 'RequiresUnreferencedCodeAttribute' on the type declaration instead.
+
+- The use of 'RequiresUnreferencedCodeAttribute' on static constructors is disallowed since is a method not callable by the user, is only called by the runtime. Placing the attribute directly on the static constructor will have no effect, instead use 'RequiresUnreferencedCodeAttribute' on the type which will handle warning and silencing from the static constructor.
+
+ ```C#
+ public class MyClass {
+ // Trim analysis warning IL2115: 'RequiresUnreferencedCodeAttribute' cannot be placed directly on static constructor 'MyClass..cctor()', consider placing 'RequiresUnreferencedCodeAttribute' on the type declaration instead.
+ [RequiresUnreferencedCode("Dangerous")]
+ static MyClass () { }
+ }
+ ```
+
+#### `IL2117`: Trim analysis: Methods 'method1' and 'method2' are both associated with lambda or local function 'method'. This is currently unsupported and may lead to incorrectly reported warnings.
+
+- Trimmer currently can't correctly handle if the same compiler generated lambda or local function is associated with two different methods. We don't know of any C# patterns which would cause this problem, but it is possible to write code like this in IL.
+
+ Only a meta-sample:
+
+ ```C#
+ [RequiresUnreferencedCode ("")] // This should suppress all warnings from the method
+ void UserDefinedMethod()
+ {
+ // Uses the compiler-generated local function method
+ // The IL2026 from the local function should be suppressed in this case
+ }
+
+ // IL2107: Methods 'UserDefinedMethod' and 'SecondUserDefinedMethod' are both associated with state machine type '_type'.
+ [RequiresUnreferencedCode ("")] // This should suppress all warnings from the method
+ void SecondUserDefinedMethod()
+ {
+ // Uses the compiler-generated local function method
+ // The IL2026 from the local function should be suppressed in this case
+ }
+
+ internal static void g__LocalFunction|0_0()
+ {
+ // Compiler-generated method emitted for a local function.
+ // This should only ever be called from one user-defined method.
+ }
+
+ ```
+
+#### `IL2121`: Unused 'UnconditionalSuppressMessageAttribute' for warning 'warning'. Consider removing the unused warning suppression.
+
+- The 'UnconditionalSuppressMessageAttribute' did not suppress any warning 'warning' caused by trimmer-incompatible patterns. Consider removing the attribute.
+
+ ```C#
+ // Trim analysis warning IL2121: TestMethod(): Unused 'UnconditionalSuppressMessageAttribute' for warning 'IL2070'. Consider removing the unused warning suppression.
+ [UnconditionalSuppressMessage("trim", "IL2070")]
+ void TestMethod()
+ {
+ Console.WriteLine("test");
+ }
+ ```
+
+
+## Single-File Warning Codes
+
+#### `IL3000`: 'member' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'
+
+- Calls to 'System.Reflection.Assembly.Location', 'System.Reflection.AssemblyName.CodeBase' and 'System.Reflection.AssemblyName.EscapedCodeBase' return an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'
+
+ ``` C#
+ void TestMethod()
+ {
+ var a = Assembly.GetExecutingAssembly();
+ // IL3000: 'System.Reflection.Assembly.Location' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'.
+ _ = a.Location;
+ }
+ ```
+
+#### `IL3001`: Assemblies embedded in a single-file app cannot have additional files in the manifest.
+
+- Calls to 'Assembly.GetFile(s)' methods for assemblies embedded inside the single-file bundle always throws an exception. Consider using embedded resources and the 'Assembly.GetManifestResourceStream' method.
+
+ ``` C#
+ void TestMethod()
+ {
+ var a = Assembly.GetExecutingAssembly();
+ // IL3001: Assemblies embedded in a single-file app cannot have additional files in the manifest.
+ _ = a.GetFiles();
+ }
+ ```
+
+#### `IL3002`: Using member 'member' which has 'RequiresAssemblyFilesAttribute' can break functionality when embedded in a single-file app. [message]. [url]
+
+- Found a call to a member annotated with 'RequiresAssemblyFilesAttribute' which can break functionality of a single-file application.
+
+ ```C#
+ [RequiresAssemblyFiles(Message="Use 'MethodFriendlyToSingleFile' instead", Url="http://help/assemblyfiles")]
+ void MethodWithAssemblyFilesUsage()
+ {
+ }
+
+ void TestMethod()
+ {
+ // IL3002: Using member 'MethodWithAssemblyFilesUsage' which has 'RequiresAssemblyFilesAttribute'
+ // can break functionality when embedded in a single-file app. Use 'MethodFriendlyToSingleFile' instead. http://help/assemblyfiles
+ MethodWithAssemblyFilesUsage();
+ }
+ ```
+
+#### `IL3003`: Member 'member' with 'RequiresAssemblyFilesAttribute' has a member 'member' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
+
+- For all interfaces and overrides the implementation 'RequiresAssemblyFilesAttribute' must match the definition 'RequiresAssemblyFilesAttribute', either all the members contain the attribute o none of them.
+
+ Here is a list of posible scenarios where the warning can be generated:
+
+ A base member has the attribute but the derived member does not have the attribute
+ ```C#
+ public class Base
+ {
+ [RequiresAssemblyFiles]
+ public virtual void TestMethod() {}
+ }
+
+ public class Derived : Base
+ {
+ // IL3003: Base member 'Base.TestMethod' with 'RequiresAssemblyFilesAttribute' has a derived member 'Derived.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
+ public override void TestMethod() {}
+ }
+ ```
+ A derived member has the attribute but the overriden base member does not have the attribute
+ ```C#
+ public class Base
+ {
+ public virtual void TestMethod() {}
+ }
+
+ public class Derived : Base
+ {
+ // IL3003: Member 'Derived.TestMethod()' with 'RequiresAssemblyFilesAttribute' overrides base member 'Base.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
+ [RequiresAssemblyFiles]
+ public override void TestMethod() {}
+ }
+ ```
+ An interface member has the attribute but it's implementation does not have the attribute
+ ```C#
+ interface IRAF
+ {
+ [RequiresAssemblyFiles]
+ void TestMethod();
+ }
+
+ class Implementation : IRAF
+ {
+ // IL3003: Interface member 'IRAF.TestMethod()' with 'RequiresAssemblyFilesAttribute' has an implementation member 'Implementation.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
+ public void TestMethod () { }
+ }
+ ```
+ An implementation member has the attribute but the interface that implementes does not have the attribute
+
+ ```C#
+ interface IRAF
+ {
+ void TestMethod();
+ }
+
+ class Implementation : IRAF
+ {
+ [RequiresAssemblyFiles]
+ // IL3003: Member 'Implementation.TestMethod()' with 'RequiresAssemblyFilesAttribute' implements interface member 'IRAF.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
+ public void TestMethod () { }
+ }
+ ```
\ No newline at end of file
diff --git a/docs/tools/illink/illink-options.md b/docs/tools/illink/illink-options.md
new file mode 100644
index 00000000000000..dba0e21e588623
--- /dev/null
+++ b/docs/tools/illink/illink-options.md
@@ -0,0 +1,254 @@
+# Available Command Line Options
+
+## `illink` tool
+
+The `illink` is IL linker version shipping with .NET Core or .NET 5 platforms. It's bundled with
+the .NET SDK and most of the options are accessible using msbuild properties but any option
+can also be passed using `_ExtraTrimmerArgs` property.
+
+### Trimming from the root assembly
+
+The command:
+
+`illink -a Program.exe`
+
+will use the assembly `Program.exe` as root ILLink input. That means that the ILLink will
+start with the main entry point method of `Program.exe` (typically the `Main` method) and
+process all its dependencies to determine what is necessary for this assembly to run.
+
+It's possible to use multiple input files and ILLink will use them all as multiple sources.
+When a library is used instead of executable ILLink will root and mark all members instead of
+assembly entry point. This rooting behaviour can be customized by passing additional option
+which can use one of following values.
+
+- `all` - Keep all members in root assembly. This is equivalent to using `copy` link action
+for the assembly.
+- `default` - Use entry point for applications and all members for libraries
+- `entrypoint` - Use assembly entry point as the only root in the assembly. This option is useful
+for multi entry-point libraries bundles.
+- `library` - All visible members and metadata are retained. This useful mode for trimming a library before publishing.
+- `visible` - Keep all members and types visible outside of the assembly. All internals members
+are also rooted when assembly contains InternalsVisibleToAttribute.
+
+You can retain all public members of `Program.exe` application even if they are not
+referenced by any dependency by calling ILLink like
+
+`illink -a Program.exe visible`
+
+### Trimming from an [XML descriptor](data-formats.md#descriptor-format)
+
+The command:
+
+`illink -x desc.xml`
+
+will use the XML descriptor as a source. That means that ILLink will
+use this file to decide what to link in a set of assemblies. The format of the
+descriptors is described in [data-formats document](data-formats.md).
+
+### Actions on the assemblies
+
+You can specify what the ILLink should do exactly per assembly.
+
+ILLink can do the following things on all or individual assemblies
+
+- `skip` - skip them, and do nothing with them
+- `copy` - copy them to the output directory
+- `copyused` - copy used assemblies to the output directory
+- `link` - trim them to reduce their size
+- `delete`- remove them from the output
+- `save` - save them in memory without trimming
+
+You can specify an action per assembly using `--action` option like this:
+
+`illink --action link Foo`
+
+or
+
+`illink --action skip System.Windows.Forms`
+
+Or you can specify what to do for the trimmed assemblies.
+
+A trimmable assembly is any assembly that includes the attribute `System.Reflection.AssemblyMetadata("IsTrimmable", "True")`.
+
+You can specify what action to do on the trimmed assemblies with the option:
+
+`--trim-mode skip|copy|copyused|link`
+
+You can specify what action to do on assemblies without such an attribute with the option:
+
+`--action copy|link`
+
+### The output directory
+
+By default, ILLink will create an `output` directory in the current
+directory where it will store the processed files, to avoid overwritting input
+assemblies. You can change the output directory with the option:
+
+`-out PATH`
+
+If you specify the output directory `.`, please ensure that you won't write over
+important assemblies of yours.
+
+### Specifying assembly lookup paths
+
+By default, ILLink will first look for assemblies in the directories `.`
+and `bin`. You can specify additional locations where assemblies will be searched
+for by using `-d PATH` option.
+
+Example:
+
+`illink -d ../../libs -a program.exe`
+
+### Excluding framework features
+
+One of the ways to reduce core assembly sizes is by removing framework capabilities. This
+is usually something that the developer decides about as it alters the program behaviour
+therefore the decision whether the size saving is worth it is left to the developer.
+
+Each feature can be controlled independently using `--feature NAME value` option.
+
+The list of available feature names is framework-dependent and can vary between different
+framework versions.
+
+The list of controllable features for .NET Core is available at https://docs.microsoft.com/en-us/dotnet/core/run-time-config/.
+
+### Using custom substitutions
+
+An option called `--substitutions FILE` allows external customization of any
+method or field for assemblies which are linked. The syntax used is fully described
+in [data-formats document](data-formats.md#substitution-format). Using substitutions
+with `ipconstprop` optimization (enabled by default) can help reduce output
+size as any dependencies under conditional logic which will be evaluated as
+unreachable will be removed.
+
+### Adding custom ILLink steps
+
+You can write [custom steps](custom-steps.md) for ILLink and instruct
+ILLink to add them into its existing pipeline. To tell ILLink where this assembly is
+located, you have to append its full path after a comma which separates the custom
+ step's name from the custom assembly's path
+
+`--custom-step [custom step],[custom assembly]`
+
+You can now ask ILLink to add the custom step at the end of the pipeline:
+
+`illink --custom-step Foo.FooStep,D:\Bar\Foo.dll`
+
+Or you can ask ILLink to add it after a specific step:
+
+`illink --custom-step +MarkStep:Foo.FooStep,D:\Bar\Foo.dll -a program.exe`
+
+Or before a specific step:
+
+`illink --custom-step -MarkStep:Foo.FooStep,D:\Bar\Foo.dll -a program.exe`
+
+### Passing data to custom steps
+
+For advanced custom steps which need interaction with external values there is a
+`--custom-data KEY=VALUE` option. Each key can have a simple value assigned which means
+if you need to store multiple values for the same key, you should use custom separators for the
+values and pass them as one key-value pair.
+
+### Supplementary [custom attributes](data-formats.md#custom-attributes-annotations-format)
+
+Much of the trimmer behaviour is controlled by the custom attributes but they are not always
+present in the input assemblies. The attributes can be applied to any existing metadata using
+`--link-attributes FILE` option.
+
+Alternatively, the trimmer recognizes the embedded XML resource 'ILLink.LinkAttributes.xml' as a
+special resource to alter the custom attributes applied.
+
+### Ignoring embedded XML control files
+
+The trimmer recognizes embedded XML resources based on name as special ones which can
+alter the trimming behaviour. The behaviour can be suppressed if necessary by using
+control options listed below.
+
+| File Format | Resource Name | Control Option |
+|---|---|---|
+| Descriptor | ILLink.Descriptors.xml | --ignore-descriptors |
+| Substition | ILLink.Substitutions.xml | --ignore-substitutions |
+| LinkAttributes | ILLink.LinkAttributes.xml | --ignore-link-attributes |
+
+### Treat warnings as errors
+
+The `--warnasserror` (or `--warnaserror+`) option will make the trimmer report any warning
+messages as error messages instead. By default, the trimmer behaves as if the `--warnaserror-`
+option was used, which causes the trimmer to report warnings as usual.
+
+Optionally, you may specify a list of warnings that you'd like to be treated as errors. These
+warnings have to be prepended with `IL` and must be separated by either a comma or semicolon.
+
+### Turning off warnings
+
+The `--nowarn` option prevents the trimmer from displaying one or more trimmer warnings by
+specifying its warning codes. All warning codes must be prepended with `IL` and multiple
+warnings should be separated with a comma or semicolon.
+
+### Control warning versions
+
+The `--warn VERSION` option prevents the trimmer from displaying warnings newer than the specified
+version. Valid versions are in the range 0-9999, where 9999 will display all current and future
+warnings.
+
+### Emit single warnings per assembly
+
+The `--singlewarn` (or `--singlewarn+`) option will show at most one trim analysis warning per
+assembly which represents all of the warnings produced by code in the assembly. The default is to show all trim analysis warnings.
+
+You may also pass `--singlewarn Assembly` (or `--singlewarn- Assembly`) to control this behavior for a particular assembly.
+
+### Generating warning suppressions
+
+For each of the linked assemblies that triggered any warnings during trimming, the
+`--generate-warning-suppressions [cs | xml]` option will generate a file containing a list
+with the necessary attributes to suppress these. The generated files can either be C# source
+files or XML files in a [format](data-formats.md#custom-attributes-annotations-format) that is supported by the trimmer,
+the emitted format depends upon the argument that is passed to this option (`cs` or `xml`.)
+The attributes contained in these files are assembly-level attributes of type `UnconditionalSuppressMessage`
+specifying the required `Scope` and `Target` properties for each of the warnings seen. The
+generated files are saved in the output directory and named `.WarningSuppressions.`.
+
+### Detailed dependencies tracing
+
+For tracking why trimmer kept specific metadata you can use `--dump-dependencies` option
+which by default writes detailed information into a compressed file called `linker-dependencies.xml.gz`
+inside output directory. The default output filename can be changed with `--dependencies-file`
+option.
+
+The format of the data is XML and it's intentionally human-readable but due
+to a large amount of data, it's recommended to use tools which can analyze the data.
+
+## monolinker specific options
+
+### The i18n Assemblies
+
+Mono has a few assemblies which contains everything region specific:
+
+ I18N.CJK.dll
+ I18N.MidEast.dll
+ I18N.Other.dll
+ I18N.Rare.dll
+ I18N.West.dll
+
+By default, they will all be copied to the output directory. But you can
+specify which one you want using the command:
+
+`illink -l choice`
+
+Where choice can either be: none, all, cjk, mideast, other, rare or west. You can
+combine the values with a comma.
+
+Example:
+
+`illink -a assembly -l mideast,cjk`
+
+### Trimming from an API info file
+
+The command:
+
+`illink -i assembly.info`
+
+will use a file produced by `mono-api-info` as a source. The trimmer will use
+this file to link only what is necessary to match the public API defined in
+the info file.
diff --git a/docs/tools/illink/illink-tasks.md b/docs/tools/illink/illink-tasks.md
new file mode 100644
index 00000000000000..eac61a5cafa74c
--- /dev/null
+++ b/docs/tools/illink/illink-tasks.md
@@ -0,0 +1,133 @@
+# ILLink.Tasks
+
+## Terminology
+
+Trimming allows a developer to reduce the final size of the application by removing unused managed code (IL) and other assets. Any publicly visible MSBuild property or item group name should use the term "trim" to refer to this capability.
+
+The trimming process exposed to MSBuild via the ILLink.Tasks assembly which calls into ILLink tool to perform the actual trimming. The ILLink tool produces the trimmed output and can issue its own [warnings and errors](error-codes.md). All of them use `ILLink` prefix and unique code for easier identification.
+
+*Note: This is similar to Compiler/csc: the capability is "compilation" and the related MSBuild/SDK integration uses "compile" as the term. The actual tool is csc and the errors/warnings coming from it are prefixed with CSC/CS.*
+
+## Usage
+
+To enable ILLink set `PublishTrimmed` property to `true` in your project and publish your app as self-contained.
+
+```
+dotnet publish -r -c Release -p:PublishTrimmed=true
+```
+
+alternatively you can edit your .csproj file to include
+
+```xml
+
+ true
+
+```
+
+The output will include only necessary code to run your application. The framework libraries size will be reduced noticeably.
+
+## ILLink Task Properties
+
+### ExtraArgs
+
+Additional [options](illink-options.md) passed to ILLink.
+
+### OutputDirectory
+
+The directory in which to place processed assemblies.
+
+### ReferenceAssemblyPaths
+
+Assembly files with paths to assemblies needed as references.
+
+### RootAssemblyNames
+
+The names of the assemblies to root. This should contain assembly names without an extension, not file names or
+paths.
+
+### RootDescriptorFiles
+
+A list of XML [descriptors](data-formats.md#descriptor-format) files specifying trimmer roots at a granular level.
+
+## ILLink Task Customization
+
+The trimmer can be invoked as an MSBuild task, `ILLink`. We recommend not using the task directly, because the SDK has built-in logic that handles computing the right set of reference assemblies as inputs, incremental trimming, and similar logic. If you would like to use the [advanced options](illink-options.md), you can invoke the msbuild task directly and pass any extra arguments like this:
+
+```xml
+
+```
+
+## Default Trimming Behavior
+
+The default in the .NET Core SDK is to trim framework assemblies only, in a conservative assembly-level mode (`copyused` action). Third-party libraries and the app will be analyzed but not trimmed. Other SDKs may modify these defaults.
+
+## Customizing Trimming Behavior
+
+`TrimMode` can be used to set the trimming behavior for framework assemblies. Additional assemblies can be given
+metadata `IsTrimmable` and they will also be trimmed using this mode, or they can have per-assembly `TrimMode` which
+takes precedence over the global `TrimMode`.
+
+## Reflection
+
+Note: this section is out-of-date. New versions of the trimmer can understand some of these reflection patterns.
+
+Applications or frameworks (including ASP.NET Core and WPF) that use reflection or related dynamic features will often break when trimmed, because the trimmer does not know about this dynamic behavior, and can not determine in general which framework types will be required for reflection at runtime. To trim such apps, you will need to tell the trimmer about any types needed by reflection in your code, and in packages or frameworks that you depend on. Be sure to test your apps after trimming.
+
+If your app or its dependencies use reflection, you may need to tell the trimmer to keep reflection targets explicitly. For example, dependency injection in ASP.NET Core apps will activate
+types depending on what is present at runtime, and therefore may fail
+if the trimmer has removed assemblies that would otherwise be
+present. Similarly, WPF apps may call into framework code depending on
+the features used. If you know beforehand what your app will require
+at runtime, you can tell the trimmer about this in a few ways.
+
+For example, an app may reflect over `System.IO.File`:
+```csharp
+Type file = System.Type.GetType("System.IO.File,System.IO.FileSystem");
+```
+
+To ensure that this works:
+
+- You can include a direct reference to the required type in your code
+ somewhere, for example by using `typeof(System.IO.File)`.
+
+- You can tell the trimmer to explicitly keep an assembly by adding it
+ to your csproj (use the assembly name *without* extension):
+
+ ```xml
+
+
+
+ ```
+
+- You can give the trimmer a more specific list of types or members to
+ include using an xml [descriptor](data-formats.md#descriptor-format) file
+
+ `.csproj`:
+ ```xml
+
+
+
+ ```
+
+ `TrimmerRoots.xml`:
+ ```xml
+
+
+
+
+
+ ```
+
+## Caveats
+
+Sometimes an application may include multiple versions of the same
+assembly. This may happen when portable apps include platform-specific
+managed code, which gets placed in the `runtimes` directory of the
+publish output. In such cases, the trimmer will pick one of the
+duplicate assemblies to analyze. This means that dependencies of the
+un-analyzed duplicates may not be included in the application, so you
+may need to root such dependencies manually.
diff --git a/docs/tools/illink/methods-kept-by-interface.md b/docs/tools/illink/methods-kept-by-interface.md
new file mode 100644
index 00000000000000..6c54714dd62314
--- /dev/null
+++ b/docs/tools/illink/methods-kept-by-interface.md
@@ -0,0 +1,106 @@
+# Interface Implementation Methods Marking
+#### (Does this method need to be kept due to the interface method it overrides)
+
+The following behavior is expected for interface methods. This logic could be used to begin marking and sweeping the `.Override` of a method since if the method isn't a dependency due to the interface/base type, we should be able to remove the methodImpl. Right now, the methodImpl is always kept if both the interface method and overriding method is kept, but that isn't always necessary.
+
+Whether or not a method implementing an interface method is required due to the _interface_ is affected by the following cases / possibilities (the method could still be kept for other reasons):
+- Base method is abstract or has a default implementation (`abstract` vs `virtual` in C#)
+- Method is Instance or Static
+- Implementing type is relevant to variant casting or not
+ - Relevant to variant casting means the type token appears, the type is passed as a type argument or array type, or is reflected over.
+- Base method is marked as used or not
+- Base method is from preserved scope or not
+- Implementing type is marked as instantiated or not
+- Interface Implementation is marked or not
+
+Note that in library mode, interface methods that can be accessed by COM or native code are marked by the ILLink.
+
+### If the interface implementation is not marked, do not mark the implementation method
+A type that doesn't implement the interface isn't required to have methods that implement the interface. However, a base type may have a public method that implements an interface on a derived type. If the interface implementation on the derived type is marked, then the method may be needed and we should go onto the next step.
+
+Cases left (bold means we know it is only one of the possible options now):
+- Base method is abstract or has a default implementation
+- Method is Instance or Static
+- Implementing type is relevant to variant casting or not
+- Base method is marked as used or not
+- Base method from preserved scope or not
+- Implementing type is marked as instantiated or not
+- __Interface Implementation is marked__
+
+### If the interface method is not marked and the interface doesn't come from a preserved scope, do not mark the implementation method
+Unmarked interface methods from `link` assemblies will be removed so the implementing method does not need to be kept.
+
+Cases left:
+- Base method is abstract or has a default implementation
+- Method is Instance or Static
+- Implementing type is relevant to variant casting or not
+- ~~Base method is marked as used or not~~
+- ~~Base method from preserved scope or not~~
+- _Base method is either marked as used or from preserved scope (combine above)_
+- Implementing type is marked as instantiated or not
+- __Interface Implementation is marked__
+
+### If the interface method is abstract, mark the implementation method
+The method is needed for valid IL.
+
+Cases left:
+- __Base method has a default implementation__
+- Method is Instance or Static
+- Implementing type is relevant to variant casting or not
+- Base method is marked as used or from preserved scope
+- Implementing type is marked as instantiated or not
+- __Interface Implementation is marked__
+
+### If the method is an instance method then mark the implementation method if the type is instantiated (or instantiable in library mode) and do not mark the implementation otherwise.
+An application can call the instance interface method if and only if the type is instantiated.
+
+Cases left:
+- __Base method has a default implementation__
+- __Method is Static__
+- Implementing type is relevant to variant casting or not
+- Base method is marked as used or from preserved scope
+- Implementing type is marked as instantiated or not
+- __Interface Implementation is marked__
+
+The use of static methods is not related to whether or not a type is instantiated or not.
+
+Cases left:
+- __Base method has a default implementation__
+- __Method is Static__
+- Implementing type is relevant to variant casting or not
+- Base method is marked as used or from preserved scope
+- __Interface Implementation is marked__
+
+### If the implementing type is relevant to variant casting, mark the implementation method.
+A static method may only be called through a constrained call if the type is relevant to variant casting.
+
+Cases left:
+- __Base method has a default implementation__
+- __Method is Static__
+- __Implementing type is not relevant to variant casting__
+- Base method is marked as used or from preserved scope
+- __Interface Implementation is marked__
+
+### If the interface method is in a preserved scope, mark the implementation method.
+We assume the implementing type could be relevant to variant casting in the preserved scope assembly and could be called, so we will keep the method.
+
+### Otherwise, do not mark the implementing method
+
+
+Summary:
+
+if __Interface Implementation is not marked__ then do not mark the implementation method.
+
+else if __Base method is marked as not used__ AND __Interface is not from preserved scope__ do not mark the implementation method
+
+else if __Base method does not have a default implementation__ then mark the implementation method
+
+else if __Implementation method is an instance method__ AND __Implementing type is instantiated__ then mark the implementation method
+
+else if __Implementation method is an instance method__ AND __Implementing type is not instantiated__ then do not mark the implementation method
+
+else if __Method is Static__ AND __Implementing type is relevant to variant casting__ then mark the implementation method
+
+else if __Method is Static__ AND __Interface method is from a preserved scope__ then mark the implementation method
+
+else do not mark the implementation method
diff --git a/docs/tools/illink/optimizations.md b/docs/tools/illink/optimizations.md
new file mode 100644
index 00000000000000..ef3b629ecf05a9
--- /dev/null
+++ b/docs/tools/illink/optimizations.md
@@ -0,0 +1,5 @@
+# Optimizations definitions
+
+## `unusedinterfaces` optimization
+
+The `unusedinterfaces` optimization controls whether or not trimming may remove the `interfaceimpl` annotation which denotes whether a class implements an interface. When the optimization is off, the ILLink tool will not remove the annotations regardless of the visibility of the interface (even private interface implementations will be kept). However, unused methods from interfaces may still be removed, as well as `.override` directives from methods that implement an interface method. When the optimization is on and the ILLink tool can provably determine that an interface will not be used on a type, the annotation will be removed. In order to know whether it is safe to remove an interface implementation, it is necessary to have a "global" view of the code. In other words, if an assembly is passed without selecting `link` for the `action` option for ILLink, all classes that implement interfaces from that assembly will keep those interface implementation annotations. For example, if you implement `System.IFormattable` from the `System.Runtime` assembly, but pass the assembly with `--action copy System.Runtime`, the interface implementation will be kept even if your code doesn't use it.
diff --git a/docs/tools/illink/serialization.md b/docs/tools/illink/serialization.md
new file mode 100644
index 00000000000000..d93f50bd8db3e0
--- /dev/null
+++ b/docs/tools/illink/serialization.md
@@ -0,0 +1,140 @@
+# Serialization
+
+Trimming tools cannot analyze the patterns typically used by reflection-based serializers. Such serializers should be annotated with `RequiresUnreferencedCodeAttribute`, and using them in a trimmed app will likely not work (or will work unpredictably). Trimming tools will produce static analysis [warnings](https://docs.microsoft.com/dotnet/core/deploying/trimming-options#analysis-warnings) for these patterns.
+
+If possible, avoid using reflection-based serializers with trimming, and prefer solutions based on source generators where the serialized types and all required members are statically referenced.
+
+As a last resort, trimming tools does have limited heuristics that can be enabled to keep _some_ of the types and members required for serialization, but this provides no correctness guarantees; apps which use reflection-based serializers are still considered "broken" as far as the static analysis can tell, and it is up to you to make sure that the app works as intended.
+
+Serialization discovery is disabled by default, and can be enabled by passing `--enable-serialization-discovery`.
+
+## History
+
+Trimming tools have historically been used for Xamarin scenarios that use reflection-based serializers like XmlSerializer, since before the introduction of the trim analysis warnings. There were limited heuristics to satisfy some simple uses of serializers. To provide backwards compatibility for such scenarios, trimming tools have built-in heuristics that makes some simple cases "just work", albeit in an opaque and unpredictable way.
+
+Consider disabling this behavior if possible, but it may be necessary when using legacy serializers that don't provide source generators or a similar solution that is statically analyzable. The following is a description of the heuristics for anyone who is unfortunate enough to have to rely on this behavior.
+
+## Heuristics
+
+There are four parts to the heuristics:
+- Activation: which conditions cause the discovered roots and their recursive types to be kept
+- Root discovery: logic to discover types and members are entry points to serialization
+- Type graph: recursive logic to build a set of types to consider for serialization, starting from the roots
+- Preservation logic: what the trimming tools do with the discovered types
+
+## Activation
+
+The heuristics will keep detected serialized types only when it sees that the app has a call to a serializer constructor:
+
+- `DataContractSerializer` or `DataContractJsonSerializer` ctors will cause types attributed with DataContractSerializer attributes and their type graph to be preserved
+- `XmlSerializer` ctor will cause types attributed with XmlSerializer attributes and their type graph to be preserved
+
+Even if the app contains attributed types for serialization, they will not be kept unless the serializer-specific construcrtor is called. Note that the preservation logic for a given serializer will be activated for all discovered types for that serializer, even if the constructor call doesn't actually serialize those types. For example:
+
+```csharp
+new XmlSerializer (typeof (Foo));
+var t = typeof (Bar);
+
+class Foo
+{
+ int removedField;
+}
+
+[XmlRoot]
+class Bar
+{
+ int keptField;
+}
+```
+
+Here, the call to the `XmlSerializer` ctor activates the serialization logic, causing `Bar` to be considered a root even though it is not the type being serialized (and `Foo` will not be considered a serializer root).
+
+## Root discovery
+
+The heuristics will discover types and members that satisfy _all_ of the following criteria:
+
+- The type, or the declaring type of the member, is used
+
+ There must be a statically discoverable reference to the type. In other words, if running trimming tools without the serialization heuristics removes a given type, then the heuristics will not discover it or any of its members as a serialization root.
+
+- The type or member is attributed with a serializer-specific attribute.
+
+ See the sections below about the attributes you can use for each serializer. The attribute must be present on the root type or member, including fields/properties/methods/events, public or private, though the serializers may not define attributes that can be placed on all member kinds.
+
+Note that passing a type directly to a serializer constructor is _not_ enough to keep it. We do not use dataflow to discover types. For example:
+
+```csharp
+new XmlSerializer (typeof (RootType)); // Will not consider RootType as one of the root types
+```
+
+This pattern will not consider the type passed into the constructor as a root type, even though it is statically analyzable in theory.
+
+### XMLSerializer attributes
+
+On any member supported by the attribute:
+- Any attribute named `Xml*Attribute` in the `System.Xml.Serialization` namespace
+ - _except_ `XmlIgnoreAttribute`
+
+### DataContractSerializer attributes
+
+On types:
+- `System.Runtime.Serialization.DataContractAttribute`
+
+On properties, fields, or events:
+- `System.Runtime.Serialization.DataMemberAttribute`
+
+## Type graph
+
+The heuristics will consider the following types based on the discovered roots:
+
+- The root type itself
+- The declaring type of a root member
+- The property or field type of a root property or field
+
+Starting with these types, the heuristics will recursively discover a set of types considered for serialization:
+
+- Base types
+ - including generic argument types
+- Types of public instance properties defined on the type
+ - a property is considered public if it has a public getter or setter
+ - including public properties of the base type
+ - including generic argument types
+- Types of public instance fields defined on the type
+ - including public fields of the base type
+ - including generic argument types
+
+Note that the types of implemented interfaces are not necessarily discovered.
+
+## Preservation logic
+
+For each discovered type (including root types and the recursive type graph), if the corresponding serializer is active, trimming tools will mark the type and the following members:
+
+- Public instance properties
+ - including public or private getters and setters for such properties
+- Public instance fields
+- Public parameterless instance constructors
+
+Note that in general, private members and static members are not preserved, nor are methods or events (other than the mentioned constructor).
+
+In addition, trimming tools mark:
+- Any discovered root members (from the attribute-based root discovery)
+ - including private members
+ - including static members
+ - including fields/properties/methods/events
+
+## What doesn't work
+
+Most features of reflection-based serializers will not work even with these heuristics. The following is an incomplete list of scenarios which will not work, unless the involved types are attributed as described above:
+
+- Serializing/deserializing types which are not attributed and don't have attributed members
+- Passing `typeof(MyType)` (directly or indirectly) into serializer constructors or methods
+- "Known type" mechanisms, such as:
+ - [`KnownTypeAttribute`](https://docs.microsoft.com/dotnet/api/system.runtime.serialization.knowntypeattribute?view=net-5.0)
+ - [`DataContractSerializer.KnownTypes`](https://docs.microsoft.com/dotnet/api/system.runtime.serialization.datacontractserializer.knowntypes?view=net-5.0)
+ - `extraTypes` argument of the [`XmlSerializer ctor`](https://docs.microsoft.com/dotnet/api/system.xml.serialization.xmlserializer.-ctor?view=net-5.0#System_Xml_Serialization_XmlSerializer__ctor_System_Type_System_Type___)
+- Serializing types which implement special interfaces
+ - [`ISerializable`](https://docs.microsoft.com/dotnet/api/system.runtime.serialization.iserializable?view=net-5.0)
+ - [`IXmlSerializable`](https://docs.microsoft.com/dotnet/api/system.xml.serialization.ixmlserializable?view=net-5.0)
+- Serializer-specific handling of collection types
+ - Types which implement [`ICollection`](https://docs.microsoft.com/dotnet/standard/serialization/examples-of-xml-serialization#serializing-a-class-that-implements-the-icollection-interface)
+ - Deserializing [`collection interfaces`](https://docs.microsoft.com/dotnet/framework/wcf/feature-details/collection-types-in-data-contracts#using-collection-interface-types-and-read-only-collections) into serializer-specific default types
diff --git a/docs/workflow/Codespaces.md b/docs/workflow/Codespaces.md
index 8473f17beb4ffe..74246c92808cef 100644
--- a/docs/workflow/Codespaces.md
+++ b/docs/workflow/Codespaces.md
@@ -1,40 +1,51 @@
# Using Codespaces
-Codespaces allows you to develop in a Docker container running in the cloud. You can use an in-browser version of VS Code or the full VS Code application with the [GitHub Codespaces VS Code Extension](https://marketplace.visualstudio.com/items?itemName=GitHub.codespaces). This means you don't need to install dotnet/runtime's prerequisites on your current machine in order to develop in dotnet/runtime.
+
+* [Create a Codespace](#create-a-codespace)
+* [Updating dotnet/runtime's Codespaces Configuration](#updating-dotnetruntimes-codespaces-configuration)
+* [Testing out your Changes](#testing-out-your-changes)
+
+Codespaces allows you to develop in a Docker container running in the cloud. You can use an in-browser version of VS Code or the full VS Code application with the [GitHub Codespaces VS Code Extension](https://marketplace.visualstudio.com/items?itemName=GitHub.codespaces). This means you don't need to install any prerequisites on your current machine in order to develop in _dotnet/runtime_.
## Create a Codespace
-dotnet/runtime runs a nightly GitHub Action to build the latest code in the repo. This allows you to immediately start developing and testing after creating a codespace without having to build the whole repo. When the machine is created, it will have built the repo using the code as of 6 AM UTC that morning.
+The _dotnet/runtime_ repo runs a nightly GitHub Action to build the latest code in it. This allows you to immediately start developing and testing after creating a Codespace without having to build the whole repo. When the machine is created, it will have built the repo using the code as of 6 AM UTC of that morning.
+
+1. From this [repository's root](https://github.com/dotnet/runtime), drop-down the _Code_ button and select the _Codespaces_ tab.
+
+
-1. From https://github.com/dotnet/runtime, drop-down the `Code` button and select the `Codespaces` tab.
+2. Click the drop-down at the side of the `Create codespace on main` button and select `Configure and create codespace`
-
+
-2. Select the Machine type. For dotnet/runtime, it is recommended to select at least a `4-core` machine. You can also verify that a "Prebuild" is ready.
+3. Select which Dev container configuration you want to use.
-
+
+* For `libraries` work, pick `.devcontainer/libraries/devcontainer.json`.
+* For `WASM` work, pick `.devcontainer/wasm/devcontainer.json`.
-*If these instructions are out of date, see https://docs.github.com/codespaces/developing-in-codespaces/creating-a-codespace#creating-a-codespace for instructions on how to create a new codespace.*
+4. Select the Machine type. For `dotnet/runtime`, it is recommended to select at least a `4-core` machine. You can also verify that a `Prebuild` is ready.
+
+
+
+_If these instructions are out of date, see for instructions on how to create a new Codespace._
## Updating dotnet/runtime's Codespaces Configuration
The Codespaces configuration is spread across the following places:
-1. The [.devcontainer](../../.devcontainer) folder contains:
- - `devcontainer.json` file configures the codespace and mostly has VS Code settings
- - The Dockerfile used to create the image
- - The `scripts` folder contains any scripts that are executed during the creation of the codespace. This has the build command that builds the entire repo for prebuilds.
-2. The GitHub Action can be configured by following the instructions at https://docs.github.com/codespaces/prebuilding-your-codespaces/configuring-prebuilds.
-
-To test out changes to the `.devcontainer` files, you can follow the process in [Applying changes to your configuration](https://docs.github.com/codespaces/customizing-your-codespace/configuring-codespaces-for-your-project#applying-changes-to-your-configuration) docs. This allows you to rebuild the Codespace privately before creating a PR.
+1. The [.devcontainer](/.devcontainer) folder contains subfolders for each development scenario:
+ * _Libraries_: Used by developers working in `src/libraries`.
+ * _Wasm_: Used by developers working on the _browser-wasm_ workload.
+ * _Scripts_: Contains any scripts that are executed during the creation of the codespace. This has the build command that builds the entire repo for prebuilds.
+2. Each development scenario folder contains the following files:
+ * The `devcontainer.json` file that configures the codespace and has VS Code / Environment settings.
+ * The _Dockerfile_ used to create the Docker image
+3. The GitHub Action can be configured by following the instructions at .
-To test out your `.yml` changes, here is the process:
+To test out changes to the `.devcontainer` files, you can follow the process in the [Applying Changes to your Configuration](https://docs.github.com/codespaces/customizing-your-codespace/configuring-codespaces-for-your-project#applying-changes-to-your-configuration) docs. This allows you to rebuild the Codespace privately before creating a PR.
-**Note**: *Executing these steps will overwrite the current prebuilt container for the entire repo. Afterwards, anyone creating a new codespace will get a prebuilt machine with your test changes until the Action in `main` is executed again.*
+## Testing out your Changes
-1. Edit and commit the files to a branch.
-2. Push that to a branch on dotnet/runtime. Be careful that you aren't pushing to `main` or some other important branch. Prefix your branch name with your GitHub account name, so others know it is a dev branch. ex. `username/FixCodespaces`.
-3. In the "Actions" tab at the top of dotnet/runtime:
- - Select "Create Codespaces Prebuild" action on the left
- - On the right click "Run workflow" and pick your branch
- - After it runs, try to create a codespace
+To test out your changes you can run the [Codespaces Prebuilds Action](https://github.com/dotnet/runtime/actions/workflows/codespaces/create_codespaces_prebuilds) in your fork against a branch with your changes.
diff --git a/docs/workflow/README.md b/docs/workflow/README.md
index ea2d180600bcc8..7f5d80edc41f58 100644
--- a/docs/workflow/README.md
+++ b/docs/workflow/README.md
@@ -1,6 +1,12 @@
# Workflow Guide
-The repo can be built for the following platforms, using the provided setup and the following instructions. Before attempting to clone or build, please check these requirements.
+* [Build Requirements](#build-requirements)
+* [Getting Yourself Started](#getting-yourself-started)
+* [Configurations and Subsets](#configurations-and-subsets)
+ * [What does this mean for me?](#what-does-this-mean-for-me)
+* [Full Instructions on Building and Testing the Runtime Repo](#full-instructions-on-building-and-testing-the-runtime-repo)
+
+The repo can be built for the following platforms, using the provided setup and the following instructions. Before attempting to clone or build, please check the requirements that match your machine, and ensure you install and prepare all as necessary.
## Build Requirements
@@ -12,81 +18,76 @@ The repo can be built for the following platforms, using the provided setup and
| ARM64 | ✔ | ✔ | ✔ | |
| | [Requirements](requirements/windows-requirements.md) | [Requirements](requirements/linux-requirements.md) | [Requirements](requirements/macos-requirements.md) | [Requirements](requirements/freebsd-requirements.md)
-Before proceeding further, please click on the link above that matches your machine and ensure you have installed all the prerequisites for the build to work.
-
Additionally, keep in mind that cloning the full history of this repo takes roughly 400-500 MB of network transfer, inflating to a repository that can consume somewhere between 1 to 1.5 GB. A build of the repo can take somewhere between 10 and 20 GB of space for a single OS and Platform configuration depending on the portions of the product built. This might increase over time, so consider this to be a minimum bar for working with this codebase.
-## Concepts
-
-The runtime repo can be built from a regular, non-administrator command prompt, from the root of the repo, as follows:
-
-For Linux and macOS
-```bash
-./build.sh
-```
-
-For Windows:
-```cmd
-build.cmd
-```
+## Getting Yourself Started
-This builds the product (in the default debug configuration), but not the tests.
+The runtime repo can be built from a regular, non-administrator command prompt, from the root of the repo.
-For information about the different options available, supply the argument `--help|-h` when invoking the build script:
-```
-build -h
-```
+The repository currently consists of three different major parts:
-On Unix like systems, arguments can be passed in with a single `-` or double hyphen `--`.
+* The Runtimes
+* The Libraries
+* The Installer
-The repository currently consists of different major parts: the runtimes, the libraries, and the installer.
-To build just one part you use the root build script (build.cmd/sh), and you add the `-subset` flag.
+More info on this, as well as the different build configurations in the [Configurations and Subsets section](#configurations-and-subsets).
-## Editing and Debugging
+This was a concise introduction and now it's time to show the specifics of building specific subsets in any given supported platform, since most likely you will want to customize your builds according to what component(s) you're working on, as well as how you configured your build environment. We have links to instructions depending on your needs [in this section](#full-instructions-on-building-and-testing-the-runtime-repo).
-For instructions on how to edit code and debug your changes, see [Editing and Debugging](editing-and-debugging.md).
+* For instructions on how to edit code and make changes, see [Editing and Debugging](editing-and-debugging.md).
+* For instructions on how to debug CoreCLR, see [Debugging CoreCLR](/docs/workflow/debugging/coreclr/debugging-runtime.md).
+* For instructions on using GitHub Codespaces, see [Codespaces](/docs/workflow/Codespaces.md).
-For instructions on using GitHub Codespaces, see [Codespaces](Codespaces.md).
-
-## Configurations
+## Configurations and Subsets
You may need to build the tree in a combination of configurations. This section explains why.
-A quick reminder of some concepts -- see the [glossary](../project/glossary.md) for more on these:
+
+A quick reminder of some concepts -- see the [glossary](/docs/project/glossary.md) for more on these:
* **Debug Configuration** -- Non-optimized code. Asserts are enabled.
-* **Checked Configuration** -- Optimized code. Asserts are enabled. Only relevant to CoreCLR runtime.
-* **Release Configuration** -- Optimized code. Asserts are disabled. Runs at the best speed, and suitable for performance profiling. You will have limited debugging experience.
+* **Checked Configuration** -- Optimized code. Asserts are enabled. _Only relevant to CoreCLR runtime._
+* **Release Configuration** -- Optimized code. Asserts are disabled. Runs at the best speed, and suitable for performance profiling. This will impact the debugging experience due to compiler optimizations that make understanding what the debugging is showing difficult to reason about, relative to the source code.
When we talk about mixing configurations, we're discussing the following sub-components:
+
* **Runtime** is the execution engine for managed code and there are two different implementations available. Both are written in C/C++, therefore, easier to debug when built in a Debug configuration.
- * CoreCLR is the comprehensive execution engine which, if built in Debug Configuration, executes managed code very slowly. For example, it will take a long time to run the managed code unit tests. The code lives under [src/coreclr](../../src/coreclr).
- * Mono is portable and also slimmer runtime and it's not that sensitive to Debug Configuration for running managed code. You will still need to build it without optimizations to have good runtime debugging experience though. The code lives under [src/mono](../../src/mono).
-* **CoreLib** (also known as System.Private.CoreLib) is the lowest level managed library. It has a special relationship to the runtimes and therefore it must be built in the matching configuration, e.g., if the runtime you are using was built in a Debug configuration, this must be in a Debug configuration. The runtime agnostic code for this library can be found at [src/libraries/System.Private.CoreLib/src](../../src/libraries/System.Private.CoreLib/src/README.md).
-* **Libraries** is the bulk of the dlls that are oblivious to the configuration that runtimes and CoreLib were built in. They are most debuggable when built in a Debug configuration, and, happily, they still run sufficiently fast in that configuration that it's acceptable for development work. The code lives under [src/libraries](../../src/libraries).
+ * CoreCLR is the comprehensive execution engine which, if built in Debug Configuration, executes managed code very slowly. For example, it will take a long time to run the managed code unit tests. The code lives under [src/coreclr](/src/coreclr).
+ * Mono is a portable and also slimmer runtime and it's not that sensitive to Debug Configuration for running managed code. You will still need to build it without optimizations to have good runtime debugging experience though. The code lives under [src/mono](/src/mono).
+* **CoreLib** (also known as System.Private.CoreLib) is the lowest level managed library. It has a special relationship to the runtimes and therefore it must be built in the matching configuration, e.g., if the runtime you are using was built in a Debug configuration, this must be in a Debug configuration. The runtime agnostic code for this library can be found at [src/libraries/System.Private.CoreLib/src](/src/libraries/System.Private.CoreLib/src/README.md).
+* **Libraries** is the bulk of the dlls that are oblivious to the configuration that runtimes and CoreLib were built in. They are most debuggable when built in a Debug configuration, and happily, they still run sufficiently fast in that configuration that it's acceptable for development work. The code lives under [src/libraries](/src/libraries).
+
+
+To build just one part of the repo, you add the `-subset` flag with the subset you wish to build to the root build script _(build.cmd/sh)_. You can specify more than one by linking them with the `+` operator (e.g. `-subset clr+libs` would build CoreCLR and the libraries). Note that if the subset is the first argument you pass to the script, you can omit the `--subset` flag altogether.
### What does this mean for me?
-At this point you probably know what you are planning to work on primarily: the runtimes or libraries.
+At this point you probably know what you are planning to work on primarily: the runtimes or libraries. As general suggestions on how to proceed, here are some ideas:
+
+* If you're working in runtimes, you may want to build everything in the Debug configuration, depending on how comfortable you are debugging optimized native code.
+* If you're working in libraries, you will want to use debug libraries with a release version of runtime and CoreLib, because the tests will run faster.
+* If you're working in CoreLib - you probably want to try to get the job done with release runtime and CoreLib, and fall back to debug if you need to. The [Building Libraries](/docs/workflow/building/libraries/README.md) document explains how you'll do this.
-* if you're working in runtimes, you may want to build everything in the Debug configuration, depending on how comfortable you are debugging optimized native code.
-* if you're working in libraries, you will want to use debug libraries with a release version of runtime and CoreLib, because the tests will run faster.
-* if you're working in CoreLib - you probably want to try to get the job done with release runtime and CoreLib, and fall back to debug if you need to. The [Building Libraries](building/libraries/README.md) document explains how you'll do this.
+## Full Instructions on Building and Testing the Runtime Repo
-Now you know about configurations and how we use them, you will want to read how to build what you plan to work on. Pick one of these:
+Now you know about configurations and how we use them, so now you will want to read how to build what you plan to work on. Each of these will have further specific instructions or links for whichever platform you are developing on.
-- [Building CoreCLR runtime](building/coreclr/README.md)
-- [Building Mono runtime](building/mono/README.md)
-- [Building Libraries](building/libraries/README.md)
+* [Building CoreCLR runtime](/docs/workflow/building/coreclr/README.md)
+* [Building Mono runtime](/docs/workflow/building/mono/README.md)
+* [Building Libraries](/docs/workflow/building/libraries/README.md)
After that, here's information about how to run tests:
-- [Testing CoreCLR runtime](testing/coreclr/testing.md)
-- [Testing Mono runtime](testing/mono/testing.md)
-- [Testing Libraries](testing/libraries/testing.md)
+* [Testing CoreCLR runtime](/docs/workflow/testing/coreclr/testing.md)
+* [Testing Mono runtime](/docs/workflow/testing/mono/testing.md)
+* [Testing Libraries](/docs/workflow/testing/libraries/testing.md)
And how to measure performance:
-- [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)
-- [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md)
+* [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)
+* [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md)
+
+## Warnings as Errors
+
+The repo build treats warnings as errors. Dealing with warnings when you're in the middle of making changes can be annoying (e.g. unused variable that you plan to use later). To disable treating warnings as errors, set the `TreatWarningsAsErrors` environment variable to `false` before building. This variable will be respected by both the `build.sh`/`build.cmd` root build scripts and builds done with `dotnet build` or Visual Studio. Some people may prefer setting this environment variable globally in their machine settings.
diff --git a/docs/workflow/building/coreclr/README.md b/docs/workflow/building/coreclr/README.md
index 8722813dc57438..fbc1eab77c7289 100644
--- a/docs/workflow/building/coreclr/README.md
+++ b/docs/workflow/building/coreclr/README.md
@@ -1,56 +1,100 @@
-# Building
+# Building CoreCLR
-These are instructions for building the common form of CoreCLR on common platforms. For instructions on particular form factors, see also [Build NativeAOT](nativeaot.md), [Build CoreCLR on Linux](linux-instructions.md), [Build CoreCLR on OS X](osx-instructions.md), [Build CoreCLR on FreeBSD](freebsd-instructions.md),
-[Cross Compilation for ARM on Windows](cross-building.md), [Cross Compilation for Android on Linux](android.md).
+* [Introduction](#introduction)
+* [Common Building Options](#common-building-options)
+ * [Build Drivers](#build-drivers)
+ * [Extra Flags](#extra-flags)
+ * [Build Results Layout](#build-results-layout)
+* [Platform-Specific Instructions](#platform-specific-instructions)
+* [Testing CoreCLR](#testing-coreclr)
-To build just CoreCLR, use the `-subset` flag to the `build.sh` (or `build.cmd`) script at the repo root:
+## Introduction
-For Linux:
-```
-./build.sh -subset clr
+Here is a brief overview on how to build the common form of CoreCLR in general. For further specific instructions on each platform, we have links to instructions later on in [Platform-Specific Instructions](#platform-specific-instructions).
+
+To build just CoreCLR, use the `subset` flag to the `build.sh` or `build.cmd` script at the repo root. Note that specifying `-subset` explicitly is not necessary if it is the first argument (i.e. `./build.sh --subset clr` and `./build.sh clr` are equivalent). However, if you specify any other argument beforehand, then you must specify the `-subset` flag.
+
+For Linux and macOS:
+
+```bash
+./build.sh --subset clr
```
For Windows:
-```
-build.cmd -subset clr
-```
-Specifying `-subset` explicitly is not necessary if it is the first argument: `./build -subset clr` and `./build clr` are equivalent.
-By default, build generates a 'debug' build type, that includes asserts and is easier for some people to debug. If you want to make performance measurements, or just want tests to execute more quickly, you can also build the 'release' version (which does not have these checks) by adding the flag `-configuration release` (or `-c release`), for example:
-```
-./build.sh -subset clr -configuration release
+```cmd
+.\build.cmd -subset clr
```
-CoreCLR also supports a 'checked' build type which has asserts enabled like 'debug', but is built with the native compiler optimizer enabled, so it runs much faster. This is the usual mode used for running tests in the CI system. You can build that using, for example:
+## Common Building Options
+
+By default, the script generates a _Debug_ build type, which is not optimized code and includes asserts. As its name suggests, this makes it easier and friendlier to debug the code. If you want to make performance measurements, you ought to build the _Release_ version instead, which doesn't have any asserts and has all code optimizations enabled. Likewise, if you plan on running tests, the _Release_ configuration is more suitable since it's considerably faster than the _Debug_ one. For this, you add the flag `-configuration release` (or `-c release`). For example:
+
+```bash
+./build.sh --subset clr --configuration release
```
-./build.sh -subset clr -configuration checked
+
+As mentioned before in the [general building document](/docs/workflow/README.md#configurations-and-subsets), CoreCLR also supports a _Checked_ build type which has asserts enabled like _Debug_, but is built with the native compiler optimizer enabled, so it runs much faster. This is the usual mode used for running tests in the CI system.
+
+Now, it is also possible to select a different configuration for each subset when building them together. The `--configuration` flag applies universally to all subsets, but it can be overridden with any one or more of the following ones:
+
+* `--runtimeConfiguration (-rc)`: Flag for the CLR build configuration.
+* `--librariesConfiguration (-lc)`: Flag for the libraries build configuration.
+* `--hostConfiguration (-hc)`: Flag for the host build configuration.
+
+For example, a very common scenario used by developers and the repo's test scripts with default options, is to build the _clr_ in _Debug_ mode, and the _libraries_ in _Release_ mode. To achieve this, the command-line would look like the following:
+
+```bash
+./build.sh --subset clr+libs --configuration Release --runtimeConfiguration Debug
```
-If you want to use Ninja to drive the native build instead of Make on non-Windows platforms, you can pass the `-ninja` flag to the build script as follows:
+Or alternatively:
+
+```bash
+./build.sh --subset clr+libs --librariesConfiguration Release --runtimeConfiguration Debug
```
-./build.cmd -subset clr -ninja
+
+For more information about all the different options available, supply the argument `-help|-h` when invoking the build script. On Unix-like systems, non-abbreviated arguments can be passed in with a single `-` or double hyphen `--`.
+
+### Build Drivers
+
+If you want to use _Ninja_ to drive the native build instead of _Make_ on non-Windows platforms, you can pass the `-ninja` flag to the build script as follows:
+
+```bash
+./build.sh --subset clr --ninja
```
-If you want to use Visual Studio's MSBuild to drive the native build on Windows, you can pass the `-msbuild` flag to the build script similarly to the `-ninja` flag.
+If you want to use Visual Studio's _MSBuild_ to drive the native build on Windows, you can pass the `-msbuild` flag to the build script similarly to the `-ninja` flag.
+
+We recommend using _Ninja_ for building the project on Windows since it more efficiently uses the build machine's resources for the native runtime build in comparison to Visual Studio's _MSBuild_.
-We recommend using Ninja for building the project on Windows since it more efficiently uses the build machine's resources for the native runtime build in comparison to Visual Studio's MSBuild.
+### Extra Flags
To pass extra compiler/linker flags to the coreclr build, set the environment variables `EXTRA_CFLAGS`, `EXTRA_CXXFLAGS` and `EXTRA_LDFLAGS` as needed. Don't set `CFLAGS`/`CXXFLAGS`/`LDFLAGS` directly as that might lead to configure-time tests failing.
-This will produce outputs as follows:
+### Build Results Layout
+
+Once the build has concluded, it will have produced its output artifacts in the following structure:
+
+* Product binaries will be dropped in `artifacts\bin\coreclr\..` folder.
+* A NuGet package, _Microsoft.Dotnet.CoreCLR_, will be created under `artifacts\bin\coreclr\..\.nuget` folder.
+* Test binaries (if built) will be dropped under `artifacts\tests\coreclr\..` folder. However, remember the root build script will not build the tests. The instructions for working with tests (building and running) are [in the testing doc](/docs/workflow/testing/coreclr/testing.md).
+* The build places logs in `artifacts\log` and these are useful when the build fails.
+* The build places all of its intermediate output in the `artifacts\obj\coreclr` directory.
-- Product binaries will be dropped in `artifacts\bin\coreclr\..` folder.
-- A NuGet package, Microsoft.Dotnet.CoreCLR, will be created under `artifacts\bin\coreclr\..\.nuget` folder.
-- Test binaries will be dropped under `artifacts\tests\coreclr\..` folder. However, the root build script will not build the tests.
+If you want to force a full rebuild of the subsets you specified when calling the build script, pass the `-rebuild` flag to it, in addition to any other arguments you might require.
-The build places logs in `artifacts\log` and these are useful when the build fails.
+## Platform-Specific Instructions
-The build places all of its intermediate output in the `artifacts\obj\coreclr` directory, so if you remove that directory you can force a
-full rebuild.
+Now that you've got the general idea on how the _CoreCLR_ builds work, here are some further documentation links on platform-specific caveats and features.
-To build CoreCLR, the root build script invokes the `src\coreclr\build.cmd` (or build.sh) script. To build the CoreCLR tests, you must use this script.
-Use `build -?` to learn about the options to this script.
+* [Build CoreCLR on Windows](windows-instructions.md)
+* [Build CoreCLR on macOS](macos-instructions.md)
+* [Build CoreCLR on Linux](linux-instructions.md)
+* [Build CoreCLR on FreeBSD](freebsd-instructions.md)
-See [Running Tests](../../testing/coreclr/testing.md) for instructions on running the tests.
+We also have specific instructions for building _NativeAOT_ [here](/docs/workflow/building/coreclr/nativeaot.md).
+## Testing CoreCLR
+For testing your build, the [testing docs](/docs/workflow/testing/coreclr/testing.md) have detailed instructions on how to do it.
diff --git a/docs/workflow/building/coreclr/cross-building.md b/docs/workflow/building/coreclr/cross-building.md
index 73c64b55cced89..993ce2c76cbd90 100644
--- a/docs/workflow/building/coreclr/cross-building.md
+++ b/docs/workflow/building/coreclr/cross-building.md
@@ -1,184 +1,163 @@
-Cross Compilation for ARM on Windows
-==================================
+# Cross-Building for Different Architectures and Operating Systems
-Building ARM for Windows can be done using cross compilation.
+* [Windows Cross-Building](#windows-cross-building)
+ * [Cross-Compiling for ARM32 and ARM64 on Windows](#cross-compiling-for-arm32-and-arm64-on-windows)
+ * [Cross-Compiling for x86 on Windows](#cross-compiling-for-x86-on-windows)
+* [macOS Cross-Building](#macos-cross-building)
+* [Linux Cross-Building](#linux-cross-building)
+ * [Generating the ROOTFS](#generating-the-rootfs)
+ * [ROOTFS for FreeBSD](#rootfs-for-freebsd)
+ * [Cross-Compiling CoreCLR](#cross-compiling-coreclr)
+ * [CoreCLR for FreeBSD](#coreclr-for-freebsd)
+ * [Cross-Compiling CoreCLR for other VFP Configurations](#cross-compiling-coreclr-for-other-vfp-configurations)
+ * [Building the Cross-Targeting Tools](#building-the-cross-targeting-tools)
+* [Cross-Building using Docker](#cross-building-using-docker)
+ * [Cross-Compiling for ARM32 and ARM64 with Docker](#cross-compiling-for-arm32-and-arm64-with-docker)
+ * [Cross-Compiling for FreeBSD with Docker](#cross-compiling-for-freebsd-with-docker)
-Requirements
-------------
+This guide will go more in-depth on how to do cross-building across multiple operating systems and architectures. It's worth mentioning this is not an any-to-any scenario. Only the combinations explained here are possible/supported. If/When any other combinations get supported/discovered, this document will get updated accordingly.
-Install the ARM tools and Windows SDK, as described [here](https://github.com/dotnet/runtime/blob/main/docs/workflow/requirements/windows-requirements.md).
+## Windows Cross-Building
-Cross compiling CoreCLR
------------------------
+This section will go over cross-compiling on Windows. Currently, Windows allows you to cross-compile from x64 to basically any other architecture.
-Build using "arm" as the architecture. For example:
+### Cross-Compiling for ARM32 and ARM64 on Windows
- C:\runtime> build.cmd -subset clr.runtime -arch arm -c debug
+To do cross-compilation for ARM32/ARM64 on Windows, first make sure you have the appropriate tools and Windows SDK installed. This is described in detail in the [Windows requirements doc](/docs/workflow/requirements/windows-requirements.md#visual-studio).
--or-
+Once you have all the required dependencies, it is a straightforward process. Windows knows how to cross-build behind curtains, so all you have to do is specify which architecture you want to build for:
- C:\runtime> src\coreclr\build-runtime.cmd -arm -debug
-
-Cross Compilation for ARM64 on macOS
-================================================
-
-The toolset required to do native compilation described in [macOS requirements](https://github.com/dotnet/runtime/blob/main/docs/workflow/requirements/macos-requirements.md) has cross compilation capabilities with no additional installs required. The only needed change is to use the `-cross` flag in the build scripts. For example, a release CoreCLR runtime that targets ARM64 can be built using the following commandline from the root of the repo:
-
- ./build.sh -subset clr.runtime -c release -cross -arch arm64 /p:CrossBuild=true
-
-Cross Compilation for ARM, ARM64 or x86 on Linux
-================================================
-
-Through cross compilation, on Linux it is possible to build CoreCLR for arm or arm64. Note that this documentation exists to explain using `runtime/eng/common/build-rootfs.sh`. This will build a rootfs and then use it to cross build. Newer documentation [linux-instructions.md](linux-instructions.md) exists which leverages docker to use a prebuilt environment to cross build.
-
-Requirements for targeting Debian based distros
-------------------------------------------------
-
-You need a Debian based host and the following packages need to be installed:
-
- ~/runtime/ $ sudo apt-get install qemu qemu-user-static binfmt-support debootstrap
+```cmd
+.\build.cmd -s clr -c Release -arch arm64
+```
-In addition, to cross compile CoreCLR the binutils for the target are required. So for arm you need:
+### Cross-Compiling for x86 on Windows
- ~/runtime/ $ sudo apt-get install binutils-arm-linux-gnueabihf
+Building for x86 doesn't require any additional software installed or configured, since all the x64 build tools also have the capability of building for x86. Just specify it when calling the build script:
-and conversely for arm64:
+```cmd
+.\build.cmd -s clr -c Release -arch x86
+```
- ~/runtime/ $ sudo apt-get install binutils-aarch64-linux-gnu
+## macOS Cross-Building
-and for armel (ARM softfp):
+This section will go over cross-compiling on macOS. Currently, macOS allows you to cross-compile between x64 and ARM64.
- ~/runtime/ $ sudo apt-get install binutils-arm-linux-gnueabi
+Similarly to targeting Windows x86, the native tooling you installed back in the [macOS requirements doc](/docs/workflow/requirements/macos-requirements.md) has the capabilities to effectuate the cross-compilation. You have simply to pass the `-cross` flag, along with the designated architecture. For example, for an arm64 build on an Intel x64 Mac:
+```bash
+./build.sh -s clr -c Release --cross -a arm64
+```
-Requirements for targeting ARM or ARM64 Alpine Linux
------------------------------------------------------
+## Linux Cross-Building
-You can use any Linux distro as a host. The qemu, qemu-user-static and binfmt-support packages need to be installed (the names may be different for some distros).
+This section will go over cross-compiling on Linux. Currently, Linux allows you to cross-compile from x64 to ARM32 and ARM64, as well as to other Unix-based operating systems, like FreeBSD and Alpine.
-In addition, to cross compile CoreCLR, the binutils for Alpine need to be built from the https://github.com/richfelker/musl-cross-make repo, since they are not available as packages.
+### Generating the ROOTFS
-To build them, use the following steps:
-* Clone the repo
-* Create a new config.mak file in the root directory of the repo and add the following lines into it:
- * `TARGET = armv6-alpine-linux-musleabihf` for ARM or `TARGET = aarch64-alpine-linux-musl` for ARM64
- * `OUTPUT = /usr`
- * `BINUTILS_CONFIG=--enable-gold=yes`
-* Run `make` with current directory set to the root of the repo
-* Run `sudo make install`
+Before you can attempt to do any Linux cross-building, you will need to generate the _ROOTFS_ corresponding to the platform you want to target. The script located in `eng/common/cross/build-rootfs.sh` is in charge of effectuating this task. Note that this script must be run with `sudo`, as it needs to make some symlinks to the system that would not be allowed otherwise.
-Generating the rootfs
----------------------
-The `eng/common/cross/build-rootfs.sh` script can be used to download the files needed for cross compilation. It will generate a rootfs as this is what CoreCLR targets.
+For example, let's try generating a _ROOTFS_ targeting Ubuntu 18 (Bionic) for ARM64:
- Usage: ./eng/common/cross/build-rootfs.sh [BuildArch] [LinuxCodeName] [lldbx.y] [--skipunmount]
- BuildArch can be: arm(default), armel, arm64, x86
- LinuxCodeName - optional, Code name for Linux, can be: trusty(default), vivid, wily, xenial or alpine. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen.
- lldbx.y - optional, LLDB version, can be: lldb3.6(default), lldb3.8. This is ignored when building rootfs for Alpine Linux.
+```bash
+sudo ./eng/common/cross/build-rootfs.sh arm64 bionic
+```
-The `build-rootfs.sh` script must be run as root as it has to make some symlinks to the system, it will by default generate the rootfs in `eng/common/cross/rootfs/` however this can be changed by setting the `ROOTFS_DIR` environment variable.
+The _rootfs_ binaries will be placed in `.tools/rootfs/`. So, for this example, it would be `.tools/rootfs/arm64`. Note that the Linux codename argument is optional, and if you omit it, the script will pick its default one.
-For example, to generate an arm rootfs:
+It is also possible to have `build-rootfs.sh` generate its output elsewhere. For that, you have to set the environment variable `ROOTFS_DIR` to the path where you want your _rootfs_ binaries to be placed in.
- ~/runtime/ $ sudo ./eng/common/cross/build-rootfs.sh arm
+#### ROOTFS for FreeBSD
-You can choose Linux code name to match your target, give `vivid` for `Ubuntu 15.04`, `wily` for `Ubuntu 15.10`. The default is `trusty`, version `Ubuntu 14.04`.
+Generating the _ROOTFS_ for FreeBSD cross-compiling is virtually the same as for other Linux distributions in other architectures. The only difference is you have to specify it so. For example, for an x64 cross-compilation for FreeBSD 13:
- ~/runtime/ $ sudo ./eng/common/cross/build-rootfs.sh arm wily
+```bash
+sudo ./eng/common/cross/build-rootfs.sh x64 freebsd13
+```
-and if you wanted to generate the rootfs elsewhere:
+### Cross-Compiling CoreCLR
- ~/runtime/ $ sudo ROOTFS_DIR=/home/cross/arm ./eng/common/cross/build-rootfs.sh arm
+Once you have your _ROOTFS_ generated, make sure to set the environment variable `ROOTFS_DIR` to where your binaries are located if you didn't do so in the previous step. Then, build normally and pass the `--cross` flag to the build script:
-For example, to generate an armel rootfs:
+```bash
+export ROOTFS_DIR=/path/to/runtime/.tools/rootfs/arm64
+./build.sh --subset clr --configuration Release --arch arm64 --cross
+```
- ~/runtime/ $ sudo ./eng/common/cross/build-rootfs.sh armel
+Like with any other build, you'll find the built binaries at `artifacts/bin/coreclr/Linux..`. For our example, it would be `artifacts/bin/coreclr/Linux.arm64.Release`.
-You can choose code name to match your target, give `jessie` for `Debian`, `tizen` for `Tizen`. The default is `jessie`.
+#### CoreCLR for FreeBSD
- ~/runtime/ $ sudo ./eng/common/cross/build-rootfs.sh armel tizen
+Very similarly to generating the _ROOTFS_, cross-building for FreeBSD follows the same process as for other architectures, which is described above. The only difference is that, in addition to the `--cross` flag, you also have to specify it is for FreeBSD by means of the `--os` flag:
-and if you wanted to generate the rootfs elsewhere:
+```bash
+export ROOTFS_DIR=/path/to/runtime/.tools/rootfs/x64
+./build.sh --subset clr --configuration Release --cross --os freebsd
+```
- ~/runtime/ $ sudo ROOTFS_DIR=/home/armel ./eng/common/cross/build-rootfs.sh armel tizen
+#### Cross-Compiling CoreCLR for other VFP Configurations
+The default ARM compilation configuration for CoreCLR is armv7-a with thumb-2 instruction set, and VFPv3 floating point with 32 64-bit FPU registers.
-Cross compiling CoreCLR
------------------------
-`ROOTFS_DIR` must be set when running `build-runtime.sh`.
+CoreCLR JIT requires 16 64-bit or 32 32-bit FPU registers.
- ~/runtime/ $ ROOTFS_DIR=/home/arm ./build.sh --subset clr.runtime --arch arm -c debug -v verbose --cross
+A set of FPU configuration options have been provided in the build scripts to accommodate different CPU types. These FPU configuration options are:
--or-
+* _CLR\_ARM\_FPU\_TYPE_: Translates to a value given to the `-mfpu` compiler option. Please refer to your compiler documentation for possible options.
+* _CLR\_ARM\_FPU\_CAPABILITY_: Used by the PAL code to decide which FPU registers should be saved and restored during context switches (the supported options are 0x3 and 0x7):
+ * Bit 0 unused always set to 1.
+ * Bit 1 corresponds to 16 64-bit FPU registers.
+ * Bit 2 corresponds to 32 64-bit FPU registers.
- ~/runtime/ $ ROOTFS_DIR=/home/arm ./src/coreclr/build-runtime.sh -arm -debug -verbose -cross
+For example, if you wanted to support armv7 CPU with VFPv3-d16, you'd use the following compile options:
-As usual, the resulting binaries will be found in `artifacts/bin/coreclr/TargetOS.BuildArch.BuildType/`
+```bash
+./build.sh --subset clr --configuration Release --cross --arch arm --cmakeargs "-DCLR_ARM_FPU_CAPABILITY=0x3" --cmakeargs "-DCLR_ARM_FPU_TYPE=vfpv3-d16"
+```
-Cross compiling CoreCLR for Other VFP configurations
-----------------------------------------------------------
-The default arm compilation configuration for CoreCLR is armv7-a with thumb-2 instruction set and
-VFPv3 floating point with 32 64-bit FPU registers.
+### Building the Cross-Targeting Tools
-CoreCLR JIT requires 16 64-bit or 32 32-bit FPU registers.
+Certain parts of the build process need some native components that are built for the current machine architecture, regardless of whichever you are targeting. These tools are referred to as cross-targeting tools or "cross tools". There are two categories of these tools today:
-A set of FPU configuration options have been provided via build-runtime.sh to accommodate different CPU types.
-These FPU configuration options are: CLR_ARM_FPU_CAPABILITY and CLR_ARM_FPU_TYPE.
+* Crossgen2 JIT Tools
+* Diagnostic Libraries
-CLR_ARM_FPU_TYPE translates to a value given to -mfpu compiler option. Please refer to
-your compiler documentation for possible options.
+The Crossgen2 JIT tools are used to run Crossgen2 on libraries built during the current build, such as during the `clr.nativecorelib` stage. Under normal circumstances, you should have no need to worry about this, since these tools are automatically built when using the `.\build.cmd` or `./build.sh` scripts at the root of the repo to build any of the CoreCLR native files.
-CLR_ARM_FPU_CAPABILITY is used by the PAL code to decide which FPU registers should be saved and
-restored during context switches.
+However, you might find yourself needing to (re)build them because either you made changes to them, or you built CoreCLR in a different way using `build-runtime.sh` instead of the usual default script at the root of the repo. To build these tools, you need to run the `src/coreclr/build-runtime.sh` script, and pass the `-hostarch` flag with the architecture of the host machine, alongside the `-component crosscomponents` flag to specify that you only want to build the cross-targeting tools. Retaking our previous example of building for ARM64 using an x64 Linux machine:
-Bit 0 unused always set to 1.
-Bit 1 corresponds to 16 64-bit FPU registers.
-Bit 2 corresponds to 32 64-bit FPU registers.
+```bash
+./src/coreclr/build-runtime.sh -arm64 -hostarch x64 -component crosscomponents -cmakeargs "-DCLR_CROSS_COMPONENTS_BUILD=1"
+```
-Supported options are 0x3 and 0x7.
+The output of running this command is placed in `artifacts/bin/coreclr/linux../`. For our example, it would be `artifacts/bin/coreclr/linux.arm64.Release/x64`.
-If you wanted to support armv7 CPU with VFPv3-d16, you'd use the following compile options:
+On Windows, you can build these cross-targeting diagnostic libraries with the `linuxdac` and `alpinedac` subsets from the root `build.cmd` script. That said, you can also use the `build-runtime.cmd` script, like with Linux. These builds also require you to pass the `-os` flag to specify the target OS. For example:
-```
-./src/coreclr/build-runtime.sh -cross -arm -cmakeargs -DCLR_ARM_FPU_CAPABILITY=0x3 -cmakeargs -DCLR_ARM_FPU_TYPE=vfpv3-d16
+```cmd
+.\src\coreclr\build-runtime.cmd -arm64 -hostarch x64 -os linux -component crosscomponents -cmakeargs "-DCLR_CROSS_COMPONENTS_BUILD=1"
```
-Building the Cross-Targeting Tools
-------------------------------------
+If you're building the cross-components in powershell, you'll need to wrap `"-DCLR_CROSS_COMPONENTS_BUILD=1"` with single quotes (`'`) to ensure things are escaped correctly for CMD.
-Some parts of our build process need some native components that are built for the current machine architecture, even when you are building for a different target architecture. These tools are referred to as cross-targeting tools or "cross tools". There are two categories of these tools today:
+## Cross-Building using Docker
-- Crossgen2 JIT tools
-- Diagnostic libraries
+When it comes to building, Docker offers the most flexibility when it comes to targeting different Linux platforms and other similar Unix-based ones, like FreeBSD. This is thanks to the multiple existing Docker images already configured for doing such cross-platform building, and Docker's ease of use of running out of the box on Windows machines with [WSL](https://docs.microsoft.com/windows/wsl/about) enabled, installed, and up and running, as well as Linux machines.
-The Crossgen2 JIT tools are used to run Crossgen2 on libraries built during the current build, such as during the clr.nativecorelib stage. These tools are automatically built when using the `./build.cmd` or `./build.sh` scripts at the root of the repo to build any of the CoreCLR native files, but they are not automatically built when using the `build-runtime.cmd/sh` scripts. To build these tools, you need to pass the `-hostarch` flag with the architecture of the host machine and the `-component crosscomponents` flag to specify that you only want to build the cross-targeting tools. For example:
+### Cross-Compiling for ARM32 and ARM64 with Docker
-```
-./src/coreclr/build-runtime.sh -arm -hostarch x64 -component crosscomponents -cmakeargs -DCLR_CROSS_COMPONENTS_BUILD=1
-```
+As mentioned in the [Linux Cross-Building section](#linux-cross-building), the _ROOTFS\_DIR_ environment variable has to be set to the _crossrootfs_ location. The prereqs Docker images already have _crossrootfs_ built, so you only need to specify it when creating the Docker container by means of the `-e` flag. These locations are specified in the [Docker Images table](/docs/workflow/building/coreclr/linux-instructions.md#docker-images).
-On Windows, the cross-targeting diagnostic libraries are built with the `linuxdac` and `alpinedac` subsets from the root `build.cmd` script, but they can also be built manually with the `build-runtime.cmd` scripts. These builds also require you to pass the `-os` flag to specify the target OS. For example:
+In addition, you also have to specify the `--cross` flag with the target architecture. For example, the following command would create a container to build CoreCLR for Linux ARM64:
-```
-src\coreclr\build-runtime.cmd -arm64 -hostarch x64 -os Linux -component crosscomponents -cmakeargs "-DCLR_CROSS_COMPONENTS_BUILD=1"
+```bash
+docker run --rm -v :/runtime -w /runtime -e ROOTFS_DIR=/crossrootfs/arm64 mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-arm64-20220427171722-6e40d49 ./build.sh --subset clr --cross --arch arm64 --clang9
```
-If you're building the cross-components in powershell, you'll need to wrap `"-DCLR_CROSS_COMPONENTS_BUILD=1"` with single quotes (`'`) to ensure things are escaped correctly for CMD.
-
-Build System.Private.CoreLib on Ubuntu
---------------------------------------
-The following instructions assume you are on a Linux machine such as Ubuntu 14.04 x86 64bit.
+### Cross-Compiling for FreeBSD with Docker
-To build System.Private.CoreLib for Linux, run the following command:
+Using Docker to cross-build for FreeBSD is very similar to any other Docker Linux build. You only need to use the appropriate image and pass `--os` as well to specify this is not an architecture(-only) build. For example, to make a FreeBSD x64 build:
-```
- lgs@ubuntu ~/git/runtime/ $ ./build.sh --subset clr.corelib+clr.nativecorelib --arch arm -c debug -v verbose
-```
-
-The output is at `artifacts/bin/coreclr/.arm.Debug/IL/System.Private.CoreLib.dll`.
-
-```
- lgs@ubuntu ~/git/runtime/ $ file ./artifacts/bin/coreclr/Linux.arm.Debug/IL/System.Private.CoreLib.dll
- ./artifacts/bin/coreclr/Linux.arm.Debug/IL/System.Private.CoreLib.dll: PE32 executable (DLL)
- (console) ARMv7 Thumb Mono/.NET assembly, for MS Windows
+```bash
+docker run --rm -v :/runtime -w /runtime -e ROOTFS_DIR=/crossrootfs/x64 mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-freebsd-12-20220831130538-f13d79e ./build.sh --subset clr --cross --os freebsd
```
diff --git a/docs/workflow/building/coreclr/crossgen.md b/docs/workflow/building/coreclr/crossgen.md
deleted file mode 100644
index b90c59180195e1..00000000000000
--- a/docs/workflow/building/coreclr/crossgen.md
+++ /dev/null
@@ -1,74 +0,0 @@
-Using CrossGen to Create Native Images
-======================================
-
-Introduction
-------------
-
-When you create a .NET assembly using C# compiler, your assembly contains only MSIL code.
-When the app runs, the JIT compiler translates the MSIL code into native code, before the CPU can execute them.
-This execution model has some advantages. For example, your assembly code can be portable across all platforms and architectures that support .NET.
-However, this portability comes with a performance cost. Your app starts up more slowly because the JIT compiler has to spend time to translate the code.
-
-To help make your app start up faster, CoreCLR includes a tool called CrossGen, which can pre-compile the MSIL code into native code.
-
-Getting CrossGen
-----------------
-
-If you build CoreCLR yourself, the CrossGen tool (`crossgen.exe` on Windows, or `crossgen` on other platforms) is created as part of the build and stored in the same output directory as other CoreCLR binaries.
-If you install CoreCLR using a NuGet package, you can find CrossGen in the `tools` folder of the NuGet package.
-
-Regardless of how you obtain CrossGen, it is very important that it must match other CoreCLR binaries.
-- If you build CrossGen yourself, you should use it with runtime and `System.Private.CoreLib.dll` generated from the same build. Do not attempt to mix CrossGen from one build with binaries generated from another build.
-- If you install CrossGen from NuGet, make sure you use CrossGen from exactly the same NuGet package as the rest of your CoreCLR binaries. Do not attempt to mix binaries from multiple NuGet packages.
-
-If you do not follow the above rules, you are likely to encounter errors while running CrossGen.
-
-Using CrossGen
---------------
-
-In most cases, the build script automatically runs CrossGen to create the native image for `System.Private.CoreLib.dll`.
-When this happens, you will find `System.Private.CoreLib.ni.dll` in your output directory.
-`System.Private.CoreLib.dll` is the MSIL assemblies created by the C# compiler, while `System.Private.CoreLib.ni.dll` is the native images that contain CPU-specific code.
-Once the build is done, you only need `System.Private.CoreLib.ni.dll` to use CoreCLR.
-The original MSIL assemblies are no longer needed by the runtime.
-
-If you installed CoreCLR from a NuGet package, `System.Private.CoreLib.ni.dll` is included in the package.
-
-If for some reason you did not get `System.Private.CoreLib.dll` with the rest of your CoreCLR, you can easily create it yourself using CrossGen.
-
-If your `System.Private.CoreLib.dll` and JIT compiler (`clrjit.dll` on Windows or `libclrjit.*` on other platforms) are all in the same directory as CrossGen itself, you can compile `System.Private.CoreLib.dll` with the following commands (first two commands for Windows, next two commands for other platforms):
-
- .\crossgen.exe System.Private.CoreLib.dll
- ./crossgen System.Private.CoreLib.dll
-
-If your files are scattered in different directories, or if you want to create native images for other assemblies, the command line is slightly more complex:
-
- .\crossgen.exe /JITPath path\clrjit.dll /p "path1;path2;..." path\assemblyName.dll
- ./crossgen -JITPath path/libclrjit.so -p "path1:path2:..." path/assemblyName.dll
-
-The /p is used to specify the locations of all the dependencies of the input assembly, including the input assembly itself.
-You should use full paths for these locations. Relative paths do not always work.
-If there are multiple paths, separate them with semicolons (`;`) on Windows, or colons (`:`) on non-Windows platforms.
-
-Another way to reference assemblies is by using the /r switch, which takes file names instead of paths. This switch can be used multiple times, once for each reference file, since is not a semicolon/colon separated list of file names. Example:
-
- .\crossgen.exe /JITPath path\clrjit.dll /r "reference1.dll" /r "path\reference2.dll" /r ... path\assemblyName.dll
- ./crossgen -JITPath path/libclrjit.so -r "reference1.dll" -r "path/reference2.dll" /r ... path/assemblyName.dll
-
-It is generally a good idea to enclose the path list or file names in quotes to protect any special characters from the shell.
-Note that the /r and /p options cannot be used together.
-
-Using native images
--------------------
-
-Running CrossGen on an assembly creates a "native image" file, with the extension of `.ni.dll` or `.ni.exe`.
-You should include the native images in your app, either by replacing the original MSIL assemblies with the native images or by putting the native images next to the MSIL assemblies.
-When the native images are present, the CoreCLR runtime will automatically use it instead of the original MSIL assemblies.
-
-Common errors
--------------
-
-The following are some of the command errors while creating or using native images:
-- "Error: Could not load file or assembly '...' or one of its dependencies. The system cannot find the file specified. (Exception from HRESULT: 0x80070002)": CrossGen wasn't able to find a particular dependency that it needs. Verify that you have the assembly specified in the error message, and make sure its location is included in `/Platform_Assemblies_Paths`.
-- CoreCLR unable to initialize: While there are many possible causes of this error, one possibility is a mismatch between System.Private.CoreLib.ni.dll and coreclr.dll (or libcoreclr.so). Make sure they come from the same build or NuGet package.
-- "Unable to load Jit Compiler": Please get a copy of `clrjit.dll` (or `libclrjit.so` or `libclrjit.dylib`, depending on your platform), and place it in the same directory as CrossGen (or use /JITPath option). You can either build `clrjit.dll` yourself or get it from `Microsoft.NETCore.Jit` NuGet package. To avoid possible issues, please use `clrjit.dll` from the same build as `crossgen.exe` if possible.
diff --git a/docs/workflow/building/coreclr/freebsd-instructions.md b/docs/workflow/building/coreclr/freebsd-instructions.md
index ef31a0b4d215f9..9ff21b3c32258c 100644
--- a/docs/workflow/building/coreclr/freebsd-instructions.md
+++ b/docs/workflow/building/coreclr/freebsd-instructions.md
@@ -1,19 +1,62 @@
-Build CoreCLR on FreeBSD
-======================
+# Build CoreCLR on FreeBSD
-This guide will walk you through building CoreCLR on FreeBSD and running Hello World. We'll start by showing how to set up your environment from scratch.
+* [Build using Docker](#build-using-docker)
+* [Build using cross-compilation on Linux](#build-using-cross-compilation-on-linux)
+* [Build directly on FreeBSD](#build-directly-on-freebsd)
+* [Old Documentation](#old-documentation)
+ * [Environment](#environment)
+ * [Toolchain Setup](#toolchain-setup)
+ * [Debugging CoreCLR (Optional)](#debugging-coreclr-optional)
+ * [Git Setup](#git-setup)
+ * [Build the Runtime](#build-the-runtime)
+ * [Build the Framework Native Components](#build-the-framework-native-components)
+ * [Build the Framework Managed Components](#build-the-framework-managed-components)
+ * [Download Dependencies](#download-dependencies)
+ * [Install Mono](#install-mono)
+ * [Download the NuGet Client](#download-the-nuget-client)
+ * [Download NuGet Packages](#download-nuget-packages)
+ * [Compile an App](#compile-an-app)
+ * [Run your App](#run-your-app)
+ * [Run the test suite](#run-the-test-suite)
+ * [Note on Clang/LLVM versions](#note-on-clangllvm-versions)
-Environment
-===========
+This guide will walk you through building CoreCLR on FreeBSD.
-These instructions are written assuming FreeBSD 10.1-RELEASE, since that's the release the team uses.
+As mentioned in the [FreeBSD requirements doc](/docs/workflow/requirements/freebsd-requirements.md), there are three ways to go on about to build CoreCLR for FreeBSD:
+
+* Build using Docker
+* Build using cross-compilation on your own Linux environment
+* Build directly on FreeBSD
+
+## Build using Docker
+
+Building for FreeBSD with Docker follows a very similar workflow to using Docker for Linux. Since this is also a cross-building scenario, the instructions are found in the [Docker section of the cross-building doc](/docs/workflow/building/coreclr/cross-building.md#cross-compiling-for-freebsd-with-docker).
+
+## Build using cross-compilation on Linux
+
+Ensure you have all of the prerequisites installed from the [Linux Requirements](/docs/workflow/requirements/linux-requirements.md), and the additional ones listed in the [FreeBSD Requirements](/docs/workflow/requirements/freebsd-requirements.md#linux-environment).
+
+Once that is done, refer to the [Linux section of the cross-building doc](/docs/workflow/building/coreclr/cross-building.md#linux-cross-building). There are detailed instructions on how to cross-compile using your Linux environment, including a section dedicated to FreeBSD building.
+
+## Build directly on FreeBSD
+
+Ensure you have all of the prerequisites installed from the [FreeBSD Requirements](/docs/workflow/requirements/freebsd-requirements.md).
+
+Instructions for building directly on FreeBSD coming soon!
+
+Meanwhile, here are the old instructions.
+
+## Old Documentation
+
+These instructions were written quite a while ago, and they may or may not work today. Updated instructions coming soon.
+
+### Environment
These instructions assume you use the binary package tool `pkg` (analog to `apt-get` or `yum` on Linux) to install the environment. Compiling the dependencies from source using the ports tree might work too, but is untested.
Minimum RAM required to build is 1GB. The build is known to fail on 512 MB VMs ([Issue 4069](https://github.com/dotnet/runtime/issues/4069)).
-Toolchain Setup
----------------
+#### Toolchain Setup
Install the following packages for the toolchain:
@@ -35,8 +78,7 @@ janhenke@freebsd-frankfurt:~ % sudo pkg install bash cmake libunwind gettext llv
The command above will install Clang and LLVM 3.7. For information on building CoreCLR with other versions, see section on [Clang/LLVM versions](#note-on-clangllvm-versions).
-Debugging CoreCLR (Optional)
-----------------------------
+### Debugging CoreCLR (Optional)
Note: This step is not required to build CoreCLR itself. If you intend on hacking or debugging the CoreCLR source code, you need to follow these steps. You must follow these steps *before* starting the build itself.
@@ -54,13 +96,11 @@ Run tests:
./src/pal/tests/palsuite/runpaltests.sh $PWD/artifacts/obj/FreeBSD.x64.Debug $PWD/artifacts/paltestout
```
-Git Setup
----------
+### Git Setup
This guide assumes that you've cloned the corefx and coreclr repositories into `~/git/corefx` and `~/git/coreclr` on your FreeBSD machine and the corefx and coreclr repositories into `D:\git\corefx` and `D:\git\coreclr` on Windows. If your setup is different, you'll need to pay careful attention to the commands you run. In this guide, I'll always show what directory I'm in on both the FreeBSD and Windows machine.
-Build the Runtime
-=================
+### Build the Runtime
To build the runtime on FreeBSD, run build.sh from the root of the coreclr repository:
@@ -92,16 +132,14 @@ janhenke@freebsd-frankfurt:~/git/coreclr % cp artifacts/Product/FreeBSD.x64.Debu
janhenke@freebsd-frankfurt:~/git/coreclr % cp artifacts/Product/FreeBSD.x64.Debug/libcoreclr*.so ~/coreclr-demo/runtime
```
-Build the Framework Native Components
-======================================
+### Build the Framework Native Components
```sh
janhenke@freebsd-frankfurt:~/git/corefx$ ./build-native.sh
janhenke@freebsd-frankfurt:~/git/corefx$ cp artifacts/FreeBSD.x64.Debug/Native/*.so ~/coreclr-demo/runtime
```
-Build the Framework Managed Components
-======================================
+### Build the Framework Managed Components
We don't _yet_ have support for building managed code on FreeBSD, so you'll need a Windows machine with clones of both the CoreCLR and CoreFX projects.
@@ -132,8 +170,7 @@ janhenke@freebsd-frankfurt:~/git/coreclr % ls ~/coreclr-demo/runtime/
System.Console.dll System.Diagnostics.Debug.dll corerun libcoreclr.so libcoreclrpal.so System.Private.CoreLib.dll
```
-Download Dependencies
-=====================
+### Download Dependencies
The rest of the assemblies you need to run are presently just facades that point to System.Private.CoreLib. We can pull these dependencies down via NuGet (which currently requires Mono).
@@ -144,8 +181,7 @@ janhenke@freebsd-frankfurt:~/git/coreclr % mkdir ~/coreclr-demo/packages
janhenke@freebsd-frankfurt:~/git/coreclr % cd ~/coreclr-demo/packages
```
-Install Mono
-------------
+### Install Mono
If you don't already have Mono installed on your system, use the pkg tool again:
@@ -153,16 +189,14 @@ If you don't already have Mono installed on your system, use the pkg tool again:
janhenke@freebsd-frankfurt:~/coreclr-demo/packages % sudo pkg install mono
```
-Download the NuGet Client
--------------------------
+### Download the NuGet Client
Grab NuGet (if you don't have it already)
```sh
janhenke@freebsd-frankfurt:~/coreclr-demo/packages % curl -L -O https://nuget.org/nuget.exe
```
-Download NuGet Packages
------------------------
+### Download NuGet Packages
With Mono and NuGet in hand, you can use NuGet to get the required dependencies.
@@ -210,8 +244,7 @@ Finally, you need to copy over the assemblies to the runtime folder. You don't
janhenke@freebsd-frankfurt:~/coreclr-demo/packages % find . -wholename '*/aspnetcore50/*.dll' -exec cp -n {} ~/coreclr-demo/runtime \;
```
-Compile an App
-==============
+### Compile an App
Now you need a Hello World application to run. You can write your own, if you'd like. Personally, I'm partial to the one on corefxlab which will draw Tux for us.
@@ -226,8 +259,7 @@ Then you just need to build it, with `mcs`, the Mono C# compiler. FYI: The Rosly
janhenke@freebsd-frankfurt:~/coreclr-demo/runtime % mcs /nostdlib /noconfig /r:../packages/System.Console.4.0.0-beta-22703/lib/contract/System.Console.dll /r:../packages/System.Runtime.4.0.20-beta-22703/lib/contract/System.Runtime.dll HelloWorld.cs
```
-Run your App
-============
+### Run your App
You're ready to run Hello World! To do that, run corerun, passing the path to the managed exe, plus any arguments. The HelloWorld from corefxlab will print a daemon if you pass "freebsd" as an argument, so:
@@ -242,8 +274,7 @@ Over time, this process will get easier. We will remove the dependency on having
A sample that builds Hello World on FreeBSD using the correct references but via XBuild or MonoDevelop would be great! Some of our processes (e.g. the System.Private.CoreLib build) rely on Windows-specific tools, but we want to figure out how to solve these problems for FreeBSD as well. There's still a lot of work ahead, so if you're interested in helping, we're ready for you!
-Run the test suite
-==================
+### Run the test suite
If you've made changes to the CoreCLR PAL code, you might want to run the PAL tests directly to validate your changes.
This can be done after a clean build, without any other dependencies.
@@ -256,8 +287,7 @@ janhenke@freebsd-frankfurt:~/coreclr % ./src/pal/tests/palsuite/runpaltests.sh
This should run all the tests associated with the PAL.
-Note on Clang/LLVM versions
-===========================
+### Note on Clang/LLVM versions
The minimum version to build CoreCLR is Clang 3.5 or above.
diff --git a/docs/workflow/building/coreclr/linux-instructions.md b/docs/workflow/building/coreclr/linux-instructions.md
index dac415c3da1b52..de38b5514d1c5c 100644
--- a/docs/workflow/building/coreclr/linux-instructions.md
+++ b/docs/workflow/building/coreclr/linux-instructions.md
@@ -1,108 +1,91 @@
-Build CoreCLR on Linux
-======================
+# Build CoreCLR on Linux
+
+* [Build using Docker](#build-using-docker)
+ * [Docker Images](#docker-images)
+* [Build using your own Environment](#build-using-your-own-environment)
+ * [Set the maximum number of file-handles](#set-the-maximum-number-of-file-handles)
+* [Build the Runtime](#build-the-runtime)
+ * [Cross-Compilation](#cross-compilation)
+* [Create the Core_Root](#create-the-core_root)
This guide will walk you through building CoreCLR on Linux.
-First, set up your environment to build using the instructions [here](../../requirements/linux-requirements.md).
+As mentioned in the [Linux requirements doc](/docs/workflow/requirements/linux-requirements.md), there are two options to build CoreCLR on Linux:
+
+* Build using Docker.
+* Build using your own environment.
-Choose one of the following options for building.
+## Build using Docker
-[Build using Docker](#Build-using-Docker)
+Building using Docker will require that you choose the correct image for your environment.
-[Build with own environment](#Environment)
+Note that the OS is strictly speaking not important. For example if you are on Ubuntu 20.04 and build using the Ubuntu 18.04 x64 image there should be no issues. You can even use Linux images on a Windows OS if you have [WSL](https://docs.microsoft.com/windows/wsl/about) enabled. However, note that you can't run multiple OS's on the same _Docker Daemon_, as it takes resources from the underlying kernel as needed. In other words, you can run either Linux on WSL, or Windows containers. You have to switch between them if you need both, and restart Docker.
-Build using Docker
-==================
+The target architecture is more important, as building arm32 using the x64 image will not work. There will be missing _rootfs_ components required by the build. See [Docker Images](#docker-images) below, for more information on choosing an image to build with.
-Building using Docker will require that you choose the correct image for your environment. Note that the OS is strictly speaking not extremely important, for example if you are on Ubuntu 18.04 and build using the Ubuntu 16.04 x64 image there should be no issues. The target architecture is more important, as building arm32 using the x64 image will not work: there will be missing rootfs components required by the build. See [Docker Images](#Docker-Images), below, for more information on choosing an image to build with.
+**NOTE**: The image's architecture has to match your machine's supported platforms. For example, you can't run arm32 images on an x64 machine. But you could run x64 and arm64 images on an M1 Mac, for example. This is thanks to the _Rosetta_ emulator that Apple Silicon provides. Same case applies to running x86 on an x64 Windows machine thanks to Windows' _SYSWOW64_. Likewise, you can run Linux arm32 images on a Linux arm64 host.
-Please note that when choosing an image choosing the same image as the host os you are running on you will allow you to run the product/tests outside of the docker container you built in.
+Please note that choosing the same image as the host OS you are running on will allow you to run the product/tests outside of the docker container you built in.
-Once you have chosen an image the build is one command run from the root of the runtime repository:
+Once you have chosen an image, the build is one command run from the root of the runtime repository:
-```sh
-docker run --rm -v :/runtime -w /runtime mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-20200508132555-78cbb55 ./build.sh -subset clr -clang9
+```bash
+docker run --rm -v :/runtime -w /runtime mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-20210714125435-9b5bbc2 ./build.sh --subset clr
```
Dissecting the command:
-- `--rm`: erase the created container after use.
-- `-v :/runtime`: mount the runtime repository under `/runtime`. Replace `` with the full path to your `runtime` repo clone, e.g., `-v /home/user/runtime:/runtime`.
-- `-w: /runtime`: set /runtime as working directory for the container.
-- `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-20200508132555-78cbb55`: Docker image name.
-- `./build.sh`: command to be run in the container: run the root build command.
-- `-subset clr`: build the clr subset (excluding libraries and installers).
-- `-clang9`: argument to use clang 9 for the build (the only compiler in the build image).
-
-If you are attempting to cross build for arm or arm64 then use the crossrootfs location to set the ROOTFS_DIR. The command would add `-e ROOTFS_DIR=`. See [Docker Images](#Docker-Images) for the crossrootfs location. In addition you will need to specify `-cross`. For example:
+* `--rm`: Erase the created container after use.
+* `-v :/runtime`: Mount the runtime repository under `/runtime`. Replace `` with the full path to your `runtime` repo clone, e.g., `-v /home/user/runtime:/runtime`.
+* `-w: /runtime`: Set /runtime as working directory for the container.
+* `mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-20210714125435-9b5bbc2`: Docker image name.
+* `./build.sh`: Command to be run in the container: run the root build command.
+* `-subset clr`: Build the clr subset (excluding libraries and installers).
-```sh
-docker run --rm -v :/runtime -w /runtime -e ROOTFS_DIR=/crossrootfs/arm64 mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-20200508132638-b2c2436 ./build.sh -arch arm64 -subset clr -cross -clang9
-```
-
-Note that instructions on building the crossrootfs location can be found at [cross-building.md](cross-building.md). These instructions are suggested only if there are plans to change the rootfs, or the Docker images for arm/arm64 are insufficient for you build.
+To do cross-building for ARM32 or ARM64 using Docker, you need to use either specific images designated for this purpose, or configure your own. Detailed information on this can be found in the [cross-building doc](/docs/workflow/building/coreclr/cross-building.md#cross-building-using-docker).
-Docker Images
-=============
+### Docker Images
-This table of images might often become stale as we change our images as our requirements change. The images used for our our official builds can be found in [the platform matrix](../../../../eng/pipelines/common/platform-matrix.yml) of our Azure DevOps builds under the `container` key of the platform you plan to build.
+This table of images might often become stale as we change our images as our requirements change. The images used for our official builds can be found in [the pipeline resources](/eng/pipelines/common/templates/pipeline-with-resources.yml) of our Azure DevOps builds under the `container` key of the platform you plan to build.
-| OS | Target Arch | Image location | crossrootfs location | Clang Version |
-| --------------------------- | --------------- | ---------------------------------------------------------------------------------------------------- | -------------------- | ------------- |
-| Alpine | x64 | `mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.13-WithNode-20210910135845-c401c85` | - | -clang5.0 |
-| CentOS 7 (build for RHEL 7) | x64 | `mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-20210714125435-9b5bbc2` | - | -clang9 |
-| Ubuntu 16.04 (x64, arm ROOTFS) | arm32 (armhf) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-20210719121212-8a8d3be` | `/crossrootfs/arm` | -clang9 |
-| Ubuntu 16.04 (x64, arm64 ROOTFS) | arm64 (arm64v8) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-20210719121212-8a8d3be` | `/crossrootfs/arm64` | -clang9 |
-| Alpine (x64, arm ROOTFS) | arm | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm-alpine-20210923140502-78f7860` | `/crossrootfs/arm64` | -clang9 |
-| Alpine (x64, arm64 ROOTFS) | arm64 (arm64v8) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-alpine-20210719121212-b2c2436` | `/crossrootfs/arm64` | -clang9 |
+| OS | Target Arch | Image location | crossrootfs location | Clang Version |
+| --------------------------------- | --------------- | ---------------------------------------------------------------------------------------------------- | -------------------- | ------------- |
+| Alpine | x64 | `mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.13-WithNode-20210910135845-c401c85` | - | -clang5.0 |
+| CentOS 7 (build for RHEL 7) | x64 | `mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-20210714125435-9b5bbc2` | - | -clang9 |
+| Ubuntu 18.04 (x64, arm ROOTFS) | arm32 (armhf) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-20220426130400-6e40d49` | `/crossrootfs/arm` | -clang9 |
+| Ubuntu 18.04 (x64, arm64 ROOTFS) | arm64 (arm64v8) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-arm64-20220427171722-6e40d49` | `/crossrootfs/arm64` | -clang9 |
+| Alpine (x64, arm ROOTFS) | arm | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm-alpine-20210923140502-78f7860` | `/crossrootfs/arm64` | -clang9 |
+| Alpine (x64, arm64 ROOTFS) | arm64 (arm64v8) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-alpine-20210923140502-78f7860` | `/crossrootfs/arm64` | -clang9 |
+| FreeBSD (x64 ROOTFS) | x64 | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-freebsd-12-20210917001307-f13d79e` | `/crossrootfs/x64` | (default) |
-Environment
-===========
+These Docker images are built using the Dockerfiles maintained in the [dotnet-buildtools-prereqs-docker repo](https://github.com/dotnet/dotnet-buildtools-prereqs-docker).
-Git Setup
----------
+## Build using your own Environment
-This guide assumes that you've cloned the runtime repository.
+Ensure you have all of the prerequisites installed from the [Linux Requirements](/docs/workflow/requirements/linux-requirements.md).
-Set the maximum number of file-handles
---------------------------------------
+### Set the maximum number of file-handles
-To ensure that your system can allocate enough file-handles for the libraries build run `sysctl fs.file-max`. If it is less than 100000, add `fs.file-max = 100000` to `/etc/sysctl.conf`, and then run `sudo sysctl -p`.
+To ensure that your system can allocate enough file-handles for the libraries build, run the command in your terminal `sysctl fs.file-max`. If it is less than 100000, add `fs.file-max = 100000` to `/etc/sysctl.conf`, and then run `sudo sysctl -p`.
-Build the Runtime and System.Private.CoreLib
-=============================================
+## Build the Runtime
-To build the runtime on Linux, run build.sh to build the CoreCLR subset category of the runtime:
+To build CoreCLR on Linux, run `build.sh` while specifying the `clr` subset:
-```
-./build.sh -subset clr
+```bash
+./build.sh --subset clr
```
-After the build is completed, there should some files placed in `artifacts/bin/coreclr/Linux.x64.Debug`. The ones we are most interested in are:
+After the build is completed, there should be some files placed in `artifacts/bin/coreclr/linux..` (for example `artifacts/bin/coreclr/linux.x64.Release`). The most important binaries are the following:
-* `corerun`: The command line host. This program loads and starts the CoreCLR runtime and passes the managed program you want to run to it.
+* `corerun`: The command line host. This program loads and starts the CoreCLR runtime and passes the managed program (e.g. `program.dll`) you want to run with it.
* `libcoreclr.so`: The CoreCLR runtime itself.
* `System.Private.CoreLib.dll`: The core managed library, containing definitions of `Object` and base functionality.
-Create the Core_Root
-===================
+### Cross-Compilation
-The Core_Root folder will contain the built binaries, generated by `build.sh`, as well as the library packages required to run tests. It is required that you build
-the libraries subset (`-subset libs`) before this command can be run. Note that this by default searches the libraries in Release mode, regardless of the runtime
-configuration you specify. If you built your libs in another configuration, then you have to pass down the appropriate flag `/p:LibrariesConfiguration=`.
+Just like you can use specialized Docker images, you can also do any of the supported cross-builds for ARM32 or ARM64 on your own Linux environment. Detailed instructions are found in the [cross-building doc](/docs/workflow/building/coreclr/cross-building.md#linux-cross-building).
-```
-./src/tests/build.sh generatelayoutonly
-```
-
-After the build is complete you will find the output in the `artifacts/tests/coreclr/Linux.x64.Debug/Tests/Core_Root` folder.
+## Create the Core_Root
-Running a single test
-===================
-
-After `src/tests/build.sh` is run, `corerun` from the Core_Root folder is ready to be run. This can be done by using the full absolute path to `corerun`, or by setting an environment variable to the Core_Root folder.
-
-```sh
-export CORE_ROOT=/runtime/artifacts/tests/coreclr/Linux.x64.Debug/Tests/Core_Root
-$CORE_ROOT/corerun hello_world.dll
-```
+The Core_Root provides one of the main ways to test your build. Full instructions on how to build it in the [CoreCLR testing doc](/docs/workflow/testing/coreclr/testing.md), and we also have a detailed guide on how to use it for your own testing in [its own dedicated doc](/docs/workflow/testing/using-corerun-and-coreroot.md).
diff --git a/docs/workflow/building/coreclr/macos-instructions.md b/docs/workflow/building/coreclr/macos-instructions.md
new file mode 100644
index 00000000000000..df55d204205370
--- /dev/null
+++ b/docs/workflow/building/coreclr/macos-instructions.md
@@ -0,0 +1,34 @@
+# Build CoreCLR on macOS
+
+* [Environment](#environment)
+* [Build the Runtime](#build-the-runtime)
+ * [Cross-Compilation](#cross-compilation)
+* [Create the Core_Root](#create-the-core_root)
+
+This guide will walk you through building CoreCLR on macOS.
+
+## Environment
+
+Ensure you have all of the prerequisites installed from the [macOS Requirements](/docs/workflow/requirements/macos-requirements.md).
+
+## Build the Runtime
+
+To build CoreCLR on macOS, run `build.sh` while specifying the `clr` subset:
+
+```bash
+./build.sh --subset clr
+```
+
+After the build has completed, there should be some files placed in `artifacts/bin/coreclr/osx..` (for example `artifacts/bin/coreclr/osx.x64.Release`). The most important binaries are the following:
+
+* `corerun`: The command line host. This program loads and starts the CoreCLR runtime and passes the managed program (e.g. `program.dll`) you want to run with it.
+* `libcoreclr.dylib`: The CoreCLR runtime itself.
+* `System.Private.CoreLib.dll`: The core managed library, containing definitions of `Object` and base functionality.
+
+### Cross-Compilation
+
+It is possible to get a macOS ARM64 build using an Intel x64 Mac and vice versa, an x64 one using an M1 Mac. Instructions on how to do this are in the [cross-building doc](/docs/workflow/building/coreclr/cross-building.md#macos-cross-building).
+
+## Create the Core_Root
+
+The Core_Root provides one of the main ways to test your build. Full instructions on how to build it in the [CoreCLR testing doc](/docs/workflow/testing/coreclr/testing.md), and we also have a detailed guide on how to use it for your own testing in [its own dedicated doc](/docs/workflow/testing/using-corerun-and-coreroot.md).
diff --git a/docs/workflow/building/coreclr/nativeaot.md b/docs/workflow/building/coreclr/nativeaot.md
index bb4c7d76f9aa60..401fb8c20f9577 100644
--- a/docs/workflow/building/coreclr/nativeaot.md
+++ b/docs/workflow/building/coreclr/nativeaot.md
@@ -1,10 +1,21 @@
# Native AOT Developer Workflow
+* [Building](#building)
+ * [Using built binaries](#using-built-binaries)
+ * [Building packages](#building-packages)
+* [High Level Overview](#high-level-overview)
+* [Visual Studio Solutions](#visual-studio-solutions)
+* [Convenience Visual Studio "repro" project](#convenience-visual-studio-repro-project)
+* [Running tests](#running-tests)
+ * [Running library tests](#running-library-tests)
+* [Design Documentation](#design-documentation)
+* [Further Reading](#further-reading)
+
The Native AOT toolchain can be currently built for Linux (x64/arm64), macOS (x64) and Windows (x64/arm64).
## Building
-1. [Install pre-requisites](../../README.md#build-requirements)
+1. [Install pre-requisites](/docs/workflow/README.md#build-requirements)
1. Run `build[.cmd|.sh] clr.aot+libs -rc [Debug|Release]` from the repo root to build binaries for local development. This will build individual components, but not the NuGet packages and builds much faster.
### Using built binaries
@@ -16,8 +27,9 @@ The component that writes out object files (objwriter.dll/libobjwriter.so/libobj
### Building packages
Run `build[.cmd|.sh] -c Release` from the repo root to build the NativeAOT toolchain packages. The build will place the toolchain packages at `artifacts\packages\Release\Shipping`. To publish your project using these packages:
- - Add the package directory to your `nuget.config` file. For example, add ``
- - Run `dotnet publish --packages pkg -r [win-x64|linux-x64|osx-64] -c [Debug|Release]` to publish your project. `--packages pkg` option restores the package into a local directory that is easy to cleanup once you are done. It avoids polluting the global nuget cache with your locally built dev package.
+
+* Add the package directory to your `nuget.config` file. For example, add ``
+* Run `dotnet publish --packages pkg -r [win-x64|linux-x64|osx-64] -c [Debug|Release]` to publish your project. `--packages pkg` option restores the package into a local directory that is easy to cleanup once you are done. It avoids polluting the global nuget cache with your locally built dev package.
## High Level Overview
@@ -41,15 +53,18 @@ The compiler also has a mode where each managed assembly can be compiled into a
The repository has a number of Visual Studio Solutions files (`*.sln`) that are useful for editing parts of the repository. Build the repo from command line first before building using the solution files. Remember to select the appropriate configuration that you built. By default, `build.cmd` builds Debug x64 and so `Debug` and `x64` must be selected in the solution build configuration drop downs.
-- `src\coreclr\nativeaot\nativeaot.sln`. This solution is for the runtime libraries.
-- `src\coreclr\tools\aot\ilc.sln`. This solution is for the compiler.
+Solutions related to this:
+
+* `src\coreclr\nativeaot\nativeaot.sln`. This solution is for the runtime libraries.
+* `src\coreclr\tools\aot\ilc.sln`. This solution is for the compiler.
Typical workflow for working on the compiler:
-- Open `ilc.sln` in Visual Studio
-- Set "ILCompiler" project in solution explorer as your startup project
-- Set Working directory in the project Debug options to your test project directory, e.g. `C:\test`
-- Set Application arguments in the project Debug options to the response file that was generated by regular native aot publishing of your test project, e.g. `@obj\Release\net6.0\win-x64\native\HelloWorld.ilc.rsp`
-- Build & run using **F5**
+
+* Open `ilc.sln` in Visual Studio
+* Set "ILCompiler" project in solution explorer as your startup project
+* Set Working directory in the project Debug options to your test project directory, e.g. `C:\test`
+* Set Application arguments in the project Debug options to the response file that was generated by regular native aot publishing of your test project, e.g. `@obj\Release\net6.0\win-x64\native\HelloWorld.ilc.rsp`
+* Build & run using **F5**
## Convenience Visual Studio "repro" project
@@ -57,15 +72,15 @@ Typical native AOT runtime developer scenario workflow is to native AOT compile
The workflow looks like this:
-- Build the repo using the Building instructions above
-- Open the ilc.sln solution described above. This solution contains the compiler, but also an unrelated project named "repro". This repro project is a small Hello World. You can place any piece of C# you would like to compile in it. Building the project will compile the source code into IL, but also generate a response file that is suitable to pass to the AOT compiler.
-- Make sure you set the solution configuration in VS to the configuration you just built (e.g. x64 Debug).
-- In the ILCompiler project properties, on the Debug tab, set the "Application arguments" to the generated response file. This will be a file such as "C:\runtime\artifacts\bin\repro\x64\Debug\compile-with-Release-libs.rsp". Prefix the path to the file with "@" to indicate this is a response file so that the "Application arguments" field looks like "@some\path\to\file.rsp".
-- Build & run ILCompiler using **F5**. This will compile the repro project into an `.obj` file. You can debug the compiler and set breakpoints in it at this point.
-- The last step is linking the object file into an executable so that we can launch the result of the AOT compilation.
-- Open the src\coreclr\tools\aot\ILCompiler\reproNative\reproNative.vcxproj project in Visual Studio. This project is configured to pick up the `.obj` file we just compiled and link it with the rest of the runtime.
-- Set the solution configuration to the tuple you've been using so far (e.g. x64 Debug)
-- Build & run using **F5**. This will run the platform linker to link the obj file with the runtime and launch it. At this point you can debug the runtime and the various System.Private libraries.
+* Build the repo using the Building instructions above
+* Open the ilc.sln solution described above. This solution contains the compiler, but also an unrelated project named "repro". This repro project is a small Hello World. You can place any piece of C# you would like to compile in it. Building the project will compile the source code into IL, but also generate a response file that is suitable to pass to the AOT compiler.
+* Make sure you set the solution configuration in VS to the configuration you just built (e.g. x64 Debug).
+* In the ILCompiler project properties, on the Debug tab, set the "Application arguments" to `@$(ArtifactsBinDir)repro\$(TargetArchitecture)\$(Configuration)\compile-with-Release-libs.rsp`. The `@` at the front of the argument indicates that this is the path to the response file generated when "repro" was built. Adjust the "compile-with-Release-libs" part to "compile-with-Debug-libs" depending on how you built the libraries (the `-lc` argument to `build.cmd`). Visual Studio will expand the path to something like `@C:\runtime\artifacts\bin\repro\x64\Debug\compile-with-Release-libs.rsp`.
+* Build & run ILCompiler using **F5**. This will compile the repro project into an `.obj` file. You can debug the compiler and set breakpoints in it at this point.
+* The last step is linking the object file into an executable so that we can launch the result of the AOT compilation.
+* Open the src\coreclr\tools\aot\ILCompiler\reproNative\reproNative.vcxproj project in Visual Studio. This project is configured to pick up the `.obj` file we just compiled and link it with the rest of the runtime.
+* Set the solution configuration to the tuple you've been using so far (e.g. x64 Debug)
+* Build & run using **F5**. This will run the platform linker to link the obj file with the runtime and launch it. At this point you can debug the runtime and the various System.Private libraries.
## Running tests
@@ -73,22 +88,26 @@ If you haven't built the tests yet, run `src\tests\build.cmd nativeaot [Debug|Re
To run all the tests that got built, run `src\tests\run.cmd runnativeaottests [Debug|Release]` on Windows, or `src/tests/run.sh --runnativeaottests [Debug|Release]` on Linux. The `Debug`/`Release` flag should match the flag that was passed to `build.cmd` in the previous step.
-To run an individual test (after it was built), navigate to the `artifacts\tests\coreclr\[Windows|Linux|OSX[.x64.[Debug|Release]\$path_to_test` directory. `$path_to_test` matches the subtree of `src\tests`. You should see a `[.cmd|.sh]` file there. This file is a script that will compile and launch the individual test for you. Before invoking the script, set the following environment variables:
+To run an individual test (after it was built), navigate to the `artifacts\tests\coreclr\[windows|linux|osx[.x64.[Debug|Release]\$path_to_test` directory. `$path_to_test` matches the subtree of `src\tests`. You should see a `[.cmd|.sh]` file there. This file is a script that will compile and launch the individual test for you. Before invoking the script, set the following environment variables:
-* CORE_ROOT=$repo_root\artifacts\tests\coreclr\[Windows|Linux|OSX].x64.[Debug|Release]\Tests\Core_Root
+* CORE_ROOT=$repo_root\artifacts\tests\coreclr\[windows|linux|osx].x64.[Debug|Release]\Tests\Core_Root
* CLRCustomTestLauncher=$repo_root\src\tests\Common\scripts\nativeaottest[.cmd|.sh]
`$repo_root` is the root of your clone of the repo.
-Sometimes it's handy to be able to rebuild the managed test manually or run the compilation under a debugger. A response file that was used to invoke the ahead of time compiler can be found in `$repo_root\artifacts\tests\coreclr\obj\[Windows|Linux|OSX].x64.[Debug|Release]\Managed`.
+Sometimes it's handy to be able to rebuild the managed test manually or run the compilation under a debugger. A response file that was used to invoke the ahead of time compiler can be found in `$repo_root\artifacts\tests\coreclr\obj\[windows|linux|osx].x64.[Debug|Release]\Managed`.
-For more advanced scenarios, look for at [Building Test Subsets](../../testing/coreclr/windows-test-instructions.md#building-test-subsets) and [Generating Core_Root](../../testing/coreclr/windows-test-instructions.md#generating-core_root)
+For more advanced scenarios, look for at [Building the Tests](/docs/workflow/testing/coreclr/testing.md#building-the-tests) and [Building the Core_Root](../../testing/coreclr/testing.md#building-the-coreroot)
### Running library tests
-Build library tests by passing the `libs.tests` subset together with the `/p:TestNativeAot=true` to build the libraries, i.e. `clr.aot+libs+libs.tests /p:TestNativeAot=true` together with the full arguments as specified [above](#building). Then, to run a specific library, go to the tests directory of the library and run the usual command to run tests for the library (see [Running tests for a single library](../../testing/libraries/testing.md#running-tests-for-a-single-library)) but add the `/p:TestNativeAot=true` and the build configuration that was used, i.e. `dotnet.cmd build /t:Test /p:TestNativeAot=true -c Release`.
+Build library tests by passing the `libs.tests` subset together with the `/p:TestNativeAot=true` to build the libraries, i.e. `clr.aot+libs+libs.tests /p:TestNativeAot=true` together with the full arguments as specified [above](#building). Then, to run a specific library, go to the tests directory of the library and run the usual command to run tests for the library (see [Running tests for a single library](/docs/workflow/testing/libraries/testing.md#running-tests-for-a-single-library)) but add the `/p:TestNativeAot=true` and the build configuration that was used, i.e. `dotnet.cmd build /t:Test /p:TestNativeAot=true -c Release`.
## Design Documentation
-- [ILC Compiler Architecture](../../../design/coreclr/botr/ilc-architecture.md)
-- [Managed Type System](../../../design/coreclr/botr/managed-type-system.md)
+* [ILC Compiler Architecture](/docs/design/coreclr/botr/ilc-architecture.md)
+* [Managed Type System](/docs/design/coreclr/botr/managed-type-system.md)
+
+## Further Reading
+
+If you want to know more about working with _NativeAOT_ in general, you can check out their [more in-depth docs](/src/coreclr/nativeaot/docs/README.md) in the `src/coreclr/nativeaot` subtree.
diff --git a/docs/workflow/building/coreclr/osx-instructions.md b/docs/workflow/building/coreclr/osx-instructions.md
deleted file mode 100644
index 283dab9ac68862..00000000000000
--- a/docs/workflow/building/coreclr/osx-instructions.md
+++ /dev/null
@@ -1,48 +0,0 @@
-Build CoreCLR on macOS
-=====================
-
-This guide will walk you through building CoreCLR on macOS. We'll start by showing how to set up your environment from scratch.
-
-Environment
-===========
-
-Ensure you have all of the prerequisites installed from the [macOS Requirements](/docs/workflow/requirements/macos-requirements.md).
-
-Build the Runtime and System.Private.CoreLib
-============================================
-
-To Build CoreCLR, run build.sh to build the CoreCLR subset category of the runtime:
-
-```
-./build.sh -subset clr
-```
-
-After the build has completed, there should some files placed in `artifacts/bin/coreclr/OSX.x64.Debug`. The ones we are interested in are:
-
-- `corerun`: The command line host. This program loads and starts the CoreCLR runtime and passes the managed program you want to run to it.
-- `libcoreclr.dylib`: The CoreCLR runtime itself.
-- `System.Private.CoreLib.dll`: Microsoft Core Library.
-
-Create the Core_Root
-===================
-
-The Core_Root folder will contain the built binaries, generated by `build.sh`, as well as the library packages required to run tests. It is required that you build
-the libraries subset (`-subset libs`) before this command can be run. Note that this by default searches the libraries in Release mode, regardless of the runtime
-configuration you specify. If you built your libs in another configuration, then you have to pass down the appropriate flag `/p:LibrariesConfiguration=`.
-
-```
-./src/tests/build.sh generatelayoutonly
-```
-
-After the build is complete you will be able to find the output in the `artifacts/tests/coreclr/OSX.x64.Debug/Tests/Core_Root` folder.
-
-Running a single test
-===================
-
-After `src/tests/build.sh` is run, corerun from the Core_Root folder is ready to be run. This can be done by using the full absolute path to corerun, or by setting
-an environment variable to the Core_Root folder.
-
-```sh
-export CORE_ROOT=/path/to/runtime/artifacts/tests/coreclr/OSX.x64.Debug/Tests/Core_Root
-$CORE_ROOT/corerun hello_world.dll
-```
diff --git a/docs/workflow/building/coreclr/windows-instructions.md b/docs/workflow/building/coreclr/windows-instructions.md
new file mode 100644
index 00000000000000..38ca5af6f513d6
--- /dev/null
+++ b/docs/workflow/building/coreclr/windows-instructions.md
@@ -0,0 +1,47 @@
+# Build CoreCLR on Windows
+
+* [Environment](#environment)
+* [Build the Runtime](#build-the-runtime)
+ * [Cross-Compilation](#cross-compilation)
+* [Core_Root](#core_root)
+* [Native ARM64 (Experimental)](#native-arm64-experimental)
+
+This guide will walk you through building CoreCLR on Windows.
+
+## Environment
+
+Ensure you have all of the prerequisites installed from the [Windows Requirements](/docs/workflow/requirements/windows-requirements.md).
+
+## Build the Runtime
+
+To build CoreCLR on Windows, run `build.cmd` while specifying the `clr` subset:
+
+```cmd
+.\build.cmd -subset clr