diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index bd60f2e67ceac..72af997c0c254 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -15,7 +15,7 @@
]
},
"microsoft.dotnet.xharness.cli": {
- "version": "8.0.0-prerelease.23407.2",
+ "version": "8.0.0-prerelease.24060.1",
"commands": [
"xharness"
]
diff --git a/NuGet.config b/NuGet.config
index b128648435e3d..874a54ee27326 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -9,6 +9,7 @@
+
diff --git a/docs/design/coreclr/botr/clr-abi.md b/docs/design/coreclr/botr/clr-abi.md
index 825ad5820a920..9141613db0c0d 100644
--- a/docs/design/coreclr/botr/clr-abi.md
+++ b/docs/design/coreclr/botr/clr-abi.md
@@ -205,7 +205,7 @@ For non-rude thread abort, the VM walks the stack, running any catch handler tha
For example:
-```
+```cs
try { // try 1
try { // try 2
System.Threading.Thread.CurrentThread.Abort();
@@ -221,7 +221,7 @@ L:
In this case, if the address returned in catch 2 corresponding to label L is outside try 1, then the ThreadAbortException re-raised by the VM will not be caught by catch 1, as is expected. The JIT needs to insert a block such that this is the effective code generation:
-```
+```cs
try { // try 1
try { // try 2
System.Threading.Thread.CurrentThread.Abort();
@@ -238,7 +238,7 @@ L:
Similarly, the automatic re-raise address for a ThreadAbortException can't be within a finally handler, or the VM will abort the re-raise and swallow the exception. This can happen due to call-to-finally thunks marked as "cloned finally", as described above. For example (this is pseudo-assembly-code, not C#):
-```
+```cs
try { // try 1
try { // try 2
System.Threading.Thread.CurrentThread.Abort();
@@ -254,7 +254,7 @@ L:
This would generate something like:
-```
+```asm
// beginning of 'try 1'
// beginning of 'try 2'
System.Threading.Thread.CurrentThread.Abort();
@@ -279,7 +279,7 @@ Finally1:
Note that the JIT must already insert a "step" block so the finally will be called. However, this isn't sufficient to support ThreadAbortException processing, because "L1" is marked as "cloned finally". In this case, the JIT must insert another step block that is within "try 1" but outside the cloned finally block, that will allow for correct re-raise semantics. For example:
-```
+```asm
// beginning of 'try 1'
// beginning of 'try 2'
System.Threading.Thread.CurrentThread.Abort();
@@ -397,7 +397,7 @@ To implement this requirement, for any function with EH, we create a frame-local
Note that the since a slot on x86 is 4 bytes, the minimum size is 16 bytes. The idea is to have 1 slot for each handler that could be possibly be invoked at the same time. For example, for:
-```
+```cs
try {
...
} catch {
@@ -417,7 +417,7 @@ When calling a finally, we set the appropriate level to 0xFC (aka "finally call"
Thus, calling a finally from JIT generated code looks like:
-```
+```asm
mov dword ptr [L_02+0x4 ebp-10H], 0 // This must happen before the 0xFC is written
mov dword ptr [L_02+0x8 ebp-0CH], 252 // 0xFC
push G_M52300_IG07
@@ -428,7 +428,7 @@ In this case, `G_M52300_IG07` is not the address after the 'jmp', so a simple 'c
The code this finally returns to looks like this:
-```
+```asm
mov dword ptr [L_02+0x8 ebp-0CH], 0
jmp SHORT G_M52300_IG05
```
@@ -477,7 +477,7 @@ Because a main function body will **always** be on the stack when one of its fun
There is one "corner case" in the VM implementation of WantsReportOnlyLeaf model that has implications for the code the JIT is allowed to generate. Consider this function with nested exception handling:
-```
+```cs
public void runtest() {
try {
try {
@@ -804,3 +804,29 @@ In addition to the usual registers it also preserves all float registers and `rc
`CORINFO_HELP_DISPATCH_INDIRECT_CALL` takes the call address in `rax` and it reserves the right to use and trash `r10` and `r11`.
The JIT uses the dispatch helper on x64 whenever possible as it is expected that the code size benefits outweighs the less accurate branch prediction.
However, note that the use of `r11` in the dispatcher makes it incompatible with VSD calls where the JIT must fall back to the validator and a manual call.
+
+# Notes on Memset/Memcpy
+
+Generally, `memset` and `memcpy` do not provide any guarantees of atomicity. This implies that they should only be used when the memory being modified by `memset`/`memcpy` is not observable by any other thread (including GC), or when there are no atomicity requirements according to our [Memory Model](../../specs/Memory-model.md). It's especially important when we modify heap containing managed pointers - those must be updated atomically, e.g. using pointer-sized `mov` instruction (managed pointers are always aligned) - see [Atomic Memory Access](../../specs/Memory-model.md#Atomic-memory-accesses). It's worth noting that by "update" it's implied "set to zero", otherwise, we need a write barrier.
+
+Examples:
+
+```cs
+struct MyStruct
+{
+ long a;
+ string b;
+}
+
+void Test1(ref MyStruct m)
+{
+ // We're not allowed to use memset here
+ m = default;
+}
+
+MyStruct Test2()
+{
+ // We can use memset here
+ return default;
+}
+```
\ No newline at end of file
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index acbe3a4cf0259..95c24b9f3675f 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -90,23 +90,23 @@
45dd3a73dd5b64b010c4251303b3664bb30df029
-
+
https://github.com/dotnet/emsdk
- 201f4dae9d1a1e105d8ba86d7ece61eed1f665e0
+ 2fc2ffd960930318f33fcaa690cbdbc55d72f52d
-
+
https://github.com/dotnet/emsdk
- 201f4dae9d1a1e105d8ba86d7ece61eed1f665e0
+ 2fc2ffd960930318f33fcaa690cbdbc55d72f52d
-
+
https://github.com/dotnet/source-build-reference-packages
- 95f83e27806330fec09edd96e06bba3acabe3f35
+ 453a37ef7ae6c335cd49b3b9ab7713c87faeb265
-
+
https://github.com/dotnet/source-build-externals
- e844aa02a05b90d8cbe499676ec6ee0f19ec4980
+ 83274d94c7e2ff21081b0d75ecbec2da2241f831
@@ -185,57 +185,57 @@
https://github.com/dotnet/arcade
61ae141d2bf3534619265c8f691fd55dc3e75147
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
https://github.com/dotnet/llvm-project
@@ -322,17 +322,17 @@
https://github.com/dotnet/runtime
edbd5c769a19798b6955050baccf99e6797d3208
-
+
https://github.com/dotnet/xharness
- 480b9159eb7e69b182a87581d5a336e97e0b6dae
+ a417169d3ba558fd6daa522f04e686574bbce520
-
+
https://github.com/dotnet/xharness
- 480b9159eb7e69b182a87581d5a336e97e0b6dae
+ a417169d3ba558fd6daa522f04e686574bbce520
-
+
https://github.com/dotnet/xharness
- 480b9159eb7e69b182a87581d5a336e97e0b6dae
+ a417169d3ba558fd6daa522f04e686574bbce520
https://github.com/dotnet/arcade
@@ -354,13 +354,13 @@
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
67613417f5e1af250e6ddfba79f8f2885d8e90fb
-
+
https://github.com/dotnet/hotreload-utils
- 5524f726f92ef862b415793758cebbd2a1950b70
+ 3b7da338c73b31b943c5512dcf0e2f6dd75f601c
-
+
https://github.com/dotnet/runtime-assets
- 57ca3048e3bf7c0755add6569809270290040f5d
+ 3b165c269b12cc194f48fde6a1a7694bece8931b
https://github.com/dotnet/roslyn
@@ -375,13 +375,13 @@
https://github.com/dotnet/roslyn
7b75981cf3bd520b86ec4ed00ec156c8bc48e4eb
-
+
https://github.com/dotnet/roslyn-analyzers
- b4d9a1334d5189172977ba8fddd00bda70161e4a
+ abef8ced132657943b7150f01a308e2199a17d5d
-
+
https://github.com/dotnet/roslyn-analyzers
- b4d9a1334d5189172977ba8fddd00bda70161e4a
+ abef8ced132657943b7150f01a308e2199a17d5d
https://github.com/dotnet/sdk
diff --git a/eng/Versions.props b/eng/Versions.props
index de1937187364e..55ce55ada067d 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -36,8 +36,8 @@
- 3.11.0-beta1.23525.2
- 8.0.0-preview.23525.2
+ 3.11.0-beta1.23614.1
+ 8.0.0-preview.23614.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
- 8.0.0-beta.23566.1
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
+ 8.0.0-beta.24060.2
1.0.0-prerelease.23566.3
1.0.0-prerelease.23566.3
@@ -183,10 +183,10 @@
1.1.0
17.4.0-preview-20220707-01
- 8.0.0-prerelease.23407.2
- 8.0.0-prerelease.23407.2
- 8.0.0-prerelease.23407.2
- 8.0.0-alpha.0.23570.2
+ 8.0.0-prerelease.24060.1
+ 8.0.0-prerelease.24060.1
+ 8.0.0-prerelease.24060.1
+ 8.0.0-alpha.0.24060.1
2.4.2
1.0.0
2.4.5
@@ -240,7 +240,7 @@
Note: when the name is updated, make sure to update dependency name in eng/pipelines/common/xplat-setup.yml
like - DarcDependenciesChanged.Microsoft_NET_Workload_Emscripten_Current_Manifest-8_0_100_Transport
-->
- 8.0.1
+ 8.0.2
$(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version)
1.1.87-gba258badda
diff --git a/eng/pipelines/common/restore-internal-tools.yml b/eng/pipelines/common/restore-internal-tools.yml
index eead4b67c30f6..fdec41da53da5 100644
--- a/eng/pipelines/common/restore-internal-tools.yml
+++ b/eng/pipelines/common/restore-internal-tools.yml
@@ -1,5 +1,5 @@
steps:
- - task: NuGetAuthenticate@0
+ - task: NuGetAuthenticate@1
inputs:
nuGetServiceConnections: 'devdiv/dotnet-core-internal-tooling'
forceReinstallCredentialProvider: true
diff --git a/eng/pipelines/common/templates/browser-wasm-build-tests.yml b/eng/pipelines/common/templates/browser-wasm-build-tests.yml
index 28d659e1607f4..742ad88de1c80 100644
--- a/eng/pipelines/common/templates/browser-wasm-build-tests.yml
+++ b/eng/pipelines/common/templates/browser-wasm-build-tests.yml
@@ -110,7 +110,7 @@ jobs:
/p:InstallWorkloadForTesting=true
/p:WasmSkipMissingRuntimePackBuild=true
/p:PreparePackagesForWorkloadInstall=false
- timeoutInMinutes: 120
+ timeoutInMinutes: 180
condition: >-
or(
eq(variables['alwaysRunVar'], true),
diff --git a/eng/pipelines/coreclr/ci.yml b/eng/pipelines/coreclr/ci.yml
index 209314a136702..adf052b014f45 100644
--- a/eng/pipelines/coreclr/ci.yml
+++ b/eng/pipelines/coreclr/ci.yml
@@ -155,13 +155,3 @@ extends:
readyToRun: true
displayNameArgs: R2R_CG2
liveLibrariesBuildConfig: Release
-
- #
- # Formatting
- #
- - template: /eng/pipelines/common/platform-matrix.yml
- parameters:
- jobTemplate: /eng/pipelines/coreclr/templates/format-job.yml
- platforms:
- - linux_x64
- - windows_x64
diff --git a/eng/pipelines/coreclr/templates/helix-queues-setup.yml b/eng/pipelines/coreclr/templates/helix-queues-setup.yml
index 240c010b8c9da..8e5ddd3675958 100644
--- a/eng/pipelines/coreclr/templates/helix-queues-setup.yml
+++ b/eng/pipelines/coreclr/templates/helix-queues-setup.yml
@@ -44,7 +44,7 @@ jobs:
# Android arm64
- ${{ if in(parameters.platform, 'android_arm64') }}:
- - Windows.10.Amd64.Android.Open
+ - Windows.11.Amd64.Android.Open
# Android x64
- ${{ if in(parameters.platform, 'android_x64') }}:
@@ -86,9 +86,9 @@ jobs:
# Linux musl arm32
- ${{ if eq(parameters.platform, 'linux_musl_arm') }}:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- - (Alpine.315.Arm32.Open)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.15-helix-arm32v7-20230807201723-7ea784e
+ - (Alpine.315.Arm32.Open)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.15-helix-arm32v7
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- - (Alpine.315.Arm32)Ubuntu.1804.ArmArch@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.15-helix-arm32v7-20230807201723-7ea784e
+ - (Alpine.315.Arm32)Ubuntu.1804.ArmArch@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.15-helix-arm32v7
# Linux musl arm64
- ${{ if eq(parameters.platform, 'linux_musl_arm64') }}:
diff --git a/eng/pipelines/installer/jobs/steps/build-linux-package.yml b/eng/pipelines/installer/jobs/steps/build-linux-package.yml
index 645b3edefa7ef..a5645af3d9ccd 100644
--- a/eng/pipelines/installer/jobs/steps/build-linux-package.yml
+++ b/eng/pipelines/installer/jobs/steps/build-linux-package.yml
@@ -8,7 +8,7 @@ parameters:
steps:
## Run NuGet Authentication for each of the side containers
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- - task: NuGetAuthenticate@0
+ - task: NuGetAuthenticate@1
target: ${{ parameters.target }}
- script: |
$(Build.SourcesDirectory)/build.sh \
diff --git a/eng/pipelines/libraries/helix-queues-setup.yml b/eng/pipelines/libraries/helix-queues-setup.yml
index 987d7f99c41f4..dd80cdc85095a 100644
--- a/eng/pipelines/libraries/helix-queues-setup.yml
+++ b/eng/pipelines/libraries/helix-queues-setup.yml
@@ -101,7 +101,7 @@ jobs:
- ${{ if in(parameters.platform, 'android_x86', 'android_x64', 'linux_bionic_x64') }}:
- Ubuntu.1804.Amd64.Android.29.Open
- ${{ if in(parameters.platform, 'android_arm', 'android_arm64', 'linux_bionic_arm64') }}:
- - Windows.10.Amd64.Android.Open
+ - Windows.11.Amd64.Android.Open
# iOS Simulator/Mac Catalyst arm64
- ${{ if in(parameters.platform, 'maccatalyst_arm64', 'iossimulator_arm64') }}:
diff --git a/eng/pipelines/official/jobs/prepare-signed-artifacts.yml b/eng/pipelines/official/jobs/prepare-signed-artifacts.yml
index c6d1624603fe1..908f2b64c71c2 100644
--- a/eng/pipelines/official/jobs/prepare-signed-artifacts.yml
+++ b/eng/pipelines/official/jobs/prepare-signed-artifacts.yml
@@ -26,7 +26,7 @@ jobs:
fetchDepth: 20
- ${{ if eq(parameters.isOfficialBuild, true) }}:
- - task: NuGetAuthenticate@0
+ - task: NuGetAuthenticate@1
- task: MicroBuildSigningPlugin@2
displayName: Install MicroBuild plugin for Signing
diff --git a/eng/testing/performance/performance-setup.ps1 b/eng/testing/performance/performance-setup.ps1
index 8a8cd269dbe45..c18445bff8aae 100644
--- a/eng/testing/performance/performance-setup.ps1
+++ b/eng/testing/performance/performance-setup.ps1
@@ -51,7 +51,7 @@ if ($Internal) {
"perftiger_crossgen" { $Queue = "Windows.10.Amd64.19H1.Tiger.Perf" }
"perfowl" { $Queue = "Windows.10.Amd64.20H2.Owl.Perf" }
"perfsurf" { $Queue = "Windows.10.Arm64.Perf.Surf" }
- "perfpixel4a" { $Queue = "Windows.10.Amd64.Pixel.Perf" }
+ "perfpixel4a" { $Queue = "Windows.11.Amd64.Pixel.Perf" }
"perfampere" { $Queue = "Windows.Server.Arm64.Perf" }
"cloudvm" { $Queue = "Windows.10.Amd64" }
Default { $Queue = "Windows.10.Amd64.19H1.Tiger.Perf" }
diff --git a/eng/testing/performance/performance-setup.sh b/eng/testing/performance/performance-setup.sh
index c53ca6924b97b..4853f0e6fb3bd 100755
--- a/eng/testing/performance/performance-setup.sh
+++ b/eng/testing/performance/performance-setup.sh
@@ -275,7 +275,7 @@ if [[ "$internal" == true ]]; then
extra_benchmark_dotnet_arguments=
if [[ "$logical_machine" == "perfiphone12mini" ]]; then
- queue=OSX.1015.Amd64.Iphone.Perf
+ queue=OSX.13.Amd64.Iphone.Perf
elif [[ "$logical_machine" == "perfampere" ]]; then
queue=Ubuntu.2004.Arm64.Perf
elif [[ "$logical_machine" == "cloudvm" ]]; then
diff --git a/src/coreclr/debug/createdump/crashinfo.cpp b/src/coreclr/debug/createdump/crashinfo.cpp
index 8af6ec4a54f5b..996f3a81935d0 100644
--- a/src/coreclr/debug/createdump/crashinfo.cpp
+++ b/src/coreclr/debug/createdump/crashinfo.cpp
@@ -9,6 +9,9 @@ typedef HINSTANCE (PALAPI_NOEXPORT *PFN_REGISTER_MODULE)(LPCSTR); /* u
// This is for the PAL_VirtualUnwindOutOfProc read memory adapter.
CrashInfo* g_crashInfo;
+// This is the NativeAOT DotNetRuntimeDebugHeader signature
+uint8_t g_debugHeaderCookie[4] = { 0x44, 0x4E, 0x44, 0x48 };
+
static bool ModuleInfoCompare(const ModuleInfo* lhs, const ModuleInfo* rhs) { return lhs->BaseAddress() < rhs->BaseAddress(); }
CrashInfo::CrashInfo(const CreateDumpOptions& options) :
@@ -30,6 +33,7 @@ CrashInfo::CrashInfo(const CreateDumpOptions& options) :
m_enumMemoryPagesAdded(0)
{
g_crashInfo = this;
+ m_runtimeBaseAddress = 0;
#ifdef __APPLE__
m_task = 0;
#else
diff --git a/src/coreclr/debug/createdump/crashinfomac.cpp b/src/coreclr/debug/createdump/crashinfomac.cpp
index 90a31f106d684..89c71c9e586c8 100644
--- a/src/coreclr/debug/createdump/crashinfomac.cpp
+++ b/src/coreclr/debug/createdump/crashinfomac.cpp
@@ -3,6 +3,8 @@
#include "createdump.h"
+extern uint8_t g_debugHeaderCookie[4];
+
int g_readProcessMemoryResult = KERN_SUCCESS;
bool
@@ -263,6 +265,24 @@ void CrashInfo::VisitModule(MachOModule& module)
}
}
}
+ else if (m_appModel == AppModelType::NativeAOT)
+ {
+ uint64_t symbolOffset;
+ if (module.TryLookupSymbol("DotNetRuntimeDebugHeader", &symbolOffset))
+ {
+ m_coreclrPath = GetDirectory(module.Name());
+ m_runtimeBaseAddress = module.BaseAddress();
+
+ uint8_t cookie[sizeof(g_debugHeaderCookie)];
+ if (ReadMemory((void*)(module.BaseAddress() + symbolOffset), cookie, sizeof(cookie)))
+ {
+ if (memcmp(cookie, g_debugHeaderCookie, sizeof(g_debugHeaderCookie)) == 0)
+ {
+ TRACE("Found valid NativeAOT runtime module\n");
+ }
+ }
+ }
+ }
}
// VisitSegment is called for each segment of the module
module.EnumerateSegments();
diff --git a/src/coreclr/debug/createdump/crashinfounix.cpp b/src/coreclr/debug/createdump/crashinfounix.cpp
index 70b2ddb270d74..24b975e3d6555 100644
--- a/src/coreclr/debug/createdump/crashinfounix.cpp
+++ b/src/coreclr/debug/createdump/crashinfounix.cpp
@@ -8,6 +8,7 @@
#endif
extern CrashInfo* g_crashInfo;
+extern uint8_t g_debugHeaderCookie[4];
int g_readProcessMemoryErrno = 0;
@@ -383,6 +384,27 @@ CrashInfo::VisitModule(uint64_t baseAddress, std::string& moduleName)
}
}
}
+ else if (m_appModel == AppModelType::NativeAOT)
+ {
+ if (PopulateForSymbolLookup(baseAddress))
+ {
+ uint64_t symbolOffset;
+ if (TryLookupSymbol("DotNetRuntimeDebugHeader", &symbolOffset))
+ {
+ m_coreclrPath = GetDirectory(moduleName);
+ m_runtimeBaseAddress = baseAddress;
+
+ uint8_t cookie[sizeof(g_debugHeaderCookie)];
+ if (ReadMemory((void*)(baseAddress + symbolOffset), cookie, sizeof(cookie)))
+ {
+ if (memcmp(cookie, g_debugHeaderCookie, sizeof(g_debugHeaderCookie)) == 0)
+ {
+ TRACE("Found valid NativeAOT runtime module\n");
+ }
+ }
+ }
+ }
+ }
}
EnumerateProgramHeaders(baseAddress);
}
diff --git a/src/coreclr/debug/createdump/dumpwriter.cpp b/src/coreclr/debug/createdump/dumpwriter.cpp
index 5153ba790154f..0e39b52b3a7d4 100644
--- a/src/coreclr/debug/createdump/dumpwriter.cpp
+++ b/src/coreclr/debug/createdump/dumpwriter.cpp
@@ -39,7 +39,8 @@ DumpWriter::WriteDiagInfo(size_t size)
SpecialDiagInfoHeader header = {
{SPECIAL_DIAGINFO_SIGNATURE},
SPECIAL_DIAGINFO_VERSION,
- m_crashInfo.ExceptionRecord()
+ m_crashInfo.ExceptionRecord(),
+ m_crashInfo.RuntimeBaseAddress()
};
if (!WriteData(&header, sizeof(header))) {
return false;
diff --git a/src/coreclr/debug/createdump/specialdiaginfo.h b/src/coreclr/debug/createdump/specialdiaginfo.h
index a857129c9c91f..84f79f00a160d 100644
--- a/src/coreclr/debug/createdump/specialdiaginfo.h
+++ b/src/coreclr/debug/createdump/specialdiaginfo.h
@@ -8,11 +8,11 @@
// ******************************************************************************
// This is a special memory region added to ELF and MachO dumps that contains extra diagnostics
-// information like the exception record for a crash for a NativeAOT app. The exception record
-// contains the pointer to the JSON formatted crash info.
+// information like the exception record address for a NativeAOT app crash or the runtime module
+// base address. The exception record contains the pointer to the JSON formatted crash info.
#define SPECIAL_DIAGINFO_SIGNATURE "DIAGINFOHEADER"
-#define SPECIAL_DIAGINFO_VERSION 1
+#define SPECIAL_DIAGINFO_VERSION 2
#ifdef __APPLE__
const uint64_t SpecialDiagInfoAddress = 0x7fffffff10000000;
@@ -31,4 +31,5 @@ struct SpecialDiagInfoHeader
char Signature[16];
int32_t Version;
uint64_t ExceptionRecordAddress;
+ uint64_t RuntimeBaseAddress;
};
diff --git a/src/coreclr/debug/daccess/request_svr.cpp b/src/coreclr/debug/daccess/request_svr.cpp
index ac0010e3e9af9..d1dd6f046e837 100644
--- a/src/coreclr/debug/daccess/request_svr.cpp
+++ b/src/coreclr/debug/daccess/request_svr.cpp
@@ -335,7 +335,7 @@ HRESULT DacHeapWalker::InitHeapDataSvr(HeapData *&pHeaps, size_t &pCount)
for (int i = 0; i < heaps; ++i)
{
// Basic heap info.
- TADDR heapAddress = HeapTableIndex(g_gcDacGlobals->g_heaps, i);
+ TADDR heapAddress = HeapTableIndex(g_gcDacGlobals->g_heaps, i);
dac_gc_heap heap = LoadGcHeapData(heapAddress);
dac_gc_heap* pHeap = &heap;
dac_generation gen0 = ServerGenerationTableIndex(heapAddress, 0);
@@ -395,17 +395,16 @@ HRESULT DacHeapWalker::InitHeapDataSvr(HeapData *&pHeaps, size_t &pCount)
seg = gen0.start_segment;
for (; seg && (j < count); ++j)
{
+ pHeaps[i].Segments[j].Generation = CorDebug_Gen0;
pHeaps[i].Segments[j].Start = (CORDB_ADDRESS)seg->mem;
if (seg.GetAddr() == pHeap->ephemeral_heap_segment.GetAddr())
{
pHeaps[i].Segments[j].End = (CORDB_ADDRESS)pHeap->alloc_allocated;
pHeaps[i].EphemeralSegment = j;
- pHeaps[i].Segments[j].Generation = CorDebug_Gen0;
}
else
{
pHeaps[i].Segments[j].End = (CORDB_ADDRESS)seg->allocated;
- pHeaps[i].Segments[j].Generation = seg->flags & HEAP_SEGMENT_FLAGS_READONLY ? CorDebug_NonGC : CorDebug_Gen2;;
}
seg = seg->next;
@@ -471,11 +470,11 @@ void DacFreeRegionEnumerator::AddServerRegions()
TADDR heapAddress = (TADDR)HeapTableIndex(g_gcDacGlobals->g_heaps, i);
if (heapAddress == 0)
continue;
-
+
dac_gc_heap heap = LoadGcHeapData(heapAddress);
for (int i = 0; i < count_free_region_kinds; i++)
AddSegmentList(heap.free_regions[i].head_free_region, FreeRegionKind::FreeRegion, i);
-
+
AddSegmentList(heap.freeable_soh_segment, FreeRegionKind::FreeSohSegment, i);
AddSegmentList(heap.freeable_uoh_segment, FreeRegionKind::FreeUohSegment, i);
}
diff --git a/src/coreclr/debug/ee/amd64/walker.cpp b/src/coreclr/debug/ee/amd64/walker.cpp
index 79f0952dee1c4..815366def5b0d 100644
--- a/src/coreclr/debug/ee/amd64/walker.cpp
+++ b/src/coreclr/debug/ee/amd64/walker.cpp
@@ -929,7 +929,6 @@ void NativeWalker::DecodeInstructionForPatchSkip(const BYTE *address, Instructio
case 0x45:
case 0x46:
case 0x47:
- done = true;
break;
// REX register extension prefixes with W
@@ -942,7 +941,6 @@ void NativeWalker::DecodeInstructionForPatchSkip(const BYTE *address, Instructio
case 0x4e:
case 0x4f:
W = true;
- done = true;
break;
default:
diff --git a/src/coreclr/jit/codegen.h b/src/coreclr/jit/codegen.h
index eb190f97f0e47..dda0d1871e4bf 100644
--- a/src/coreclr/jit/codegen.h
+++ b/src/coreclr/jit/codegen.h
@@ -1226,6 +1226,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#ifndef TARGET_X86
void genCodeForInitBlkHelper(GenTreeBlk* initBlkNode);
#endif
+ void genCodeForInitBlkLoop(GenTreeBlk* initBlkNode);
void genCodeForInitBlkRepStos(GenTreeBlk* initBlkNode);
void genCodeForInitBlkUnroll(GenTreeBlk* initBlkNode);
void genJumpTable(GenTree* tree);
diff --git a/src/coreclr/jit/codegenarmarch.cpp b/src/coreclr/jit/codegenarmarch.cpp
index 5434ef7b722ef..562dad738bd3e 100644
--- a/src/coreclr/jit/codegenarmarch.cpp
+++ b/src/coreclr/jit/codegenarmarch.cpp
@@ -3114,6 +3114,72 @@ void CodeGen::genCodeForInitBlkHelper(GenTreeBlk* initBlkNode)
genEmitHelperCall(CORINFO_HELP_MEMSET, 0, EA_UNKNOWN);
}
+//------------------------------------------------------------------------
+// genCodeForInitBlkLoop - Generate code for an InitBlk using an inlined for-loop.
+// It's needed for cases when size is too big to unroll and we're not allowed
+// to use memset call due to atomicity requirements.
+//
+// Arguments:
+// initBlkNode - the GT_STORE_BLK node
+//
+void CodeGen::genCodeForInitBlkLoop(GenTreeBlk* initBlkNode)
+{
+ GenTree* const dstNode = initBlkNode->Addr();
+ genConsumeReg(dstNode);
+ const regNumber dstReg = dstNode->GetRegNum();
+
+#ifndef TARGET_ARM64
+ GenTree* const zeroNode = initBlkNode->Data();
+ genConsumeReg(zeroNode);
+ const regNumber zeroReg = zeroNode->GetRegNum();
+#else
+ const regNumber zeroReg = REG_ZR;
+#endif
+
+ if (initBlkNode->IsVolatile())
+ {
+ // issue a full memory barrier before a volatile initBlock Operation
+ instGen_MemoryBarrier();
+ }
+
+ // str xzr, [dstReg]
+ // mov offsetReg,
+ //.LOOP:
+ // str xzr, [dstReg, offsetReg]
+ // subs offsetReg, offsetReg, #8
+ // bne .LOOP
+
+ const unsigned size = initBlkNode->GetLayout()->GetSize();
+ assert((size >= TARGET_POINTER_SIZE) && ((size % TARGET_POINTER_SIZE) == 0));
+
+ // The loop is reversed - it makes it smaller.
+ // Although, we zero the first pointer before the loop (the loop doesn't zero it)
+ // it works as a nullcheck, otherwise the first iteration would try to access
+ // "null + potentially large offset" and hit AV.
+ GetEmitter()->emitIns_R_R(INS_str, EA_PTRSIZE, zeroReg, dstReg);
+ if (size > TARGET_POINTER_SIZE)
+ {
+ // Extend liveness of dstReg in case if it gets killed by the store.
+ gcInfo.gcMarkRegPtrVal(dstReg, dstNode->TypeGet());
+
+ const regNumber offsetReg = initBlkNode->GetSingleTempReg();
+ instGen_Set_Reg_To_Imm(EA_PTRSIZE, offsetReg, size - TARGET_POINTER_SIZE);
+
+ BasicBlock* loop = genCreateTempLabel();
+ genDefineTempLabel(loop);
+
+ GetEmitter()->emitIns_R_R_R(INS_str, EA_PTRSIZE, zeroReg, dstReg, offsetReg);
+#ifdef TARGET_ARM64
+ GetEmitter()->emitIns_R_R_I(INS_subs, EA_PTRSIZE, offsetReg, offsetReg, TARGET_POINTER_SIZE);
+#else
+ GetEmitter()->emitIns_R_R_I(INS_sub, EA_PTRSIZE, offsetReg, offsetReg, TARGET_POINTER_SIZE, INS_FLAGS_SET);
+#endif
+ inst_JMP(EJ_ne, loop);
+
+ gcInfo.gcMarkRegSetNpt(genRegMask(dstReg));
+ }
+}
+
//------------------------------------------------------------------------
// genCall: Produce code for a GT_CALL node
//
@@ -4384,6 +4450,11 @@ void CodeGen::genCodeForStoreBlk(GenTreeBlk* blkOp)
genCodeForCpObj(blkOp->AsBlk());
break;
+ case GenTreeBlk::BlkOpKindLoop:
+ assert(!isCopyBlk);
+ genCodeForInitBlkLoop(blkOp);
+ break;
+
case GenTreeBlk::BlkOpKindHelper:
assert(!blkOp->gtBlkOpGcUnsafe);
if (isCopyBlk)
diff --git a/src/coreclr/jit/codegenloongarch64.cpp b/src/coreclr/jit/codegenloongarch64.cpp
index 33bd2a77486c6..2f7444e0825ae 100644
--- a/src/coreclr/jit/codegenloongarch64.cpp
+++ b/src/coreclr/jit/codegenloongarch64.cpp
@@ -6375,6 +6375,54 @@ void CodeGen::genCodeForInitBlkHelper(GenTreeBlk* initBlkNode)
genEmitHelperCall(CORINFO_HELP_MEMSET, 0, EA_UNKNOWN);
}
+//------------------------------------------------------------------------
+// genCodeForInitBlkLoop - Generate code for an InitBlk using an inlined for-loop.
+// It's needed for cases when size is too big to unroll and we're not allowed
+// to use memset call due to atomicity requirements.
+//
+// Arguments:
+// initBlkNode - the GT_STORE_BLK node
+//
+void CodeGen::genCodeForInitBlkLoop(GenTreeBlk* initBlkNode)
+{
+ GenTree* const dstNode = initBlkNode->Addr();
+ genConsumeReg(dstNode);
+ const regNumber dstReg = dstNode->GetRegNum();
+
+ if (initBlkNode->IsVolatile())
+ {
+ // issue a full memory barrier before a volatile initBlock Operation
+ instGen_MemoryBarrier();
+ }
+
+ const unsigned size = initBlkNode->GetLayout()->GetSize();
+ assert((size >= TARGET_POINTER_SIZE) && ((size % TARGET_POINTER_SIZE) == 0));
+
+ // The loop is reversed - it makes it smaller.
+ // Although, we zero the first pointer before the loop (the loop doesn't zero it)
+ // it works as a nullcheck, otherwise the first iteration would try to access
+ // "null + potentially large offset" and hit AV.
+ GetEmitter()->emitIns_R_R_I(INS_st_d, EA_PTRSIZE, REG_R0, dstReg, 0);
+ if (size > TARGET_POINTER_SIZE)
+ {
+ // Extend liveness of dstReg in case if it gets killed by the store.
+ gcInfo.gcMarkRegPtrVal(dstReg, dstNode->TypeGet());
+
+ const regNumber offsetReg = initBlkNode->GetSingleTempReg();
+ instGen_Set_Reg_To_Imm(EA_PTRSIZE, offsetReg, size - TARGET_POINTER_SIZE);
+
+ // loop begin:
+ // *(dstReg + offsetReg) = 0
+ GetEmitter()->emitIns_R_R_R(INS_stx_d, EA_PTRSIZE, REG_R0, dstReg, offsetReg);
+ // offsetReg = offsetReg - 8
+ GetEmitter()->emitIns_R_R_I(INS_addi_d, EA_PTRSIZE, offsetReg, offsetReg, -8);
+ // if (offsetReg != 0) goto loop;
+ GetEmitter()->emitIns_R_I(INS_bnez, EA_8BYTE, offsetReg, -2 << 2);
+
+ gcInfo.gcMarkRegSetNpt(genRegMask(dstReg));
+ }
+}
+
// Generate code for a load from some address + offset
// base: tree node which can be either a local address or arbitrary node
// offset: distance from the base from which to load
@@ -7286,6 +7334,11 @@ void CodeGen::genCodeForStoreBlk(GenTreeBlk* blkOp)
genCodeForCpObj(blkOp->AsBlk());
break;
+ case GenTreeBlk::BlkOpKindLoop:
+ assert(!isCopyBlk);
+ genCodeForInitBlkLoop(blkOp);
+ break;
+
case GenTreeBlk::BlkOpKindHelper:
if (isCopyBlk)
{
diff --git a/src/coreclr/jit/codegenriscv64.cpp b/src/coreclr/jit/codegenriscv64.cpp
index 39d25e316e529..df5b47554d8b9 100644
--- a/src/coreclr/jit/codegenriscv64.cpp
+++ b/src/coreclr/jit/codegenriscv64.cpp
@@ -5958,6 +5958,61 @@ void CodeGen::genCodeForCpBlkUnroll(GenTreeBlk* cpBlkNode)
}
}
+//------------------------------------------------------------------------
+// genCodeForInitBlkLoop - Generate code for an InitBlk using an inlined for-loop.
+// It's needed for cases when size is too big to unroll and we're not allowed
+// to use memset call due to atomicity requirements.
+//
+// Arguments:
+// initBlkNode - the GT_STORE_BLK node
+//
+void CodeGen::genCodeForInitBlkLoop(GenTreeBlk* initBlkNode)
+{
+ GenTree* const dstNode = initBlkNode->Addr();
+ genConsumeReg(dstNode);
+ const regNumber dstReg = dstNode->GetRegNum();
+
+ if (initBlkNode->IsVolatile())
+ {
+ // issue a full memory barrier before a volatile initBlock Operation
+ instGen_MemoryBarrier();
+ }
+
+ const unsigned size = initBlkNode->GetLayout()->GetSize();
+ assert((size >= TARGET_POINTER_SIZE) && ((size % TARGET_POINTER_SIZE) == 0));
+
+ // The loop is reversed - it makes it smaller.
+ // Although, we zero the first pointer before the loop (the loop doesn't zero it)
+ // it works as a nullcheck, otherwise the first iteration would try to access
+ // "null + potentially large offset" and hit AV.
+ GetEmitter()->emitIns_R_R_I(INS_sd, EA_PTRSIZE, REG_R0, dstReg, 0);
+ if (size > TARGET_POINTER_SIZE)
+ {
+ // Extend liveness of dstReg in case if it gets killed by the store.
+ gcInfo.gcMarkRegPtrVal(dstReg, dstNode->TypeGet());
+
+ const regNumber tempReg = initBlkNode->GetSingleTempReg();
+ instGen_Set_Reg_To_Imm(EA_PTRSIZE, tempReg, size - TARGET_POINTER_SIZE);
+
+ // tempReg = dstReg + tempReg (a new interior pointer, but in a nongc region)
+ GetEmitter()->emitIns_R_R_R(INS_add, EA_PTRSIZE, tempReg, dstReg, tempReg);
+
+ BasicBlock* loop = genCreateTempLabel();
+ genDefineTempLabel(loop);
+ GetEmitter()->emitDisableGC(); // TODO: add gcinfo to tempReg and remove nogc
+
+ // *tempReg = 0
+ GetEmitter()->emitIns_R_R_I(INS_sd, EA_PTRSIZE, REG_R0, tempReg, 0);
+ // tempReg = tempReg - 8
+ GetEmitter()->emitIns_R_R_I(INS_addi, EA_PTRSIZE, tempReg, tempReg, -8);
+ // if (tempReg != dstReg) goto loop;
+ GetEmitter()->emitIns_J(INS_bne, loop, (int)tempReg | ((int)dstReg << 5));
+ GetEmitter()->emitEnableGC();
+
+ gcInfo.gcMarkRegSetNpt(genRegMask(dstReg));
+ }
+}
+
//------------------------------------------------------------------------
// genCodeForInitBlkHelper - Generate code for an InitBlk node by the means of the VM memcpy helper call
//
@@ -6853,6 +6908,11 @@ void CodeGen::genCodeForStoreBlk(GenTreeBlk* blkOp)
genCodeForCpObj(blkOp->AsBlk());
break;
+ case GenTreeBlk::BlkOpKindLoop:
+ assert(!isCopyBlk);
+ genCodeForInitBlkLoop(blkOp);
+ break;
+
case GenTreeBlk::BlkOpKindHelper:
if (isCopyBlk)
{
diff --git a/src/coreclr/jit/codegenxarch.cpp b/src/coreclr/jit/codegenxarch.cpp
index 5847b40ffd32e..12764affdd92e 100644
--- a/src/coreclr/jit/codegenxarch.cpp
+++ b/src/coreclr/jit/codegenxarch.cpp
@@ -3034,6 +3034,11 @@ void CodeGen::genCodeForStoreBlk(GenTreeBlk* storeBlkNode)
genCodeForCpObj(storeBlkNode->AsBlk());
break;
+ case GenTreeBlk::BlkOpKindLoop:
+ assert(!isCopyBlk);
+ genCodeForInitBlkLoop(storeBlkNode);
+ break;
+
#ifdef TARGET_AMD64
case GenTreeBlk::BlkOpKindHelper:
assert(!storeBlkNode->gtBlkOpGcUnsafe);
@@ -3312,6 +3317,60 @@ void CodeGen::genCodeForInitBlkUnroll(GenTreeBlk* node)
#endif
}
+//------------------------------------------------------------------------
+// genCodeForInitBlkLoop - Generate code for an InitBlk using an inlined for-loop.
+// It's needed for cases when size is too big to unroll and we're not allowed
+// to use memset call due to atomicity requirements.
+//
+// Arguments:
+// initBlkNode - the GT_STORE_BLK node
+//
+void CodeGen::genCodeForInitBlkLoop(GenTreeBlk* initBlkNode)
+{
+ GenTree* const dstNode = initBlkNode->Addr();
+ GenTree* const zeroNode = initBlkNode->Data();
+
+ genConsumeReg(dstNode);
+ genConsumeReg(zeroNode);
+
+ const regNumber dstReg = dstNode->GetRegNum();
+ const regNumber zeroReg = zeroNode->GetRegNum();
+
+ // xor zeroReg, zeroReg
+ // mov qword ptr [dstReg], zeroReg
+ // mov offsetReg,
+ //.LOOP:
+ // mov qword ptr [dstReg + offsetReg], zeroReg
+ // sub offsetReg, 8
+ // jne .LOOP
+
+ const unsigned size = initBlkNode->GetLayout()->GetSize();
+ assert((size >= TARGET_POINTER_SIZE) && ((size % TARGET_POINTER_SIZE) == 0));
+
+ // The loop is reversed - it makes it smaller.
+ // Although, we zero the first pointer before the loop (the loop doesn't zero it)
+ // it works as a nullcheck, otherwise the first iteration would try to access
+ // "null + potentially large offset" and hit AV.
+ GetEmitter()->emitIns_AR_R(INS_mov, EA_PTRSIZE, zeroReg, dstReg, 0);
+ if (size > TARGET_POINTER_SIZE)
+ {
+ // Extend liveness of dstReg in case if it gets killed by the store.
+ gcInfo.gcMarkRegPtrVal(dstReg, dstNode->TypeGet());
+
+ const regNumber offsetReg = initBlkNode->GetSingleTempReg();
+ instGen_Set_Reg_To_Imm(EA_PTRSIZE, offsetReg, size - TARGET_POINTER_SIZE);
+
+ BasicBlock* loop = genCreateTempLabel();
+ genDefineTempLabel(loop);
+
+ GetEmitter()->emitIns_ARX_R(INS_mov, EA_PTRSIZE, zeroReg, dstReg, offsetReg, 1, 0);
+ GetEmitter()->emitIns_R_I(INS_sub, EA_PTRSIZE, offsetReg, TARGET_POINTER_SIZE);
+ inst_JMP(EJ_jne, loop);
+
+ gcInfo.gcMarkRegSetNpt(genRegMask(dstReg));
+ }
+}
+
#ifdef TARGET_AMD64
//------------------------------------------------------------------------
// genCodeForInitBlkHelper - Generate code for an InitBlk node by the means of the VM memcpy helper call
diff --git a/src/coreclr/jit/compiler.h b/src/coreclr/jit/compiler.h
index 8339d6d274f4f..dd23c48255915 100644
--- a/src/coreclr/jit/compiler.h
+++ b/src/coreclr/jit/compiler.h
@@ -9905,6 +9905,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
STRESS_MODE(IF_CONVERSION_COST) \
STRESS_MODE(IF_CONVERSION_INNER_LOOPS) \
STRESS_MODE(POISON_IMPLICIT_BYREFS) \
+ STRESS_MODE(STORE_BLOCK_UNROLLING) \
STRESS_MODE(COUNT)
enum compStressArea
diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp
index 7c34c51571e66..31be03bda15b7 100644
--- a/src/coreclr/jit/gentree.cpp
+++ b/src/coreclr/jit/gentree.cpp
@@ -12227,6 +12227,11 @@ void Compiler::gtDispTree(GenTree* tree,
printf(" (Helper)");
break;
#endif
+
+ case GenTreeBlk::BlkOpKindLoop:
+ printf(" (Loop)");
+ break;
+
default:
unreached();
}
diff --git a/src/coreclr/jit/gentree.h b/src/coreclr/jit/gentree.h
index 109da6a15c30d..5a06113fa8d71 100644
--- a/src/coreclr/jit/gentree.h
+++ b/src/coreclr/jit/gentree.h
@@ -7248,6 +7248,7 @@ struct GenTreeBlk : public GenTreeIndir
#ifdef TARGET_XARCH
BlkOpKindRepInstr,
#endif
+ BlkOpKindLoop,
BlkOpKindUnroll,
BlkOpKindUnrollMemmove,
} gtBlkOpKind;
@@ -7256,12 +7257,20 @@ struct GenTreeBlk : public GenTreeIndir
bool gtBlkOpGcUnsafe;
#endif
-#ifdef TARGET_XARCH
+ bool ContainsReferences()
+ {
+ return (m_layout != nullptr) && m_layout->HasGCPtr();
+ }
+
bool IsOnHeapAndContainsReferences()
{
- return (m_layout != nullptr) && m_layout->HasGCPtr() && !Addr()->OperIs(GT_LCL_ADDR);
+ return ContainsReferences() && !Addr()->OperIs(GT_LCL_ADDR);
+ }
+
+ bool IsZeroingGcPointersOnHeap()
+ {
+ return OperIs(GT_STORE_BLK) && Data()->IsIntegralConst(0) && IsOnHeapAndContainsReferences();
}
-#endif
GenTreeBlk(genTreeOps oper, var_types type, GenTree* addr, ClassLayout* layout)
: GenTreeIndir(oper, type, addr, nullptr)
@@ -7272,6 +7281,10 @@ struct GenTreeBlk : public GenTreeIndir
GenTreeBlk(genTreeOps oper, var_types type, GenTree* addr, GenTree* data, ClassLayout* layout)
: GenTreeIndir(oper, type, addr, data)
{
+ if (data->IsIntegralConst(0))
+ {
+ data->gtFlags |= GTF_DONT_CSE;
+ }
Initialize(layout);
}
diff --git a/src/coreclr/jit/importer.cpp b/src/coreclr/jit/importer.cpp
index e8fa8a3db39ee..6087b1499301c 100644
--- a/src/coreclr/jit/importer.cpp
+++ b/src/coreclr/jit/importer.cpp
@@ -453,6 +453,11 @@ void Compiler::impAppendStmt(Statement* stmt, unsigned chkLevel, bool checkConsu
}
}
+ // In the case of GT_RET_EXPR any subsequent spills will appear in the wrong place -- after
+ // the call. We need to move them to before the call
+ //
+ Statement* lastStmt = impLastStmt;
+
if ((dstVarDsc != nullptr) && !dstVarDsc->IsAddressExposed() && !dstVarDsc->lvHasLdAddrOp)
{
impSpillLclRefs(lvaGetLclNum(dstVarDsc), chkLevel);
@@ -480,6 +485,40 @@ void Compiler::impAppendStmt(Statement* stmt, unsigned chkLevel, bool checkConsu
{
impSpillSpecialSideEff();
}
+
+ if ((lastStmt != impLastStmt) && expr->OperIs(GT_RET_EXPR))
+ {
+ GenTree* const call = expr->AsRetExpr()->gtInlineCandidate;
+ JITDUMP("\nimpAppendStmt: after sinking a local struct store into inline candidate [%06u], we need to "
+ "reorder subsequent spills.\n",
+ dspTreeID(call));
+
+ // Move all newly appended statements to just before the call's statement.
+ // First, find the statement containing the call.
+ //
+ Statement* insertBeforeStmt = lastStmt;
+
+ while (insertBeforeStmt->GetRootNode() != call)
+ {
+ assert(insertBeforeStmt != impStmtList);
+ insertBeforeStmt = insertBeforeStmt->GetPrevStmt();
+ }
+
+ Statement* movingStmt = lastStmt->GetNextStmt();
+
+ JITDUMP("Moving " FMT_STMT " through " FMT_STMT " before " FMT_STMT "\n", movingStmt->GetID(),
+ impLastStmt->GetID(), insertBeforeStmt->GetID());
+
+ // We move these backwards, so must keep moving the insert
+ // point to keep them in order.
+ //
+ while (impLastStmt != lastStmt)
+ {
+ Statement* movingStmt = impExtractLastStmt();
+ impInsertStmtBefore(movingStmt, insertBeforeStmt);
+ insertBeforeStmt = movingStmt;
+ }
+ }
}
impAppendStmtCheck(stmt, chkLevel);
@@ -9478,6 +9517,13 @@ void Compiler::impImportBlockCode(BasicBlock* block)
op1 = gtNewLclVarAddrNode(stackallocAsLocal);
convertedToLocal = true;
+ if (compIsForInlining() && info.compInitMem && !impInlineRoot()->info.compInitMem)
+ {
+ // Explicitly zero out the local if we're inlining a method with InitLocals into a
+ // method without InitLocals.
+ impStoreTemp(stackallocAsLocal, gtNewIconNode(0), CHECK_SPILL_ALL);
+ }
+
if (!this->opts.compDbgEnC)
{
// Ensure we have stack security for this method.
diff --git a/src/coreclr/jit/lower.cpp b/src/coreclr/jit/lower.cpp
index 2e454e64c14eb..2231a044b04cd 100644
--- a/src/coreclr/jit/lower.cpp
+++ b/src/coreclr/jit/lower.cpp
@@ -7973,6 +7973,15 @@ void Lowering::LowerBlockStoreCommon(GenTreeBlk* blkNode)
{
assert(blkNode->OperIs(GT_STORE_BLK, GT_STORE_DYN_BLK));
+ if (blkNode->ContainsReferences() && !blkNode->OperIsCopyBlkOp())
+ {
+ // Make sure we don't use GT_STORE_DYN_BLK
+ assert(blkNode->OperIs(GT_STORE_BLK));
+
+ // and we only zero it (and that zero is better to be not hoisted/CSE'd)
+ assert(blkNode->Data()->IsIntegralConst(0));
+ }
+
// Lose the type information stored in the source - we no longer need it.
if (blkNode->Data()->OperIs(GT_BLK))
{
diff --git a/src/coreclr/jit/lowerarmarch.cpp b/src/coreclr/jit/lowerarmarch.cpp
index 2536d44aa00c5..c58456940bf5e 100644
--- a/src/coreclr/jit/lowerarmarch.cpp
+++ b/src/coreclr/jit/lowerarmarch.cpp
@@ -554,6 +554,16 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode)
if (blkNode->OperIsInitBlkOp())
{
+#ifdef DEBUG
+ // Use BlkOpKindLoop for more cases under stress mode
+ if (comp->compStressCompile(Compiler::STRESS_STORE_BLOCK_UNROLLING, 50) && blkNode->OperIs(GT_STORE_BLK) &&
+ ((blkNode->GetLayout()->GetSize() % TARGET_POINTER_SIZE) == 0) && src->IsIntegralConst(0))
+ {
+ blkNode->gtBlkOpKind = GenTreeBlk::BlkOpKindLoop;
+ return;
+ }
+#endif
+
if (src->OperIs(GT_INIT_VAL))
{
src->SetContained();
@@ -598,6 +608,15 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode)
ContainBlockStoreAddress(blkNode, size, dstAddr, nullptr);
}
+ else if (blkNode->IsZeroingGcPointersOnHeap())
+ {
+ blkNode->gtBlkOpKind = GenTreeBlk::BlkOpKindLoop;
+#ifdef TARGET_ARM64
+ // On ARM64 we can just use REG_ZR instead of having to load
+ // the constant into a real register like on ARM32.
+ src->SetContained();
+#endif
+ }
else
{
blkNode->gtBlkOpKind = GenTreeBlk::BlkOpKindHelper;
diff --git a/src/coreclr/jit/lowerloongarch64.cpp b/src/coreclr/jit/lowerloongarch64.cpp
index d89c8723e80f6..d522a85ab0f96 100644
--- a/src/coreclr/jit/lowerloongarch64.cpp
+++ b/src/coreclr/jit/lowerloongarch64.cpp
@@ -326,6 +326,12 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode)
ContainBlockStoreAddress(blkNode, size, dstAddr, nullptr);
}
+ else if (blkNode->IsZeroingGcPointersOnHeap())
+ {
+ blkNode->gtBlkOpKind = GenTreeBlk::BlkOpKindLoop;
+ // We're going to use REG_R0 for zero
+ src->SetContained();
+ }
else
{
blkNode->gtBlkOpKind = GenTreeBlk::BlkOpKindHelper;
diff --git a/src/coreclr/jit/lowerriscv64.cpp b/src/coreclr/jit/lowerriscv64.cpp
index 37848fc5909de..0c0f0aafc34bc 100644
--- a/src/coreclr/jit/lowerriscv64.cpp
+++ b/src/coreclr/jit/lowerriscv64.cpp
@@ -280,6 +280,12 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode)
ContainBlockStoreAddress(blkNode, size, dstAddr, nullptr);
}
+ else if (blkNode->IsZeroingGcPointersOnHeap())
+ {
+ blkNode->gtBlkOpKind = GenTreeBlk::BlkOpKindLoop;
+ // We're going to use REG_R0 for zero
+ src->SetContained();
+ }
else
{
blkNode->gtBlkOpKind = GenTreeBlk::BlkOpKindHelper;
diff --git a/src/coreclr/jit/lowerxarch.cpp b/src/coreclr/jit/lowerxarch.cpp
index 150ad04a55d99..f0e7fc6322f2b 100644
--- a/src/coreclr/jit/lowerxarch.cpp
+++ b/src/coreclr/jit/lowerxarch.cpp
@@ -310,6 +310,16 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode)
if (blkNode->OperIsInitBlkOp())
{
+#ifdef DEBUG
+ // Use BlkOpKindLoop for more cases under stress mode
+ if (comp->compStressCompile(Compiler::STRESS_STORE_BLOCK_UNROLLING, 50) && blkNode->OperIs(GT_STORE_BLK) &&
+ ((blkNode->GetLayout()->GetSize() % TARGET_POINTER_SIZE) == 0) && src->IsIntegralConst(0))
+ {
+ blkNode->gtBlkOpKind = GenTreeBlk::BlkOpKindLoop;
+ return;
+ }
+#endif
+
if (src->OperIs(GT_INIT_VAL))
{
src->SetContained();
@@ -375,10 +385,12 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode)
{
TOO_BIG_TO_UNROLL:
#ifdef TARGET_AMD64
- blkNode->gtBlkOpKind = GenTreeBlk::BlkOpKindHelper;
+ blkNode->gtBlkOpKind =
+ blkNode->IsZeroingGcPointersOnHeap() ? GenTreeBlk::BlkOpKindLoop : GenTreeBlk::BlkOpKindHelper;
#else
// TODO-X86-CQ: Investigate whether a helper call would be beneficial on x86
- blkNode->gtBlkOpKind = GenTreeBlk::BlkOpKindRepInstr;
+ blkNode->gtBlkOpKind =
+ blkNode->IsZeroingGcPointersOnHeap() ? GenTreeBlk::BlkOpKindLoop : GenTreeBlk::BlkOpKindRepInstr;
#endif
}
}
@@ -7656,7 +7668,10 @@ bool Lowering::IsContainableHWIntrinsicOp(GenTreeHWIntrinsic* parentNode, GenTre
const unsigned expectedSize = genTypeSize(parentNode->TypeGet()) / 2;
const unsigned operandSize = genTypeSize(childNode->TypeGet());
- supportsGeneralLoads = supportsUnalignedSIMDLoads && (operandSize >= expectedSize);
+ // For broadcasts we can only optimize constants and memory operands
+ const bool broadcastIsContainable = childNode->OperIsConst() || childNode->isMemoryOp();
+ supportsGeneralLoads =
+ broadcastIsContainable && supportsUnalignedSIMDLoads && (operandSize >= expectedSize);
break;
}
diff --git a/src/coreclr/jit/lsraarmarch.cpp b/src/coreclr/jit/lsraarmarch.cpp
index e72ff23df3375..b87e0f80539fd 100644
--- a/src/coreclr/jit/lsraarmarch.cpp
+++ b/src/coreclr/jit/lsraarmarch.cpp
@@ -631,6 +631,11 @@ int LinearScan::BuildBlockStore(GenTreeBlk* blkNode)
#endif // TARGET_ARM64
break;
+ case GenTreeBlk::BlkOpKindLoop:
+ // Needed for offsetReg
+ buildInternalIntRegisterDefForNode(blkNode, availableIntRegs);
+ break;
+
case GenTreeBlk::BlkOpKindHelper:
assert(!src->isContained());
dstAddrRegMask = RBM_ARG_0;
diff --git a/src/coreclr/jit/lsrabuild.cpp b/src/coreclr/jit/lsrabuild.cpp
index 8c9025f61b703..22efbf53b82cb 100644
--- a/src/coreclr/jit/lsrabuild.cpp
+++ b/src/coreclr/jit/lsrabuild.cpp
@@ -968,6 +968,7 @@ regMaskTP LinearScan::getKillSetForBlockStore(GenTreeBlk* blkNode)
#endif
case GenTreeBlk::BlkOpKindUnrollMemmove:
case GenTreeBlk::BlkOpKindUnroll:
+ case GenTreeBlk::BlkOpKindLoop:
case GenTreeBlk::BlkOpKindInvalid:
// for these 'gtBlkOpKind' kinds, we leave 'killMask' = RBM_NONE
break;
diff --git a/src/coreclr/jit/lsraloongarch64.cpp b/src/coreclr/jit/lsraloongarch64.cpp
index 7ab333630c046..0312342a38914 100644
--- a/src/coreclr/jit/lsraloongarch64.cpp
+++ b/src/coreclr/jit/lsraloongarch64.cpp
@@ -1114,6 +1114,11 @@ int LinearScan::BuildBlockStore(GenTreeBlk* blkNode)
}
break;
+ case GenTreeBlk::BlkOpKindLoop:
+ // Needed for offsetReg
+ buildInternalIntRegisterDefForNode(blkNode, availableIntRegs);
+ break;
+
case GenTreeBlk::BlkOpKindHelper:
assert(!src->isContained());
dstAddrRegMask = RBM_ARG_0;
diff --git a/src/coreclr/jit/lsrariscv64.cpp b/src/coreclr/jit/lsrariscv64.cpp
index 4be7a391d26a7..09d8a8daf905a 100644
--- a/src/coreclr/jit/lsrariscv64.cpp
+++ b/src/coreclr/jit/lsrariscv64.cpp
@@ -1129,6 +1129,11 @@ int LinearScan::BuildBlockStore(GenTreeBlk* blkNode)
}
break;
+ case GenTreeBlk::BlkOpKindLoop:
+ // Needed for tempReg
+ buildInternalIntRegisterDefForNode(blkNode, availableIntRegs);
+ break;
+
case GenTreeBlk::BlkOpKindHelper:
assert(!src->isContained());
dstAddrRegMask = RBM_ARG_0;
diff --git a/src/coreclr/jit/lsraxarch.cpp b/src/coreclr/jit/lsraxarch.cpp
index 5d54c08ebb790..678aa6bd596bb 100644
--- a/src/coreclr/jit/lsraxarch.cpp
+++ b/src/coreclr/jit/lsraxarch.cpp
@@ -1406,6 +1406,11 @@ int LinearScan::BuildBlockStore(GenTreeBlk* blkNode)
sizeRegMask = RBM_RCX;
break;
+ case GenTreeBlk::BlkOpKindLoop:
+ // Needed for offsetReg
+ buildInternalIntRegisterDefForNode(blkNode, availableIntRegs);
+ break;
+
#ifdef TARGET_AMD64
case GenTreeBlk::BlkOpKindHelper:
dstAddrRegMask = RBM_ARG_0;
diff --git a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets
index 1f5b2cd681095..71acdacdadd10 100644
--- a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets
+++ b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets
@@ -33,6 +33,7 @@ The .NET Foundation licenses this file to you under the MIT license.
$(RuntimeIdentifier)
+ $(RuntimeIdentifier)
x86_64
@@ -122,10 +123,6 @@ The .NET Foundation licenses this file to you under the MIT license.
-
-
-
-
diff --git a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.targets b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.targets
index e9462399741c5..e379eb457bdc6 100644
--- a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.targets
+++ b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.targets
@@ -81,7 +81,7 @@ The .NET Foundation licenses this file to you under the MIT license.
$(NativeIntermediateOutputPath)$(TargetName)$(NativeObjectExt)
$(NativeOutputPath)$(TargetName)$(NativeBinaryExt)
true
- $(NativeIntermediateOutputPath)$(TargetName)$(ExportsFileExt)
+ $(NativeIntermediateOutputPath)$(TargetName)$(ExportsFileExt)
$(NativeObject)
@@ -240,7 +240,10 @@ The .NET Foundation licenses this file to you under the MIT license.
-
+
+
+
+
@@ -334,8 +337,8 @@ The .NET Foundation licenses this file to you under the MIT license.
-
-
+
+
diff --git a/src/coreclr/nativeaot/Runtime/DebugHeader.cpp b/src/coreclr/nativeaot/Runtime/DebugHeader.cpp
index 121fdec1019e0..8cafe9e1dab83 100644
--- a/src/coreclr/nativeaot/Runtime/DebugHeader.cpp
+++ b/src/coreclr/nativeaot/Runtime/DebugHeader.cpp
@@ -36,12 +36,12 @@ struct GlobalValueEntry
// This size should be one bigger than the number of entries since a null entry
// signifies the end of the array.
-static constexpr size_t DebugTypeEntriesArraySize = 96;
+static constexpr size_t DebugTypeEntriesArraySize = 100;
static DebugTypeEntry s_DebugEntries[DebugTypeEntriesArraySize];
// This size should be one bigger than the number of entries since a null entry
// signifies the end of the array.
-static constexpr size_t GlobalEntriesArraySize = 6;
+static constexpr size_t GlobalEntriesArraySize = 8;
static GlobalValueEntry s_GlobalEntries[GlobalEntriesArraySize];
// This structure is part of a in-memory serialization format that is used by diagnostic tools to
@@ -107,10 +107,11 @@ struct DotNetRuntimeDebugHeader
GlobalValueEntry (* volatile GlobalEntries)[GlobalEntriesArraySize] = nullptr;
};
-#ifdef TARGET_WINDOWS
-#pragma comment (linker, "/EXPORT:DotNetRuntimeDebugHeader,DATA")
-#endif
extern "C" struct DotNetRuntimeDebugHeader DotNetRuntimeDebugHeader;
+
+#ifdef HOST_UNIX
+__attribute__ ((visibility ("default")))
+#endif
struct DotNetRuntimeDebugHeader DotNetRuntimeDebugHeader = {};
#define MAKE_DEBUG_ENTRY(TypeName, FieldName, Value) \
@@ -118,7 +119,7 @@ struct DotNetRuntimeDebugHeader DotNetRuntimeDebugHeader = {};
{ \
s_DebugEntries[currentDebugPos] = { #TypeName, #FieldName, Value, 0 }; \
++currentDebugPos; \
- ASSERT(currentDebugPos <= DebugTypeEntriesArraySize); \
+ ASSERT(currentDebugPos < DebugTypeEntriesArraySize); \
} while(0)
#define MAKE_DEBUG_FIELD_ENTRY(TypeName, FieldName) MAKE_DEBUG_ENTRY(TypeName, FieldName, offsetof(TypeName, FieldName))
@@ -132,7 +133,7 @@ struct DotNetRuntimeDebugHeader DotNetRuntimeDebugHeader = {};
{ \
s_GlobalEntries[currentGlobalPos] = { #Name, Name }; \
++currentGlobalPos; \
- ASSERT(currentGlobalPos <= GlobalEntriesArraySize) \
+ ASSERT(currentGlobalPos < GlobalEntriesArraySize); \
} while(0) \
extern "C" void PopulateDebugHeaders()
diff --git a/src/coreclr/nativeaot/Runtime/PalRedhawk.h b/src/coreclr/nativeaot/Runtime/PalRedhawk.h
index d15969eab3784..581fbf29d12e9 100644
--- a/src/coreclr/nativeaot/Runtime/PalRedhawk.h
+++ b/src/coreclr/nativeaot/Runtime/PalRedhawk.h
@@ -752,7 +752,7 @@ REDHAWK_PALIMPORT uint32_t REDHAWK_PALAPI PalEventWrite(REGHANDLE arg1, const EV
#endif
REDHAWK_PALIMPORT UInt32_BOOL REDHAWK_PALAPI PalAllocateThunksFromTemplate(_In_ HANDLE hTemplateModule, uint32_t templateRva, size_t templateSize, _Outptr_result_bytebuffer_(templateSize) void** newThunksOut);
-REDHAWK_PALIMPORT UInt32_BOOL REDHAWK_PALAPI PalFreeThunksFromTemplate(_In_ void *pBaseAddress);
+REDHAWK_PALIMPORT UInt32_BOOL REDHAWK_PALAPI PalFreeThunksFromTemplate(_In_ void *pBaseAddress, size_t templateSize);
REDHAWK_PALIMPORT UInt32_BOOL REDHAWK_PALAPI PalMarkThunksAsValidCallTargets(
void *virtualAddress,
diff --git a/src/coreclr/nativeaot/Runtime/ThunksMapping.cpp b/src/coreclr/nativeaot/Runtime/ThunksMapping.cpp
index 2b877fc9bfd22..68a346596b529 100644
--- a/src/coreclr/nativeaot/Runtime/ThunksMapping.cpp
+++ b/src/coreclr/nativeaot/Runtime/ThunksMapping.cpp
@@ -329,6 +329,7 @@ EXTERN_C NATIVEAOT_API void* __cdecl RhAllocateThunksMapping()
int thunkBlockSize = RhpGetThunkBlockSize();
int templateSize = thunkBlocksPerMapping * thunkBlockSize;
+#ifndef TARGET_APPLE // Apple platforms cannot use the initial template
if (pThunksTemplateAddress == NULL)
{
// First, we use the thunks directly from the thunks template sections in the module until all
@@ -337,12 +338,13 @@ EXTERN_C NATIVEAOT_API void* __cdecl RhAllocateThunksMapping()
pThunkMap = pThunksTemplateAddress;
}
else
+#endif
{
// We've already used the thunks template in the module for some previous thunks, and we
// cannot reuse it here. Now we need to create a new mapping of the thunks section in order to have
// more thunks
- uint8_t* pModuleBase = (uint8_t*)PalGetModuleHandleFromPointer(pThunksTemplateAddress);
+ uint8_t* pModuleBase = (uint8_t*)PalGetModuleHandleFromPointer(RhpGetThunksBase());
int templateRva = (int)((uint8_t*)RhpGetThunksBase() - pModuleBase);
if (!PalAllocateThunksFromTemplate((HANDLE)pModuleBase, templateRva, templateSize, &pThunkMap))
@@ -357,7 +359,7 @@ EXTERN_C NATIVEAOT_API void* __cdecl RhAllocateThunksMapping()
thunkBlocksPerMapping))
{
if (pThunkMap != pThunksTemplateAddress)
- PalFreeThunksFromTemplate(pThunkMap);
+ PalFreeThunksFromTemplate(pThunkMap, templateSize);
return NULL;
}
diff --git a/src/coreclr/nativeaot/Runtime/amd64/InteropThunksHelpers.S b/src/coreclr/nativeaot/Runtime/amd64/InteropThunksHelpers.S
index 5c0b6f631ef53..a53dd3c63624f 100644
--- a/src/coreclr/nativeaot/Runtime/amd64/InteropThunksHelpers.S
+++ b/src/coreclr/nativeaot/Runtime/amd64/InteropThunksHelpers.S
@@ -14,7 +14,11 @@ LEAF_ENTRY RhCommonStub, _TEXT
alloc_stack SIZEOF_FP_REGS
SAVE_FLOAT_ARGUMENT_REGISTERS 0
+#ifdef FEATURE_EMULATED_TLS
+ call C_FUNC(RhpGetThunkData)
+#else
INLINE_GET_TLS_VAR tls_thunkData
+#endif
RESTORE_FLOAT_ARGUMENT_REGISTERS 0
free_stack SIZEOF_FP_REGS
@@ -36,6 +40,7 @@ LEAF_ENTRY RhGetCommonStubAddress, _TEXT
LEAF_END RhGetCommonStubAddress, _TEXT
+#ifndef FEATURE_EMULATED_TLS
LEAF_ENTRY RhGetCurrentThunkContext, _TEXT
INLINE_GET_TLS_VAR tls_thunkData
@@ -43,3 +48,4 @@ LEAF_ENTRY RhGetCurrentThunkContext, _TEXT
mov rax, qword ptr [rax]
ret
LEAF_END RhGetCurrentThunkContext, _TEXT
+#endif //FEATURE_EMULATED_TLS
diff --git a/src/coreclr/nativeaot/Runtime/amd64/ThunkPoolThunks.S b/src/coreclr/nativeaot/Runtime/amd64/ThunkPoolThunks.S
index 259d698002b49..f79ace1ca4996 100644
--- a/src/coreclr/nativeaot/Runtime/amd64/ThunkPoolThunks.S
+++ b/src/coreclr/nativeaot/Runtime/amd64/ThunkPoolThunks.S
@@ -38,11 +38,8 @@
.endm
#ifdef TARGET_APPLE
- // Create two segments in the Mach-O file:
- // __THUNKS with executable permissions
- // __THUNKS_DATA with read/write permissions
-
- .section __THUNKS,__thunks,regular,pure_instructions
+// Thunk pool
+ .text
.p2align PAGE_SIZE_LOG2
PATCH_LABEL ThunkPool
.rept (THUNKS_MAP_SIZE / PAGE_SIZE)
@@ -50,10 +47,6 @@ PATCH_LABEL ThunkPool
THUNKS_PAGE_BLOCK
.endr
.p2align PAGE_SIZE_LOG2
- .section __THUNKS_DATA,__thunks,regular
- .p2align PAGE_SIZE_LOG2
- .space THUNKS_MAP_SIZE
- .p2align PAGE_SIZE_LOG2
#else
#error Unsupported OS
#endif
diff --git a/src/coreclr/nativeaot/Runtime/arm64/ThunkPoolThunks.S b/src/coreclr/nativeaot/Runtime/arm64/ThunkPoolThunks.S
index d93d9f959506e..1b0ea7e029116 100644
--- a/src/coreclr/nativeaot/Runtime/arm64/ThunkPoolThunks.S
+++ b/src/coreclr/nativeaot/Runtime/arm64/ThunkPoolThunks.S
@@ -46,11 +46,8 @@
.endm
#ifdef TARGET_APPLE
- // Create two segments in the Mach-O file:
- // __THUNKS with executable permissions
- // __THUNKS_DATA with read/write permissions
-
- .section __THUNKS,__thunks,regular,pure_instructions
+// Thunk pool
+ .text
.p2align PAGE_SIZE_LOG2
PATCH_LABEL ThunkPool
.rept (THUNKS_MAP_SIZE / PAGE_SIZE)
@@ -58,10 +55,6 @@ PATCH_LABEL ThunkPool
THUNKS_PAGE_BLOCK
.endr
.p2align PAGE_SIZE_LOG2
- .section __THUNKS_DATA,__thunks,regular
- .p2align PAGE_SIZE_LOG2
- .space THUNKS_MAP_SIZE
- .p2align PAGE_SIZE_LOG2
#else
#error Unsupported OS
#endif
diff --git a/src/coreclr/nativeaot/Runtime/eventpipe/CMakeLists.txt b/src/coreclr/nativeaot/Runtime/eventpipe/CMakeLists.txt
index cedb910ac093e..27f0719728799 100644
--- a/src/coreclr/nativeaot/Runtime/eventpipe/CMakeLists.txt
+++ b/src/coreclr/nativeaot/Runtime/eventpipe/CMakeLists.txt
@@ -158,12 +158,15 @@ add_library(eventpipe-enabled STATIC ${EVENTPIPE_SOURCES})
add_library(eventpipe-disabled STATIC ${AOT_EVENTPIPE_DISABLED_SOURCES})
if (CLR_CMAKE_TARGET_WIN32)
+ add_library(eventpipe-enabled.GuardCF STATIC ${EVENTPIPE_SOURCES})
add_library(eventpipe-disabled.GuardCF STATIC ${AOT_EVENTPIPE_DISABLED_SOURCES})
+ target_compile_options(eventpipe-enabled.GuardCF PRIVATE $<$,$>:/guard:cf>)
target_compile_options(eventpipe-disabled.GuardCF PRIVATE $<$,$>:/guard:cf>)
endif (CLR_CMAKE_TARGET_WIN32)
install_static_library(eventpipe-enabled aotsdk nativeaot)
install_static_library(eventpipe-disabled aotsdk nativeaot)
if (CLR_CMAKE_TARGET_WIN32)
+ install_static_library(eventpipe-enabled.GuardCF aotsdk nativeaot)
install_static_library(eventpipe-disabled.GuardCF aotsdk nativeaot)
endif (CLR_CMAKE_TARGET_WIN32)
diff --git a/src/coreclr/nativeaot/Runtime/thread.cpp b/src/coreclr/nativeaot/Runtime/thread.cpp
index 4c924524fd4d7..53b86b4e3d0b2 100644
--- a/src/coreclr/nativeaot/Runtime/thread.cpp
+++ b/src/coreclr/nativeaot/Runtime/thread.cpp
@@ -263,7 +263,7 @@ void Thread::Construct()
m_pDeferredTransitionFrame = TOP_OF_STACK_MARKER;
m_hPalThread = INVALID_HANDLE_VALUE;
- m_threadId.SetToCurrentThread();
+ m_threadId = PalGetCurrentOSThreadId();
HANDLE curProcessPseudo = PalGetCurrentProcess();
HANDLE curThreadPseudo = PalGetCurrentThread();
@@ -328,12 +328,7 @@ bool Thread::CatchAtSafePoint()
uint64_t Thread::GetPalThreadIdForLogging()
{
- return *(uint64_t*)&m_threadId;
-}
-
-bool Thread::IsCurrentThread()
-{
- return m_threadId.IsCurrentThread();
+ return m_threadId;
}
void Thread::Detach()
diff --git a/src/coreclr/nativeaot/Runtime/thread.h b/src/coreclr/nativeaot/Runtime/thread.h
index 7aa473eb6763d..688a84c30340e 100644
--- a/src/coreclr/nativeaot/Runtime/thread.h
+++ b/src/coreclr/nativeaot/Runtime/thread.h
@@ -102,7 +102,7 @@ struct ThreadBuffer
GCFrameRegistration* m_pGCFrameRegistrations;
PTR_VOID m_pStackLow;
PTR_VOID m_pStackHigh;
- EEThreadId m_threadId; // OS thread ID
+ uint64_t m_threadId; // OS thread ID
PTR_VOID m_pThreadStressLog; // pointer to head of thread's StressLogChunks
NATIVE_CONTEXT* m_interruptedContext; // context for an asynchronously interrupted thread.
#ifdef FEATURE_SUSPEND_REDIRECTION
@@ -209,7 +209,6 @@ class Thread : private ThreadBuffer
#ifndef DACCESS_COMPILE
uint64_t GetPalThreadIdForLogging();
- bool IsCurrentThread();
void GcScanRoots(void * pfnEnumCallback, void * pvCallbackData);
#else
diff --git a/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp b/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp
index 5b184882830a8..9d6f45c8fee8a 100644
--- a/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp
+++ b/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp
@@ -56,8 +56,7 @@
#endif
#ifdef TARGET_APPLE
-#include
-#include
+#include
#endif
using std::nullptr_t;
@@ -520,59 +519,61 @@ extern "C" bool PalDetachThread(void* thread)
#if !defined(USE_PORTABLE_HELPERS) && !defined(FEATURE_RX_THUNKS)
-#ifdef TARGET_APPLE
-static const struct section_64 *thunks_section;
-static const struct section_64 *thunks_data_section;
-#endif
-
REDHAWK_PALEXPORT UInt32_BOOL REDHAWK_PALAPI PalAllocateThunksFromTemplate(HANDLE hTemplateModule, uint32_t templateRva, size_t templateSize, void** newThunksOut)
{
#ifdef TARGET_APPLE
- int f;
- Dl_info info;
+ vm_address_t addr, taddr;
+ vm_prot_t prot, max_prot;
+ kern_return_t ret;
- int st = dladdr((const void*)hTemplateModule, &info);
- if (st == 0)
+ // Allocate two contiguous ranges of memory: the first range will contain the trampolines
+ // and the second range will contain their data.
+ do
{
- return UInt32_FALSE;
- }
+ ret = vm_allocate(mach_task_self(), &addr, templateSize * 2, VM_FLAGS_ANYWHERE);
+ } while (ret == KERN_ABORTED);
- f = open(info.dli_fname, O_RDONLY);
- if (f < 0)
+ if (ret != KERN_SUCCESS)
{
return UInt32_FALSE;
}
- // NOTE: We ignore templateRva since we would need to convert it to file offset
- // and templateSize is useless too. Instead we read the sections from the
- // executable and determine the size from them.
- if (thunks_section == NULL)
+ do
+ {
+ ret = vm_remap(
+ mach_task_self(), &addr, templateSize, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
+ mach_task_self(), ((vm_address_t)hTemplateModule + templateRva), FALSE, &prot, &max_prot, VM_INHERIT_SHARE);
+ } while (ret == KERN_ABORTED);
+
+ if (ret != KERN_SUCCESS)
{
- const struct mach_header_64 *hdr = (const struct mach_header_64 *)hTemplateModule;
- thunks_section = getsectbynamefromheader_64(hdr, "__THUNKS", "__thunks");
- thunks_data_section = getsectbynamefromheader_64(hdr, "__THUNKS_DATA", "__thunks");
+ do
+ {
+ ret = vm_deallocate(mach_task_self(), addr, templateSize * 2);
+ } while (ret == KERN_ABORTED);
+
+ return UInt32_FALSE;
}
- *newThunksOut = mmap(
- NULL,
- thunks_section->size + thunks_data_section->size,
- PROT_READ | PROT_EXEC,
- MAP_PRIVATE,
- f,
- thunks_section->offset);
- close(f);
+ *newThunksOut = (void*)addr;
- return *newThunksOut == NULL ? UInt32_FALSE : UInt32_TRUE;
+ return UInt32_TRUE;
#else
PORTABILITY_ASSERT("UNIXTODO: Implement this function");
#endif
}
-REDHAWK_PALEXPORT UInt32_BOOL REDHAWK_PALAPI PalFreeThunksFromTemplate(void *pBaseAddress)
+REDHAWK_PALEXPORT UInt32_BOOL REDHAWK_PALAPI PalFreeThunksFromTemplate(void *pBaseAddress, size_t templateSize)
{
#ifdef TARGET_APPLE
- int ret = munmap(pBaseAddress, thunks_section->size + thunks_data_section->size);
- return ret == 0 ? UInt32_TRUE : UInt32_FALSE;
+ kern_return_t ret;
+
+ do
+ {
+ ret = vm_deallocate(mach_task_self(), (vm_address_t)pBaseAddress, templateSize * 2);
+ } while (ret == KERN_ABORTED);
+
+ return ret == KERN_SUCCESS ? UInt32_TRUE : UInt32_FALSE;
#else
PORTABILITY_ASSERT("UNIXTODO: Implement this function");
#endif
diff --git a/src/coreclr/nativeaot/Runtime/unix/unixasmmacrosamd64.inc b/src/coreclr/nativeaot/Runtime/unix/unixasmmacrosamd64.inc
index ab64ef9ce92b4..11225c0ad5ed2 100644
--- a/src/coreclr/nativeaot/Runtime/unix/unixasmmacrosamd64.inc
+++ b/src/coreclr/nativeaot/Runtime/unix/unixasmmacrosamd64.inc
@@ -300,8 +300,12 @@ C_FUNC(\Name):
.macro INLINE_GETTHREAD
+#ifdef FEATURE_EMULATED_TLS
+ call C_FUNC(RhpGetThread)
+#else
// Inlined version of call C_FUNC(RhpGetThread)
INLINE_GET_TLS_VAR tls_CurrentThread
+#endif
.endm
.macro INLINE_THREAD_UNHIJACK threadReg, trashReg1, trashReg2
diff --git a/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp b/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp
index 964a3b52b09e4..9850fed10b11a 100644
--- a/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp
+++ b/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp
@@ -259,7 +259,7 @@ REDHAWK_PALEXPORT UInt32_BOOL REDHAWK_PALAPI PalAllocateThunksFromTemplate(_In_
#endif
}
-REDHAWK_PALEXPORT UInt32_BOOL REDHAWK_PALAPI PalFreeThunksFromTemplate(_In_ void *pBaseAddress)
+REDHAWK_PALEXPORT UInt32_BOOL REDHAWK_PALAPI PalFreeThunksFromTemplate(_In_ void *pBaseAddress, size_t templateSize)
{
#ifdef XBOX_ONE
return TRUE;
diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/CrashInfo.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/CrashInfo.cs
index c2421fc6b4ceb..a92f64f368cfe 100644
--- a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/CrashInfo.cs
+++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/CrashInfo.cs
@@ -170,7 +170,8 @@ private bool WriteExceptionHelper(ReadOnlySpan key, Exception exception, i
if (!OpenValue(key, '{'))
return false;
- if (!WriteHexValue("address"u8, (ulong)Unsafe.AsPointer(ref exception)))
+ ulong address = Unsafe.As(ref exception);
+ if (!WriteHexValue("address"u8, address))
return false;
if (!WriteHexValue("hr"u8, exception.HResult))
diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
index 9d98650b91bbb..01d2d15fc2997 100644
--- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
+++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
@@ -707,9 +707,15 @@ private void CompileMethodCleanup()
_instantiationToJitVisibleInstantiation = null;
_pgoResults.Clear();
+
+ // We need to clear out this cache because the next compilation could actually come up
+ // with a different MethodIL for the same MethodDesc. This happens when we need to replace
+ // a MethodIL with a throw helper.
+ _methodILScopeToHandle.Clear();
}
private Dictionary
- <_MonoAotCrossFilePath>$(MonoObjCrossDir)out\bin\$(MonoAotCrossFileName)
- <_MonoAotCrossPdbFilePath>$(MonoObjCrossDir)out\bin\$(MonoAotCrossPdbFileName)
+ <_MonoAotCrossFilePath>$(MonoObjCrossDir)out\bin\$(MonoAotCrossName)$(ExeSuffix)
<_MonoLLVMHostArchitecture>$(AotHostArchitecture)
@@ -961,6 +959,18 @@
<_MonoRuntimeArtifacts Include="$(_MonoRuntimeStaticFilePath)" Condition="Exists($(_MonoRuntimeStaticFilePath)) and '$(_MonoRuntimeStaticFilePath)' != '$(_MonoRuntimeFilePath)'">
$(RuntimeBinDir)$(MonoStaticLibFileName)
+ <_MonoRuntimeArtifacts Include="$(_MonoAotCrossFilePath)" Condition="Exists($(_MonoAotCrossFilePath))">
+ $(RuntimeBinDir)cross\$(OutputRID)\$(MonoAotCrossName)$(ExeSuffix)
+
+ <_MonoRuntimeArtifacts Include="$(_MonoAotCrossFilePath).dbg" Condition="Exists('$(_MonoAotCrossFilePath).dbg')">
+ $(RuntimeBinDir)cross\$(OutputRID)\$(MonoAotCrossName).dbg
+
+ <_MonoRuntimeArtifacts Include="$(_MonoAotCrossFilePath).dwarf" Condition="Exists('$(_MonoAotCrossFilePath).dwarf')">
+ $(RuntimeBinDir)cross\$(OutputRID)\$(MonoAotCrossName).dwarf
+
+ <_MonoRuntimeArtifacts Include="$(MonoObjCrossDir)out\bin\PDB\$(MonoAotCrossName).pdb" Condition="Exists('$(MonoObjCrossDir)out\bin\PDB\$(MonoAotCrossName).pdb')">
+ $(RuntimeBinDir)cross\$(OutputRID)\$(MonoAotCrossName).pdb
+
<_MonoRuntimeArtifacts Include="@(_MonoRuntimeComponentsStaticFilePath)">
$(RuntimeBinDir)%(_MonoRuntimeComponentsStaticFilePath.Filename)%(_MonoRuntimeComponentsStaticFilePath.Extension)
@@ -968,9 +978,6 @@
<_MonoRuntimeArtifacts Include="@(_MonoRuntimeComponentsSharedFilePath)">
$(RuntimeBinDir)%(_MonoRuntimeComponentsSharedFilePath.Filename)%(_MonoRuntimeComponentsSharedFilePath.Extension)
- <_MonoRuntimeArtifacts Include="$(_MonoAotCrossFilePath)">
- $(RuntimeBinDir)cross\$(OutputRID)\$(MonoAotCrossFileName)
-
<_MonoRuntimeArtifacts Condition="'$(HostOS)' == 'Linux' and ('$(MonoBundleLLVMOptimizer)' == 'true' or '$(MonoEnableLLVM)' == 'true') and '$(TargetArchitecture)' != 'wasm' and '$(MonoUseLibCxx)' == 'true'" Include="$(MonoLLVMDir)\$(_MonoLLVMTargetArchitecture)\lib\libc++.so.1">
$(RuntimeBinDir)libc++.so.1
@@ -983,9 +990,6 @@
<_MonoRuntimeArtifacts Condition="'$(HostOS)' == 'Linux' and ((('$(MonoAOTBundleLLVMOptimizer)' == 'true' or '$(MonoAOTEnableLLVM)' == 'true') and '$(MonoUseLibCxx)' == 'true') or '$(TargetArchitecture)' == 'wasm')" Include="$(MonoLLVMDir)\$(_MonoLLVMHostArchitecture)\lib\libc++abi.so.1">
$(RuntimeBinDir)cross\$(OutputRID)\libc++abi.so.1
- <_MonoRuntimeArtifacts Include="$(_MonoAotCrossPdbFilePath)" Condition="Exists('$(_MonoAotCrossPdbFilePath)')">
- $(RuntimeBinDir)cross\$(OutputRID)\$(MonoAotCrossPdbFileName)
-
<_MonoRuntimeArtifacts Condition="'$(MonoBundleLLVMOptimizer)' == 'true'" Include="$(MonoLLVMDir)\$(_MonoLLVMHostArchitecture)\bin\llc$(ExeSuffix)">
$(RuntimeBinDir)\llc$(ExeSuffix)
diff --git a/src/mono/mono/component/debugger-agent.c b/src/mono/mono/component/debugger-agent.c
index 9a6906f6e272e..1e8e27686a287 100644
--- a/src/mono/mono/component/debugger-agent.c
+++ b/src/mono/mono/component/debugger-agent.c
@@ -11087,7 +11087,7 @@ bool mono_debugger_agent_receive_and_process_command (void)
if (command_set == CMD_SET_VM && (command == CMD_VM_DISPOSE || command == CMD_VM_EXIT))
break;
}
- return !(command_set == CMD_SET_VM && command == CMD_VM_DISPOSE);
+ return (command_set == CMD_SET_VM && command == CMD_VM_DISPOSE);
}
static gboolean
diff --git a/src/mono/mono/component/mini-wasm-debugger.c b/src/mono/mono/component/mini-wasm-debugger.c
index 0e737f420f2a7..61020ecb57353 100644
--- a/src/mono/mono/component/mini-wasm-debugger.c
+++ b/src/mono/mono/component/mini-wasm-debugger.c
@@ -215,11 +215,12 @@ assembly_loaded (MonoProfiler *prof, MonoAssembly *assembly)
MonoPPDBFile *ppdb = handle->ppdb;
if (ppdb && !mono_ppdb_is_embedded (ppdb)) { //if it's an embedded pdb we don't need to send pdb extrated to DebuggerProxy.
pdb_image = mono_ppdb_get_image (ppdb);
- mono_wasm_asm_loaded (assembly_image->assembly_name, assembly_image->raw_data, assembly_image->raw_data_len, pdb_image->raw_data, pdb_image->raw_data_len);
+ mono_wasm_asm_loaded (assembly_image->assembly_name, assembly_image->storage->raw_data, assembly_image->storage->raw_data_len, pdb_image->raw_data, pdb_image->raw_data_len);
return;
}
}
- mono_wasm_asm_loaded (assembly_image->assembly_name, assembly_image->raw_data, assembly_image->raw_data_len, NULL, 0);
+
+ mono_wasm_asm_loaded (assembly_image->assembly_name, assembly_image->storage->raw_data, assembly_image->storage->raw_data_len, NULL, 0);
}
}
diff --git a/src/mono/mono/metadata/object.c b/src/mono/mono/metadata/object.c
index 5d23bb87273ea..a99369f8bfce5 100644
--- a/src/mono/mono/metadata/object.c
+++ b/src/mono/mono/metadata/object.c
@@ -458,21 +458,24 @@ mono_runtime_class_init_full (MonoVTable *vtable, MonoError *error)
* on this cond var.
*/
+ HANDLE_FUNCTION_ENTER ();
+
retry_top:
+ (void)0; // appease C compiler; label must preceed a statement not a var declaration
+
+ gboolean ret = FALSE;
+
mono_type_initialization_lock ();
/* double check... */
if (vtable->initialized) {
mono_type_initialization_unlock ();
- return TRUE;
+ goto return_true;
}
gboolean do_initialization = FALSE;
TypeInitializationLock *lock = NULL;
gboolean pending_tae = FALSE;
- gboolean ret = FALSE;
-
- HANDLE_FUNCTION_ENTER ();
if (vtable->init_failed) {
/* The type initialization already failed once, rethrow the same exception */
@@ -615,8 +618,8 @@ mono_runtime_class_init_full (MonoVTable *vtable, MonoError *error)
if (!lock->done) {
int timeout_ms = 500;
int wait_result = mono_coop_cond_timedwait (&lock->cond, &lock->mutex, timeout_ms);
- if (wait_result == -1) {
- /* timed out - go around again from the beginning. If we got here
+ if (wait_result == -1 || (wait_result == 0 && !lock->done)) {
+ /* timed out or spurious wakeup - go around again from the beginning. If we got here
* from the "is_blocked = FALSE" case, above (another thread was
* blocked on the current thread, but on a lock that was already
* done but it didn't get to wake up yet), then it might still be
@@ -647,7 +650,7 @@ mono_runtime_class_init_full (MonoVTable *vtable, MonoError *error)
g_hash_table_remove (type_initialization_hash, vtable);
mono_type_initialization_unlock ();
goto retry_top;
- } else if (wait_result == 0) {
+ } else if (wait_result == 0 && lock->done) {
/* Success: we were signaled that the other thread is done. Proceed */
} else {
g_assert_not_reached ();
diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c
index dedc6804c3cbd..eb0ab5f4e296c 100644
--- a/src/mono/mono/mini/method-to-ir.c
+++ b/src/mono/mono/mini/method-to-ir.c
@@ -9707,12 +9707,11 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
// callvirt instance ISomeIface::Method()
// TO
// call SomeStruct::Method()
- guchar* callvirt_ip;
guint32 callvirt_proc_token;
if (!((cfg->compile_aot || cfg->compile_llvm) && !mono_class_is_def(klass)) && // we cannot devirtualize in AOT when using generics
next_ip < end &&
- (callvirt_ip = il_read_callvirt (next_ip, end, &callvirt_proc_token)) &&
- ip_in_bb (cfg, cfg->cbb, callvirt_ip) ) {
+ il_read_callvirt (next_ip, end, &callvirt_proc_token) &&
+ ip_in_bb (cfg, cfg->cbb, next_ip) ) {
MonoMethod* iface_method;
MonoMethodSignature* iface_method_sig;
diff --git a/src/mono/sample/iOS-NativeAOT/Program.csproj b/src/mono/sample/iOS-NativeAOT/Program.csproj
index 45b0a262bdea7..4bf35ce171a19 100644
--- a/src/mono/sample/iOS-NativeAOT/Program.csproj
+++ b/src/mono/sample/iOS-NativeAOT/Program.csproj
@@ -9,6 +9,7 @@
$(TargetOS)-$(TargetArchitecture)
HelloiOS
true
+ true
true
false
static
diff --git a/src/mono/wasm/runtime/loader/assets.ts b/src/mono/wasm/runtime/loader/assets.ts
index be7c0e4592938..02e05b1f8a962 100644
--- a/src/mono/wasm/runtime/loader/assets.ts
+++ b/src/mono/wasm/runtime/loader/assets.ts
@@ -146,8 +146,6 @@ export function resolve_single_asset_path(behavior: SingleAssetBehaviors): Asset
export async function mono_download_assets(): Promise {
mono_log_debug("mono_download_assets");
- loaderHelpers.maxParallelDownloads = loaderHelpers.config.maxParallelDownloads || loaderHelpers.maxParallelDownloads;
- loaderHelpers.enableDownloadRetry = loaderHelpers.config.enableDownloadRetry || loaderHelpers.enableDownloadRetry;
try {
const promises_of_assets: Promise[] = [];
diff --git a/src/mono/wasm/runtime/loader/config.ts b/src/mono/wasm/runtime/loader/config.ts
index 097f6d1ca2cb1..d9bcccd4ed933 100644
--- a/src/mono/wasm/runtime/loader/config.ts
+++ b/src/mono/wasm/runtime/loader/config.ts
@@ -212,6 +212,9 @@ export function normalizeConfig() {
runtimeHelpers.enablePerfMeasure = !!config.browserProfilerOptions
&& globalThis.performance
&& typeof globalThis.performance.measure === "function";
+
+ loaderHelpers.maxParallelDownloads = config.maxParallelDownloads || loaderHelpers.maxParallelDownloads;
+ loaderHelpers.enableDownloadRetry = config.enableDownloadRetry !== undefined ? config.enableDownloadRetry : loaderHelpers.enableDownloadRetry;
}
let configLoaded = false;
diff --git a/src/mono/wasm/templates/templates/browser/Properties/launchSettings.json b/src/mono/wasm/templates/templates/browser/Properties/launchSettings.json
index 4807594b8f5fa..79ae7c7162940 100644
--- a/src/mono/wasm/templates/templates/browser/Properties/launchSettings.json
+++ b/src/mono/wasm/templates/templates/browser/Properties/launchSettings.json
@@ -7,7 +7,7 @@
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000",
- "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/debug?browser={browserInspectUri}"
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
}
}
}
diff --git a/src/native/libs/System.Security.Cryptography.Native/opensslshim.h b/src/native/libs/System.Security.Cryptography.Native/opensslshim.h
index cf10d2f794987..0748e305d5ce0 100644
--- a/src/native/libs/System.Security.Cryptography.Native/opensslshim.h
+++ b/src/native/libs/System.Security.Cryptography.Native/opensslshim.h
@@ -296,8 +296,10 @@ int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *md, size_t len);
REQUIRED_FUNCTION(ERR_peek_error) \
REQUIRED_FUNCTION(ERR_peek_error_line) \
REQUIRED_FUNCTION(ERR_peek_last_error) \
+ REQUIRED_FUNCTION(ERR_pop_to_mark) \
FALLBACK_FUNCTION(ERR_put_error) \
REQUIRED_FUNCTION(ERR_reason_error_string) \
+ REQUIRED_FUNCTION(ERR_set_mark) \
LIGHTUP_FUNCTION(ERR_set_debug) \
LIGHTUP_FUNCTION(ERR_set_error) \
REQUIRED_FUNCTION(EVP_aes_128_cbc) \
@@ -353,6 +355,7 @@ int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *md, size_t len);
REQUIRED_FUNCTION(EVP_PKCS82PKEY) \
REQUIRED_FUNCTION(EVP_PKEY2PKCS8) \
REQUIRED_FUNCTION(EVP_PKEY_CTX_ctrl) \
+ REQUIRED_FUNCTION(EVP_PKEY_CTX_ctrl_str) \
REQUIRED_FUNCTION(EVP_PKEY_CTX_free) \
REQUIRED_FUNCTION(EVP_PKEY_CTX_get0_pkey) \
REQUIRED_FUNCTION(EVP_PKEY_CTX_new) \
@@ -794,8 +797,10 @@ FOR_ALL_OPENSSL_FUNCTIONS
#define ERR_peek_error_line ERR_peek_error_line_ptr
#define ERR_peek_last_error ERR_peek_last_error_ptr
#define ERR_put_error ERR_put_error_ptr
+#define ERR_pop_to_mark ERR_pop_to_mark_ptr
#define ERR_reason_error_string ERR_reason_error_string_ptr
#define ERR_set_debug ERR_set_debug_ptr
+#define ERR_set_mark ERR_set_mark_ptr
#define ERR_set_error ERR_set_error_ptr
#define EVP_aes_128_cbc EVP_aes_128_cbc_ptr
#define EVP_aes_128_cfb8 EVP_aes_128_cfb8_ptr
@@ -850,6 +855,7 @@ FOR_ALL_OPENSSL_FUNCTIONS
#define EVP_PKCS82PKEY EVP_PKCS82PKEY_ptr
#define EVP_PKEY2PKCS8 EVP_PKEY2PKCS8_ptr
#define EVP_PKEY_CTX_ctrl EVP_PKEY_CTX_ctrl_ptr
+#define EVP_PKEY_CTX_ctrl_str EVP_PKEY_CTX_ctrl_str_ptr
#define EVP_PKEY_CTX_free EVP_PKEY_CTX_free_ptr
#define EVP_PKEY_CTX_get0_pkey EVP_PKEY_CTX_get0_pkey_ptr
#define EVP_PKEY_CTX_new EVP_PKEY_CTX_new_ptr
diff --git a/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_rsa.c b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_rsa.c
index c9ccdf33e3afe..043bf9f9d1eda 100644
--- a/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_rsa.c
+++ b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_rsa.c
@@ -67,6 +67,19 @@ static bool ConfigureEncryption(EVP_PKEY_CTX* ctx, RsaPaddingMode padding, const
{
return false;
}
+
+ // OpenSSL 3.2 introduced a change where PKCS#1 RSA decryption does not fail for invalid padding.
+ // If the padding is invalid, the decryption operation returns random data.
+ // See https://github.com/openssl/openssl/pull/13817 for background.
+ // Some Linux distributions backported this change to previous versions of OpenSSL.
+ // Here we do a best-effort to set a flag to revert the behavior to failing if the padding is invalid.
+ ERR_set_mark();
+
+ EVP_PKEY_CTX_ctrl_str(ctx, "rsa_pkcs1_implicit_rejection", "0");
+
+ // Undo any changes to the error queue that may have occured while configuring implicit rejection if the
+ // current version does not support implicit rejection.
+ ERR_pop_to_mark();
}
else
{
diff --git a/src/native/libs/System.Security.Cryptography.Native/pal_ssl.c b/src/native/libs/System.Security.Cryptography.Native/pal_ssl.c
index 29d478555ce13..e6bd41143c165 100644
--- a/src/native/libs/System.Security.Cryptography.Native/pal_ssl.c
+++ b/src/native/libs/System.Security.Cryptography.Native/pal_ssl.c
@@ -577,7 +577,7 @@ X509* CryptoNative_SslGetPeerCertificate(SSL* ssl)
long len = SSL_get_tlsext_status_ocsp_resp(ssl, &data);
X509* cert = SSL_get1_peer_certificate(ssl);
- if (len > 0 && cert != NULL)
+ if (len > 0 && cert != NULL && !X509_get_ex_data(cert, g_x509_ocsp_index))
{
OCSP_RESPONSE* ocspResp = d2i_OCSP_RESPONSE(NULL, &data, len);
diff --git a/src/native/libs/System.Security.Cryptography.Native/pal_x509.c b/src/native/libs/System.Security.Cryptography.Native/pal_x509.c
index 40f7c604e8f39..04c6ba06cd5dc 100644
--- a/src/native/libs/System.Security.Cryptography.Native/pal_x509.c
+++ b/src/native/libs/System.Security.Cryptography.Native/pal_x509.c
@@ -1302,11 +1302,11 @@ CryptoNative_X509ChainVerifyOcsp(X509_STORE_CTX* storeCtx, OCSP_REQUEST* req, OC
return X509ChainVerifyOcsp(storeCtx, subject, issuer, req, resp, cachePath);
}
-int32_t CryptoNative_X509DecodeOcspToExpiration(const uint8_t* buf, int32_t len, OCSP_REQUEST* req, X509* subject, X509* issuer, int64_t* expiration)
+int32_t CryptoNative_X509DecodeOcspToExpiration(const uint8_t* buf, int32_t len, OCSP_REQUEST* req, X509* subject, X509** issuers, int issuersLen, int64_t* expiration)
{
ERR_clear_error();
- if (buf == NULL || len == 0)
+ if (buf == NULL || len == 0 || issuersLen == 0)
{
return 0;
}
@@ -1329,7 +1329,16 @@ int32_t CryptoNative_X509DecodeOcspToExpiration(const uint8_t* buf, int32_t len,
if (bag != NULL)
{
- if (X509_STORE_add_cert(store, issuer) && sk_X509_push(bag, issuer))
+ int i;
+ for (i = 0; i < issuersLen; i++)
+ {
+ if (!X509_STORE_add_cert(store, issuers[i]) || !sk_X509_push(bag, issuers[i]))
+ {
+ break;
+ }
+ }
+
+ if (i == issuersLen)
{
ctx = X509_STORE_CTX_new();
}
@@ -1343,7 +1352,7 @@ int32_t CryptoNative_X509DecodeOcspToExpiration(const uint8_t* buf, int32_t len,
{
int canCache = 0;
time_t expiration_t = 0;
- X509VerifyStatusCode code = CheckOcspGetExpiry(req, resp, subject, issuer, ctx, &canCache, &expiration_t);
+ X509VerifyStatusCode code = CheckOcspGetExpiry(req, resp, subject, issuers[0], ctx, &canCache, &expiration_t);
if (sizeof(time_t) == sizeof(int64_t))
{
diff --git a/src/native/libs/System.Security.Cryptography.Native/pal_x509.h b/src/native/libs/System.Security.Cryptography.Native/pal_x509.h
index be376882d127f..bf76a1c2345ff 100644
--- a/src/native/libs/System.Security.Cryptography.Native/pal_x509.h
+++ b/src/native/libs/System.Security.Cryptography.Native/pal_x509.h
@@ -412,4 +412,4 @@ PALEXPORT int32_t CryptoNative_X509ChainVerifyOcsp(X509_STORE_CTX* storeCtx,
Decode len bytes of buf into an OCSP response, process it against the OCSP request, and return if the bytes were valid.
If the bytes were valid, and the OCSP response had a nextUpdate value, assign it to expiration.
*/
-PALEXPORT int32_t CryptoNative_X509DecodeOcspToExpiration(const uint8_t* buf, int32_t len, OCSP_REQUEST* req, X509* subject, X509* issuer, int64_t* expiration);
+PALEXPORT int32_t CryptoNative_X509DecodeOcspToExpiration(const uint8_t* buf, int32_t len, OCSP_REQUEST* req, X509* subject, X509** issuers, int issuersLen, int64_t* expiration);
diff --git a/src/tests/Common/mergedrunner.targets b/src/tests/Common/mergedrunner.targets
index 81a9def0117f1..72ae7aeef1f19 100644
--- a/src/tests/Common/mergedrunner.targets
+++ b/src/tests/Common/mergedrunner.targets
@@ -7,7 +7,7 @@
<_ProjectReferencesUsedByReferencePaths Include="@(ReferencePath->Metadata('ProjectReferenceOriginalItemSpec'))" />
- <_ProjectAssemblyReferences Include="@(ProjectReference)" Condition="'%(ProjectReference.OutputItemType)' == ''" />
+ <_ProjectAssemblyReferences Include="@(ProjectReference)" Condition="'%(ProjectReference.OutputItemType)' == '' and '%(ProjectReference.ReferenceOutputAssembly)' != 'false'" />
<_ProjectAssemblyReferences Remove="@(_ReferenceWithDisabledBuild->Metadata('OriginalItemSpec'))" />
<_ProjectReferencesRemovedDueToConflictResolution Include="@(_ProjectAssemblyReferences)" Exclude="@(_ProjectReferencesUsedByReferencePaths)" />
@@ -17,6 +17,6 @@
-->
-
+
-
\ No newline at end of file
+
diff --git a/src/tests/Directory.Build.props b/src/tests/Directory.Build.props
index 2d73150fc5f94..674ab3b0baa18 100644
--- a/src/tests/Directory.Build.props
+++ b/src/tests/Directory.Build.props
@@ -203,9 +203,9 @@
false
-
- true
- true
+
+ true
+ true
true
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_90508/Runtime_90508.cs b/src/tests/JIT/Regression/JitBlue/Runtime_90508/Runtime_90508.cs
new file mode 100644
index 0000000000000..ce2881a9d6718
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_90508/Runtime_90508.cs
@@ -0,0 +1,39 @@
+// 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.Intrinsics;
+using System.Runtime.Intrinsics.X86;
+using Xunit;
+
+public class Runtime_90508
+{
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static Vector128 Test1(Vector128 v, double b) =>
+ v + Sse3.MoveAndDuplicate(Vector128.CreateScalarUnsafe(b));
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static Vector128 Test2(Vector128 v) =>
+ v + Sse3.MoveAndDuplicate(Vector128.CreateScalarUnsafe(1.0));
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static Vector128 Test3(Vector128 v) =>
+ v + Sse3.MoveAndDuplicate(Vector128.Create(1.0));
+
+ [Fact]
+ public static int TestEntryPoint()
+ {
+ if (!Sse3.IsSupported)
+ {
+ return 100;
+ }
+
+ if (Test1(Vector128.Create(42.0), 1).ToString().Equals("<43, 43>") &&
+ Test2(Vector128.Create(42.0)).ToString().Equals("<43, 43>") &&
+ Test3(Vector128.Create(42.0)).ToString().Equals("<43, 43>"))
+ {
+ return 100;
+ }
+ return 101;
+ }
+}
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_90508/Runtime_90508.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_90508/Runtime_90508.csproj
new file mode 100644
index 0000000000000..15edd99711a1a
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_90508/Runtime_90508.csproj
@@ -0,0 +1,8 @@
+
+
+ True
+
+
+
+
+
\ No newline at end of file
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_95347/Runtime_95347.cs b/src/tests/JIT/Regression/JitBlue/Runtime_95347/Runtime_95347.cs
new file mode 100644
index 0000000000000..594d61a477362
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_95347/Runtime_95347.cs
@@ -0,0 +1,16 @@
+// 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 Xunit;
+
+public static class Runtime_95347
+{
+ [Fact]
+ public static int Test()
+ {
+ object? n = "abcd";
+ var s = (n ?? false).ToString();
+ return (s == "abcd") ? 100 : -1;
+ }
+}
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_95347/Runtime_95347.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_95347/Runtime_95347.csproj
new file mode 100644
index 0000000000000..15edd99711a1a
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_95347/Runtime_95347.csproj
@@ -0,0 +1,8 @@
+
+
+ True
+
+
+
+
+
\ No newline at end of file
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_95349/Runtime_95349.cs b/src/tests/JIT/Regression/JitBlue/Runtime_95349/Runtime_95349.cs
new file mode 100644
index 0000000000000..95cb943a4f6d0
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_95349/Runtime_95349.cs
@@ -0,0 +1,61 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+// Issues with stack spill ordering around some GDVs
+// Compile with None
+
+using System;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using Xunit;
+
+class P
+{
+ virtual public (double x, double y) XY() => (0, 0);
+}
+
+class P1 : P
+{
+ override public (double x, double y) XY() => (1, 2);
+}
+
+public class Runtime_95349
+{
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ static int Problem(P p, int n, (double x, double y) tuple)
+ {
+ int wn = 0;
+ for (int i = 0; i < n; i++)
+ {
+ (double x, double y) tupleTmp = tuple;
+ tuple = p.XY();
+ (_, double f) = tupleTmp;
+ wn = Wn(wn, f, tuple.y);
+ }
+
+ return wn;
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ static int Wn(int wn, double f, double y)
+ {
+ wn += (f == -1) ? 1 : 0;
+ return wn;
+ }
+
+ [Fact]
+ public static void Test()
+ {
+ P p = new P1();
+ int n = 100_000;
+ for (int i = 0; i < 100; i++)
+ {
+ _ = Problem(p, n, (-1, -1));
+ Thread.Sleep(30);
+ }
+
+ int r = Problem(p, n, (-1, -1));
+ Console.WriteLine($"r = {r} (expected 1)");
+ Assert.Equal(1, r);
+ }
+}
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_95349/Runtime_95349.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_95349/Runtime_95349.csproj
new file mode 100644
index 0000000000000..1bb887ea34b0f
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_95349/Runtime_95349.csproj
@@ -0,0 +1,9 @@
+
+
+ True
+ None
+
+
+
+
+
\ No newline at end of file
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_96174/Runtime_96174.cs b/src/tests/JIT/Regression/JitBlue/Runtime_96174/Runtime_96174.cs
new file mode 100644
index 0000000000000..57d59d30a42ae
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_96174/Runtime_96174.cs
@@ -0,0 +1,43 @@
+// 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.Runtime.CompilerServices;
+using Xunit;
+
+public class Runtime_96174
+{
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static void MethodWithoutLocalsInit()
+ {
+ SmallStackalloc();
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static void MethodWithLoop()
+ {
+ for (int i = 0; i < 10000; i++)
+ {
+ SmallStackalloc();
+ }
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ private static void SmallStackalloc()
+ {
+ Span buf = stackalloc byte[4];
+ if (!buf.SequenceEqual("\0\0\0\0"u8))
+ throw new InvalidOperationException("Stackalloc was not zero-initialized");
+ Consume(buf);
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static void Consume(Span _) {}
+
+ [Fact]
+ public static void Test()
+ {
+ MethodWithoutLocalsInit();
+ MethodWithLoop();
+ }
+}
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_96174/Runtime_96174.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_96174/Runtime_96174.csproj
new file mode 100644
index 0000000000000..6c2e6c34ba403
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_96174/Runtime_96174.csproj
@@ -0,0 +1,10 @@
+
+
+ True
+ None
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/src/tests/JIT/opt/Structs/StructWithGC_Zeroing.cs b/src/tests/JIT/opt/Structs/StructWithGC_Zeroing.cs
new file mode 100644
index 0000000000000..0a8719a2430a3
--- /dev/null
+++ b/src/tests/JIT/opt/Structs/StructWithGC_Zeroing.cs
@@ -0,0 +1,56 @@
+// 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.Runtime.CompilerServices;
+using Xunit;
+
+public class StructWithGC_Zeroing
+{
+ [Fact]
+ public static void StructZeroingShouldNotUseMemset()
+ {
+ LargeStructWithGC ls1 = default;
+ ls1.str = "hello1";
+ ls1.z2 = long.MaxValue;
+ ZeroIt(ref ls1);
+
+ LargeStructWithGC2 ls2 = default;
+ ls2.str = "hello2";
+ ls2.z1 = long.MinValue;
+ ZeroIt2(ref ls2);
+
+ if (ls1.str != null || ls2.str != null || ls1.z2 != 0 || ls2.z1 != 0)
+ throw new InvalidOperationException("should be zeroed");
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static void ZeroIt(ref LargeStructWithGC s)
+ {
+ // X64-NOT: CORINFO_HELP_MEMSET
+ // ARM64-NOT: CORINFO_HELP_MEMSET
+ s = default;
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static void ZeroIt2(ref LargeStructWithGC2 s)
+ {
+ // X64-NOT: CORINFO_HELP_MEMSET
+ // ARM64-NOT: CORINFO_HELP_MEMSET
+ s = default;
+ }
+
+ struct LargeStructWithGC // 360 bytes (64-bit)
+ {
+ public string str;
+ public long b1, c1, d1, e1, f1, g1, h1, i1, j1, k1, l1, m1, n1, o1, p1, r1, s1, t1, u1, v1, w1, z1;
+ public long b2, c2, d2, e2, f2, g2, h2, i2, j2, k2, l2, m2, n2, o2, p2, r2, s2, t2, u2, v2, w2, z2;
+ }
+
+ unsafe struct LargeStructWithGC2 // 4184 bytes (64-bit)
+ {
+ public fixed byte data[4000];
+ public string str;
+ public long b1, c1, d1, e1, f1, g1, h1, i1, j1, k1, l1, m1, n1, o1, p1, r1, s1, t1, u1, v1, w1, z1;
+ }
+}
diff --git a/src/tests/JIT/opt/Structs/StructWithGC_Zeroing.csproj b/src/tests/JIT/opt/Structs/StructWithGC_Zeroing.csproj
new file mode 100644
index 0000000000000..7aa59749804e4
--- /dev/null
+++ b/src/tests/JIT/opt/Structs/StructWithGC_Zeroing.csproj
@@ -0,0 +1,13 @@
+
+
+ true
+ true
+ None
+ True
+
+
+
+ true
+
+
+
diff --git a/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDefaultImpCallDefaultImp/GenericContextCommonAndImplementation.il b/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDICallDI/GenericContextCommonAndImplementationDICallDI.il
similarity index 99%
rename from src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDefaultImpCallDefaultImp/GenericContextCommonAndImplementation.il
rename to src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDICallDI/GenericContextCommonAndImplementationDICallDI.il
index d1ef889588336..5f21b51ced4c0 100644
--- a/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDefaultImpCallDefaultImp/GenericContextCommonAndImplementation.il
+++ b/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDICallDI/GenericContextCommonAndImplementationDICallDI.il
@@ -7,7 +7,7 @@
.assembly extern mscorlib {}
.assembly extern System.Runtime {}
.assembly extern GenericContextCommonCs {}
-.assembly GenericContextCommonAndImplementation {}
+.assembly GenericContextCommonAndImplementationDICallDI {}
.class interface public abstract auto ansi IFaceNonGeneric
{
.method public newslot virtual abstract static void NormalMethod() {}
diff --git a/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDefaultImpCallDefaultImp/GenericContextCommonAndImplementation.ilproj b/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDICallDI/GenericContextCommonAndImplementationDICallDI.ilproj
similarity index 80%
rename from src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDefaultImpCallDefaultImp/GenericContextCommonAndImplementation.ilproj
rename to src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDICallDI/GenericContextCommonAndImplementationDICallDI.ilproj
index 8f17e9188e06a..82490f2b1cf46 100644
--- a/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDefaultImpCallDefaultImp/GenericContextCommonAndImplementation.ilproj
+++ b/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDICallDI/GenericContextCommonAndImplementationDICallDI.ilproj
@@ -8,6 +8,6 @@
Full
-
+
diff --git a/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDefaultImpCallDefaultImp/GenericContextTestDefaultImpCallDefaultImp.il b/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDICallDI/GenericContextTestDICallDI.il
similarity index 88%
rename from src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDefaultImpCallDefaultImp/GenericContextTestDefaultImpCallDefaultImp.il
rename to src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDICallDI/GenericContextTestDICallDI.il
index c4bc38234b684..f96ebcdf8106b 100644
--- a/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDefaultImpCallDefaultImp/GenericContextTestDefaultImpCallDefaultImp.il
+++ b/src/tests/Loader/classloader/StaticVirtualMethods/GenericContext/GenericContextTestDICallDI/GenericContextTestDICallDI.il
@@ -7,15 +7,15 @@
.assembly extern mscorlib {}
.assembly extern System.Runtime {}
.assembly extern GenericContextCommonCs {}
-.assembly extern GenericContextCommonAndImplementation {}
-.assembly GenericContextTestDefaultImpCallDefaultImp {}
+.assembly extern GenericContextCommonAndImplementationDICallDI {}
+.assembly GenericContextTestDICallDI {}
.class public auto ansi TestEntrypoint
extends [System.Runtime]System.Object
{
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_NonGeneric_NormalMethod() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::NormalMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_NonGeneric_NormalMethod"
ldstr "IFaceNonGenericDefaultImp.NormalMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -23,8 +23,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_NonGeneric_NormalMethod
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_NonGeneric_NormalMethod() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::NormalMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -38,8 +38,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_NonGeneric_NormalMethod() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::NormalMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -54,8 +54,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_NonGeneric_NormalMethod
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_NormalMethod() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::NormalMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_NormalMethod"
ldstr "IFaceNonGenericDefaultImp.NormalMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -63,8 +63,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_NormalMethod
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_NormalMethod() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::NormalMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -78,8 +78,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_NormalMethod() cil managed noinlining
{
ldnull
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::NormalMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -94,8 +94,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_NormalMethod
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverInt() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverInt"
ldstr "IFaceNonGenericDefaultImp.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -103,8 +103,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverInt
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverInt() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -118,8 +118,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverInt() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -134,8 +134,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverInt
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverInt() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverInt"
ldstr "IFaceNonGenericDefaultImp.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -143,8 +143,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverInt
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverInt() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -158,8 +158,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverInt() cil managed noinlining
{
ldnull
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -174,8 +174,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverInt
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverString() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverString"
ldstr "IFaceNonGenericDefaultImp.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -183,8 +183,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverString
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverString() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -198,8 +198,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverString() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -214,8 +214,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_NonGeneric_GenericMethodOverString
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverString() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverString"
ldstr "IFaceNonGenericDefaultImp.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -223,8 +223,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverString
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverString() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -238,8 +238,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverString() cil managed noinlining
{
ldnull
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceNonGenericDefaultImp::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceNonGenericDefaultImp::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -254,8 +254,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_NonGeneric_GenericMethodOverString
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverString_NormalMethod() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_GenericOverString_NormalMethod"
ldstr "IFaceGenericDefaultImp`1.NormalMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -263,8 +263,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverString_NormalMethod
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_GenericOverString_NormalMethod() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -278,8 +278,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverString_NormalMethod() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -294,8 +294,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverString_NormalMethod
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_NormalMethod() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_NormalMethod"
ldstr "IFaceGenericDefaultImp`1.NormalMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -303,8 +303,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_NormalMethod
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_NormalMethod() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -318,8 +318,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_NormalMethod() cil managed noinlining
{
ldnull
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -334,8 +334,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_NormalMethod
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverInt() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverInt"
ldstr "IFaceGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -343,8 +343,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverInt
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverInt() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -358,8 +358,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverInt() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -374,8 +374,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverInt
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverInt() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverInt"
ldstr "IFaceGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -383,8 +383,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverInt
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverInt() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -398,8 +398,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverInt() cil managed noinlining
{
ldnull
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -414,8 +414,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverInt
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverString() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverString"
ldstr "IFaceGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -423,8 +423,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverString
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverString() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -438,8 +438,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverString() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -454,8 +454,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverString_GenericMethodOverString
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverString() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverString"
ldstr "IFaceGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -463,8 +463,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverString
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverString() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -478,8 +478,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverString() cil managed noinlining
{
ldnull
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -494,8 +494,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverString_GenericMethodOverString
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverObject_NormalMethod() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_GenericOverObject_NormalMethod"
ldstr "IFaceGenericDefaultImp`1.NormalMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -503,8 +503,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverObject_NormalMethod
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_GenericOverObject_NormalMethod() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -518,8 +518,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverObject_NormalMethod() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -534,8 +534,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverObject_NormalMethod
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_NormalMethod() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_NormalMethod"
ldstr "IFaceGenericDefaultImp`1.NormalMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -543,8 +543,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_NormalMethod
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_NormalMethod() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -558,8 +558,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_NormalMethod() cil managed noinlining
{
ldnull
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::NormalMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -574,8 +574,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_NormalMethod
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverInt() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverInt"
ldstr "IFaceGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -583,8 +583,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverInt
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverInt() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -598,8 +598,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverInt() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -614,8 +614,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverInt
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverInt() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverInt"
ldstr "IFaceGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -623,8 +623,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverInt
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverInt() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -638,8 +638,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverInt() cil managed noinlining
{
ldnull
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -654,8 +654,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverInt
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverString() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverString"
ldstr "IFaceGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -663,8 +663,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverString
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverString() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -678,8 +678,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverString() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -694,8 +694,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_GenericOverObject_GenericMethodOverString
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverString() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverString"
ldstr "IFaceGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -703,8 +703,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverString
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverString() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -718,8 +718,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverString() cil managed noinlining
{
ldnull
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceGenericDefaultImp`1::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -734,8 +734,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_GenericOverObject_GenericMethodOverString
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_NormalMethod() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_NormalMethod"
ldstr "IFaceCuriouslyRecurringGenericDefaultImp`1.NormalMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -743,8 +743,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_NormalMethod
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_NormalMethod() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -758,8 +758,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_NormalMethod() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -774,8 +774,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_NormalMethod
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_NormalMethod() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_NormalMethod"
ldstr "IFaceCuriouslyRecurringGenericDefaultImp`1.NormalMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -783,8 +783,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_NormalMethod
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_NormalMethod() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -798,8 +798,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_NormalMethod() cil managed noinlining
{
ldnull
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::NormalMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -814,8 +814,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_NormalMethod
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt"
ldstr "IFaceCuriouslyRecurringGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -823,8 +823,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -838,8 +838,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -854,8 +854,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt"
ldstr "IFaceCuriouslyRecurringGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -863,8 +863,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -878,8 +878,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt() cil managed noinlining
{
ldnull
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -894,8 +894,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverInt
.method public static void Test_Call_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverString() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- call void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverString"
ldstr "IFaceCuriouslyRecurringGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -903,8 +903,8 @@
} // end of method Test_Call_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverString
.method public static void Test_Ldftn_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverString() cil managed noinlining
{
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
volatile.
stsfld native int modreq([System.Runtime]System.Runtime.CompilerServices.IsVolatile) [GenericContextCommonCs]Statics::FtnHolder
volatile.
@@ -918,8 +918,8 @@
.method public static void Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverString() cil managed noinlining
{
ldnull
- constrained. class [GenericContextCommonAndImplementation]NonGenericClass
- ldftn void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
+ constrained. class [GenericContextCommonAndImplementationDICallDI]NonGenericClass
+ ldftn void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
newobj instance void [System.Runtime]System.Action::.ctor(object,
native int)
volatile.
@@ -934,8 +934,8 @@
} // end of method Test_CreateDelegate_NonGenericNonGenericClass_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverString
.method public static void Test_Call_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverString() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- call void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
+ constrained. valuetype [GenericContextCommonAndImplementationDICallDI]NonGenericValuetype
+ call void class [GenericContextCommonAndImplementationDICallDI]IFaceCuriouslyRecurringGenericDefaultImp`1::GenericMethod()
ldstr "Call_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverString"
ldstr "IFaceCuriouslyRecurringGenericDefaultImp`1.GenericMethod"
call void [GenericContextCommonCs]Statics::CheckForFailure(string,string)
@@ -943,8 +943,8 @@
} // end of method Test_Call_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverString
.method public static void Test_Ldftn_NonGenericNonGenericValuetype_NonGeneric_CuriouslyRecurringGeneric_GenericMethodOverString() cil managed noinlining
{
- constrained. valuetype [GenericContextCommonAndImplementation]NonGenericValuetype
- ldftn void class [GenericContextCommonAndImplementation]IFaceCuriouslyRecurringGenericDefaultImp`1