Skip to content

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions - #100379

Closed
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot
Closed

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions#100379
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

Continuation of #99778

@MichalStrehovsky

Copy link
Copy Markdown
Member

If we're removing INPLACE_RUNTIME, we should be sure that this is the layering we actually want, in the theoretical case that we'd need to extract a shared piece (for e.g. sharing between multiple dlls loaded in the same process, etc.). There's a lot more that can/should be ripped out here if that's what we want.

Casting and interface dispatch would probably go to a CoreLib and they would not be part of the runtime anymore.

But exception handling - I don't have much clarity about that.

I've been avoiding touching this so that I don't have to think about this. Some of this code could in theory be compiled into an obj file that is linked into coreclr.dll at some point and then we do need a form of INPLACE_RUNTIME. Similarly for the NAOT scenario I mentioned in the first paragraph.

I'd leave these questions for Jan, I'm sure he already has some thoughts. This is all the thoughts I have around it.

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/RuntimeExports.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Array.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Exception.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated

// They don't cast to any other class
goto fail;
ThrowHelper.ThrowInvalidCastException();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this introducing a frame to this method? This structuring was obviously deliberate and matches ChkCastClassSpecial in the other corelib. What motivates this change?

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment on lines -970 to -972
// Would not be inlined, but still need to mark NoInlining so that it doesn't throw off tail calls
[MethodImpl(MethodImplOptions.NoInlining)]
private static unsafe object ThrowInvalidCastException(MethodTable* pMT)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ThrowHelper.ThrowInvalidCastException looks different (doesn't return object, is not marked noinlining). Are we deoptimizing codegen or are the underlying RyuJIT issues fixed up?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

RyuJIT understands and special cases throw helpers that aren't marked with NoInlining so this should improve the codegen or keep it the same.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I've checked and the codegen is different, the JIT now puts the throw in a cold block at the end of the method instead of a tailcall in the middle. I'd argue it's better since the need for a jump for the exception shouldn't matter much.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 20, 2024
@jkotas

Copy link
Copy Markdown
Member

@MichalPetryka Are you interested in finishing this PR?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka Are you interested in finishing this PR?

I'll get back to it tomorrow.


#if DEBUG && !INPLACE_RUNTIME && NATIVEAOT
private static MethodTable* s_pLowLevelObjectType;
private static void AssertNotRuntimeObject(MethodTable* pClauseType)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This still looks valuable if we expect exception handling would still use some C# code and might end up being shared between all managed runtime instances within a process (for loading-multiple-nativeAOT-dlls-in-the-same-process-and sharing-low-level-runtime case).

I don't know how such layering would look like, so I defer to Jan. The existing INPLACE_LAYERING was known to actually work because it was used like that in .NET Native. I don't know about this new layering.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think that the shared component should be GC and GC support like thread suspension, not much else. Ideally, we would have an option to run in a configuration where a CoreCLR instance and native AOT instances would be able to share one process wide GC instance. Exception handling, casting, interface dispatch should be all private per-runtime. I think that the .NET Native design where these services tried to be in the shared component was problematic.

With this plan, the shared component may still need some managed code that can be stackwalked for good perf, but it should not need to do any allocations or handle exceptions on its own. We would use compiler/linker to enforce that. It means that it should be fine to delete this code.

Comment on lines -473 to -475

fail:
return ThrowInvalidCastException(pTargetType);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

My old comment still stands - this is the existing structuring in the other copy of TypeCast.cs used with JIT.

They should be in sync, so either do the same change there (better to be 100% sure this will not deoptimize codegen) or undo it here.


private static unsafe object IsInstanceOfVariantType(MethodTable* pTargetType, object obj)
{
Debug.Assert(obj is not null);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

These new asserts are not useful. We'll nullref on the subsequent line which is as good as an assert.

Debug.Assert is not low level enough to be callable from casting code. We could end up with reentrancy and then instead of troubleshooting an easy nullref, we need to troubleshoot a stack overflow or something worse.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label Aug 26, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalPetryka@MichalStrehovsky@jkotas@agocke
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions by MichalPetryka · Pull Request #100379 · dotnet/runtime · GitHub
Skip to content

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions - #100379

Closed
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot
Closed

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions#100379
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

Continuation of #99778

@MichalStrehovsky

Copy link
Copy Markdown
Member

If we're removing INPLACE_RUNTIME, we should be sure that this is the layering we actually want, in the theoretical case that we'd need to extract a shared piece (for e.g. sharing between multiple dlls loaded in the same process, etc.). There's a lot more that can/should be ripped out here if that's what we want.

Casting and interface dispatch would probably go to a CoreLib and they would not be part of the runtime anymore.

But exception handling - I don't have much clarity about that.

I've been avoiding touching this so that I don't have to think about this. Some of this code could in theory be compiled into an obj file that is linked into coreclr.dll at some point and then we do need a form of INPLACE_RUNTIME. Similarly for the NAOT scenario I mentioned in the first paragraph.

I'd leave these questions for Jan, I'm sure he already has some thoughts. This is all the thoughts I have around it.

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/RuntimeExports.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Array.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Exception.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated

// They don't cast to any other class
goto fail;
ThrowHelper.ThrowInvalidCastException();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this introducing a frame to this method? This structuring was obviously deliberate and matches ChkCastClassSpecial in the other corelib. What motivates this change?

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment on lines -970 to -972
// Would not be inlined, but still need to mark NoInlining so that it doesn't throw off tail calls
[MethodImpl(MethodImplOptions.NoInlining)]
private static unsafe object ThrowInvalidCastException(MethodTable* pMT)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ThrowHelper.ThrowInvalidCastException looks different (doesn't return object, is not marked noinlining). Are we deoptimizing codegen or are the underlying RyuJIT issues fixed up?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

RyuJIT understands and special cases throw helpers that aren't marked with NoInlining so this should improve the codegen or keep it the same.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I've checked and the codegen is different, the JIT now puts the throw in a cold block at the end of the method instead of a tailcall in the middle. I'd argue it's better since the need for a jump for the exception shouldn't matter much.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 20, 2024
@jkotas

Copy link
Copy Markdown
Member

@MichalPetryka Are you interested in finishing this PR?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka Are you interested in finishing this PR?

I'll get back to it tomorrow.


#if DEBUG && !INPLACE_RUNTIME && NATIVEAOT
private static MethodTable* s_pLowLevelObjectType;
private static void AssertNotRuntimeObject(MethodTable* pClauseType)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This still looks valuable if we expect exception handling would still use some C# code and might end up being shared between all managed runtime instances within a process (for loading-multiple-nativeAOT-dlls-in-the-same-process-and sharing-low-level-runtime case).

I don't know how such layering would look like, so I defer to Jan. The existing INPLACE_LAYERING was known to actually work because it was used like that in .NET Native. I don't know about this new layering.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think that the shared component should be GC and GC support like thread suspension, not much else. Ideally, we would have an option to run in a configuration where a CoreCLR instance and native AOT instances would be able to share one process wide GC instance. Exception handling, casting, interface dispatch should be all private per-runtime. I think that the .NET Native design where these services tried to be in the shared component was problematic.

With this plan, the shared component may still need some managed code that can be stackwalked for good perf, but it should not need to do any allocations or handle exceptions on its own. We would use compiler/linker to enforce that. It means that it should be fine to delete this code.

Comment on lines -473 to -475

fail:
return ThrowInvalidCastException(pTargetType);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

My old comment still stands - this is the existing structuring in the other copy of TypeCast.cs used with JIT.

They should be in sync, so either do the same change there (better to be 100% sure this will not deoptimize codegen) or undo it here.


private static unsafe object IsInstanceOfVariantType(MethodTable* pTargetType, object obj)
{
Debug.Assert(obj is not null);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

These new asserts are not useful. We'll nullref on the subsequent line which is as good as an assert.

Debug.Assert is not low level enough to be callable from casting code. We could end up with reentrancy and then instead of troubleshooting an easy nullref, we need to troubleshoot a stack overflow or something worse.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label Aug 26, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalPetryka@MichalStrehovsky@jkotas@agocke
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions by MichalPetryka · Pull Request #100379 · dotnet/runtime · GitHub
Skip to content

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions - #100379

Closed
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot
Closed

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions#100379
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

Continuation of #99778

@MichalStrehovsky

Copy link
Copy Markdown
Member

If we're removing INPLACE_RUNTIME, we should be sure that this is the layering we actually want, in the theoretical case that we'd need to extract a shared piece (for e.g. sharing between multiple dlls loaded in the same process, etc.). There's a lot more that can/should be ripped out here if that's what we want.

Casting and interface dispatch would probably go to a CoreLib and they would not be part of the runtime anymore.

But exception handling - I don't have much clarity about that.

I've been avoiding touching this so that I don't have to think about this. Some of this code could in theory be compiled into an obj file that is linked into coreclr.dll at some point and then we do need a form of INPLACE_RUNTIME. Similarly for the NAOT scenario I mentioned in the first paragraph.

I'd leave these questions for Jan, I'm sure he already has some thoughts. This is all the thoughts I have around it.

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/RuntimeExports.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Array.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Exception.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated

// They don't cast to any other class
goto fail;
ThrowHelper.ThrowInvalidCastException();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this introducing a frame to this method? This structuring was obviously deliberate and matches ChkCastClassSpecial in the other corelib. What motivates this change?

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment on lines -970 to -972
// Would not be inlined, but still need to mark NoInlining so that it doesn't throw off tail calls
[MethodImpl(MethodImplOptions.NoInlining)]
private static unsafe object ThrowInvalidCastException(MethodTable* pMT)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ThrowHelper.ThrowInvalidCastException looks different (doesn't return object, is not marked noinlining). Are we deoptimizing codegen or are the underlying RyuJIT issues fixed up?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

RyuJIT understands and special cases throw helpers that aren't marked with NoInlining so this should improve the codegen or keep it the same.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I've checked and the codegen is different, the JIT now puts the throw in a cold block at the end of the method instead of a tailcall in the middle. I'd argue it's better since the need for a jump for the exception shouldn't matter much.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 20, 2024
@jkotas

Copy link
Copy Markdown
Member

@MichalPetryka Are you interested in finishing this PR?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka Are you interested in finishing this PR?

I'll get back to it tomorrow.


#if DEBUG && !INPLACE_RUNTIME && NATIVEAOT
private static MethodTable* s_pLowLevelObjectType;
private static void AssertNotRuntimeObject(MethodTable* pClauseType)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This still looks valuable if we expect exception handling would still use some C# code and might end up being shared between all managed runtime instances within a process (for loading-multiple-nativeAOT-dlls-in-the-same-process-and sharing-low-level-runtime case).

I don't know how such layering would look like, so I defer to Jan. The existing INPLACE_LAYERING was known to actually work because it was used like that in .NET Native. I don't know about this new layering.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think that the shared component should be GC and GC support like thread suspension, not much else. Ideally, we would have an option to run in a configuration where a CoreCLR instance and native AOT instances would be able to share one process wide GC instance. Exception handling, casting, interface dispatch should be all private per-runtime. I think that the .NET Native design where these services tried to be in the shared component was problematic.

With this plan, the shared component may still need some managed code that can be stackwalked for good perf, but it should not need to do any allocations or handle exceptions on its own. We would use compiler/linker to enforce that. It means that it should be fine to delete this code.

Comment on lines -473 to -475

fail:
return ThrowInvalidCastException(pTargetType);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

My old comment still stands - this is the existing structuring in the other copy of TypeCast.cs used with JIT.

They should be in sync, so either do the same change there (better to be 100% sure this will not deoptimize codegen) or undo it here.


private static unsafe object IsInstanceOfVariantType(MethodTable* pTargetType, object obj)
{
Debug.Assert(obj is not null);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

These new asserts are not useful. We'll nullref on the subsequent line which is as good as an assert.

Debug.Assert is not low level enough to be callable from casting code. We could end up with reentrancy and then instead of troubleshooting an easy nullref, we need to troubleshoot a stack overflow or something worse.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label Aug 26, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions - #100379

Closed
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot
Closed

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions#100379
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

Continuation of #99778

@MichalStrehovsky

Copy link
Copy Markdown
Member

If we're removing INPLACE_RUNTIME, we should be sure that this is the layering we actually want, in the theoretical case that we'd need to extract a shared piece (for e.g. sharing between multiple dlls loaded in the same process, etc.). There's a lot more that can/should be ripped out here if that's what we want.

Casting and interface dispatch would probably go to a CoreLib and they would not be part of the runtime anymore.

But exception handling - I don't have much clarity about that.

I've been avoiding touching this so that I don't have to think about this. Some of this code could in theory be compiled into an obj file that is linked into coreclr.dll at some point and then we do need a form of INPLACE_RUNTIME. Similarly for the NAOT scenario I mentioned in the first paragraph.

I'd leave these questions for Jan, I'm sure he already has some thoughts. This is all the thoughts I have around it.

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/RuntimeExports.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Array.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Exception.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated

// They don't cast to any other class
goto fail;
ThrowHelper.ThrowInvalidCastException();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this introducing a frame to this method? This structuring was obviously deliberate and matches ChkCastClassSpecial in the other corelib. What motivates this change?

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment on lines -970 to -972
// Would not be inlined, but still need to mark NoInlining so that it doesn't throw off tail calls
[MethodImpl(MethodImplOptions.NoInlining)]
private static unsafe object ThrowInvalidCastException(MethodTable* pMT)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ThrowHelper.ThrowInvalidCastException looks different (doesn't return object, is not marked noinlining). Are we deoptimizing codegen or are the underlying RyuJIT issues fixed up?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

RyuJIT understands and special cases throw helpers that aren't marked with NoInlining so this should improve the codegen or keep it the same.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I've checked and the codegen is different, the JIT now puts the throw in a cold block at the end of the method instead of a tailcall in the middle. I'd argue it's better since the need for a jump for the exception shouldn't matter much.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 20, 2024
@jkotas

Copy link
Copy Markdown
Member

@MichalPetryka Are you interested in finishing this PR?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka Are you interested in finishing this PR?

I'll get back to it tomorrow.


#if DEBUG && !INPLACE_RUNTIME && NATIVEAOT
private static MethodTable* s_pLowLevelObjectType;
private static void AssertNotRuntimeObject(MethodTable* pClauseType)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This still looks valuable if we expect exception handling would still use some C# code and might end up being shared between all managed runtime instances within a process (for loading-multiple-nativeAOT-dlls-in-the-same-process-and sharing-low-level-runtime case).

I don't know how such layering would look like, so I defer to Jan. The existing INPLACE_LAYERING was known to actually work because it was used like that in .NET Native. I don't know about this new layering.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think that the shared component should be GC and GC support like thread suspension, not much else. Ideally, we would have an option to run in a configuration where a CoreCLR instance and native AOT instances would be able to share one process wide GC instance. Exception handling, casting, interface dispatch should be all private per-runtime. I think that the .NET Native design where these services tried to be in the shared component was problematic.

With this plan, the shared component may still need some managed code that can be stackwalked for good perf, but it should not need to do any allocations or handle exceptions on its own. We would use compiler/linker to enforce that. It means that it should be fine to delete this code.

Comment on lines -473 to -475

fail:
return ThrowInvalidCastException(pTargetType);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

My old comment still stands - this is the existing structuring in the other copy of TypeCast.cs used with JIT.

They should be in sync, so either do the same change there (better to be 100% sure this will not deoptimize codegen) or undo it here.


private static unsafe object IsInstanceOfVariantType(MethodTable* pTargetType, object obj)
{
Debug.Assert(obj is not null);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

These new asserts are not useful. We'll nullref on the subsequent line which is as good as an assert.

Debug.Assert is not low level enough to be callable from casting code. We could end up with reentrancy and then instead of troubleshooting an easy nullref, we need to troubleshoot a stack overflow or something worse.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label Aug 26, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions - #100379

Closed
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot
Closed

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions#100379
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

Continuation of #99778

@MichalStrehovsky

Copy link
Copy Markdown
Member

If we're removing INPLACE_RUNTIME, we should be sure that this is the layering we actually want, in the theoretical case that we'd need to extract a shared piece (for e.g. sharing between multiple dlls loaded in the same process, etc.). There's a lot more that can/should be ripped out here if that's what we want.

Casting and interface dispatch would probably go to a CoreLib and they would not be part of the runtime anymore.

But exception handling - I don't have much clarity about that.

I've been avoiding touching this so that I don't have to think about this. Some of this code could in theory be compiled into an obj file that is linked into coreclr.dll at some point and then we do need a form of INPLACE_RUNTIME. Similarly for the NAOT scenario I mentioned in the first paragraph.

I'd leave these questions for Jan, I'm sure he already has some thoughts. This is all the thoughts I have around it.

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/RuntimeExports.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Array.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Exception.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated

// They don't cast to any other class
goto fail;
ThrowHelper.ThrowInvalidCastException();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this introducing a frame to this method? This structuring was obviously deliberate and matches ChkCastClassSpecial in the other corelib. What motivates this change?

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment on lines -970 to -972
// Would not be inlined, but still need to mark NoInlining so that it doesn't throw off tail calls
[MethodImpl(MethodImplOptions.NoInlining)]
private static unsafe object ThrowInvalidCastException(MethodTable* pMT)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ThrowHelper.ThrowInvalidCastException looks different (doesn't return object, is not marked noinlining). Are we deoptimizing codegen or are the underlying RyuJIT issues fixed up?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

RyuJIT understands and special cases throw helpers that aren't marked with NoInlining so this should improve the codegen or keep it the same.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I've checked and the codegen is different, the JIT now puts the throw in a cold block at the end of the method instead of a tailcall in the middle. I'd argue it's better since the need for a jump for the exception shouldn't matter much.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 20, 2024
@jkotas

Copy link
Copy Markdown
Member

@MichalPetryka Are you interested in finishing this PR?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka Are you interested in finishing this PR?

I'll get back to it tomorrow.


#if DEBUG && !INPLACE_RUNTIME && NATIVEAOT
private static MethodTable* s_pLowLevelObjectType;
private static void AssertNotRuntimeObject(MethodTable* pClauseType)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This still looks valuable if we expect exception handling would still use some C# code and might end up being shared between all managed runtime instances within a process (for loading-multiple-nativeAOT-dlls-in-the-same-process-and sharing-low-level-runtime case).

I don't know how such layering would look like, so I defer to Jan. The existing INPLACE_LAYERING was known to actually work because it was used like that in .NET Native. I don't know about this new layering.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think that the shared component should be GC and GC support like thread suspension, not much else. Ideally, we would have an option to run in a configuration where a CoreCLR instance and native AOT instances would be able to share one process wide GC instance. Exception handling, casting, interface dispatch should be all private per-runtime. I think that the .NET Native design where these services tried to be in the shared component was problematic.

With this plan, the shared component may still need some managed code that can be stackwalked for good perf, but it should not need to do any allocations or handle exceptions on its own. We would use compiler/linker to enforce that. It means that it should be fine to delete this code.

Comment on lines -473 to -475

fail:
return ThrowInvalidCastException(pTargetType);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

My old comment still stands - this is the existing structuring in the other copy of TypeCast.cs used with JIT.

They should be in sync, so either do the same change there (better to be 100% sure this will not deoptimize codegen) or undo it here.


private static unsafe object IsInstanceOfVariantType(MethodTable* pTargetType, object obj)
{
Debug.Assert(obj is not null);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

These new asserts are not useful. We'll nullref on the subsequent line which is as good as an assert.

Debug.Assert is not low level enough to be callable from casting code. We could end up with reentrancy and then instead of troubleshooting an easy nullref, we need to troubleshoot a stack overflow or something worse.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label Aug 26, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalPetryka@MichalStrehovsky@jkotas@agocke
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions by MichalPetryka · Pull Request #100379 · dotnet/runtime · GitHub
Skip to content

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions - #100379

Closed
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot
Closed

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions#100379
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

Continuation of #99778

@MichalStrehovsky

Copy link
Copy Markdown
Member

If we're removing INPLACE_RUNTIME, we should be sure that this is the layering we actually want, in the theoretical case that we'd need to extract a shared piece (for e.g. sharing between multiple dlls loaded in the same process, etc.). There's a lot more that can/should be ripped out here if that's what we want.

Casting and interface dispatch would probably go to a CoreLib and they would not be part of the runtime anymore.

But exception handling - I don't have much clarity about that.

I've been avoiding touching this so that I don't have to think about this. Some of this code could in theory be compiled into an obj file that is linked into coreclr.dll at some point and then we do need a form of INPLACE_RUNTIME. Similarly for the NAOT scenario I mentioned in the first paragraph.

I'd leave these questions for Jan, I'm sure he already has some thoughts. This is all the thoughts I have around it.

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/RuntimeExports.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Array.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Exception.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated

// They don't cast to any other class
goto fail;
ThrowHelper.ThrowInvalidCastException();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this introducing a frame to this method? This structuring was obviously deliberate and matches ChkCastClassSpecial in the other corelib. What motivates this change?

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment on lines -970 to -972
// Would not be inlined, but still need to mark NoInlining so that it doesn't throw off tail calls
[MethodImpl(MethodImplOptions.NoInlining)]
private static unsafe object ThrowInvalidCastException(MethodTable* pMT)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ThrowHelper.ThrowInvalidCastException looks different (doesn't return object, is not marked noinlining). Are we deoptimizing codegen or are the underlying RyuJIT issues fixed up?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

RyuJIT understands and special cases throw helpers that aren't marked with NoInlining so this should improve the codegen or keep it the same.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I've checked and the codegen is different, the JIT now puts the throw in a cold block at the end of the method instead of a tailcall in the middle. I'd argue it's better since the need for a jump for the exception shouldn't matter much.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 20, 2024
@jkotas

Copy link
Copy Markdown
Member

@MichalPetryka Are you interested in finishing this PR?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka Are you interested in finishing this PR?

I'll get back to it tomorrow.


#if DEBUG && !INPLACE_RUNTIME && NATIVEAOT
private static MethodTable* s_pLowLevelObjectType;
private static void AssertNotRuntimeObject(MethodTable* pClauseType)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This still looks valuable if we expect exception handling would still use some C# code and might end up being shared between all managed runtime instances within a process (for loading-multiple-nativeAOT-dlls-in-the-same-process-and sharing-low-level-runtime case).

I don't know how such layering would look like, so I defer to Jan. The existing INPLACE_LAYERING was known to actually work because it was used like that in .NET Native. I don't know about this new layering.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think that the shared component should be GC and GC support like thread suspension, not much else. Ideally, we would have an option to run in a configuration where a CoreCLR instance and native AOT instances would be able to share one process wide GC instance. Exception handling, casting, interface dispatch should be all private per-runtime. I think that the .NET Native design where these services tried to be in the shared component was problematic.

With this plan, the shared component may still need some managed code that can be stackwalked for good perf, but it should not need to do any allocations or handle exceptions on its own. We would use compiler/linker to enforce that. It means that it should be fine to delete this code.

Comment on lines -473 to -475

fail:
return ThrowInvalidCastException(pTargetType);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

My old comment still stands - this is the existing structuring in the other copy of TypeCast.cs used with JIT.

They should be in sync, so either do the same change there (better to be 100% sure this will not deoptimize codegen) or undo it here.


private static unsafe object IsInstanceOfVariantType(MethodTable* pTargetType, object obj)
{
Debug.Assert(obj is not null);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

These new asserts are not useful. We'll nullref on the subsequent line which is as good as an assert.

Debug.Assert is not low level enough to be callable from casting code. We could end up with reentrancy and then instead of troubleshooting an easy nullref, we need to troubleshoot a stack overflow or something worse.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label Aug 26, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalPetryka@MichalStrehovsky@jkotas@agocke
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions by MichalPetryka · Pull Request #100379 · dotnet/runtime · GitHub
Skip to content

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions - #100379

Closed
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot
Closed

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions#100379
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

Continuation of #99778

@MichalStrehovsky

Copy link
Copy Markdown
Member

If we're removing INPLACE_RUNTIME, we should be sure that this is the layering we actually want, in the theoretical case that we'd need to extract a shared piece (for e.g. sharing between multiple dlls loaded in the same process, etc.). There's a lot more that can/should be ripped out here if that's what we want.

Casting and interface dispatch would probably go to a CoreLib and they would not be part of the runtime anymore.

But exception handling - I don't have much clarity about that.

I've been avoiding touching this so that I don't have to think about this. Some of this code could in theory be compiled into an obj file that is linked into coreclr.dll at some point and then we do need a form of INPLACE_RUNTIME. Similarly for the NAOT scenario I mentioned in the first paragraph.

I'd leave these questions for Jan, I'm sure he already has some thoughts. This is all the thoughts I have around it.

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/RuntimeExports.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Array.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Exception.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated

// They don't cast to any other class
goto fail;
ThrowHelper.ThrowInvalidCastException();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this introducing a frame to this method? This structuring was obviously deliberate and matches ChkCastClassSpecial in the other corelib. What motivates this change?

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment on lines -970 to -972
// Would not be inlined, but still need to mark NoInlining so that it doesn't throw off tail calls
[MethodImpl(MethodImplOptions.NoInlining)]
private static unsafe object ThrowInvalidCastException(MethodTable* pMT)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ThrowHelper.ThrowInvalidCastException looks different (doesn't return object, is not marked noinlining). Are we deoptimizing codegen or are the underlying RyuJIT issues fixed up?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

RyuJIT understands and special cases throw helpers that aren't marked with NoInlining so this should improve the codegen or keep it the same.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I've checked and the codegen is different, the JIT now puts the throw in a cold block at the end of the method instead of a tailcall in the middle. I'd argue it's better since the need for a jump for the exception shouldn't matter much.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 20, 2024
@jkotas

Copy link
Copy Markdown
Member

@MichalPetryka Are you interested in finishing this PR?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka Are you interested in finishing this PR?

I'll get back to it tomorrow.


#if DEBUG && !INPLACE_RUNTIME && NATIVEAOT
private static MethodTable* s_pLowLevelObjectType;
private static void AssertNotRuntimeObject(MethodTable* pClauseType)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This still looks valuable if we expect exception handling would still use some C# code and might end up being shared between all managed runtime instances within a process (for loading-multiple-nativeAOT-dlls-in-the-same-process-and sharing-low-level-runtime case).

I don't know how such layering would look like, so I defer to Jan. The existing INPLACE_LAYERING was known to actually work because it was used like that in .NET Native. I don't know about this new layering.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think that the shared component should be GC and GC support like thread suspension, not much else. Ideally, we would have an option to run in a configuration where a CoreCLR instance and native AOT instances would be able to share one process wide GC instance. Exception handling, casting, interface dispatch should be all private per-runtime. I think that the .NET Native design where these services tried to be in the shared component was problematic.

With this plan, the shared component may still need some managed code that can be stackwalked for good perf, but it should not need to do any allocations or handle exceptions on its own. We would use compiler/linker to enforce that. It means that it should be fine to delete this code.

Comment on lines -473 to -475

fail:
return ThrowInvalidCastException(pTargetType);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

My old comment still stands - this is the existing structuring in the other copy of TypeCast.cs used with JIT.

They should be in sync, so either do the same change there (better to be 100% sure this will not deoptimize codegen) or undo it here.


private static unsafe object IsInstanceOfVariantType(MethodTable* pTargetType, object obj)
{
Debug.Assert(obj is not null);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

These new asserts are not useful. We'll nullref on the subsequent line which is as good as an assert.

Debug.Assert is not low level enough to be callable from casting code. We could end up with reentrancy and then instead of troubleshooting an easy nullref, we need to troubleshoot a stack overflow or something worse.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label Aug 26, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions - #100379

Closed
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot
Closed

Remove non INPLACE_RUNTIME NativeAOT paths, cleanup exceptions#100379
MichalPetryka wants to merge 6 commits into
dotnet:mainfrom
MichalPetryka:inplace-aot

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

Continuation of #99778

@MichalStrehovsky

Copy link
Copy Markdown
Member

If we're removing INPLACE_RUNTIME, we should be sure that this is the layering we actually want, in the theoretical case that we'd need to extract a shared piece (for e.g. sharing between multiple dlls loaded in the same process, etc.). There's a lot more that can/should be ripped out here if that's what we want.

Casting and interface dispatch would probably go to a CoreLib and they would not be part of the runtime anymore.

But exception handling - I don't have much clarity about that.

I've been avoiding touching this so that I don't have to think about this. Some of this code could in theory be compiled into an obj file that is linked into coreclr.dll at some point and then we do need a form of INPLACE_RUNTIME. Similarly for the NAOT scenario I mentioned in the first paragraph.

I'd leave these questions for Jan, I'm sure he already has some thoughts. This is all the thoughts I have around it.

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/RuntimeExports.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Array.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Exception.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated

// They don't cast to any other class
goto fail;
ThrowHelper.ThrowInvalidCastException();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this introducing a frame to this method? This structuring was obviously deliberate and matches ChkCastClassSpecial in the other corelib. What motivates this change?

Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment threadsrc/coreclr/nativeaot/Runtime.Base/src/System/Runtime/TypeCast.cs Outdated
Comment on lines -970 to -972
// Would not be inlined, but still need to mark NoInlining so that it doesn't throw off tail calls
[MethodImpl(MethodImplOptions.NoInlining)]
private static unsafe object ThrowInvalidCastException(MethodTable* pMT)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ThrowHelper.ThrowInvalidCastException looks different (doesn't return object, is not marked noinlining). Are we deoptimizing codegen or are the underlying RyuJIT issues fixed up?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

RyuJIT understands and special cases throw helpers that aren't marked with NoInlining so this should improve the codegen or keep it the same.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I've checked and the codegen is different, the JIT now puts the throw in a cold block at the end of the method instead of a tailcall in the middle. I'd argue it's better since the need for a jump for the exception shouldn't matter much.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 20, 2024
@jkotas

Copy link
Copy Markdown
Member

@MichalPetryka Are you interested in finishing this PR?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka Are you interested in finishing this PR?

I'll get back to it tomorrow.


#if DEBUG && !INPLACE_RUNTIME && NATIVEAOT
private static MethodTable* s_pLowLevelObjectType;
private static void AssertNotRuntimeObject(MethodTable* pClauseType)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This still looks valuable if we expect exception handling would still use some C# code and might end up being shared between all managed runtime instances within a process (for loading-multiple-nativeAOT-dlls-in-the-same-process-and sharing-low-level-runtime case).

I don't know how such layering would look like, so I defer to Jan. The existing INPLACE_LAYERING was known to actually work because it was used like that in .NET Native. I don't know about this new layering.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think that the shared component should be GC and GC support like thread suspension, not much else. Ideally, we would have an option to run in a configuration where a CoreCLR instance and native AOT instances would be able to share one process wide GC instance. Exception handling, casting, interface dispatch should be all private per-runtime. I think that the .NET Native design where these services tried to be in the shared component was problematic.

With this plan, the shared component may still need some managed code that can be stackwalked for good perf, but it should not need to do any allocations or handle exceptions on its own. We would use compiler/linker to enforce that. It means that it should be fine to delete this code.

Comment on lines -473 to -475

fail:
return ThrowInvalidCastException(pTargetType);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

My old comment still stands - this is the existing structuring in the other copy of TypeCast.cs used with JIT.

They should be in sync, so either do the same change there (better to be 100% sure this will not deoptimize codegen) or undo it here.


private static unsafe object IsInstanceOfVariantType(MethodTable* pTargetType, object obj)
{
Debug.Assert(obj is not null);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

These new asserts are not useful. We'll nullref on the subsequent line which is as good as an assert.

Debug.Assert is not low level enough to be callable from casting code. We could end up with reentrancy and then instead of troubleshooting an easy nullref, we need to troubleshoot a stack overflow or something worse.

@agockeagocke added the needs-author-action An issue or pull request that requires more info or actions from the author. label Aug 26, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalPetryka@MichalStrehovsky@jkotas@agocke