diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 6ab177bb875b34..394b058cb4b22e 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -54,77 +54,77 @@
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
https://github.com/dotnet/runtime-assets
@@ -250,25 +250,25 @@
https://github.com/dotnet/xharness
5ebf69650b9f7b4ecab485be840b3022420f7812
-
+
https://github.com/dotnet/arcade
- 6a638cd0c13962ab2a1943cb1c878be5a41dd82e
+ afc901d73d7d3bd363547ddf8769efe14052bfa7
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- e01e5b0aed54a5a8d9df74e717d1b13f0fb0e056
+ 5e0b0da43f660de5798186f4fd3bc900fc90576c
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- e01e5b0aed54a5a8d9df74e717d1b13f0fb0e056
+ 5e0b0da43f660de5798186f4fd3bc900fc90576c
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- e01e5b0aed54a5a8d9df74e717d1b13f0fb0e056
+ 5e0b0da43f660de5798186f4fd3bc900fc90576c
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- e01e5b0aed54a5a8d9df74e717d1b13f0fb0e056
+ 5e0b0da43f660de5798186f4fd3bc900fc90576c
https://github.com/dotnet/hotreload-utils
@@ -286,5 +286,13 @@
https://github.com/dotnet/sdk
3f2524bd65a6ab77b9160bcc23824dbc03990f3d
+
+ https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
+ 5e0b0da43f660de5798186f4fd3bc900fc90576c
+
+
+ https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
+ 5e0b0da43f660de5798186f4fd3bc900fc90576c
+
diff --git a/eng/Versions.props b/eng/Versions.props
index 72f17c83aa2662..0a1d7ed3b2f309 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -54,22 +54,22 @@
7.0.100-rc.1.22402.1
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 2.5.1-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
- 7.0.0-beta.22411.2
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 2.5.1-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
+ 7.0.0-beta.22416.1
6.0.0-preview.1.102
@@ -99,9 +99,9 @@
4.5.0
5.0.0
5.0.0
- 4.5.4
+ 4.5.5
4.5.0
- 6.0.0
+ 6.0.1
4.7.1
4.7.0
4.7.0
@@ -133,10 +133,12 @@
7.0.0-beta.22409.1
7.0.0-beta.22409.1
- 1.0.0-prerelease.22375.7
- 1.0.0-prerelease.22375.7
- 1.0.0-prerelease.22375.7
- 1.0.0-prerelease.22375.7
+ 1.0.0-prerelease.22415.6
+ 1.0.0-prerelease.22415.6
+ 1.0.0-prerelease.22415.6
+ 1.0.0-prerelease.22415.6
+ 1.0.0-prerelease.22415.6
+ 1.0.0-prerelease.22415.6
16.9.0-beta1.21055.5
2.0.0-beta4.22355.1
diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh
index d3b0ac3ba7b600..032f5f193732a1 100755
--- a/eng/common/cross/build-rootfs.sh
+++ b/eng/common/cross/build-rootfs.sh
@@ -76,10 +76,10 @@ __FreeBSDPackages+=" openssl"
__FreeBSDPackages+=" krb5"
__FreeBSDPackages+=" terminfo-db"
-__IllumosPackages="icu-64.2nb2"
-__IllumosPackages+=" mit-krb5-1.16.2nb4"
-__IllumosPackages+=" openssl-1.1.1e"
-__IllumosPackages+=" zlib-1.2.11"
+__IllumosPackages="icu"
+__IllumosPackages+=" mit-krb5"
+__IllumosPackages+=" openssl"
+__IllumosPackages+=" zlib"
__HaikuPackages="gmp"
__HaikuPackages+=" gmp_devel"
@@ -390,14 +390,18 @@ elif [[ "$__CodeName" == "illumos" ]]; then
if [[ "$__UseMirror" == 1 ]]; then
BaseUrl=http://pkgsrc.smartos.skylime.net
fi
- BaseUrl="$BaseUrl/packages/SmartOS/2020Q1/${__illumosArch}/All"
+ BaseUrl="$BaseUrl/packages/SmartOS/trunk/${__illumosArch}/All"
+ echo "Downloading manifest"
+ wget "$BaseUrl"
echo "Downloading dependencies."
read -ra array <<<"$__IllumosPackages"
for package in "${array[@]}"; do
- echo "Installing $package..."
+ echo "Installing '$package'"
+ package="$(grep ">$package-[0-9]" All | sed -En 's/.*href="(.*)\.tgz".*/\1/p')"
+ echo "Resolved name '$package'"
wget "$BaseUrl"/"$package".tgz
ar -x "$package".tgz
- tar --skip-old-files -xzf "$package".tmp.tgz -C "$__RootfsDir" 2>/dev/null
+ tar --skip-old-files -xzf "$package".tmp.tg* -C "$__RootfsDir" 2>/dev/null
done
echo "Cleaning up temporary files."
popd
diff --git a/eng/common/generate-locproject.ps1 b/eng/common/generate-locproject.ps1
index afdd1750290923..846e7950ce945b 100644
--- a/eng/common/generate-locproject.ps1
+++ b/eng/common/generate-locproject.ps1
@@ -33,6 +33,8 @@ $jsonTemplateFiles | ForEach-Object {
$jsonWinformsTemplateFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "en\\strings\.json" } # current winforms pattern
+$wxlFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\\.+\.wxl" -And -Not( $_.Directory.Name -Match "\d{4}" ) } # localized files live in four digit lang ID directories; this excludes them
+
$xlfFiles = @()
$allXlfFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory\*\*.xlf"
@@ -77,8 +79,7 @@ $locJson = @{
CopyOption = "LangIDOnPath"
OutputPath = "$($_.Directory.Parent.FullName | Resolve-Path -Relative)\"
}
- }
- else {
+ } else {
return @{
SourceFile = $sourceFile
CopyOption = "LangIDOnName"
@@ -88,6 +89,32 @@ $locJson = @{
}
}
)
+ },
+ @{
+ CloneLanguageSet = "WiX_CloneLanguages"
+ LssFiles = @( "wxl_loc.lss" )
+ LocItems = @(
+ $wxlFiles | ForEach-Object {
+ $outputPath = "$($_.Directory.FullName | Resolve-Path -Relative)\"
+ $continue = $true
+ foreach ($exclusion in $exclusions.Exclusions) {
+ if ($outputPath.Contains($exclusion))
+ {
+ $continue = $false
+ }
+ }
+ $sourceFile = ($_.FullName | Resolve-Path -Relative)
+ if ($continue)
+ {
+ return @{
+ SourceFile = $sourceFile
+ CopyOption = "LangIDOnPath"
+ OutputPath = $outputPath
+ Languages = "cs-CZ;de-DE;es-ES;fr-FR;it-IT;ja-JP;ko-KR;pl-PL;pt-BR;ru-RU;tr-TR;zh-CN;zh-TW"
+ }
+ }
+ }
+ )
}
)
}
diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1
index 119a6c660d1a4d..c35087a06019ef 100644
--- a/eng/common/sdk-task.ps1
+++ b/eng/common/sdk-task.ps1
@@ -64,7 +64,7 @@ try {
$GlobalJson.tools | Add-Member -Name "vs" -Value (ConvertFrom-Json "{ `"version`": `"16.5`" }") -MemberType NoteProperty
}
if( -not ($GlobalJson.tools.PSObject.Properties.Name -match "xcopy-msbuild" )) {
- $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "17.1.0" -MemberType NoteProperty
+ $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "17.2.1" -MemberType NoteProperty
}
if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") {
$xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true
diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1
index f83a748c37e9cf..aba6308ad313c5 100644
--- a/eng/common/tools.ps1
+++ b/eng/common/tools.ps1
@@ -365,8 +365,8 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements =
# If the version of msbuild is going to be xcopied,
# use this version. Version matches a package here:
- # https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-eng&package=RoslynTools.MSBuild&protocolType=NuGet&version=17.1.0&view=overview
- $defaultXCopyMSBuildVersion = '17.1.0'
+ # https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-eng&package=RoslynTools.MSBuild&protocolType=NuGet&version=17.2.1&view=overview
+ $defaultXCopyMSBuildVersion = '17.2.1'
if (!$vsRequirements) {
if (Get-Member -InputObject $GlobalJson.tools -Name 'vs') {
diff --git a/eng/native/configureplatform.cmake b/eng/native/configureplatform.cmake
index c7a38c3eee8294..9f8ac48694b3c8 100644
--- a/eng/native/configureplatform.cmake
+++ b/eng/native/configureplatform.cmake
@@ -2,7 +2,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/functions.cmake)
# If set, indicates that this is not an officially supported release.
# Release branches should set this to false.
-set(PRERELEASE 1)
+set(PRERELEASE 0)
#----------------------------------------
# Detect and set platform variable names
diff --git a/eng/nativepgo.targets b/eng/nativepgo.targets
index e6d58a33994fff..5dc312774e3078 100644
--- a/eng/nativepgo.targets
+++ b/eng/nativepgo.targets
@@ -1,7 +1,7 @@
- true
- true
+ true
+ true
false
false
@@ -16,14 +16,20 @@
+
+
-
+
diff --git a/eng/pipelines/coreclr/templates/run-performance-job.yml b/eng/pipelines/coreclr/templates/run-performance-job.yml
index d4e25aff3f4985..218c8262ad52de 100644
--- a/eng/pipelines/coreclr/templates/run-performance-job.yml
+++ b/eng/pipelines/coreclr/templates/run-performance-job.yml
@@ -64,29 +64,35 @@ jobs:
- HelixPerfUploadTokenValue: '$(PerfCommandUploadTokenLinux)'
- ${{ if and(notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.osGroup, 'windows')) }}:
- HelixPerfUploadTokenValue: '$(PerfCommandUploadToken)'
+ - ${{ if eq(parameters.runtimeType, 'wasm') }}:
+ - HelixPreCommandsWasmOnLinux: >-
+ sudo apt-get -y remove nodejs &&
+ curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash - &&
+ sudo apt-get -y install nodejs &&
+ npm install --prefix $HELIX_WORKITEM_PAYLOAD jsvu -g &&
+ $HELIX_WORKITEM_PAYLOAD/bin/jsvu --os=linux64 --engines=v8,javascriptcore
+ - ${{ if ne(parameters.runtimeType, 'wasm') }}:
+ - HelixPreCommandsWasmOnLinux: echo
- HelixPreCommandStemWindows: 'set ORIGPYPATH=%PYTHONPATH%;py -m pip install -U pip;py -3 -m venv %HELIX_WORKITEM_PAYLOAD%\.venv;call %HELIX_WORKITEM_PAYLOAD%\.venv\Scripts\activate.bat;set PYTHONPATH=;py -3 -m pip install -U pip;py -3 -m pip install azure.storage.blob==12.0.0;py -3 -m pip install azure.storage.queue==12.0.0;set "PERFLAB_UPLOAD_TOKEN=$(HelixPerfUploadTokenValue)"'
- HelixPreCommandStemLinux: >-
export ORIGPYPATH=$PYTHONPATH
export CRYPTOGRAPHY_ALLOW_OPENSSL_102=true;
echo "** Installing prerequistes **";
- python3 -m pip install -U pip &&
+ python3 -m pip install --user -U pip &&
sudo apt-get -y install python3-venv &&
python3 -m venv $HELIX_WORKITEM_PAYLOAD/.venv &&
ls -l $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate &&
export PYTHONPATH= &&
- python3 -m pip install -U pip &&
- pip3 install azure.storage.blob==12.0.0 &&
- pip3 install azure.storage.queue==12.0.0 &&
+ python3 -m pip install --user -U pip &&
+ pip3 install --user azure.storage.blob==12.0.0 &&
+ pip3 install --user azure.storage.queue==12.0.0 &&
sudo apt-get update &&
sudo apt -y install curl dirmngr apt-transport-https lsb-release ca-certificates &&
- curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&
- sudo apt-get -y install nodejs &&
- npm install --prefix $HELIX_WORKITEM_PAYLOAD jsvu -g &&
- $HELIX_WORKITEM_PAYLOAD/bin/jsvu --os=linux64 --engines=v8,javascriptcore &&
- export PERFLAB_UPLOAD_TOKEN="$(HelixPerfUploadTokenValue)" &&
- export PERF_PREREQS_INSTALLED=1;
- test "x$PERF_PREREQS_INSTALLED" = "x1" || echo "** Error: Failed to install prerequites **"
- - HelixPreCommandStemMusl: 'export ORIGPYPATH=$PYTHONPATH;sudo apk add icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib cargo;sudo apk add libgdiplus --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing; python3 -m venv $HELIX_WORKITEM_PAYLOAD/.venv;source $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate;export PYTHONPATH=;python3 -m pip install -U pip;pip3 install azure.storage.blob==12.7.1;pip3 install azure.storage.queue==12.1.5;export PERFLAB_UPLOAD_TOKEN="$(HelixPerfUploadTokenValue)"'
+ $(HelixPreCommandsWasmOnLinux) &&
+ export PERFLAB_UPLOAD_TOKEN="$(HelixPerfUploadTokenValue)"
+ || export PERF_PREREQS_INSTALL_FAILED=1;
+ test "x$PERF_PREREQS_INSTALL_FAILED" = "x1" && echo "** Error: Failed to install prerequites **"
+ - HelixPreCommandStemMusl: 'export ORIGPYPATH=$PYTHONPATH;sudo apk add icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib cargo;sudo apk add libgdiplus --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing; python3 -m venv $HELIX_WORKITEM_PAYLOAD/.venv;source $HELIX_WORKITEM_PAYLOAD/.venv/bin/activate;export PYTHONPATH=;python3 -m pip install --user -U pip;pip3 install --user azure.storage.blob==12.7.1;pip3 install --user azure.storage.queue==12.1.5;export PERFLAB_UPLOAD_TOKEN="$(HelixPerfUploadTokenValue)"'
- ExtraMSBuildLogsWindows: 'set MSBUILDDEBUGCOMM=1;set "MSBUILDDEBUGPATH=%HELIX_WORKITEM_UPLOAD_ROOT%"'
- ExtraMSBuildLogsLinux: 'export MSBUILDDEBUGCOMM=1;export "MSBUILDDEBUGPATH=$HELIX_WORKITEM_UPLOAD_ROOT"'
- HelixPreCommand: ''
diff --git a/eng/pipelines/mono/templates/workloads-build.yml b/eng/pipelines/mono/templates/workloads-build.yml
index 28fb20114c89a3..19a56febb53ab4 100644
--- a/eng/pipelines/mono/templates/workloads-build.yml
+++ b/eng/pipelines/mono/templates/workloads-build.yml
@@ -56,6 +56,8 @@ jobs:
IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm*.nupkg
IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.android-*.nupkg
IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.browser-wasm*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.multithread.browser-wasm*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.perftrace.browser-wasm*.nupkg
IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.ios-*.nupkg
IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.iossimulator-*.nupkg
IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.maccatalyst-*.nupkg
diff --git a/eng/restore/optimizationData.targets b/eng/restore/optimizationData.targets
index 2072c6a28d2f06..9d8717803f1946 100644
--- a/eng/restore/optimizationData.targets
+++ b/eng/restore/optimizationData.targets
@@ -3,7 +3,9 @@
+
+
diff --git a/eng/testing/performance/microbenchmarks.proj b/eng/testing/performance/microbenchmarks.proj
index 1331e1e7a811c0..3793751775f92d 100644
--- a/eng/testing/performance/microbenchmarks.proj
+++ b/eng/testing/performance/microbenchmarks.proj
@@ -132,10 +132,10 @@
$(WorkItemDirectory)
$(WorkItemCommand) --bdn-artifacts $(BaselineArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(BaselineCoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)"
- if [ "x$PERF_PREREQS_INSTALLED" = "x1" ]; then
- $(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)";
+ if [ "x$PERF_PREREQS_INSTALL_FAILED" = "x1" ]; then
+ echo "\n\n** Error: Failed to install prerequisites **\n\n"; (exit 1);
else
- echo "\n\n** Error: Failed to install prerequisites **\n\n"; export _commandExitCode=1;
+ $(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)";
fi
$(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)"
$(DotnetExe) run -f $(PERFLAB_Framework) -p $(ResultsComparer) --base $(BaselineArtifactsDirectory) --diff $(ArtifactsDirectory) --threshold 2$(Percent) --xml $(XMLResults);$(FinalCommand)
@@ -148,10 +148,10 @@
$(WorkItemDirectory)
$(WorkItemCommand) --bdn-artifacts $(BaselineArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(BaselineCoreRunArgument)"
- if [ "x$PERF_PREREQS_INSTALLED" = "x1" ]; then
- $(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument)";
+ if [ "x$PERF_PREREQS_INSTALL_FAILED" = "x1" ]; then
+ echo "\n\n** Error: Failed to install prerequisites **\n\n"; (exit 1);
else
- echo "\n\n** Error: Failed to install prerequisites **\n\n"; export _commandExitCode=1;
+ $(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument)";
fi
$(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument)"
$(DotnetExe) run -f $(PERFLAB_Framework) -p $(ResultsComparer) --base $(BaselineArtifactsDirectory) --diff $(ArtifactsDirectory) --threshold 2$(Percent) --xml $(XMLResults)
diff --git a/global.json b/global.json
index 9f0baa92e79cf3..4a177769017cf9 100644
--- a/global.json
+++ b/global.json
@@ -8,9 +8,9 @@
"dotnet": "7.0.100-preview.7.22377.5"
},
"msbuild-sdks": {
- "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.22411.2",
- "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.22411.2",
- "Microsoft.DotNet.SharedFramework.Sdk": "7.0.0-beta.22411.2",
+ "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.22416.1",
+ "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.22416.1",
+ "Microsoft.DotNet.SharedFramework.Sdk": "7.0.0-beta.22416.1",
"Microsoft.Build.NoTargets": "3.5.0",
"Microsoft.Build.Traversal": "3.1.6",
"Microsoft.NET.Sdk.IL": "7.0.0-rc.1.22414.6"
diff --git a/src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs b/src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs
index 595f5482fca5b9..bc731b674d2e97 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs
@@ -176,7 +176,7 @@ internal static unsafe void ConvertFixedToNative(int flags, string strManaged, I
internal static unsafe string ConvertFixedToManaged(IntPtr cstr, int length)
{
- int end = SpanHelpers.IndexOf(ref *(byte*)cstr, 0, length);
+ int end = new ReadOnlySpan((byte*)cstr, length).IndexOf((byte)0);
if (end >= 0)
{
length = end;
@@ -450,7 +450,7 @@ internal static unsafe void ConvertToNative(string? strManaged, IntPtr nativeHom
internal static unsafe string ConvertToManaged(IntPtr nativeHome, int length)
{
- int end = SpanHelpers.IndexOf(ref *(char*)nativeHome, '\0', length);
+ int end = new ReadOnlySpan((char*)nativeHome, length).IndexOf('\0');
if (end >= 0)
{
length = end;
diff --git a/src/coreclr/nativeaot/BuildIntegration/Microsoft.DotNet.ILCompiler.props b/src/coreclr/nativeaot/BuildIntegration/Microsoft.DotNet.ILCompiler.props
index da6b72b12d7ce1..e0cc69015b8e16 100644
--- a/src/coreclr/nativeaot/BuildIntegration/Microsoft.DotNet.ILCompiler.props
+++ b/src/coreclr/nativeaot/BuildIntegration/Microsoft.DotNet.ILCompiler.props
@@ -11,8 +11,8 @@ Copyright (c) .NET Foundation. All rights reserved.
-->
-
- true
+
+ true
$(MSBuildThisFileDirectory)Microsoft.DotNet.ILCompiler.SingleEntry.targets
diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/InteropHelpers.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/InteropHelpers.cs
index 4e8bfcd492dde1..8e383b44d85033 100644
--- a/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/InteropHelpers.cs
+++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/InteropHelpers.cs
@@ -55,8 +55,8 @@ internal static unsafe void StringToByValAnsiString(string str, byte* pNative, i
public static unsafe string ByValAnsiStringToString(byte* buffer, int length)
{
- int end = SpanHelpers.IndexOf(ref *(byte*)buffer, 0, length);
- if (end != -1)
+ int end = new ReadOnlySpan(buffer, length).IndexOf((byte)0);
+ if (end >= 0)
{
length = end;
}
@@ -77,8 +77,8 @@ internal static unsafe void StringToUnicodeFixedArray(string str, ushort* buffer
internal static unsafe string UnicodeToStringFixedArray(ushort* buffer, int length)
{
- int end = SpanHelpers.IndexOf(ref *(char*)buffer, '\0', length);
- if (end != -1)
+ int end = new ReadOnlySpan(buffer, length).IndexOf('\0');
+ if (end >= 0)
{
length = end;
}
diff --git a/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs b/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs
index ebfbab7a8e2c02..41226385ea86ac 100644
--- a/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs
+++ b/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/MethodNameFormatter.cs
@@ -1,8 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
@@ -49,7 +47,6 @@ public static string FormatMethodName(MetadataReader metadataReader, TypeDefinit
MethodNameFormatter formatter = new MethodNameFormatter(metadataReader, SigTypeContext.FromMethod(metadataReader, enclosingTypeHandle, methodHandle));
Method method = metadataReader.GetMethod(methodHandle);
- MethodSignature methodSignature = metadataReader.GetMethodSignature(method.Signature);
formatter.EmitTypeName(enclosingTypeHandle, namespaceQualified: true);
formatter._outputBuilder.Append('.');
formatter.EmitString(method.Name);
@@ -64,7 +61,7 @@ public static string FormatMethodName(MetadataReader metadataReader, TypeDefinit
}
else
{
- formatter._outputBuilder.Append(", ");
+ formatter._outputBuilder.Append(',');
}
formatter.EmitTypeName(handle, namespaceQualified: false);
}
@@ -73,7 +70,7 @@ public static string FormatMethodName(MetadataReader metadataReader, TypeDefinit
formatter._outputBuilder.Append(']');
}
- formatter.EmitMethodParameters(methodSignature);
+ formatter.EmitMethodParameters(methodHandle);
return formatter._outputBuilder.ToString();
}
@@ -124,28 +121,30 @@ private void EmitMethodReferenceName(MemberReferenceHandle memberRefHandle)
private void EmitMethodInstantiationName(MethodInstantiationHandle methodInstHandle)
{
MethodInstantiation methodInst = _metadataReader.GetMethodInstantiation(methodInstHandle);
- MethodSignature methodSignature;
+
if (methodInst.Method.HandleType == HandleType.MemberReference)
{
MemberReferenceHandle methodRefHandle = methodInst.Method.ToMemberReferenceHandle(_metadataReader);
MemberReference methodRef = methodRefHandle.GetMemberReference(_metadataReader);
- EmitContainingTypeAndMethodName(methodRef, out methodSignature);
+ EmitContainingTypeAndMethodName(methodRef, out MethodSignature methodSignature);
+ EmitGenericArguments(methodInst.GenericTypeArguments);
+ EmitMethodParameters(methodSignature);
}
else
{
QualifiedMethodHandle qualifiedMethodHandle = methodInst.Method.ToQualifiedMethodHandle(_metadataReader);
QualifiedMethod qualifiedMethod = _metadataReader.GetQualifiedMethod(qualifiedMethodHandle);
- EmitContainingTypeAndMethodName(qualifiedMethod, out methodSignature);
+ EmitContainingTypeAndMethodName(qualifiedMethod);
+ EmitGenericArguments(methodInst.GenericTypeArguments);
+ EmitMethodParameters(qualifiedMethod.Method);
}
- EmitGenericArguments(methodInst.GenericTypeArguments);
- EmitMethodParameters(methodSignature);
}
private void EmitMethodDefinitionName(QualifiedMethodHandle qualifiedMethodHandle)
{
QualifiedMethod qualifiedMethod = _metadataReader.GetQualifiedMethod(qualifiedMethodHandle);
- EmitContainingTypeAndMethodName(qualifiedMethod, out MethodSignature methodSignature);
- EmitMethodParameters(methodSignature);
+ EmitContainingTypeAndMethodName(qualifiedMethod);
+ EmitMethodParameters(qualifiedMethod.Method);
}
///
@@ -161,10 +160,9 @@ private void EmitContainingTypeAndMethodName(MemberReference methodRef, out Meth
EmitString(methodRef.Name);
}
- private void EmitContainingTypeAndMethodName(QualifiedMethod qualifiedMethod, out MethodSignature methodSignature)
+ private void EmitContainingTypeAndMethodName(QualifiedMethod qualifiedMethod)
{
Method method = _metadataReader.GetMethod(qualifiedMethod.Method);
- methodSignature = _metadataReader.GetMethodSignature(method.Signature);
EmitTypeName(qualifiedMethod.EnclosingType, namespaceQualified: true);
_outputBuilder.Append('.');
EmitString(method.Name);
@@ -181,6 +179,57 @@ private void EmitMethodParameters(MethodSignature methodSignature)
_outputBuilder.Append(')');
}
+ ///
+ /// Emit parenthesized method argument type list with parameter names.
+ ///
+ /// Method handle to use for parameter formatting
+ private void EmitMethodParameters(MethodHandle methodHandle)
+ {
+ bool TryGetNextParameter(ref ParameterHandleCollection.Enumerator enumerator, out Parameter parameter)
+ {
+ bool hasNext = enumerator.MoveNext();
+ parameter = hasNext ? enumerator.Current.GetParameter(_metadataReader) : default;
+ return hasNext;
+ }
+
+ Method method = methodHandle.GetMethod(_metadataReader);
+ HandleCollection typeVector = method.Signature.GetMethodSignature(_metadataReader).Parameters;
+ ParameterHandleCollection.Enumerator parameters = method.Parameters.GetEnumerator();
+
+ bool hasParameter = TryGetNextParameter(ref parameters, out Parameter parameter);
+ if (hasParameter && parameter.Sequence == 0)
+ {
+ hasParameter = TryGetNextParameter(ref parameters, out parameter);
+ }
+
+ _outputBuilder.Append('(');
+
+ uint typeIndex = 0;
+ foreach (Handle type in typeVector)
+ {
+ if (typeIndex != 0)
+ {
+ _outputBuilder.Append(", ");
+ }
+
+ EmitTypeName(type, namespaceQualified: false);
+
+ if (++typeIndex == parameter.Sequence && hasParameter)
+ {
+ string name = parameter.Name.GetConstantStringValue(_metadataReader).Value;
+ hasParameter = TryGetNextParameter(ref parameters, out parameter);
+
+ if (!string.IsNullOrEmpty(name))
+ {
+ _outputBuilder.Append(' ');
+ _outputBuilder.Append(name);
+ }
+ }
+ }
+
+ _outputBuilder.Append(')');
+ }
+
///
/// Emit comma-separated list of type names into the output string builder.
///
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/MetadataFieldLayoutAlgorithm.cs b/src/coreclr/tools/Common/TypeSystem/Common/MetadataFieldLayoutAlgorithm.cs
index 8da028a5190fb5..70b529a60601ce 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/MetadataFieldLayoutAlgorithm.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/MetadataFieldLayoutAlgorithm.cs
@@ -469,6 +469,7 @@ protected ComputedInstanceFieldLayout ComputeAutoFieldLayout(MetadataType type,
if (IsByValueClass(fieldType))
{
+ // Valuetypes which are not primitives or enums
instanceValueClassFieldCount++;
}
else if (fieldType.IsGCPointer)
@@ -520,25 +521,47 @@ protected ComputedInstanceFieldLayout ComputeAutoFieldLayout(MetadataType type,
if (!fieldLayoutAbiStable)
layoutAbiStable = false;
- largestAlignmentRequired = LayoutInt.Max(fieldSizeAndAlignment.Alignment, largestAlignmentRequired);
-
if (IsByValueClass(fieldType))
{
+ // This block handles valuetypes which are not primitives or enums, it only has a meaningful effect, if the
+ // type has an alignment greater than pointer size.
+ largestAlignmentRequired = LayoutInt.Max(fieldSizeAndAlignment.Alignment, largestAlignmentRequired);
instanceValueClassFieldsArr[instanceValueClassFieldCount++] = field;
}
- else if (fieldType.IsGCPointer)
- {
- instanceGCPointerFieldsArr[instanceGCPointerFieldsCount++] = field;
- }
else
{
- int log2size = CalculateLog2(fieldSizeAndAlignment.Size.AsInt);
- instanceNonGCPointerFieldsArr[log2size][instanceNonGCPointerFieldsCount[log2size]++] = field;
+ // non-value-type (and primitive type) fields will add an alignment requirement of pointer size
+ // This alignment requirement will not be significant in the final alignment calculation unlesss the
+ // type is greater than the size of a single pointer.
+ //
+ // This does not account for types that are marked IsAlign8Candidate due to 8-byte fields
+ // but that is explicitly handled when we calculate the final alignment for the type.
+
+ // This behavior is extremely strange for primitive types, as it makes a struct with a single byte in it
+ // have 8 byte alignment, but that is the current implementation.
+
+ largestAlignmentRequired = LayoutInt.Max(new LayoutInt(context.Target.PointerSize), largestAlignmentRequired);
+
+ if (fieldType.IsGCPointer)
+ {
+ instanceGCPointerFieldsArr[instanceGCPointerFieldsCount++] = field;
+ }
+ else
+ {
+ Debug.Assert(fieldType.IsPrimitive || fieldType.IsPointer || fieldType.IsFunctionPointer || fieldType.IsEnum || fieldType.IsByRef);
+ int log2size = CalculateLog2(fieldSizeAndAlignment.Size.AsInt);
+ instanceNonGCPointerFieldsArr[log2size][instanceNonGCPointerFieldsCount[log2size]++] = field;
+
+ if (fieldType.IsPrimitive || fieldType.IsEnum)
+ {
+ // Handle alignment of long/ulong/double on ARM32
+ largestAlignmentRequired = LayoutInt.Max(context.Target.GetObjectAlignment(fieldSizeAndAlignment.Size), largestAlignmentRequired);
+ }
+ }
}
}
- largestAlignmentRequired = context.Target.GetObjectAlignment(largestAlignmentRequired);
- bool requiresAlign8 = !largestAlignmentRequired.IsIndeterminate && largestAlignmentRequired.AsInt > 4;
+ bool requiresAlign8 = !largestAlignmentRequired.IsIndeterminate && context.Target.PointerSize == 4 && context.Target.GetObjectAlignment(largestAlignmentRequired).AsInt > 4 && context.Target.PointerSize == 4;
// For types inheriting from another type, field offsets continue on from where they left off
// Base alignment is not always required, it's only applied when there's a version bubble boundary
diff --git a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ArchitectureSpecificFieldLayoutTests.cs b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ArchitectureSpecificFieldLayoutTests.cs
index 067486f858c168..a55aa430f2fccb 100644
--- a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ArchitectureSpecificFieldLayoutTests.cs
+++ b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ArchitectureSpecificFieldLayoutTests.cs
@@ -414,5 +414,67 @@ public void TestAlignmentBehavior_ShortByteEnumStructAuto()
Assert.Equal(0x4, tX86FieldStruct.GetField("_struct").Offset.AsInt);
Assert.Equal(0x4, tARMFieldStruct.GetField("_struct").Offset.AsInt);
}
+
+ [Fact]
+ public void TestAlignmentBehavior_StructStructByte_StructByteAuto()
+ {
+ string _namespace = "Sequential";
+ string _type = "StructStructByte_StructByteAuto";
+
+ MetadataType tX64 = _testModuleX64.GetType(_namespace, _type);
+ MetadataType tX86 = _testModuleX86.GetType(_namespace, _type);
+ MetadataType tARM = _testModuleARM.GetType(_namespace, _type);
+
+ Assert.Equal(0x1, tX64.InstanceFieldAlignment.AsInt);
+ Assert.Equal(0x1, tARM.InstanceFieldAlignment.AsInt);
+ Assert.Equal(0x1, tX86.InstanceFieldAlignment.AsInt);
+
+ Assert.Equal(0x2, tX64.InstanceFieldSize.AsInt);
+ Assert.Equal(0x2, tARM.InstanceFieldSize.AsInt);
+ Assert.Equal(0x2, tX86.InstanceFieldSize.AsInt);
+
+ Assert.Equal(0x0, tX64.GetField("fld1").Offset.AsInt);
+ Assert.Equal(0x0, tARM.GetField("fld1").Offset.AsInt);
+ Assert.Equal(0x0, tX86.GetField("fld1").Offset.AsInt);
+
+ Assert.Equal(0x1, tX64.GetField("fld2").Offset.AsInt);
+ Assert.Equal(0x1, tARM.GetField("fld2").Offset.AsInt);
+ Assert.Equal(0x1, tX86.GetField("fld2").Offset.AsInt);
+ }
+
+ [Theory]
+ [InlineData("StructStructByte_StructByteAuto", new int[]{1,1,1}, new int[]{2,2,2})]
+ [InlineData("StructStructByte_Struct2BytesAuto", new int[]{2,2,2}, new int[]{4,4,4})]
+ [InlineData("StructStructByte_Struct3BytesAuto", new int[]{4,4,4}, new int[]{8,8,8})]
+ [InlineData("StructStructByte_Struct4BytesAuto", new int[]{4,4,4}, new int[]{8,8,8})]
+ [InlineData("StructStructByte_Struct5BytesAuto", new int[]{8,4,4}, new int[]{16,12,12})]
+ [InlineData("StructStructByte_Struct8BytesAuto", new int[]{8,4,4}, new int[]{16,12,12})]
+ [InlineData("StructStructByte_Struct9BytesAuto", new int[]{8,4,4}, new int[]{24,16,16})]
+ public void TestAlignmentBehavior_AutoAlignmentRules(string wrapperType, int[] alignment, int[] size)
+ {
+ string _namespace = "Sequential";
+ string _type = wrapperType;
+
+ MetadataType tX64 = _testModuleX64.GetType(_namespace, _type);
+ MetadataType tX86 = _testModuleX86.GetType(_namespace, _type);
+ MetadataType tARM = _testModuleARM.GetType(_namespace, _type);
+
+ Assert.Equal(alignment[0], tX64.InstanceFieldAlignment.AsInt);
+ Assert.Equal(alignment[1], tARM.InstanceFieldAlignment.AsInt);
+ Assert.Equal(alignment[2], tX86.InstanceFieldAlignment.AsInt);
+
+ Assert.Equal(size[0], tX64.InstanceFieldSize.AsInt);
+ Assert.Equal(size[1], tARM.InstanceFieldSize.AsInt);
+ Assert.Equal(size[2], tX86.InstanceFieldSize.AsInt);
+
+ Assert.Equal(0x0, tX64.GetField("fld1").Offset.AsInt);
+ Assert.Equal(0x0, tARM.GetField("fld1").Offset.AsInt);
+ Assert.Equal(0x0, tX86.GetField("fld1").Offset.AsInt);
+
+ Assert.Equal(alignment[0], tX64.GetField("fld2").Offset.AsInt);
+ Assert.Equal(alignment[1], tARM.GetField("fld2").Offset.AsInt);
+ Assert.Equal(alignment[2], tX86.GetField("fld2").Offset.AsInt);
+ }
+
}
}
diff --git a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/InstanceFieldLayout.cs b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/InstanceFieldLayout.cs
index b49dd4ff729309..c360958375e010 100644
--- a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/InstanceFieldLayout.cs
+++ b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/InstanceFieldLayout.cs
@@ -3,56 +3,57 @@
using System;
using System.Runtime.InteropServices;
+using System.Runtime.Intrinsics;
#pragma warning disable 169
namespace ContainsGCPointers
{
- struct NoPointers
+ public struct NoPointers
{
- int int1;
- byte byte1;
- char char1;
+ public int int1;
+ public byte byte1;
+ public char char1;
}
- struct StillNoPointers
+ public struct StillNoPointers
{
- NoPointers noPointers1;
- bool bool1;
+ public NoPointers noPointers1;
+ public bool bool1;
}
- class ClassNoPointers
+ public class ClassNoPointers
{
- char char1;
+ public char char1;
}
- struct HasPointers
+ public struct HasPointers
{
- string string1;
+ public string string1;
}
- struct FieldHasPointers
+ public struct FieldHasPointers
{
- HasPointers hasPointers1;
+ public HasPointers hasPointers1;
}
- class ClassHasPointers
+ public class ClassHasPointers
{
- ClassHasPointers classHasPointers1;
+ public ClassHasPointers classHasPointers1;
}
- class BaseClassHasPointers : ClassHasPointers
+ public class BaseClassHasPointers : ClassHasPointers
{
}
public class ClassHasIntArray
{
- int[] intArrayField;
+ public int[] intArrayField;
}
public class ClassHasArrayOfClassType
{
- ClassNoPointers[] classTypeArray;
+ public ClassNoPointers[] classTypeArray;
}
}
@@ -61,29 +62,29 @@ namespace Explicit
[StructLayout(LayoutKind.Explicit)]
class Class1
{
- static int Stat;
+ public static int Stat;
[FieldOffset(4)]
- bool Bar;
+ public bool Bar;
[FieldOffset(10)]
- char Baz;
+ public char Baz;
}
[StructLayout(LayoutKind.Explicit)]
class Class2 : Class1
{
[FieldOffset(0)]
- int Lol;
+ public int Lol;
[FieldOffset(20)]
- byte Omg;
+ public byte Omg;
}
[StructLayout(LayoutKind.Explicit, Size = 40)]
class ExplicitSize
{
[FieldOffset(0)]
- int Lol;
+ public int Lol;
[FieldOffset(20)]
- byte Omg;
+ public byte Omg;
}
[StructLayout(LayoutKind.Explicit)]
@@ -123,194 +124,320 @@ ref struct ByRefStruct
namespace Sequential
{
[StructLayout(LayoutKind.Sequential)]
- class Class1
+ public class Class1
{
- int MyInt;
- bool MyBool;
- char MyChar;
- string MyString;
- byte[] MyByteArray;
- Class1 MyClass1SelfRef;
+ public int MyInt;
+ public bool MyBool;
+ public char MyChar;
+ public string MyString;
+ public byte[] MyByteArray;
+ public Class1 MyClass1SelfRef;
}
[StructLayout(LayoutKind.Sequential)]
- class Class2 : Class1
+ public class Class2 : Class1
{
- int MyInt2;
+ public int MyInt2;
}
// [StructLayout(LayoutKind.Sequential)] is applied by default by the C# compiler
- struct Struct0
+ public struct Struct0
{
- bool b1;
- bool b2;
- bool b3;
- int i1;
- string s1;
+ public bool b1;
+ public bool b2;
+ public bool b3;
+ public int i1;
+ public string s1;
}
// [StructLayout(LayoutKind.Sequential)] is applied by default by the C# compiler
- struct Struct1
+ public struct Struct1
{
- Struct0 MyStruct0;
- bool MyBool;
+ public Struct0 MyStruct0;
+ public bool MyBool;
}
[StructLayout(LayoutKind.Sequential)]
public class ClassDoubleBool
{
- double double1;
- bool bool1;
+ public double double1;
+ public bool bool1;
}
[StructLayout(LayoutKind.Sequential)]
public class ClassBoolDoubleBool
{
- bool bool1;
- double double1;
- bool bool2;
+ public bool bool1;
+ public double double1;
+ public bool bool2;
+ }
+
+ public struct StructByte
+ {
+ public byte fld1;
+ }
+
+ public struct StructStructByte_StructByteAuto
+ {
+ public StructByte fld1;
+ public Auto.StructByte fld2;
+ }
+ public struct StructStructByte_Struct2BytesAuto
+ {
+ public StructByte fld1;
+ public Auto.Struct2Bytes fld2;
+ }
+ public struct StructStructByte_Struct3BytesAuto
+ {
+ public StructByte fld1;
+ public Auto.Struct3Bytes fld2;
+ }
+ public struct StructStructByte_Struct4BytesAuto
+ {
+ public StructByte fld1;
+ public Auto.Struct4Bytes fld2;
+ }
+ public struct StructStructByte_Struct5BytesAuto
+ {
+ public StructByte fld1;
+ public Auto.Struct5Bytes fld2;
+ }
+ public struct StructStructByte_Struct8BytesAuto
+ {
+ public StructByte fld1;
+ public Auto.Struct8Bytes fld2;
+ }
+ public struct StructStructByte_Struct9BytesAuto
+ {
+ public StructByte fld1;
+ public Auto.Struct9Bytes fld2;
}
}
namespace Auto
{
[StructLayout(LayoutKind.Auto)]
- struct StructWithBool
+ public struct StructWithBool
{
- bool MyStructBool;
+ public bool MyStructBool;
}
[StructLayout(LayoutKind.Auto)]
- struct StructWithIntChar
+ public struct StructWithIntChar
{
- char MyStructChar;
- int MyStructInt;
+ public char MyStructChar;
+ public int MyStructInt;
}
[StructLayout(LayoutKind.Auto)]
- struct StructWithChar
+ public struct StructWithChar
{
- char MyStructChar;
+ public char MyStructChar;
}
- class ClassContainingStructs
+ public class ClassContainingStructs
{
- static int MyStaticInt;
+ public static int MyStaticInt;
- StructWithBool MyStructWithBool;
- bool MyBool1;
- char MyChar1;
- int MyInt;
- double MyDouble;
- long MyLong;
- byte[] MyByteArray;
- string MyString1;
- bool MyBool2;
- StructWithIntChar MyStructWithIntChar;
- StructWithChar MyStructWithChar;
+ public StructWithBool MyStructWithBool;
+ public bool MyBool1;
+ public char MyChar1;
+ public int MyInt;
+ public double MyDouble;
+ public long MyLong;
+ public byte[] MyByteArray;
+ public string MyString1;
+ public bool MyBool2;
+ public StructWithIntChar MyStructWithIntChar;
+ public StructWithChar MyStructWithChar;
}
- class BaseClass7BytesRemaining
+ public class BaseClass7BytesRemaining
{
- bool MyBool1;
- double MyDouble1;
- long MyLong1;
- byte[] MyByteArray1;
- string MyString1;
+ public bool MyBool1;
+ public double MyDouble1;
+ public long MyLong1;
+ public byte[] MyByteArray1;
+ public string MyString1;
}
- class BaseClass4BytesRemaining
+ public class BaseClass4BytesRemaining
{
- long MyLong1;
- uint MyUint1;
+ public long MyLong1;
+ public uint MyUint1;
}
- class BaseClass3BytesRemaining
+ public class BaseClass3BytesRemaining
{
- int MyInt1;
- string MyString1;
- bool MyBool1;
+ public int MyInt1;
+ public string MyString1;
+ public bool MyBool1;
}
- class OptimizePartial : BaseClass7BytesRemaining
+ public class OptimizePartial : BaseClass7BytesRemaining
{
- bool OptBool;
- char OptChar;
- long NoOptLong;
- string NoOptString;
+ public bool OptBool;
+ public char OptChar;
+ public long NoOptLong;
+ public string NoOptString;
}
- class Optimize7Bools : BaseClass7BytesRemaining
+ public class Optimize7Bools : BaseClass7BytesRemaining
{
- bool OptBool1;
- bool OptBool2;
- bool OptBool3;
- bool OptBool4;
- bool OptBool5;
- bool OptBool6;
- bool OptBool7;
- bool NoOptBool8;
- string NoOptString;
+ public bool OptBool1;
+ public bool OptBool2;
+ public bool OptBool3;
+ public bool OptBool4;
+ public bool OptBool5;
+ public bool OptBool6;
+ public bool OptBool7;
+ public bool NoOptBool8;
+ public string NoOptString;
}
- class OptimizeAlignedFields : BaseClass7BytesRemaining
+ public class OptimizeAlignedFields : BaseClass7BytesRemaining
{
- bool OptBool1;
- bool OptBool2;
- bool OptBool3;
- bool NoOptBool4;
- char OptChar1;
- char OptChar2;
- string NoOptString;
+ public bool OptBool1;
+ public bool OptBool2;
+ public bool OptBool3;
+ public bool NoOptBool4;
+ public char OptChar1;
+ public char OptChar2;
+ public string NoOptString;
}
- class OptimizeLargestField : BaseClass4BytesRemaining
+ public class OptimizeLargestField : BaseClass4BytesRemaining
{
- bool NoOptBool;
- char NoOptChar;
- int OptInt;
- string NoOptString;
+ public bool NoOptBool;
+ public char NoOptChar;
+ public int OptInt;
+ public string NoOptString;
}
- class NoOptimizeMisaligned : BaseClass3BytesRemaining
+ public class NoOptimizeMisaligned : BaseClass3BytesRemaining
{
- char NoOptChar;
- int NoOptInt;
- string NoOptString;
+ public char NoOptChar;
+ public int NoOptInt;
+ public string NoOptString;
}
- class NoOptimizeCharAtSize2Alignment : BaseClass3BytesRemaining
+ public class NoOptimizeCharAtSize2Alignment : BaseClass3BytesRemaining
{
- char NoOptChar;
+ public char NoOptChar;
}
[StructLayout(LayoutKind.Auto, Pack = 1)]
- struct MinPacking
+ public struct MinPacking
{
public byte _byte;
public T _value;
}
+
+ [StructLayout(LayoutKind.Auto)]
+ public struct int8x16x2
+ {
+ public Vector128 _0;
+ public Vector128 _1;
+ }
+
+ public struct Wrapper_int8x16x2
+ {
+ public int8x16x2 fld;
+ }
+
+ public struct Wrapper_int8x16x2_2
+ {
+ public bool fld1;
+ public int8x16x2 fld2;
+ }
+
+ [StructLayout(LayoutKind.Auto)]
+ public struct StructByte
+ {
+ public byte fld1;
+ }
+
+ [StructLayout(LayoutKind.Auto)]
+ public struct Struct2Bytes
+ {
+ public byte fld1;
+ public byte fld2;
+ }
+
+ [StructLayout(LayoutKind.Auto)]
+ public struct Struct3Bytes
+ {
+ public byte fld1;
+ public byte fld2;
+ public byte fld3;
+ }
+
+ [StructLayout(LayoutKind.Auto)]
+ public struct Struct4Bytes
+ {
+ public byte fld1;
+ public byte fld2;
+ public byte fld3;
+ public byte fld4;
+ }
+
+ [StructLayout(LayoutKind.Auto)]
+ public struct Struct5Bytes
+ {
+ public byte fld1;
+ public byte fld2;
+ public byte fld3;
+ public byte fld4;
+ public byte fld5;
+ }
+
+ [StructLayout(LayoutKind.Auto)]
+ public struct Struct8Bytes
+ {
+ public byte fld1;
+ public byte fld2;
+ public byte fld3;
+ public byte fld4;
+ public byte fld5;
+ public byte fld6;
+ public byte fld7;
+ public byte fld8;
+ }
+
+ [StructLayout(LayoutKind.Auto)]
+ public struct Struct9Bytes
+ {
+ public byte fld1;
+ public byte fld2;
+ public byte fld3;
+ public byte fld4;
+ public byte fld5;
+ public byte fld6;
+ public byte fld7;
+ public byte fld8;
+ public byte fld9;
+ }
}
namespace IsByRefLike
{
public ref struct ByRefLikeStruct
{
- ref object ByRef;
+ public ref object ByRef;
}
public struct NotByRefLike
{
- int X;
+ public int X;
}
}
namespace EnumAlignment
{
- public enum ByteEnum : byte {}
- public enum ShortEnum : short {}
- public enum IntEnum : int {}
- public enum LongEnum : long {}
+ public enum ByteEnum : byte { Val }
+ public enum ShortEnum : short { Val }
+ public enum IntEnum : int { Val }
+ public enum LongEnum : long { Val }
public struct LongIntEnumStruct
{
diff --git a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/Platform.cs b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/Platform.cs
index 2850c56a10f3c9..d9602770b92da5 100644
--- a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/Platform.cs
+++ b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/Platform.cs
@@ -1,5 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
#pragma warning disable 649
#pragma warning disable 169
@@ -136,4 +138,22 @@ public static class RuntimeFeature
public const string ByRefFields = nameof(ByRefFields);
public const string VirtualStaticsInInterfaces = nameof(VirtualStaticsInInterfaces);
}
+
+ internal sealed class IntrinsicAttribute : Attribute
+ {
+ }
+}
+
+namespace System.Runtime.Intrinsics
+{
+ [Intrinsic]
+ [StructLayout(LayoutKind.Sequential, Size = 16)]
+ public readonly struct Vector128
+ where T : struct
+ {
+ // These fields exist to ensure the alignment is 8, rather than 1.
+ // This also allows the debug view to work https://github.com/dotnet/runtime/issues/9495)
+ private readonly ulong _00;
+ private readonly ulong _01;
+ }
}
diff --git a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ILCompiler.TypeSystem.Tests.csproj b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ILCompiler.TypeSystem.Tests.csproj
index a9e0faf8ac8177..444ce230f3f834 100644
--- a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ILCompiler.TypeSystem.Tests.csproj
+++ b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ILCompiler.TypeSystem.Tests.csproj
@@ -46,6 +46,7 @@
+
diff --git a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/InstanceFieldLayoutTests.cs b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/InstanceFieldLayoutTests.cs
index 0a60a72a4a640b..4b02f805f3535b 100644
--- a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/InstanceFieldLayoutTests.cs
+++ b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/InstanceFieldLayoutTests.cs
@@ -850,5 +850,25 @@ public void TestInvalidByRefLikeTypes()
Assert.Throws(() => type.ComputeInstanceLayout(InstanceLayoutKind.TypeAndFields));
}
}
+
+ [Fact]
+ public void TestWrapperAroundVectorTypes()
+ {
+ {
+ MetadataType type = (MetadataType)_testModule.GetType("System.Runtime.Intrinsics", "Vector128`1");
+ MetadataType instantiatedType = type.MakeInstantiatedType(_context.GetWellKnownType(WellKnownType.Byte));
+ Assert.Equal(16, instantiatedType.InstanceFieldAlignment.AsInt);
+ }
+
+ {
+ DefType type = _testModule.GetType("Auto", "int8x16x2");
+ Assert.Equal(16, type.InstanceFieldAlignment.AsInt);
+ }
+
+ {
+ DefType type = _testModule.GetType("Auto", "Wrapper_int8x16x2");
+ Assert.Equal(16, type.InstanceFieldAlignment.AsInt);
+ }
+ }
}
}
diff --git a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/TestTypeSystemContext.cs b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/TestTypeSystemContext.cs
index 0fbd0b6a35329e..4842df691dfa9c 100644
--- a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/TestTypeSystemContext.cs
+++ b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/TestTypeSystemContext.cs
@@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Diagnostics;
+using ILCompiler;
using Internal.TypeSystem;
using System.Reflection;
using System.Reflection.PortableExecutable;
@@ -22,6 +23,7 @@ class TestTypeSystemContext : MetadataTypeSystemContext
{
Dictionary _modules = new Dictionary(StringComparer.OrdinalIgnoreCase);
+ private VectorFieldLayoutAlgorithm _vectorFieldLayoutAlgorithm;
MetadataFieldLayoutAlgorithm _metadataFieldLayout = new TestMetadataFieldLayoutAlgorithm();
MetadataRuntimeInterfacesAlgorithm _metadataRuntimeInterfacesAlgorithm = new MetadataRuntimeInterfacesAlgorithm();
ArrayOfTRuntimeInterfacesAlgorithm _arrayOfTRuntimeInterfacesAlgorithm;
@@ -32,6 +34,7 @@ class TestTypeSystemContext : MetadataTypeSystemContext
public TestTypeSystemContext(TargetArchitecture arch)
: base(new TargetDetails(arch, TargetOS.Unknown, TargetAbi.Unknown))
{
+ _vectorFieldLayoutAlgorithm = new VectorFieldLayoutAlgorithm(_metadataFieldLayout, true);
}
public ModuleDesc GetModuleForSimpleName(string simpleName)
@@ -67,6 +70,10 @@ public override FieldLayoutAlgorithm GetLayoutAlgorithmForType(DefType type)
{
if (type == UniversalCanonType)
return UniversalCanonLayoutAlgorithm.Instance;
+ else if (VectorFieldLayoutAlgorithm.IsVectorType(type))
+ {
+ return _vectorFieldLayoutAlgorithm;
+ }
return _metadataFieldLayout;
}
diff --git a/src/installer/prepare-artifacts.proj b/src/installer/prepare-artifacts.proj
index 595c8e49d575c1..3eed860616f28a 100644
--- a/src/installer/prepare-artifacts.proj
+++ b/src/installer/prepare-artifacts.proj
@@ -133,7 +133,7 @@
- $(InstallersRelativePath)workloads/$(SdkBandVersion)/%(Filename)%(Extension)
+ $(InstallersRelativePath)workloads/%(Filename)%(Extension)
true
@@ -222,11 +222,13 @@
Include="$(DownloadDirectory)**\VS.Redist.Common.*.nupkg"
Exclude="@(DownloadedSymbolNupkgFile)" />
-
+
+ $(DownloadDirectory)*\workloads-vs\**\*.zip"/>
@@ -44,7 +46,6 @@
debugger-main.js
-1
-
true
@@ -52,6 +53,8 @@
+
+
@@ -63,6 +66,7 @@
+
https://github.com/dotnet/runtime/issues/62881
-
- https://github.com/dotnet/runtime/issues/63856
-
-
- https://github.com/dotnet/runtime/issues/63856
-
diff --git a/src/tests/readytorun/fieldlayout/fieldlayout.csproj b/src/tests/readytorun/fieldlayout/fieldlayout.csproj
new file mode 100644
index 00000000000000..a9902bca098f35
--- /dev/null
+++ b/src/tests/readytorun/fieldlayout/fieldlayout.csproj
@@ -0,0 +1,16 @@
+
+
+
+ exe
+ BuildAndRun
+ true
+ true
+ true
+
+
+
+
+
+
+
+
diff --git a/src/tests/readytorun/fieldlayout/fieldlayouttests.cs b/src/tests/readytorun/fieldlayout/fieldlayouttests.cs
new file mode 100644
index 00000000000000..690f6ff9426d42
--- /dev/null
+++ b/src/tests/readytorun/fieldlayout/fieldlayouttests.cs
@@ -0,0 +1,296 @@
+using System;
+using System.Runtime.Intrinsics;
+
+class Test
+{
+ // This test uses the same set of types as the type system unittests use, and attempts to validate that the R2R usage of said types works well.
+ // This is done by touching the various types, and then relying on the verification logic in R2R images to detect failures.
+ static int Main()
+ {
+ ContainsGCPointersFieldsTest.Test();
+// ExplicitTest.Test(); // Explicit layout is known to not quite match the runtime, and if enabled this set of tests will fail.
+ SequentialTest.Test();
+ AutoTest.Test();
+ EnumAlignmentTest.Test();
+ AutoTestWithVector.Test();
+ return 100;
+ }
+}
+
+class EnumAlignmentTest
+{
+ static EnumAlignment.LongIntEnumStruct _fld1;
+ static EnumAlignment.LongIntEnumStructFieldStruct _fld2;
+ static EnumAlignment.IntShortEnumStruct _fld3;
+ static EnumAlignment.IntShortEnumStructFieldStruct _fld4;
+ static EnumAlignment.ShortByteEnumStruct _fld5;
+ static EnumAlignment.ShortByteEnumStructFieldStruct _fld6;
+ static EnumAlignment.LongIntEnumStructAuto _fld7;
+ static EnumAlignment.LongIntEnumStructAutoFieldStruct _fld8;
+ static EnumAlignment.IntShortEnumStructAuto _fld9;
+ static EnumAlignment.IntShortEnumStructAutoFieldStruct _fld10;
+ static EnumAlignment.ShortByteEnumStructAuto _fld11;
+ static EnumAlignment.ShortByteEnumStructAutoFieldStruct _fld12;
+
+ public static void Test()
+ {
+ _fld1._1 = EnumAlignment.LongEnum.Val;
+ _fld1._2 = EnumAlignment.IntEnum.Val;
+ _fld1._3 = EnumAlignment.LongEnum.Val;
+ _fld1._4 = EnumAlignment.IntEnum.Val;
+
+ _fld2._0 = 0;
+ _fld2._struct = _fld1;
+
+ _fld3._1 = EnumAlignment.IntEnum.Val;
+ _fld3._2 = EnumAlignment.ShortEnum.Val;
+ _fld3._3 = EnumAlignment.IntEnum.Val;
+ _fld3._4 = EnumAlignment.ShortEnum.Val;
+
+ _fld4._0 = 1;
+ _fld4._struct = _fld3;
+
+ _fld5._1 = EnumAlignment.ShortEnum.Val;
+ _fld5._2 = EnumAlignment.ByteEnum.Val;
+ _fld5._3 = EnumAlignment.ShortEnum.Val;
+ _fld5._4 = EnumAlignment.ByteEnum.Val;
+
+ _fld6._0 = 2;
+ _fld6._struct = _fld5;
+
+ _fld7._1 = EnumAlignment.LongEnum.Val;
+ _fld7._2 = EnumAlignment.IntEnum.Val;
+ _fld7._3 = EnumAlignment.LongEnum.Val;
+ _fld7._4 = EnumAlignment.IntEnum.Val;
+
+ _fld8._0 = 3;
+ _fld8._struct = _fld7;
+
+ _fld9._1 = EnumAlignment.IntEnum.Val;
+ _fld9._2 = EnumAlignment.ShortEnum.Val;
+ _fld9._3 = EnumAlignment.IntEnum.Val;
+ _fld9._4 = EnumAlignment.ShortEnum.Val;
+
+ _fld10._0 = 4;
+ _fld10._struct = _fld9;
+
+ _fld11._1 = EnumAlignment.ShortEnum.Val;
+ _fld11._2 = EnumAlignment.ByteEnum.Val;
+ _fld11._3 = EnumAlignment.ShortEnum.Val;
+ _fld11._4 = EnumAlignment.ByteEnum.Val;
+
+ _fld12._0 = 5;
+ _fld12._struct = _fld11;
+ }
+}
+
+class AutoTest
+{
+ static Auto.StructWithBool _fld1;
+ static Auto.StructWithIntChar _fld2;
+ static Auto.StructWithChar _fld3;
+ static Auto.ClassContainingStructs _fld4 = new Auto.ClassContainingStructs();
+ static Auto.BaseClass7BytesRemaining _fld5 = new Auto.BaseClass7BytesRemaining();
+ static Auto.BaseClass4BytesRemaining _fld6 = new Auto.BaseClass4BytesRemaining();
+ static Auto.BaseClass3BytesRemaining _fld7 = new Auto.BaseClass3BytesRemaining();
+ static Auto.OptimizePartial _fld8 = new Auto.OptimizePartial();
+ static Auto.Optimize7Bools _fld9 = new Auto.Optimize7Bools();
+ static Auto.OptimizeAlignedFields _fld10 = new Auto.OptimizeAlignedFields();
+ static Auto.OptimizeLargestField _fld11 = new Auto.OptimizeLargestField();
+ static Auto.NoOptimizeMisaligned _fld12 = new Auto.NoOptimizeMisaligned();
+ static Auto.NoOptimizeCharAtSize2Alignment _fld13 = new Auto.NoOptimizeCharAtSize2Alignment();
+ static Auto.MinPacking _fld14 = new Auto.MinPacking();
+
+ public static void Test()
+ {
+ _fld1.MyStructBool = true;
+
+ _fld2.MyStructInt = 1;
+ _fld2.MyStructChar = 'A';
+
+ _fld3.MyStructChar = 'B';
+
+ _fld4.MyStructWithChar = _fld3;
+ _fld4.MyStructWithIntChar = _fld2;
+ _fld4.MyStructWithBool = _fld1;
+ _fld4.MyString1 = "Str";
+ _fld4.MyBool1 = false;
+ _fld4.MyBool2 = true;
+
+ _fld5.MyBool1 = false;
+ _fld5.MyLong1 = 2;
+ _fld5.MyString1 = "Str2";
+ _fld5.MyDouble1 = 1.0;
+ _fld5.MyByteArray1 = new byte[3];
+
+ _fld6.MyLong1 = 3;
+ _fld6.MyUint1 = 4;
+
+ _fld7.MyBool1 = true;
+ _fld7.MyInt1 = 5;
+ _fld7.MyString1 = "str3";
+
+ _fld8.OptBool = false;
+ _fld8.OptChar = 'B';
+ _fld8.NoOptLong = 6;
+ _fld8.NoOptString = "STR4";
+
+ _fld9.OptBool1 = true;
+ _fld9.OptBool2 = false;
+ _fld9.OptBool3 = true;
+ _fld9.OptBool4 = true;
+ _fld9.OptBool5 = false;
+ _fld9.OptBool6 = true;
+ _fld9.OptBool7 = false;
+ _fld9.NoOptBool8 = true;
+ _fld9.NoOptString = "STR5";
+
+ _fld10.OptBool1 = false;
+ _fld10.OptBool2 = true;
+ _fld10.OptBool3 = false;
+ _fld10.NoOptBool4 = true;
+ _fld10.OptChar1 = 'C';
+ _fld10.OptChar2 = 'D';
+ _fld10.NoOptString = "STR6";
+
+ _fld13.NoOptChar = 'E';
+
+ _fld14._value = 7;
+ _fld14._byte = 8;
+ }
+}
+
+class AutoTestWithVector
+{
+ static Auto.int8x16x2 _fld1 = new Auto.int8x16x2();
+ static Auto.Wrapper_int8x16x2 _fld2 = new Auto.Wrapper_int8x16x2();
+ static Auto.Wrapper_int8x16x2_2 _fld3 = new Auto.Wrapper_int8x16x2_2();
+
+ public static void Test()
+ {
+ _fld1._0 = new Vector128();
+ _fld1._1 = new Vector128();
+
+ _fld2.fld = _fld1;
+
+ _fld3.fld1 = true;
+ _fld3.fld2 = _fld1;
+ }
+}
+
+class SequentialTest
+{
+ static Sequential.Class1 _fld1 = new Sequential.Class1();
+ static Sequential.Class2 _fld2 = new Sequential.Class2();
+ static Sequential.Struct0 _fld3;
+ static Sequential.Struct1 _fld4;
+ static Sequential.ClassDoubleBool _fld5 = new Sequential.ClassDoubleBool();
+ static Sequential.ClassBoolDoubleBool _fld6 = new Sequential.ClassBoolDoubleBool();
+ static Sequential.StructStructByte_StructByteAuto _fld7;
+ static Sequential.StructStructByte_Struct2BytesAuto _fld8;
+ static Sequential.StructStructByte_Struct3BytesAuto _fld9;
+ static Sequential.StructStructByte_Struct4BytesAuto _fld10;
+ static Sequential.StructStructByte_Struct5BytesAuto _fld11;
+ static Sequential.StructStructByte_Struct8BytesAuto _fld12;
+ static Sequential.StructStructByte_Struct9BytesAuto _fld13;
+
+ public static void Test()
+ {
+ _fld1.MyClass1SelfRef = _fld1;
+ _fld1.MyChar = 'A';
+ _fld1.MyInt = 1;
+ _fld1.MyString = "STR";
+ _fld1.MyBool = true;
+
+ _fld2.MyClass1SelfRef = _fld1;
+ _fld2.MyChar = 'B';
+ _fld2.MyInt = 2;
+ _fld2.MyString = "STR2";
+ _fld2.MyBool = false;
+ _fld2.MyInt2 = 3;
+
+ _fld3.b1 = true;
+ _fld3.b2 = false;
+ _fld3.b3 = true;
+ _fld3.i1 = 4;
+ _fld3.s1 = "str";
+
+ _fld4.MyStruct0 = _fld3;
+ _fld4.MyBool = false;
+
+ _fld5.bool1 = true;
+ _fld5.double1 = 1.0;
+
+ _fld6.bool1 = false;
+ _fld6.bool2 = true;
+ _fld6.double1 = 2.0;
+
+ _fld7.fld2 = default(Auto.StructByte);
+ _fld8.fld2 = default(Auto.Struct2Bytes);
+ _fld9.fld2 = default(Auto.Struct3Bytes);
+ _fld10.fld2 = default(Auto.Struct4Bytes);
+ _fld11.fld2 = default(Auto.Struct5Bytes);
+ _fld12.fld2 = default(Auto.Struct8Bytes);
+ _fld13.fld2 = default(Auto.Struct9Bytes);
+ }
+}
+
+class ExplicitTest
+{
+ static Explicit.Class1 _fld1 = new Explicit.Class1();
+ static Explicit.Class2 _fld2 = new Explicit.Class2();
+ static Explicit.ExplicitSize _fld3 = new Explicit.ExplicitSize();
+ static Explicit.ExplicitEmptyClass _fld4 = new Explicit.ExplicitEmptyClass();
+ static Explicit.ExplicitEmptyClassSize0 _fld5 = new Explicit.ExplicitEmptyClassSize0();
+ static Explicit.ExplicitEmptyStruct _fld6 = new Explicit.ExplicitEmptyStruct();
+
+ public static void Test()
+ {
+ _fld1.Bar = true;
+ _fld1.Baz = 'A';
+
+ _fld2.Baz = 'B';
+ _fld2.Bar = false;
+ _fld2.Lol = 1;
+ _fld2.Omg = 2;
+
+ _fld3.Omg = 3;
+ _fld3.Lol = 4;
+ }
+}
+class ContainsGCPointersFieldsTest
+{
+ static ContainsGCPointers.NoPointers _fld1;
+ static ContainsGCPointers.StillNoPointers _fld2;
+ static ContainsGCPointers.ClassNoPointers _fld3 = new ContainsGCPointers.ClassNoPointers();
+ static ContainsGCPointers.HasPointers _fld4;
+ static ContainsGCPointers.FieldHasPointers _fld5;
+ static ContainsGCPointers.ClassHasPointers _fld6 = new ContainsGCPointers.ClassHasPointers();
+ static ContainsGCPointers.BaseClassHasPointers _fld7 = new ContainsGCPointers.BaseClassHasPointers();
+ static ContainsGCPointers.ClassHasIntArray _fld8 = new ContainsGCPointers.ClassHasIntArray();
+ static ContainsGCPointers.ClassHasArrayOfClassType _fld9 = new ContainsGCPointers.ClassHasArrayOfClassType();
+
+ public static void Test()
+ {
+ _fld1.int1 = 1;
+ _fld1.byte1 = 2;
+ _fld1.char1 = '0';
+ _fld2.bool1 = true;
+
+ _fld2.noPointers1 = _fld1;
+
+ _fld3.char1 = '2';
+
+ _fld4.string1 = "STR";
+
+ _fld5.hasPointers1.string1 = "STR2";
+
+ _fld6.classHasPointers1 = new ContainsGCPointers.ClassHasPointers();
+
+ _fld7.classHasPointers1 = new ContainsGCPointers.ClassHasPointers();
+
+ _fld8.intArrayField = new int[1];
+
+ _fld9.classTypeArray = new ContainsGCPointers.ClassNoPointers[1];
+ }
+}
diff --git a/src/workloads/workloads.csproj b/src/workloads/workloads.csproj
index e2e96fd572c17e..573e8844c7aa9c 100644
--- a/src/workloads/workloads.csproj
+++ b/src/workloads/workloads.csproj
@@ -7,6 +7,7 @@
false
$(ArtifactsObjDir)workloads/
+ $(WorkloadIntermediateOutputPath)VS/
$(ArtifactsBinDir)workloads/
$(workloadArtifactsPath)/
$(ArtifactsShippingPackagesDir)
@@ -28,14 +29,20 @@
-
+
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
@@ -86,6 +78,10 @@
+
+
+ MonoToolChainManifest
+
Microsoft
@@ -95,50 +91,38 @@
-
+
-
-
-
-
-
+
-
+
-
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
-
+
+
-
@@ -169,15 +153,7 @@
-
-
-
-
-
-
-
-
-
+