[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time - #130468

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests
Jul 13, 2026
Merged

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time#130468
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests

Conversation

@kotlarmilos

Copy link
Copy Markdown
Member

Description

Follow-up to #130360. The SDK strips IL bodies from the Apple mobile CoreCLR composite ReadyToRun image by default, replacing each body with an invalid stub, so any test that needs the real IL at run time fails. Three more projects hit this: System.Runtime.Extensions.Tests (AppDomainTests.ExecuteAssembly invokes a stripped entry point, InvalidProgramException), System.IO.Hashing.Tests (Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128 intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async). This sets PublishReadyToRunStripILBodies to false on those three test projects, which #130360 already forwards through the _ApplePropertyNames allowlist, leaving stripping on for every other Apple mobile CoreCLR test app.

…eed IL at run time
Follow-up to dotnet#130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: System.Runtime.Extensions.Tests
(AppDomainTests.ExecuteAssembly invokes a stripped entry point,
InvalidProgramException), System.IO.Hashing.Tests
(Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128
intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the
runtime-async V2Methods.Quuux in ToString_Async). This sets
PublishReadyToRunStripILBodies to false on those three test projects,
which dotnet#130360 already forwards through the _ApplePropertyNames
allowlist, leaving stripping on for every other Apple mobile CoreCLR
test app.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 432f1ad3-ea7c-4c6e-8f53-c6ecb80338b6
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates a small set of library test projects to opt out of IL-body stripping during Apple mobile CoreCLR composite ReadyToRun publishing, ensuring tests that depend on runtime IL inspection/execution aren’t broken by stripped method bodies.

Changes:

  • Set PublishReadyToRunStripILBodies to false for System.Runtime.Extensions.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.IO.Hashing.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.Diagnostics.StackTrace.Tests.
Show a summary per file
FileDescription
src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System.Runtime.Extensions.Tests.csprojDisables IL-body stripping for this test app to keep runtime IL available where needed.
src/libraries/System.IO.Hashing/tests/System.IO.Hashing.Tests.csprojDisables IL-body stripping for this test app to avoid failures when IL is required at runtime.
src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csprojDisables IL-body stripping for this test app to preserve IL-dependent runtime behavior for specific tests.

Copilot's findings

  • Files reviewed: 3/3 changed files
  • Comments generated: 0

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

…ple mobile
The generated merged test runner entry point Program...RunTests(TestFilter)
has its IL stripped by crossgen2 --strip-il-bodies, which the interpreter on
Apple mobile CoreCLR needs at runtime, causing the iossimulator CoreCLR
runtime test leg to fail. Set PublishReadyToRunStripILBodies=false so the
property is forwarded through _ApplePropertyNames into the Helix Apple app
build, matching the approach used for the library test projects in this PR.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 11:03

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 1

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

The situation is:
For a method marked as async:

  • The IL is needed for the async variant
  • The IL is not needed for the Task-returning variant

For a method not marked as async:

  • The IL is needed for the async variant
  • The IL is needed for the Task-returning variant

The check checks for the second case and it expects the former case to be covered by the existing factory.OptimizationFlags.CompiledMethodDefs check. If that isn't the case, can we make it so it is?

CopiedMethodILNode stripped the RVA IL body of a runtime-async method
whenever the method's Task-returning entrypoint was compiled, because the
CompiledMethodDefs gate keys on the EcmaMethod while AsyncMethodVariant
records itself under its own key. The RVA body is consumed at run time only
by the async variant, so the body was stripped even when the variant was not
compiled into the image and had to be materialized from IL, faulting on the
invalid stub.
Keep the IL for an already-async method unless its async variant is present
in CompiledMethodDefs. This removes the need for the per-test
PublishReadyToRunStripILBodies override on System.Diagnostics.StackTrace.Tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 12:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 3

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Apple mobile tests no longer fail with InvalidProgramException from stripped IL bodies

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/ba-g timeouts and unrelated extra-platforms failures

@kotlarmilos
kotlarmilos merged commit a90733c into dotnet:mainJul 13, 2026
166 of 184 checks passed
@BrzVlad

Copy link
Copy Markdown
Member

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

Agreed. The project-level stripping property is broad workaround and should not be the final state. The runtime-async System.Diagnostics.StackTrace.Tests case is fixed in this PR. System.Runtime.Extensions.Tests exercises dynamic assembly loading where the load path cannot use the composite R2R code and the interpreter needs IL. The same applies to the AssemblyLoadContext.

Since stripping is enabled by default, I agree the remaining cases need fixes and the opt-outs should be removed as those fixes land.

eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…eed IL at run time (#130468)
## Description
Follow-up to #130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: `System.Runtime.Extensions.Tests`
(`AppDomainTests.ExecuteAssembly` invokes a stripped entry point,
`InvalidProgramException`), `System.IO.Hashing.Tests`
(`Crc64ParameterSet.ForwardCrc64.InitializeVectorized`, a `Vector128`
intrinsic fallback), and `System.Diagnostics.StackTrace.Tests` (the
runtime-async `V2Methods.Quuux` in `ToString_Async`). This sets
`PublishReadyToRunStripILBodies` to `false` on those three test
projects, which #130360 already forwards through the
`_ApplePropertyNames` allowlist, leaving stripping on for every other
Apple mobile CoreCLR test app.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@jakobbotsch@BrzVlad@vitek-karas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time - #130468

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests
Jul 13, 2026
Merged

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time#130468
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests

Conversation

@kotlarmilos

Copy link
Copy Markdown
Member

Description

Follow-up to #130360. The SDK strips IL bodies from the Apple mobile CoreCLR composite ReadyToRun image by default, replacing each body with an invalid stub, so any test that needs the real IL at run time fails. Three more projects hit this: System.Runtime.Extensions.Tests (AppDomainTests.ExecuteAssembly invokes a stripped entry point, InvalidProgramException), System.IO.Hashing.Tests (Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128 intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async). This sets PublishReadyToRunStripILBodies to false on those three test projects, which #130360 already forwards through the _ApplePropertyNames allowlist, leaving stripping on for every other Apple mobile CoreCLR test app.

…eed IL at run time
Follow-up to dotnet#130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: System.Runtime.Extensions.Tests
(AppDomainTests.ExecuteAssembly invokes a stripped entry point,
InvalidProgramException), System.IO.Hashing.Tests
(Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128
intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the
runtime-async V2Methods.Quuux in ToString_Async). This sets
PublishReadyToRunStripILBodies to false on those three test projects,
which dotnet#130360 already forwards through the _ApplePropertyNames
allowlist, leaving stripping on for every other Apple mobile CoreCLR
test app.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 432f1ad3-ea7c-4c6e-8f53-c6ecb80338b6
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates a small set of library test projects to opt out of IL-body stripping during Apple mobile CoreCLR composite ReadyToRun publishing, ensuring tests that depend on runtime IL inspection/execution aren’t broken by stripped method bodies.

Changes:

  • Set PublishReadyToRunStripILBodies to false for System.Runtime.Extensions.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.IO.Hashing.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.Diagnostics.StackTrace.Tests.
Show a summary per file
FileDescription
src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System.Runtime.Extensions.Tests.csprojDisables IL-body stripping for this test app to keep runtime IL available where needed.
src/libraries/System.IO.Hashing/tests/System.IO.Hashing.Tests.csprojDisables IL-body stripping for this test app to avoid failures when IL is required at runtime.
src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csprojDisables IL-body stripping for this test app to preserve IL-dependent runtime behavior for specific tests.

Copilot's findings

  • Files reviewed: 3/3 changed files
  • Comments generated: 0

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

…ple mobile
The generated merged test runner entry point Program...RunTests(TestFilter)
has its IL stripped by crossgen2 --strip-il-bodies, which the interpreter on
Apple mobile CoreCLR needs at runtime, causing the iossimulator CoreCLR
runtime test leg to fail. Set PublishReadyToRunStripILBodies=false so the
property is forwarded through _ApplePropertyNames into the Helix Apple app
build, matching the approach used for the library test projects in this PR.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 11:03

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 1

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

The situation is:
For a method marked as async:

  • The IL is needed for the async variant
  • The IL is not needed for the Task-returning variant

For a method not marked as async:

  • The IL is needed for the async variant
  • The IL is needed for the Task-returning variant

The check checks for the second case and it expects the former case to be covered by the existing factory.OptimizationFlags.CompiledMethodDefs check. If that isn't the case, can we make it so it is?

CopiedMethodILNode stripped the RVA IL body of a runtime-async method
whenever the method's Task-returning entrypoint was compiled, because the
CompiledMethodDefs gate keys on the EcmaMethod while AsyncMethodVariant
records itself under its own key. The RVA body is consumed at run time only
by the async variant, so the body was stripped even when the variant was not
compiled into the image and had to be materialized from IL, faulting on the
invalid stub.
Keep the IL for an already-async method unless its async variant is present
in CompiledMethodDefs. This removes the need for the per-test
PublishReadyToRunStripILBodies override on System.Diagnostics.StackTrace.Tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 12:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 3

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Apple mobile tests no longer fail with InvalidProgramException from stripped IL bodies

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/ba-g timeouts and unrelated extra-platforms failures

@kotlarmilos
kotlarmilos merged commit a90733c into dotnet:mainJul 13, 2026
166 of 184 checks passed
@BrzVlad

Copy link
Copy Markdown
Member

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

Agreed. The project-level stripping property is broad workaround and should not be the final state. The runtime-async System.Diagnostics.StackTrace.Tests case is fixed in this PR. System.Runtime.Extensions.Tests exercises dynamic assembly loading where the load path cannot use the composite R2R code and the interpreter needs IL. The same applies to the AssemblyLoadContext.

Since stripping is enabled by default, I agree the remaining cases need fixes and the opt-outs should be removed as those fixes land.

eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…eed IL at run time (#130468)
## Description
Follow-up to #130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: `System.Runtime.Extensions.Tests`
(`AppDomainTests.ExecuteAssembly` invokes a stripped entry point,
`InvalidProgramException`), `System.IO.Hashing.Tests`
(`Crc64ParameterSet.ForwardCrc64.InitializeVectorized`, a `Vector128`
intrinsic fallback), and `System.Diagnostics.StackTrace.Tests` (the
runtime-async `V2Methods.Quuux` in `ToString_Async`). This sets
`PublishReadyToRunStripILBodies` to `false` on those three test
projects, which #130360 already forwards through the
`_ApplePropertyNames` allowlist, leaving stripping on for every other
Apple mobile CoreCLR test app.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@jakobbotsch@BrzVlad@vitek-karas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time - #130468

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests
Jul 13, 2026
Merged

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time#130468
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests

Conversation

@kotlarmilos

Copy link
Copy Markdown
Member

Description

Follow-up to #130360. The SDK strips IL bodies from the Apple mobile CoreCLR composite ReadyToRun image by default, replacing each body with an invalid stub, so any test that needs the real IL at run time fails. Three more projects hit this: System.Runtime.Extensions.Tests (AppDomainTests.ExecuteAssembly invokes a stripped entry point, InvalidProgramException), System.IO.Hashing.Tests (Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128 intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async). This sets PublishReadyToRunStripILBodies to false on those three test projects, which #130360 already forwards through the _ApplePropertyNames allowlist, leaving stripping on for every other Apple mobile CoreCLR test app.

…eed IL at run time
Follow-up to dotnet#130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: System.Runtime.Extensions.Tests
(AppDomainTests.ExecuteAssembly invokes a stripped entry point,
InvalidProgramException), System.IO.Hashing.Tests
(Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128
intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the
runtime-async V2Methods.Quuux in ToString_Async). This sets
PublishReadyToRunStripILBodies to false on those three test projects,
which dotnet#130360 already forwards through the _ApplePropertyNames
allowlist, leaving stripping on for every other Apple mobile CoreCLR
test app.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 432f1ad3-ea7c-4c6e-8f53-c6ecb80338b6
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates a small set of library test projects to opt out of IL-body stripping during Apple mobile CoreCLR composite ReadyToRun publishing, ensuring tests that depend on runtime IL inspection/execution aren’t broken by stripped method bodies.

Changes:

  • Set PublishReadyToRunStripILBodies to false for System.Runtime.Extensions.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.IO.Hashing.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.Diagnostics.StackTrace.Tests.
Show a summary per file
FileDescription
src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System.Runtime.Extensions.Tests.csprojDisables IL-body stripping for this test app to keep runtime IL available where needed.
src/libraries/System.IO.Hashing/tests/System.IO.Hashing.Tests.csprojDisables IL-body stripping for this test app to avoid failures when IL is required at runtime.
src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csprojDisables IL-body stripping for this test app to preserve IL-dependent runtime behavior for specific tests.

Copilot's findings

  • Files reviewed: 3/3 changed files
  • Comments generated: 0

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

…ple mobile
The generated merged test runner entry point Program...RunTests(TestFilter)
has its IL stripped by crossgen2 --strip-il-bodies, which the interpreter on
Apple mobile CoreCLR needs at runtime, causing the iossimulator CoreCLR
runtime test leg to fail. Set PublishReadyToRunStripILBodies=false so the
property is forwarded through _ApplePropertyNames into the Helix Apple app
build, matching the approach used for the library test projects in this PR.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 11:03

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 1

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

The situation is:
For a method marked as async:

  • The IL is needed for the async variant
  • The IL is not needed for the Task-returning variant

For a method not marked as async:

  • The IL is needed for the async variant
  • The IL is needed for the Task-returning variant

The check checks for the second case and it expects the former case to be covered by the existing factory.OptimizationFlags.CompiledMethodDefs check. If that isn't the case, can we make it so it is?

CopiedMethodILNode stripped the RVA IL body of a runtime-async method
whenever the method's Task-returning entrypoint was compiled, because the
CompiledMethodDefs gate keys on the EcmaMethod while AsyncMethodVariant
records itself under its own key. The RVA body is consumed at run time only
by the async variant, so the body was stripped even when the variant was not
compiled into the image and had to be materialized from IL, faulting on the
invalid stub.
Keep the IL for an already-async method unless its async variant is present
in CompiledMethodDefs. This removes the need for the per-test
PublishReadyToRunStripILBodies override on System.Diagnostics.StackTrace.Tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 12:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 3

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Apple mobile tests no longer fail with InvalidProgramException from stripped IL bodies

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/ba-g timeouts and unrelated extra-platforms failures

@kotlarmilos
kotlarmilos merged commit a90733c into dotnet:mainJul 13, 2026
166 of 184 checks passed
@BrzVlad

Copy link
Copy Markdown
Member

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

Agreed. The project-level stripping property is broad workaround and should not be the final state. The runtime-async System.Diagnostics.StackTrace.Tests case is fixed in this PR. System.Runtime.Extensions.Tests exercises dynamic assembly loading where the load path cannot use the composite R2R code and the interpreter needs IL. The same applies to the AssemblyLoadContext.

Since stripping is enabled by default, I agree the remaining cases need fixes and the opt-outs should be removed as those fixes land.

eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…eed IL at run time (#130468)
## Description
Follow-up to #130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: `System.Runtime.Extensions.Tests`
(`AppDomainTests.ExecuteAssembly` invokes a stripped entry point,
`InvalidProgramException`), `System.IO.Hashing.Tests`
(`Crc64ParameterSet.ForwardCrc64.InitializeVectorized`, a `Vector128`
intrinsic fallback), and `System.Diagnostics.StackTrace.Tests` (the
runtime-async `V2Methods.Quuux` in `ToString_Async`). This sets
`PublishReadyToRunStripILBodies` to `false` on those three test
projects, which #130360 already forwards through the
`_ApplePropertyNames` allowlist, leaving stripping on for every other
Apple mobile CoreCLR test app.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@jakobbotsch@BrzVlad@vitek-karas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time - #130468

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests
Jul 13, 2026
Merged

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time#130468
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests

Conversation

@kotlarmilos

Copy link
Copy Markdown
Member

Description

Follow-up to #130360. The SDK strips IL bodies from the Apple mobile CoreCLR composite ReadyToRun image by default, replacing each body with an invalid stub, so any test that needs the real IL at run time fails. Three more projects hit this: System.Runtime.Extensions.Tests (AppDomainTests.ExecuteAssembly invokes a stripped entry point, InvalidProgramException), System.IO.Hashing.Tests (Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128 intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async). This sets PublishReadyToRunStripILBodies to false on those three test projects, which #130360 already forwards through the _ApplePropertyNames allowlist, leaving stripping on for every other Apple mobile CoreCLR test app.

…eed IL at run time
Follow-up to dotnet#130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: System.Runtime.Extensions.Tests
(AppDomainTests.ExecuteAssembly invokes a stripped entry point,
InvalidProgramException), System.IO.Hashing.Tests
(Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128
intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the
runtime-async V2Methods.Quuux in ToString_Async). This sets
PublishReadyToRunStripILBodies to false on those three test projects,
which dotnet#130360 already forwards through the _ApplePropertyNames
allowlist, leaving stripping on for every other Apple mobile CoreCLR
test app.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 432f1ad3-ea7c-4c6e-8f53-c6ecb80338b6
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates a small set of library test projects to opt out of IL-body stripping during Apple mobile CoreCLR composite ReadyToRun publishing, ensuring tests that depend on runtime IL inspection/execution aren’t broken by stripped method bodies.

Changes:

  • Set PublishReadyToRunStripILBodies to false for System.Runtime.Extensions.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.IO.Hashing.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.Diagnostics.StackTrace.Tests.
Show a summary per file
FileDescription
src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System.Runtime.Extensions.Tests.csprojDisables IL-body stripping for this test app to keep runtime IL available where needed.
src/libraries/System.IO.Hashing/tests/System.IO.Hashing.Tests.csprojDisables IL-body stripping for this test app to avoid failures when IL is required at runtime.
src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csprojDisables IL-body stripping for this test app to preserve IL-dependent runtime behavior for specific tests.

Copilot's findings

  • Files reviewed: 3/3 changed files
  • Comments generated: 0

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

…ple mobile
The generated merged test runner entry point Program...RunTests(TestFilter)
has its IL stripped by crossgen2 --strip-il-bodies, which the interpreter on
Apple mobile CoreCLR needs at runtime, causing the iossimulator CoreCLR
runtime test leg to fail. Set PublishReadyToRunStripILBodies=false so the
property is forwarded through _ApplePropertyNames into the Helix Apple app
build, matching the approach used for the library test projects in this PR.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 11:03

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 1

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

The situation is:
For a method marked as async:

  • The IL is needed for the async variant
  • The IL is not needed for the Task-returning variant

For a method not marked as async:

  • The IL is needed for the async variant
  • The IL is needed for the Task-returning variant

The check checks for the second case and it expects the former case to be covered by the existing factory.OptimizationFlags.CompiledMethodDefs check. If that isn't the case, can we make it so it is?

CopiedMethodILNode stripped the RVA IL body of a runtime-async method
whenever the method's Task-returning entrypoint was compiled, because the
CompiledMethodDefs gate keys on the EcmaMethod while AsyncMethodVariant
records itself under its own key. The RVA body is consumed at run time only
by the async variant, so the body was stripped even when the variant was not
compiled into the image and had to be materialized from IL, faulting on the
invalid stub.
Keep the IL for an already-async method unless its async variant is present
in CompiledMethodDefs. This removes the need for the per-test
PublishReadyToRunStripILBodies override on System.Diagnostics.StackTrace.Tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 12:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 3

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Apple mobile tests no longer fail with InvalidProgramException from stripped IL bodies

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/ba-g timeouts and unrelated extra-platforms failures

@kotlarmilos
kotlarmilos merged commit a90733c into dotnet:mainJul 13, 2026
166 of 184 checks passed
@BrzVlad

Copy link
Copy Markdown
Member

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

Agreed. The project-level stripping property is broad workaround and should not be the final state. The runtime-async System.Diagnostics.StackTrace.Tests case is fixed in this PR. System.Runtime.Extensions.Tests exercises dynamic assembly loading where the load path cannot use the composite R2R code and the interpreter needs IL. The same applies to the AssemblyLoadContext.

Since stripping is enabled by default, I agree the remaining cases need fixes and the opt-outs should be removed as those fixes land.

eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…eed IL at run time (#130468)
## Description
Follow-up to #130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: `System.Runtime.Extensions.Tests`
(`AppDomainTests.ExecuteAssembly` invokes a stripped entry point,
`InvalidProgramException`), `System.IO.Hashing.Tests`
(`Crc64ParameterSet.ForwardCrc64.InitializeVectorized`, a `Vector128`
intrinsic fallback), and `System.Diagnostics.StackTrace.Tests` (the
runtime-async `V2Methods.Quuux` in `ToString_Async`). This sets
`PublishReadyToRunStripILBodies` to `false` on those three test
projects, which #130360 already forwards through the
`_ApplePropertyNames` allowlist, leaving stripping on for every other
Apple mobile CoreCLR test app.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@jakobbotsch@BrzVlad@vitek-karas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time - #130468

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests
Jul 13, 2026
Merged

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time#130468
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests

Conversation

@kotlarmilos

Copy link
Copy Markdown
Member

Description

Follow-up to #130360. The SDK strips IL bodies from the Apple mobile CoreCLR composite ReadyToRun image by default, replacing each body with an invalid stub, so any test that needs the real IL at run time fails. Three more projects hit this: System.Runtime.Extensions.Tests (AppDomainTests.ExecuteAssembly invokes a stripped entry point, InvalidProgramException), System.IO.Hashing.Tests (Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128 intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async). This sets PublishReadyToRunStripILBodies to false on those three test projects, which #130360 already forwards through the _ApplePropertyNames allowlist, leaving stripping on for every other Apple mobile CoreCLR test app.

…eed IL at run time
Follow-up to dotnet#130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: System.Runtime.Extensions.Tests
(AppDomainTests.ExecuteAssembly invokes a stripped entry point,
InvalidProgramException), System.IO.Hashing.Tests
(Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128
intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the
runtime-async V2Methods.Quuux in ToString_Async). This sets
PublishReadyToRunStripILBodies to false on those three test projects,
which dotnet#130360 already forwards through the _ApplePropertyNames
allowlist, leaving stripping on for every other Apple mobile CoreCLR
test app.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 432f1ad3-ea7c-4c6e-8f53-c6ecb80338b6
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates a small set of library test projects to opt out of IL-body stripping during Apple mobile CoreCLR composite ReadyToRun publishing, ensuring tests that depend on runtime IL inspection/execution aren’t broken by stripped method bodies.

Changes:

  • Set PublishReadyToRunStripILBodies to false for System.Runtime.Extensions.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.IO.Hashing.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.Diagnostics.StackTrace.Tests.
Show a summary per file
FileDescription
src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System.Runtime.Extensions.Tests.csprojDisables IL-body stripping for this test app to keep runtime IL available where needed.
src/libraries/System.IO.Hashing/tests/System.IO.Hashing.Tests.csprojDisables IL-body stripping for this test app to avoid failures when IL is required at runtime.
src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csprojDisables IL-body stripping for this test app to preserve IL-dependent runtime behavior for specific tests.

Copilot's findings

  • Files reviewed: 3/3 changed files
  • Comments generated: 0

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

…ple mobile
The generated merged test runner entry point Program...RunTests(TestFilter)
has its IL stripped by crossgen2 --strip-il-bodies, which the interpreter on
Apple mobile CoreCLR needs at runtime, causing the iossimulator CoreCLR
runtime test leg to fail. Set PublishReadyToRunStripILBodies=false so the
property is forwarded through _ApplePropertyNames into the Helix Apple app
build, matching the approach used for the library test projects in this PR.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 11:03

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 1

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

The situation is:
For a method marked as async:

  • The IL is needed for the async variant
  • The IL is not needed for the Task-returning variant

For a method not marked as async:

  • The IL is needed for the async variant
  • The IL is needed for the Task-returning variant

The check checks for the second case and it expects the former case to be covered by the existing factory.OptimizationFlags.CompiledMethodDefs check. If that isn't the case, can we make it so it is?

CopiedMethodILNode stripped the RVA IL body of a runtime-async method
whenever the method's Task-returning entrypoint was compiled, because the
CompiledMethodDefs gate keys on the EcmaMethod while AsyncMethodVariant
records itself under its own key. The RVA body is consumed at run time only
by the async variant, so the body was stripped even when the variant was not
compiled into the image and had to be materialized from IL, faulting on the
invalid stub.
Keep the IL for an already-async method unless its async variant is present
in CompiledMethodDefs. This removes the need for the per-test
PublishReadyToRunStripILBodies override on System.Diagnostics.StackTrace.Tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 12:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 3

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Apple mobile tests no longer fail with InvalidProgramException from stripped IL bodies

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/ba-g timeouts and unrelated extra-platforms failures

@kotlarmilos
kotlarmilos merged commit a90733c into dotnet:mainJul 13, 2026
166 of 184 checks passed
@BrzVlad

Copy link
Copy Markdown
Member

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

Agreed. The project-level stripping property is broad workaround and should not be the final state. The runtime-async System.Diagnostics.StackTrace.Tests case is fixed in this PR. System.Runtime.Extensions.Tests exercises dynamic assembly loading where the load path cannot use the composite R2R code and the interpreter needs IL. The same applies to the AssemblyLoadContext.

Since stripping is enabled by default, I agree the remaining cases need fixes and the opt-outs should be removed as those fixes land.

eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…eed IL at run time (#130468)
## Description
Follow-up to #130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: `System.Runtime.Extensions.Tests`
(`AppDomainTests.ExecuteAssembly` invokes a stripped entry point,
`InvalidProgramException`), `System.IO.Hashing.Tests`
(`Crc64ParameterSet.ForwardCrc64.InitializeVectorized`, a `Vector128`
intrinsic fallback), and `System.Diagnostics.StackTrace.Tests` (the
runtime-async `V2Methods.Quuux` in `ToString_Async`). This sets
`PublishReadyToRunStripILBodies` to `false` on those three test
projects, which #130360 already forwards through the
`_ApplePropertyNames` allowlist, leaving stripping on for every other
Apple mobile CoreCLR test app.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@jakobbotsch@BrzVlad@vitek-karas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time - #130468

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests
Jul 13, 2026
Merged

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time#130468
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests

Conversation

@kotlarmilos

Copy link
Copy Markdown
Member

Description

Follow-up to #130360. The SDK strips IL bodies from the Apple mobile CoreCLR composite ReadyToRun image by default, replacing each body with an invalid stub, so any test that needs the real IL at run time fails. Three more projects hit this: System.Runtime.Extensions.Tests (AppDomainTests.ExecuteAssembly invokes a stripped entry point, InvalidProgramException), System.IO.Hashing.Tests (Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128 intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async). This sets PublishReadyToRunStripILBodies to false on those three test projects, which #130360 already forwards through the _ApplePropertyNames allowlist, leaving stripping on for every other Apple mobile CoreCLR test app.

…eed IL at run time
Follow-up to dotnet#130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: System.Runtime.Extensions.Tests
(AppDomainTests.ExecuteAssembly invokes a stripped entry point,
InvalidProgramException), System.IO.Hashing.Tests
(Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128
intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the
runtime-async V2Methods.Quuux in ToString_Async). This sets
PublishReadyToRunStripILBodies to false on those three test projects,
which dotnet#130360 already forwards through the _ApplePropertyNames
allowlist, leaving stripping on for every other Apple mobile CoreCLR
test app.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 432f1ad3-ea7c-4c6e-8f53-c6ecb80338b6
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates a small set of library test projects to opt out of IL-body stripping during Apple mobile CoreCLR composite ReadyToRun publishing, ensuring tests that depend on runtime IL inspection/execution aren’t broken by stripped method bodies.

Changes:

  • Set PublishReadyToRunStripILBodies to false for System.Runtime.Extensions.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.IO.Hashing.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.Diagnostics.StackTrace.Tests.
Show a summary per file
FileDescription
src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System.Runtime.Extensions.Tests.csprojDisables IL-body stripping for this test app to keep runtime IL available where needed.
src/libraries/System.IO.Hashing/tests/System.IO.Hashing.Tests.csprojDisables IL-body stripping for this test app to avoid failures when IL is required at runtime.
src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csprojDisables IL-body stripping for this test app to preserve IL-dependent runtime behavior for specific tests.

Copilot's findings

  • Files reviewed: 3/3 changed files
  • Comments generated: 0

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

…ple mobile
The generated merged test runner entry point Program...RunTests(TestFilter)
has its IL stripped by crossgen2 --strip-il-bodies, which the interpreter on
Apple mobile CoreCLR needs at runtime, causing the iossimulator CoreCLR
runtime test leg to fail. Set PublishReadyToRunStripILBodies=false so the
property is forwarded through _ApplePropertyNames into the Helix Apple app
build, matching the approach used for the library test projects in this PR.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 11:03

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 1

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

The situation is:
For a method marked as async:

  • The IL is needed for the async variant
  • The IL is not needed for the Task-returning variant

For a method not marked as async:

  • The IL is needed for the async variant
  • The IL is needed for the Task-returning variant

The check checks for the second case and it expects the former case to be covered by the existing factory.OptimizationFlags.CompiledMethodDefs check. If that isn't the case, can we make it so it is?

CopiedMethodILNode stripped the RVA IL body of a runtime-async method
whenever the method's Task-returning entrypoint was compiled, because the
CompiledMethodDefs gate keys on the EcmaMethod while AsyncMethodVariant
records itself under its own key. The RVA body is consumed at run time only
by the async variant, so the body was stripped even when the variant was not
compiled into the image and had to be materialized from IL, faulting on the
invalid stub.
Keep the IL for an already-async method unless its async variant is present
in CompiledMethodDefs. This removes the need for the per-test
PublishReadyToRunStripILBodies override on System.Diagnostics.StackTrace.Tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 12:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 3

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Apple mobile tests no longer fail with InvalidProgramException from stripped IL bodies

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/ba-g timeouts and unrelated extra-platforms failures

@kotlarmilos
kotlarmilos merged commit a90733c into dotnet:mainJul 13, 2026
166 of 184 checks passed
@BrzVlad

Copy link
Copy Markdown
Member

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

Agreed. The project-level stripping property is broad workaround and should not be the final state. The runtime-async System.Diagnostics.StackTrace.Tests case is fixed in this PR. System.Runtime.Extensions.Tests exercises dynamic assembly loading where the load path cannot use the composite R2R code and the interpreter needs IL. The same applies to the AssemblyLoadContext.

Since stripping is enabled by default, I agree the remaining cases need fixes and the opt-outs should be removed as those fixes land.

eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…eed IL at run time (#130468)
## Description
Follow-up to #130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: `System.Runtime.Extensions.Tests`
(`AppDomainTests.ExecuteAssembly` invokes a stripped entry point,
`InvalidProgramException`), `System.IO.Hashing.Tests`
(`Crc64ParameterSet.ForwardCrc64.InitializeVectorized`, a `Vector128`
intrinsic fallback), and `System.Diagnostics.StackTrace.Tests` (the
runtime-async `V2Methods.Quuux` in `ToString_Async`). This sets
`PublishReadyToRunStripILBodies` to `false` on those three test
projects, which #130360 already forwards through the
`_ApplePropertyNames` allowlist, leaving stripping on for every other
Apple mobile CoreCLR test app.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@jakobbotsch@BrzVlad@vitek-karas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time - #130468

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests
Jul 13, 2026
Merged

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time#130468
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests

Conversation

@kotlarmilos

Copy link
Copy Markdown
Member

Description

Follow-up to #130360. The SDK strips IL bodies from the Apple mobile CoreCLR composite ReadyToRun image by default, replacing each body with an invalid stub, so any test that needs the real IL at run time fails. Three more projects hit this: System.Runtime.Extensions.Tests (AppDomainTests.ExecuteAssembly invokes a stripped entry point, InvalidProgramException), System.IO.Hashing.Tests (Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128 intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async). This sets PublishReadyToRunStripILBodies to false on those three test projects, which #130360 already forwards through the _ApplePropertyNames allowlist, leaving stripping on for every other Apple mobile CoreCLR test app.

…eed IL at run time
Follow-up to dotnet#130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: System.Runtime.Extensions.Tests
(AppDomainTests.ExecuteAssembly invokes a stripped entry point,
InvalidProgramException), System.IO.Hashing.Tests
(Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128
intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the
runtime-async V2Methods.Quuux in ToString_Async). This sets
PublishReadyToRunStripILBodies to false on those three test projects,
which dotnet#130360 already forwards through the _ApplePropertyNames
allowlist, leaving stripping on for every other Apple mobile CoreCLR
test app.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 432f1ad3-ea7c-4c6e-8f53-c6ecb80338b6
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates a small set of library test projects to opt out of IL-body stripping during Apple mobile CoreCLR composite ReadyToRun publishing, ensuring tests that depend on runtime IL inspection/execution aren’t broken by stripped method bodies.

Changes:

  • Set PublishReadyToRunStripILBodies to false for System.Runtime.Extensions.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.IO.Hashing.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.Diagnostics.StackTrace.Tests.
Show a summary per file
FileDescription
src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System.Runtime.Extensions.Tests.csprojDisables IL-body stripping for this test app to keep runtime IL available where needed.
src/libraries/System.IO.Hashing/tests/System.IO.Hashing.Tests.csprojDisables IL-body stripping for this test app to avoid failures when IL is required at runtime.
src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csprojDisables IL-body stripping for this test app to preserve IL-dependent runtime behavior for specific tests.

Copilot's findings

  • Files reviewed: 3/3 changed files
  • Comments generated: 0

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

…ple mobile
The generated merged test runner entry point Program...RunTests(TestFilter)
has its IL stripped by crossgen2 --strip-il-bodies, which the interpreter on
Apple mobile CoreCLR needs at runtime, causing the iossimulator CoreCLR
runtime test leg to fail. Set PublishReadyToRunStripILBodies=false so the
property is forwarded through _ApplePropertyNames into the Helix Apple app
build, matching the approach used for the library test projects in this PR.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 11:03

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 1

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

The situation is:
For a method marked as async:

  • The IL is needed for the async variant
  • The IL is not needed for the Task-returning variant

For a method not marked as async:

  • The IL is needed for the async variant
  • The IL is needed for the Task-returning variant

The check checks for the second case and it expects the former case to be covered by the existing factory.OptimizationFlags.CompiledMethodDefs check. If that isn't the case, can we make it so it is?

CopiedMethodILNode stripped the RVA IL body of a runtime-async method
whenever the method's Task-returning entrypoint was compiled, because the
CompiledMethodDefs gate keys on the EcmaMethod while AsyncMethodVariant
records itself under its own key. The RVA body is consumed at run time only
by the async variant, so the body was stripped even when the variant was not
compiled into the image and had to be materialized from IL, faulting on the
invalid stub.
Keep the IL for an already-async method unless its async variant is present
in CompiledMethodDefs. This removes the need for the per-test
PublishReadyToRunStripILBodies override on System.Diagnostics.StackTrace.Tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 12:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 3

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Apple mobile tests no longer fail with InvalidProgramException from stripped IL bodies

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/ba-g timeouts and unrelated extra-platforms failures

@kotlarmilos
kotlarmilos merged commit a90733c into dotnet:mainJul 13, 2026
166 of 184 checks passed
@BrzVlad

Copy link
Copy Markdown
Member

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

Agreed. The project-level stripping property is broad workaround and should not be the final state. The runtime-async System.Diagnostics.StackTrace.Tests case is fixed in this PR. System.Runtime.Extensions.Tests exercises dynamic assembly loading where the load path cannot use the composite R2R code and the interpreter needs IL. The same applies to the AssemblyLoadContext.

Since stripping is enabled by default, I agree the remaining cases need fixes and the opt-outs should be removed as those fixes land.

eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…eed IL at run time (#130468)
## Description
Follow-up to #130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: `System.Runtime.Extensions.Tests`
(`AppDomainTests.ExecuteAssembly` invokes a stripped entry point,
`InvalidProgramException`), `System.IO.Hashing.Tests`
(`Crc64ParameterSet.ForwardCrc64.InitializeVectorized`, a `Vector128`
intrinsic fallback), and `System.Diagnostics.StackTrace.Tests` (the
runtime-async `V2Methods.Quuux` in `ToString_Async`). This sets
`PublishReadyToRunStripILBodies` to `false` on those three test
projects, which #130360 already forwards through the
`_ApplePropertyNames` allowlist, leaving stripping on for every other
Apple mobile CoreCLR test app.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@jakobbotsch@BrzVlad@vitek-karas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time - #130468

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests
Jul 13, 2026
Merged

[clr-ios] Disable R2R IL-body stripping for more library tests that need IL at run time#130468
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:dev/kotlarmilos/clr-ios-strip-il-bodies-more-tests

Conversation

@kotlarmilos

Copy link
Copy Markdown
Member

Description

Follow-up to #130360. The SDK strips IL bodies from the Apple mobile CoreCLR composite ReadyToRun image by default, replacing each body with an invalid stub, so any test that needs the real IL at run time fails. Three more projects hit this: System.Runtime.Extensions.Tests (AppDomainTests.ExecuteAssembly invokes a stripped entry point, InvalidProgramException), System.IO.Hashing.Tests (Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128 intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async). This sets PublishReadyToRunStripILBodies to false on those three test projects, which #130360 already forwards through the _ApplePropertyNames allowlist, leaving stripping on for every other Apple mobile CoreCLR test app.

…eed IL at run time
Follow-up to dotnet#130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: System.Runtime.Extensions.Tests
(AppDomainTests.ExecuteAssembly invokes a stripped entry point,
InvalidProgramException), System.IO.Hashing.Tests
(Crc64ParameterSet.ForwardCrc64.InitializeVectorized, a Vector128
intrinsic fallback), and System.Diagnostics.StackTrace.Tests (the
runtime-async V2Methods.Quuux in ToString_Async). This sets
PublishReadyToRunStripILBodies to false on those three test projects,
which dotnet#130360 already forwards through the _ApplePropertyNames
allowlist, leaving stripping on for every other Apple mobile CoreCLR
test app.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 432f1ad3-ea7c-4c6e-8f53-c6ecb80338b6
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates a small set of library test projects to opt out of IL-body stripping during Apple mobile CoreCLR composite ReadyToRun publishing, ensuring tests that depend on runtime IL inspection/execution aren’t broken by stripped method bodies.

Changes:

  • Set PublishReadyToRunStripILBodies to false for System.Runtime.Extensions.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.IO.Hashing.Tests.
  • Set PublishReadyToRunStripILBodies to false for System.Diagnostics.StackTrace.Tests.
Show a summary per file
FileDescription
src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System.Runtime.Extensions.Tests.csprojDisables IL-body stripping for this test app to keep runtime IL available where needed.
src/libraries/System.IO.Hashing/tests/System.IO.Hashing.Tests.csprojDisables IL-body stripping for this test app to avoid failures when IL is required at runtime.
src/libraries/System.Diagnostics.StackTrace/tests/System.Diagnostics.StackTrace.Tests.csprojDisables IL-body stripping for this test app to preserve IL-dependent runtime behavior for specific tests.

Copilot's findings

  • Files reviewed: 3/3 changed files
  • Comments generated: 0

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

…ple mobile
The generated merged test runner entry point Program...RunTests(TestFilter)
has its IL stripped by crossgen2 --strip-il-bodies, which the interpreter on
Apple mobile CoreCLR needs at runtime, causing the iossimulator CoreCLR
runtime test leg to fail. Set PublishReadyToRunStripILBodies=false so the
property is forwarded through _ApplePropertyNames into the Helix Apple app
build, matching the approach used for the library test projects in this PR.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 11:03

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 1

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch

Copy link
Copy Markdown
Member

and System.Diagnostics.StackTrace.Tests (the runtime-async V2Methods.Quuux in ToString_Async)

Why is this manual workaround needed for this case?

The guard MayNeedILAtRuntime keeps IL only when ReturnsTaskOrValueTask() && !method.IsAsync. The guard is scoped to preserve IL of non-async Task returning methods. V2Methods.Quuux public static async Task Quuux() marked [RuntimeAsyncMethodGeneration(true)].

The alternative is to fix this by expanding the guard so IL is preserved for any Task or ValueTask returning method, that is dropping the, since both the non-async path and the async variant path read the same RVA IL.

The situation is:
For a method marked as async:

  • The IL is needed for the async variant
  • The IL is not needed for the Task-returning variant

For a method not marked as async:

  • The IL is needed for the async variant
  • The IL is needed for the Task-returning variant

The check checks for the second case and it expects the former case to be covered by the existing factory.OptimizationFlags.CompiledMethodDefs check. If that isn't the case, can we make it so it is?

CopiedMethodILNode stripped the RVA IL body of a runtime-async method
whenever the method's Task-returning entrypoint was compiled, because the
CompiledMethodDefs gate keys on the EcmaMethod while AsyncMethodVariant
records itself under its own key. The RVA body is consumed at run time only
by the async variant, so the body was stripped even when the variant was not
compiled into the image and had to be materialized from IL, faulting on the
invalid stub.
Keep the IL for an already-async method unless its async variant is present
in CompiledMethodDefs. This removes the need for the per-test
PublishReadyToRunStripILBodies override on System.Diagnostics.StackTrace.Tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 24b062cc-cf90-4c79-868e-4c6d1fcc7c36
CopilotAI review requested due to automatic review settings July 10, 2026 12:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 4/4 changed files
  • Comments generated: 3

Comment threadsrc/tests/JIT/Regression/Regression_o_2.csproj
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Apple mobile tests no longer fail with InvalidProgramException from stripped IL bodies

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/ba-g timeouts and unrelated extra-platforms failures

@kotlarmilos
kotlarmilos merged commit a90733c into dotnet:mainJul 13, 2026
166 of 184 checks passed
@BrzVlad

Copy link
Copy Markdown
Member

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

Are we too aggressive with disabling tests here ? Which one of these patterns can happen with user code ? IIRC ALC unload didn't actually free memory on mono, but otherwise they would be working. I know users having been asking for this support in the past. Also, why would we ever need the IL for Crc64ParameterSet.ForwardCrc64.InitializeVectorized ? I believe we should fix all these scenarios otherwise users will just get regression as we have this stripping enabled by default.

Agreed. The project-level stripping property is broad workaround and should not be the final state. The runtime-async System.Diagnostics.StackTrace.Tests case is fixed in this PR. System.Runtime.Extensions.Tests exercises dynamic assembly loading where the load path cannot use the composite R2R code and the interpreter needs IL. The same applies to the AssemblyLoadContext.

Since stripping is enabled by default, I agree the remaining cases need fixes and the opt-outs should be removed as those fixes land.

eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…eed IL at run time (#130468)
## Description
Follow-up to #130360. The SDK strips IL bodies from the Apple mobile
CoreCLR composite ReadyToRun image by default, replacing each body with
an invalid stub, so any test that needs the real IL at run time fails.
Three more projects hit this: `System.Runtime.Extensions.Tests`
(`AppDomainTests.ExecuteAssembly` invokes a stripped entry point,
`InvalidProgramException`), `System.IO.Hashing.Tests`
(`Crc64ParameterSet.ForwardCrc64.InitializeVectorized`, a `Vector128`
intrinsic fallback), and `System.Diagnostics.StackTrace.Tests` (the
runtime-async `V2Methods.Quuux` in `ToString_Async`). This sets
`PublishReadyToRunStripILBodies` to `false` on those three test
projects, which #130360 already forwards through the
`_ApplePropertyNames` allowlist, leaving stripping on for every other
Apple mobile CoreCLR test app.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@jakobbotsch@BrzVlad@vitek-karas