[crossgen2] Add --strip-il-bodies option for composite R2R - #125647

Merged
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies
Apr 8, 2026
Merged

[crossgen2] Add --strip-il-bodies option for composite R2R#125647
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Mar 17, 2026

Copy link
Copy Markdown
Member

Description

Add a --strip-il-bodies crossgen2 option that replaces IL method bodies of successfully R2R-compiled methods with minimal stubs (ret) in composite output assemblies. This reduces assembly size for scenarios where IL interpreter fallback is not needed, such as full R2R on iOS/MacCatalyst.

Fixes#124860

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

Adds a --strip-il-bodies crossgen2 option for composite R2R that replaces IL method bodies of successfully compiled methods with minimal ret stubs, reducing output size for scenarios like full R2R on iOS/MacCatalyst.

Changes:

  • New --strip-il-bodies CLI option and corresponding NodeFactoryOptimizationFlags fields
  • Builds a set of compiled method definitions and passes it to component file rewriting
  • In CopiedMethodILNode, replaces IL bodies of non-generic compiled methods with a minimal 2-byte stub

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
Crossgen2RootCommand.csDeclares the --strip-il-bodies CLI option
Program.csWires the option value into nodeFactoryFlags.StripILBodies
ReadyToRunCodegenNodeFactory.csAdds StripILBodies/CompiledMethodDefs fields and BuildCompiledMethodDefsSet()
ReadyToRunCodegenCompilation.csBuilds the compiled methods set and passes it through to RewriteComponentFile
CopiedMethodILNode.csImplements IL body stripping with a minimal ret stub for compiled non-generic methods

You can also share your feedback on Copilot code review. Take the survey.

CopilotAI review requested due to automatic review settings March 18, 2026 13:22

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

Adds a new crossgen2 switch to reduce composite R2R deployment size by stripping IL bodies from rewritten component assemblies when the method was successfully compiled into the composite image.

Changes:

  • Add --strip-il-bodies option wiring from crossgen2 CLI into NodeFactoryOptimizationFlags.
  • Track the set of methods compiled into the composite image and pass it into component-module rewriting.
  • When rewriting component assemblies, replace eligible compiled methods’ IL bodies with a minimal stub body.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csWires the new CLI option into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csIntroduces and registers the --strip-il-bodies command-line option.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds the compiled-method set for composite builds and passes it into component rewriting.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csExtends optimization flags and adds helper to compute the compiled method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csImplements IL-body replacement for eligible methods during component rewrite.

You can also share your feedback on Copilot code review. Take the survey.

Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr crossgen2,runtime-coreclr crossgen2-composite

@azure-pipelines

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

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

The failures shouldn't be related, ready for review

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

Adds a new crossgen2 switch to optionally strip IL bodies from rewritten component assemblies in composite ReadyToRun output, reducing size for scenarios that don’t require IL fallback (notably Apple platforms).

Changes:

  • Add crossgen2 --strip-il-bodies option and plumb it into ReadyToRun node factory optimization flags.
  • During composite “standalone MSIL” rewrite, replace IL bodies for successfully compiled methods with a minimal throwing stub.
  • Wire the option into Microsoft.NET.CrossGen.targets for Apple RIDs via PublishReadyToRunCrossgen2ExtraArgs.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targetsAdds MSBuild logic to append --strip-il-bodies for Apple RIDs based on a property gate.
src/coreclr/tools/aot/crossgen2/Program.csPasses the new StripILBodies flag into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csDefines the new --strip-il-bodies CLI option and help text.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds a compiled-method set and passes it into component rewrite so IL bodies can be stripped.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csAdds optimization flag fields and helper to build the compiled-method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csEmits a stripped stub body for eligible methods instead of copying original IL.

Comment threadsrc/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targets Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos
kotlarmilos requested a review from jkotasMarch 26, 2026 10:20
…yAnalysis/ReadyToRun/CopiedMethodILNode.cs
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 31, 2026 09:33

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

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
CopilotAI review requested due to automatic review settings April 1, 2026 10:44

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

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The native AOT crashes look related, I think this needs an update in ModuleHeaders.h.

Keep ModuleHeaders.h in sync with readytorun.h and ModuleHeaders.cs
after the R2R minor version bump for stripped IL bodies flags.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos merged commit bbe57f3 into dotnet:mainApr 8, 2026
109 of 111 checks passed
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[clr-ios] Strip IL method body in R2R composite for Apple mobile

6 participants

@kotlarmilos@MichalStrehovsky@jkoritzinsky@jkotas@teo-tsirpanis
, '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

[crossgen2] Add --strip-il-bodies option for composite R2R - #125647

Merged
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies
Apr 8, 2026
Merged

[crossgen2] Add --strip-il-bodies option for composite R2R#125647
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Mar 17, 2026

Copy link
Copy Markdown
Member

Description

Add a --strip-il-bodies crossgen2 option that replaces IL method bodies of successfully R2R-compiled methods with minimal stubs (ret) in composite output assemblies. This reduces assembly size for scenarios where IL interpreter fallback is not needed, such as full R2R on iOS/MacCatalyst.

Fixes#124860

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

Adds a --strip-il-bodies crossgen2 option for composite R2R that replaces IL method bodies of successfully compiled methods with minimal ret stubs, reducing output size for scenarios like full R2R on iOS/MacCatalyst.

Changes:

  • New --strip-il-bodies CLI option and corresponding NodeFactoryOptimizationFlags fields
  • Builds a set of compiled method definitions and passes it to component file rewriting
  • In CopiedMethodILNode, replaces IL bodies of non-generic compiled methods with a minimal 2-byte stub

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
Crossgen2RootCommand.csDeclares the --strip-il-bodies CLI option
Program.csWires the option value into nodeFactoryFlags.StripILBodies
ReadyToRunCodegenNodeFactory.csAdds StripILBodies/CompiledMethodDefs fields and BuildCompiledMethodDefsSet()
ReadyToRunCodegenCompilation.csBuilds the compiled methods set and passes it through to RewriteComponentFile
CopiedMethodILNode.csImplements IL body stripping with a minimal ret stub for compiled non-generic methods

You can also share your feedback on Copilot code review. Take the survey.

CopilotAI review requested due to automatic review settings March 18, 2026 13:22

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

Adds a new crossgen2 switch to reduce composite R2R deployment size by stripping IL bodies from rewritten component assemblies when the method was successfully compiled into the composite image.

Changes:

  • Add --strip-il-bodies option wiring from crossgen2 CLI into NodeFactoryOptimizationFlags.
  • Track the set of methods compiled into the composite image and pass it into component-module rewriting.
  • When rewriting component assemblies, replace eligible compiled methods’ IL bodies with a minimal stub body.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csWires the new CLI option into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csIntroduces and registers the --strip-il-bodies command-line option.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds the compiled-method set for composite builds and passes it into component rewriting.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csExtends optimization flags and adds helper to compute the compiled method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csImplements IL-body replacement for eligible methods during component rewrite.

You can also share your feedback on Copilot code review. Take the survey.

Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr crossgen2,runtime-coreclr crossgen2-composite

@azure-pipelines

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

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

The failures shouldn't be related, ready for review

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

Adds a new crossgen2 switch to optionally strip IL bodies from rewritten component assemblies in composite ReadyToRun output, reducing size for scenarios that don’t require IL fallback (notably Apple platforms).

Changes:

  • Add crossgen2 --strip-il-bodies option and plumb it into ReadyToRun node factory optimization flags.
  • During composite “standalone MSIL” rewrite, replace IL bodies for successfully compiled methods with a minimal throwing stub.
  • Wire the option into Microsoft.NET.CrossGen.targets for Apple RIDs via PublishReadyToRunCrossgen2ExtraArgs.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targetsAdds MSBuild logic to append --strip-il-bodies for Apple RIDs based on a property gate.
src/coreclr/tools/aot/crossgen2/Program.csPasses the new StripILBodies flag into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csDefines the new --strip-il-bodies CLI option and help text.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds a compiled-method set and passes it into component rewrite so IL bodies can be stripped.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csAdds optimization flag fields and helper to build the compiled-method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csEmits a stripped stub body for eligible methods instead of copying original IL.

Comment threadsrc/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targets Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos
kotlarmilos requested a review from jkotasMarch 26, 2026 10:20
…yAnalysis/ReadyToRun/CopiedMethodILNode.cs
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 31, 2026 09:33

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

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
CopilotAI review requested due to automatic review settings April 1, 2026 10:44

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

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The native AOT crashes look related, I think this needs an update in ModuleHeaders.h.

Keep ModuleHeaders.h in sync with readytorun.h and ModuleHeaders.cs
after the R2R minor version bump for stripped IL bodies flags.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos merged commit bbe57f3 into dotnet:mainApr 8, 2026
109 of 111 checks passed
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[clr-ios] Strip IL method body in R2R composite for Apple mobile

6 participants

@kotlarmilos@MichalStrehovsky@jkoritzinsky@jkotas@teo-tsirpanis
, '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

[crossgen2] Add --strip-il-bodies option for composite R2R - #125647

Merged
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies
Apr 8, 2026
Merged

[crossgen2] Add --strip-il-bodies option for composite R2R#125647
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Mar 17, 2026

Copy link
Copy Markdown
Member

Description

Add a --strip-il-bodies crossgen2 option that replaces IL method bodies of successfully R2R-compiled methods with minimal stubs (ret) in composite output assemblies. This reduces assembly size for scenarios where IL interpreter fallback is not needed, such as full R2R on iOS/MacCatalyst.

Fixes#124860

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

Adds a --strip-il-bodies crossgen2 option for composite R2R that replaces IL method bodies of successfully compiled methods with minimal ret stubs, reducing output size for scenarios like full R2R on iOS/MacCatalyst.

Changes:

  • New --strip-il-bodies CLI option and corresponding NodeFactoryOptimizationFlags fields
  • Builds a set of compiled method definitions and passes it to component file rewriting
  • In CopiedMethodILNode, replaces IL bodies of non-generic compiled methods with a minimal 2-byte stub

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
Crossgen2RootCommand.csDeclares the --strip-il-bodies CLI option
Program.csWires the option value into nodeFactoryFlags.StripILBodies
ReadyToRunCodegenNodeFactory.csAdds StripILBodies/CompiledMethodDefs fields and BuildCompiledMethodDefsSet()
ReadyToRunCodegenCompilation.csBuilds the compiled methods set and passes it through to RewriteComponentFile
CopiedMethodILNode.csImplements IL body stripping with a minimal ret stub for compiled non-generic methods

You can also share your feedback on Copilot code review. Take the survey.

CopilotAI review requested due to automatic review settings March 18, 2026 13:22

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

Adds a new crossgen2 switch to reduce composite R2R deployment size by stripping IL bodies from rewritten component assemblies when the method was successfully compiled into the composite image.

Changes:

  • Add --strip-il-bodies option wiring from crossgen2 CLI into NodeFactoryOptimizationFlags.
  • Track the set of methods compiled into the composite image and pass it into component-module rewriting.
  • When rewriting component assemblies, replace eligible compiled methods’ IL bodies with a minimal stub body.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csWires the new CLI option into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csIntroduces and registers the --strip-il-bodies command-line option.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds the compiled-method set for composite builds and passes it into component rewriting.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csExtends optimization flags and adds helper to compute the compiled method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csImplements IL-body replacement for eligible methods during component rewrite.

You can also share your feedback on Copilot code review. Take the survey.

Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr crossgen2,runtime-coreclr crossgen2-composite

@azure-pipelines

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

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

The failures shouldn't be related, ready for review

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

Adds a new crossgen2 switch to optionally strip IL bodies from rewritten component assemblies in composite ReadyToRun output, reducing size for scenarios that don’t require IL fallback (notably Apple platforms).

Changes:

  • Add crossgen2 --strip-il-bodies option and plumb it into ReadyToRun node factory optimization flags.
  • During composite “standalone MSIL” rewrite, replace IL bodies for successfully compiled methods with a minimal throwing stub.
  • Wire the option into Microsoft.NET.CrossGen.targets for Apple RIDs via PublishReadyToRunCrossgen2ExtraArgs.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targetsAdds MSBuild logic to append --strip-il-bodies for Apple RIDs based on a property gate.
src/coreclr/tools/aot/crossgen2/Program.csPasses the new StripILBodies flag into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csDefines the new --strip-il-bodies CLI option and help text.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds a compiled-method set and passes it into component rewrite so IL bodies can be stripped.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csAdds optimization flag fields and helper to build the compiled-method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csEmits a stripped stub body for eligible methods instead of copying original IL.

Comment threadsrc/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targets Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos
kotlarmilos requested a review from jkotasMarch 26, 2026 10:20
…yAnalysis/ReadyToRun/CopiedMethodILNode.cs
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 31, 2026 09:33

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

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
CopilotAI review requested due to automatic review settings April 1, 2026 10:44

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

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The native AOT crashes look related, I think this needs an update in ModuleHeaders.h.

Keep ModuleHeaders.h in sync with readytorun.h and ModuleHeaders.cs
after the R2R minor version bump for stripped IL bodies flags.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos merged commit bbe57f3 into dotnet:mainApr 8, 2026
109 of 111 checks passed
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[clr-ios] Strip IL method body in R2R composite for Apple mobile

6 participants

@kotlarmilos@MichalStrehovsky@jkoritzinsky@jkotas@teo-tsirpanis
, '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

[crossgen2] Add --strip-il-bodies option for composite R2R - #125647

Merged
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies
Apr 8, 2026
Merged

[crossgen2] Add --strip-il-bodies option for composite R2R#125647
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Mar 17, 2026

Copy link
Copy Markdown
Member

Description

Add a --strip-il-bodies crossgen2 option that replaces IL method bodies of successfully R2R-compiled methods with minimal stubs (ret) in composite output assemblies. This reduces assembly size for scenarios where IL interpreter fallback is not needed, such as full R2R on iOS/MacCatalyst.

Fixes#124860

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

Adds a --strip-il-bodies crossgen2 option for composite R2R that replaces IL method bodies of successfully compiled methods with minimal ret stubs, reducing output size for scenarios like full R2R on iOS/MacCatalyst.

Changes:

  • New --strip-il-bodies CLI option and corresponding NodeFactoryOptimizationFlags fields
  • Builds a set of compiled method definitions and passes it to component file rewriting
  • In CopiedMethodILNode, replaces IL bodies of non-generic compiled methods with a minimal 2-byte stub

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
Crossgen2RootCommand.csDeclares the --strip-il-bodies CLI option
Program.csWires the option value into nodeFactoryFlags.StripILBodies
ReadyToRunCodegenNodeFactory.csAdds StripILBodies/CompiledMethodDefs fields and BuildCompiledMethodDefsSet()
ReadyToRunCodegenCompilation.csBuilds the compiled methods set and passes it through to RewriteComponentFile
CopiedMethodILNode.csImplements IL body stripping with a minimal ret stub for compiled non-generic methods

You can also share your feedback on Copilot code review. Take the survey.

CopilotAI review requested due to automatic review settings March 18, 2026 13:22

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

Adds a new crossgen2 switch to reduce composite R2R deployment size by stripping IL bodies from rewritten component assemblies when the method was successfully compiled into the composite image.

Changes:

  • Add --strip-il-bodies option wiring from crossgen2 CLI into NodeFactoryOptimizationFlags.
  • Track the set of methods compiled into the composite image and pass it into component-module rewriting.
  • When rewriting component assemblies, replace eligible compiled methods’ IL bodies with a minimal stub body.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csWires the new CLI option into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csIntroduces and registers the --strip-il-bodies command-line option.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds the compiled-method set for composite builds and passes it into component rewriting.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csExtends optimization flags and adds helper to compute the compiled method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csImplements IL-body replacement for eligible methods during component rewrite.

You can also share your feedback on Copilot code review. Take the survey.

Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr crossgen2,runtime-coreclr crossgen2-composite

@azure-pipelines

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

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

The failures shouldn't be related, ready for review

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

Adds a new crossgen2 switch to optionally strip IL bodies from rewritten component assemblies in composite ReadyToRun output, reducing size for scenarios that don’t require IL fallback (notably Apple platforms).

Changes:

  • Add crossgen2 --strip-il-bodies option and plumb it into ReadyToRun node factory optimization flags.
  • During composite “standalone MSIL” rewrite, replace IL bodies for successfully compiled methods with a minimal throwing stub.
  • Wire the option into Microsoft.NET.CrossGen.targets for Apple RIDs via PublishReadyToRunCrossgen2ExtraArgs.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targetsAdds MSBuild logic to append --strip-il-bodies for Apple RIDs based on a property gate.
src/coreclr/tools/aot/crossgen2/Program.csPasses the new StripILBodies flag into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csDefines the new --strip-il-bodies CLI option and help text.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds a compiled-method set and passes it into component rewrite so IL bodies can be stripped.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csAdds optimization flag fields and helper to build the compiled-method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csEmits a stripped stub body for eligible methods instead of copying original IL.

Comment threadsrc/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targets Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos
kotlarmilos requested a review from jkotasMarch 26, 2026 10:20
…yAnalysis/ReadyToRun/CopiedMethodILNode.cs
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 31, 2026 09:33

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

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
CopilotAI review requested due to automatic review settings April 1, 2026 10:44

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

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The native AOT crashes look related, I think this needs an update in ModuleHeaders.h.

Keep ModuleHeaders.h in sync with readytorun.h and ModuleHeaders.cs
after the R2R minor version bump for stripped IL bodies flags.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos merged commit bbe57f3 into dotnet:mainApr 8, 2026
109 of 111 checks passed
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[clr-ios] Strip IL method body in R2R composite for Apple mobile

6 participants

@kotlarmilos@MichalStrehovsky@jkoritzinsky@jkotas@teo-tsirpanis
, '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

[crossgen2] Add --strip-il-bodies option for composite R2R - #125647

Merged
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies
Apr 8, 2026
Merged

[crossgen2] Add --strip-il-bodies option for composite R2R#125647
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Mar 17, 2026

Copy link
Copy Markdown
Member

Description

Add a --strip-il-bodies crossgen2 option that replaces IL method bodies of successfully R2R-compiled methods with minimal stubs (ret) in composite output assemblies. This reduces assembly size for scenarios where IL interpreter fallback is not needed, such as full R2R on iOS/MacCatalyst.

Fixes#124860

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

Adds a --strip-il-bodies crossgen2 option for composite R2R that replaces IL method bodies of successfully compiled methods with minimal ret stubs, reducing output size for scenarios like full R2R on iOS/MacCatalyst.

Changes:

  • New --strip-il-bodies CLI option and corresponding NodeFactoryOptimizationFlags fields
  • Builds a set of compiled method definitions and passes it to component file rewriting
  • In CopiedMethodILNode, replaces IL bodies of non-generic compiled methods with a minimal 2-byte stub

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
Crossgen2RootCommand.csDeclares the --strip-il-bodies CLI option
Program.csWires the option value into nodeFactoryFlags.StripILBodies
ReadyToRunCodegenNodeFactory.csAdds StripILBodies/CompiledMethodDefs fields and BuildCompiledMethodDefsSet()
ReadyToRunCodegenCompilation.csBuilds the compiled methods set and passes it through to RewriteComponentFile
CopiedMethodILNode.csImplements IL body stripping with a minimal ret stub for compiled non-generic methods

You can also share your feedback on Copilot code review. Take the survey.

CopilotAI review requested due to automatic review settings March 18, 2026 13:22

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

Adds a new crossgen2 switch to reduce composite R2R deployment size by stripping IL bodies from rewritten component assemblies when the method was successfully compiled into the composite image.

Changes:

  • Add --strip-il-bodies option wiring from crossgen2 CLI into NodeFactoryOptimizationFlags.
  • Track the set of methods compiled into the composite image and pass it into component-module rewriting.
  • When rewriting component assemblies, replace eligible compiled methods’ IL bodies with a minimal stub body.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csWires the new CLI option into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csIntroduces and registers the --strip-il-bodies command-line option.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds the compiled-method set for composite builds and passes it into component rewriting.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csExtends optimization flags and adds helper to compute the compiled method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csImplements IL-body replacement for eligible methods during component rewrite.

You can also share your feedback on Copilot code review. Take the survey.

Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr crossgen2,runtime-coreclr crossgen2-composite

@azure-pipelines

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

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

The failures shouldn't be related, ready for review

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

Adds a new crossgen2 switch to optionally strip IL bodies from rewritten component assemblies in composite ReadyToRun output, reducing size for scenarios that don’t require IL fallback (notably Apple platforms).

Changes:

  • Add crossgen2 --strip-il-bodies option and plumb it into ReadyToRun node factory optimization flags.
  • During composite “standalone MSIL” rewrite, replace IL bodies for successfully compiled methods with a minimal throwing stub.
  • Wire the option into Microsoft.NET.CrossGen.targets for Apple RIDs via PublishReadyToRunCrossgen2ExtraArgs.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targetsAdds MSBuild logic to append --strip-il-bodies for Apple RIDs based on a property gate.
src/coreclr/tools/aot/crossgen2/Program.csPasses the new StripILBodies flag into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csDefines the new --strip-il-bodies CLI option and help text.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds a compiled-method set and passes it into component rewrite so IL bodies can be stripped.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csAdds optimization flag fields and helper to build the compiled-method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csEmits a stripped stub body for eligible methods instead of copying original IL.

Comment threadsrc/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targets Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos
kotlarmilos requested a review from jkotasMarch 26, 2026 10:20
…yAnalysis/ReadyToRun/CopiedMethodILNode.cs
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 31, 2026 09:33

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

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
CopilotAI review requested due to automatic review settings April 1, 2026 10:44

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

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The native AOT crashes look related, I think this needs an update in ModuleHeaders.h.

Keep ModuleHeaders.h in sync with readytorun.h and ModuleHeaders.cs
after the R2R minor version bump for stripped IL bodies flags.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos merged commit bbe57f3 into dotnet:mainApr 8, 2026
109 of 111 checks passed
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[clr-ios] Strip IL method body in R2R composite for Apple mobile

6 participants

@kotlarmilos@MichalStrehovsky@jkoritzinsky@jkotas@teo-tsirpanis
, '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

[crossgen2] Add --strip-il-bodies option for composite R2R - #125647

Merged
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies
Apr 8, 2026
Merged

[crossgen2] Add --strip-il-bodies option for composite R2R#125647
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Mar 17, 2026

Copy link
Copy Markdown
Member

Description

Add a --strip-il-bodies crossgen2 option that replaces IL method bodies of successfully R2R-compiled methods with minimal stubs (ret) in composite output assemblies. This reduces assembly size for scenarios where IL interpreter fallback is not needed, such as full R2R on iOS/MacCatalyst.

Fixes#124860

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

Adds a --strip-il-bodies crossgen2 option for composite R2R that replaces IL method bodies of successfully compiled methods with minimal ret stubs, reducing output size for scenarios like full R2R on iOS/MacCatalyst.

Changes:

  • New --strip-il-bodies CLI option and corresponding NodeFactoryOptimizationFlags fields
  • Builds a set of compiled method definitions and passes it to component file rewriting
  • In CopiedMethodILNode, replaces IL bodies of non-generic compiled methods with a minimal 2-byte stub

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
Crossgen2RootCommand.csDeclares the --strip-il-bodies CLI option
Program.csWires the option value into nodeFactoryFlags.StripILBodies
ReadyToRunCodegenNodeFactory.csAdds StripILBodies/CompiledMethodDefs fields and BuildCompiledMethodDefsSet()
ReadyToRunCodegenCompilation.csBuilds the compiled methods set and passes it through to RewriteComponentFile
CopiedMethodILNode.csImplements IL body stripping with a minimal ret stub for compiled non-generic methods

You can also share your feedback on Copilot code review. Take the survey.

CopilotAI review requested due to automatic review settings March 18, 2026 13:22

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

Adds a new crossgen2 switch to reduce composite R2R deployment size by stripping IL bodies from rewritten component assemblies when the method was successfully compiled into the composite image.

Changes:

  • Add --strip-il-bodies option wiring from crossgen2 CLI into NodeFactoryOptimizationFlags.
  • Track the set of methods compiled into the composite image and pass it into component-module rewriting.
  • When rewriting component assemblies, replace eligible compiled methods’ IL bodies with a minimal stub body.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csWires the new CLI option into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csIntroduces and registers the --strip-il-bodies command-line option.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds the compiled-method set for composite builds and passes it into component rewriting.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csExtends optimization flags and adds helper to compute the compiled method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csImplements IL-body replacement for eligible methods during component rewrite.

You can also share your feedback on Copilot code review. Take the survey.

Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr crossgen2,runtime-coreclr crossgen2-composite

@azure-pipelines

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

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

The failures shouldn't be related, ready for review

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

Adds a new crossgen2 switch to optionally strip IL bodies from rewritten component assemblies in composite ReadyToRun output, reducing size for scenarios that don’t require IL fallback (notably Apple platforms).

Changes:

  • Add crossgen2 --strip-il-bodies option and plumb it into ReadyToRun node factory optimization flags.
  • During composite “standalone MSIL” rewrite, replace IL bodies for successfully compiled methods with a minimal throwing stub.
  • Wire the option into Microsoft.NET.CrossGen.targets for Apple RIDs via PublishReadyToRunCrossgen2ExtraArgs.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targetsAdds MSBuild logic to append --strip-il-bodies for Apple RIDs based on a property gate.
src/coreclr/tools/aot/crossgen2/Program.csPasses the new StripILBodies flag into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csDefines the new --strip-il-bodies CLI option and help text.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds a compiled-method set and passes it into component rewrite so IL bodies can be stripped.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csAdds optimization flag fields and helper to build the compiled-method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csEmits a stripped stub body for eligible methods instead of copying original IL.

Comment threadsrc/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targets Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos
kotlarmilos requested a review from jkotasMarch 26, 2026 10:20
…yAnalysis/ReadyToRun/CopiedMethodILNode.cs
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 31, 2026 09:33

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

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
CopilotAI review requested due to automatic review settings April 1, 2026 10:44

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

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The native AOT crashes look related, I think this needs an update in ModuleHeaders.h.

Keep ModuleHeaders.h in sync with readytorun.h and ModuleHeaders.cs
after the R2R minor version bump for stripped IL bodies flags.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos merged commit bbe57f3 into dotnet:mainApr 8, 2026
109 of 111 checks passed
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[clr-ios] Strip IL method body in R2R composite for Apple mobile

6 participants

@kotlarmilos@MichalStrehovsky@jkoritzinsky@jkotas@teo-tsirpanis
, '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

[crossgen2] Add --strip-il-bodies option for composite R2R - #125647

Merged
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies
Apr 8, 2026
Merged

[crossgen2] Add --strip-il-bodies option for composite R2R#125647
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Mar 17, 2026

Copy link
Copy Markdown
Member

Description

Add a --strip-il-bodies crossgen2 option that replaces IL method bodies of successfully R2R-compiled methods with minimal stubs (ret) in composite output assemblies. This reduces assembly size for scenarios where IL interpreter fallback is not needed, such as full R2R on iOS/MacCatalyst.

Fixes#124860

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

Adds a --strip-il-bodies crossgen2 option for composite R2R that replaces IL method bodies of successfully compiled methods with minimal ret stubs, reducing output size for scenarios like full R2R on iOS/MacCatalyst.

Changes:

  • New --strip-il-bodies CLI option and corresponding NodeFactoryOptimizationFlags fields
  • Builds a set of compiled method definitions and passes it to component file rewriting
  • In CopiedMethodILNode, replaces IL bodies of non-generic compiled methods with a minimal 2-byte stub

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
Crossgen2RootCommand.csDeclares the --strip-il-bodies CLI option
Program.csWires the option value into nodeFactoryFlags.StripILBodies
ReadyToRunCodegenNodeFactory.csAdds StripILBodies/CompiledMethodDefs fields and BuildCompiledMethodDefsSet()
ReadyToRunCodegenCompilation.csBuilds the compiled methods set and passes it through to RewriteComponentFile
CopiedMethodILNode.csImplements IL body stripping with a minimal ret stub for compiled non-generic methods

You can also share your feedback on Copilot code review. Take the survey.

CopilotAI review requested due to automatic review settings March 18, 2026 13:22

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

Adds a new crossgen2 switch to reduce composite R2R deployment size by stripping IL bodies from rewritten component assemblies when the method was successfully compiled into the composite image.

Changes:

  • Add --strip-il-bodies option wiring from crossgen2 CLI into NodeFactoryOptimizationFlags.
  • Track the set of methods compiled into the composite image and pass it into component-module rewriting.
  • When rewriting component assemblies, replace eligible compiled methods’ IL bodies with a minimal stub body.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csWires the new CLI option into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csIntroduces and registers the --strip-il-bodies command-line option.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds the compiled-method set for composite builds and passes it into component rewriting.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csExtends optimization flags and adds helper to compute the compiled method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csImplements IL-body replacement for eligible methods during component rewrite.

You can also share your feedback on Copilot code review. Take the survey.

Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr crossgen2,runtime-coreclr crossgen2-composite

@azure-pipelines

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

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

The failures shouldn't be related, ready for review

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

Adds a new crossgen2 switch to optionally strip IL bodies from rewritten component assemblies in composite ReadyToRun output, reducing size for scenarios that don’t require IL fallback (notably Apple platforms).

Changes:

  • Add crossgen2 --strip-il-bodies option and plumb it into ReadyToRun node factory optimization flags.
  • During composite “standalone MSIL” rewrite, replace IL bodies for successfully compiled methods with a minimal throwing stub.
  • Wire the option into Microsoft.NET.CrossGen.targets for Apple RIDs via PublishReadyToRunCrossgen2ExtraArgs.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targetsAdds MSBuild logic to append --strip-il-bodies for Apple RIDs based on a property gate.
src/coreclr/tools/aot/crossgen2/Program.csPasses the new StripILBodies flag into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csDefines the new --strip-il-bodies CLI option and help text.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds a compiled-method set and passes it into component rewrite so IL bodies can be stripped.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csAdds optimization flag fields and helper to build the compiled-method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csEmits a stripped stub body for eligible methods instead of copying original IL.

Comment threadsrc/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targets Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos
kotlarmilos requested a review from jkotasMarch 26, 2026 10:20
…yAnalysis/ReadyToRun/CopiedMethodILNode.cs
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 31, 2026 09:33

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

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
CopilotAI review requested due to automatic review settings April 1, 2026 10:44

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

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The native AOT crashes look related, I think this needs an update in ModuleHeaders.h.

Keep ModuleHeaders.h in sync with readytorun.h and ModuleHeaders.cs
after the R2R minor version bump for stripped IL bodies flags.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos merged commit bbe57f3 into dotnet:mainApr 8, 2026
109 of 111 checks passed
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[clr-ios] Strip IL method body in R2R composite for Apple mobile

6 participants

@kotlarmilos@MichalStrehovsky@jkoritzinsky@jkotas@teo-tsirpanis
, '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

[crossgen2] Add --strip-il-bodies option for composite R2R - #125647

Merged
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies
Apr 8, 2026
Merged

[crossgen2] Add --strip-il-bodies option for composite R2R#125647
kotlarmilos merged 10 commits into
dotnet:mainfrom
kotlarmilos:r2r-strip-il-bodies

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Mar 17, 2026

Copy link
Copy Markdown
Member

Description

Add a --strip-il-bodies crossgen2 option that replaces IL method bodies of successfully R2R-compiled methods with minimal stubs (ret) in composite output assemblies. This reduces assembly size for scenarios where IL interpreter fallback is not needed, such as full R2R on iOS/MacCatalyst.

Fixes#124860

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

Adds a --strip-il-bodies crossgen2 option for composite R2R that replaces IL method bodies of successfully compiled methods with minimal ret stubs, reducing output size for scenarios like full R2R on iOS/MacCatalyst.

Changes:

  • New --strip-il-bodies CLI option and corresponding NodeFactoryOptimizationFlags fields
  • Builds a set of compiled method definitions and passes it to component file rewriting
  • In CopiedMethodILNode, replaces IL bodies of non-generic compiled methods with a minimal 2-byte stub

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
Crossgen2RootCommand.csDeclares the --strip-il-bodies CLI option
Program.csWires the option value into nodeFactoryFlags.StripILBodies
ReadyToRunCodegenNodeFactory.csAdds StripILBodies/CompiledMethodDefs fields and BuildCompiledMethodDefsSet()
ReadyToRunCodegenCompilation.csBuilds the compiled methods set and passes it through to RewriteComponentFile
CopiedMethodILNode.csImplements IL body stripping with a minimal ret stub for compiled non-generic methods

You can also share your feedback on Copilot code review. Take the survey.

CopilotAI review requested due to automatic review settings March 18, 2026 13:22

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

Adds a new crossgen2 switch to reduce composite R2R deployment size by stripping IL bodies from rewritten component assemblies when the method was successfully compiled into the composite image.

Changes:

  • Add --strip-il-bodies option wiring from crossgen2 CLI into NodeFactoryOptimizationFlags.
  • Track the set of methods compiled into the composite image and pass it into component-module rewriting.
  • When rewriting component assemblies, replace eligible compiled methods’ IL bodies with a minimal stub body.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csWires the new CLI option into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csIntroduces and registers the --strip-il-bodies command-line option.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds the compiled-method set for composite builds and passes it into component rewriting.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csExtends optimization flags and adds helper to compute the compiled method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csImplements IL-body replacement for eligible methods during component rewrite.

You can also share your feedback on Copilot code review. Take the survey.

Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr crossgen2,runtime-coreclr crossgen2-composite

@azure-pipelines

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

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

The failures shouldn't be related, ready for review

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

Adds a new crossgen2 switch to optionally strip IL bodies from rewritten component assemblies in composite ReadyToRun output, reducing size for scenarios that don’t require IL fallback (notably Apple platforms).

Changes:

  • Add crossgen2 --strip-il-bodies option and plumb it into ReadyToRun node factory optimization flags.
  • During composite “standalone MSIL” rewrite, replace IL bodies for successfully compiled methods with a minimal throwing stub.
  • Wire the option into Microsoft.NET.CrossGen.targets for Apple RIDs via PublishReadyToRunCrossgen2ExtraArgs.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targetsAdds MSBuild logic to append --strip-il-bodies for Apple RIDs based on a property gate.
src/coreclr/tools/aot/crossgen2/Program.csPasses the new StripILBodies flag into NodeFactoryOptimizationFlags.
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csDefines the new --strip-il-bodies CLI option and help text.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.csBuilds a compiled-method set and passes it into component rewrite so IL bodies can be stripped.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.csAdds optimization flag fields and helper to build the compiled-method definition set.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.csEmits a stripped stub body for eligible methods instead of copying original IL.

Comment threadsrc/tasks/Crossgen2Tasks/Microsoft.NET.CrossGen.targets Outdated
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@kotlarmilos
kotlarmilos requested a review from jkotasMarch 26, 2026 10:20
…yAnalysis/ReadyToRun/CopiedMethodILNode.cs
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 31, 2026 09:33

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

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
CopilotAI review requested due to automatic review settings April 1, 2026 10:44

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

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The native AOT crashes look related, I think this needs an update in ModuleHeaders.h.

Keep ModuleHeaders.h in sync with readytorun.h and ModuleHeaders.cs
after the R2R minor version bump for stripped IL bodies flags.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos merged commit bbe57f3 into dotnet:mainApr 8, 2026
109 of 111 checks passed
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kotlarmilos added a commit to kotlarmilos/sdk that referenced this pull request Apr 29, 2026
Mirror the changes from dotnet/runtime#125647.
For Apple mobile RIDs (ios-, tvos-, iossimulator-, tvossimulator-, maccatalyst-),
pass --strip-il-bodies to crossgen2 by default via PublishReadyToRunCrossgen2CompositeExtraArgs
when composite R2R is enabled (PublishReadyToRunComposite=true), controllable via the
PublishReadyToRunStripILBodies MSBuild property. The composite gate is required because
crossgen2 only accepts --strip-il-bodies in composite mode.
This re-applies dotnet#53947 (reverted in dotnet#54135) with the MSB4099 fix: the property assignments
that reference @(PublishReadyToRunPartialAssemblies) and @(PublishReadyToRunCompositeExclusions)
items are placed inside the _PrepareForReadyToRunCompilation target body so the item references
are evaluated at target time rather than at import time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[clr-ios] Strip IL method body in R2R composite for Apple mobile

6 participants

@kotlarmilos@MichalStrehovsky@jkoritzinsky@jkotas@teo-tsirpanis