Cleanup some code under FEATURE_STUBS_AS_IL - #104731

Merged
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il
Sep 19, 2024
Merged

Cleanup some code under FEATURE_STUBS_AS_IL#104731
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il

Conversation

@huoyaoyuan

@huoyaoyuanhuoyaoyuan commented Jul 11, 2024

Copy link
Copy Markdown
Member

There's no actually no IL stubs under this feature switch now, only asm stubs.

This PR addresses the simple cases. On all platforms except Windows x86, single cast delegate is written in invariant assembly code.

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

@ghostghost added the area-VM-coreclr label Jul 11, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jul 11, 2024
@jkotasjkotas changed the title Cleanup some code under FEATURE_STUBS_AS_ALCleanup some code under FEATURE_STUBS_AS_ILJul 12, 2024
Comment threadsrc/coreclr/vm/i386/asmhelpers.asm Outdated
Comment threadsrc/coreclr/vm/jitinterface.h Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Code quality

If this helps with code quality, could you please make the same change in

codeStream.EmitLdArg(0);
codeStream.Emit(ILOpcode.ldfld,emit.NewToken(functionPointerField.InstantiateAsOpen()));
as well? It is naot equivalent of this stub.

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

if(method.OwningType.HasInstantiation)
{
// If the owning type is generic, the signature will contain T's and U's.
// We need !0's and !1's.
TypeDesc[]typesToReplace=newTypeDesc[method.OwningType.Instantiation.Length];
TypeDesc[]replacementTypes=newTypeDesc[typesToReplace.Length];
for(inti=0;i<typesToReplace.Length;i++)
{
typesToReplace[i]=method.OwningType.Instantiation[i];
replacementTypes[i]=context.GetSignatureVariable(i,method:false);
}
TypeDesc[]parameters=newTypeDesc[method.Signature.Length];
for(inti=0;i<parameters.Length;i++)
{
parameters[i]=method.Signature[i].ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
}
TypeDescreturnType=method.Signature.ReturnType.ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
signature=newMethodSignature(signature.Flags,signature.GenericParameterCount,returnType,parameters);
}
Is it also required for coreclr?

@jkotas

jkotas commented Jul 18, 2024

Copy link
Copy Markdown
Member

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

We should not need a special signature instantiation like that in CoreCLR. I suspect that it is related to a special delegate calling convention used for delegate Invocation in some cases. The delegate target cannot be called via pointer - it must be called as Delegate.Invoke method so that the special calling convention kicks in.

Do you know if the Invoke method is used in the DI on a performance critical path?

This is proving to be much harder than what I thought it is going to be.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/method.hpp Outdated
@jkotas

Copy link
Copy Markdown
Member

I have pushed a commit with a small change to handle the new IL stub in stub manager. The manual debugger test from #104731 (comment) works fine now.

@jkotasjkotas left a comment

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.

LGTM. Thank you!

@jkotas

Copy link
Copy Markdown
Member

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

Do you plan to work on cleaning up the remaining code under the feature switch?

@huoyaoyuan
huoyaoyuan deleted the stubs-as-il branch September 19, 2024 16:18
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

Do you plan to work on cleaning up the remaining code under the feature switch?

Aaron suggested me to avoid converting COM interop related code because the effort needed for reviewing. I'm already busy now until October.

If you can confirm the review effort on behalf of interop team, I can start to investigate this when I finish urgent tasks.

@jkotas

Copy link
Copy Markdown
Member

I gave it a shot in #108048.

sirntar pushed a commit to sirntar/runtime that referenced this pull request Sep 30, 2024
* Use direct SinglecastDelegateInvokeStub on windows x86
* Cleanup ifdefs
* EmitDebugBreak is unused
* Use IL stub for Delegate.Invoke
* Remove SinglecastDelegateInvokeStub in asm
* Fix method name and argument count
* Code quality
* Delete JIT_InternalThrow and CorInfoException
* Apply the same codegen to ilc
* Add KeepAlive
* Emit recursive call instead
* Add tests for indirect delegate invocation
* Use public reflection instead.
* Use ldvirtftn to bypass this check
* Use winner from CompareExchange
* Return Stub from GetInvokeMethodStub
* Delete NEWSTUB_FL_MULTICAST and dependents
* Handle new stub in ILStubManager
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@huoyaoyuan@jkotas@mangod9@noahfalk
, '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

Cleanup some code under FEATURE_STUBS_AS_IL - #104731

Merged
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il
Sep 19, 2024
Merged

Cleanup some code under FEATURE_STUBS_AS_IL#104731
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il

Conversation

@huoyaoyuan

@huoyaoyuanhuoyaoyuan commented Jul 11, 2024

Copy link
Copy Markdown
Member

There's no actually no IL stubs under this feature switch now, only asm stubs.

This PR addresses the simple cases. On all platforms except Windows x86, single cast delegate is written in invariant assembly code.

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

@ghostghost added the area-VM-coreclr label Jul 11, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jul 11, 2024
@jkotasjkotas changed the title Cleanup some code under FEATURE_STUBS_AS_ALCleanup some code under FEATURE_STUBS_AS_ILJul 12, 2024
Comment threadsrc/coreclr/vm/i386/asmhelpers.asm Outdated
Comment threadsrc/coreclr/vm/jitinterface.h Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Code quality

If this helps with code quality, could you please make the same change in

codeStream.EmitLdArg(0);
codeStream.Emit(ILOpcode.ldfld,emit.NewToken(functionPointerField.InstantiateAsOpen()));
as well? It is naot equivalent of this stub.

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

if(method.OwningType.HasInstantiation)
{
// If the owning type is generic, the signature will contain T's and U's.
// We need !0's and !1's.
TypeDesc[]typesToReplace=newTypeDesc[method.OwningType.Instantiation.Length];
TypeDesc[]replacementTypes=newTypeDesc[typesToReplace.Length];
for(inti=0;i<typesToReplace.Length;i++)
{
typesToReplace[i]=method.OwningType.Instantiation[i];
replacementTypes[i]=context.GetSignatureVariable(i,method:false);
}
TypeDesc[]parameters=newTypeDesc[method.Signature.Length];
for(inti=0;i<parameters.Length;i++)
{
parameters[i]=method.Signature[i].ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
}
TypeDescreturnType=method.Signature.ReturnType.ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
signature=newMethodSignature(signature.Flags,signature.GenericParameterCount,returnType,parameters);
}
Is it also required for coreclr?

@jkotas

jkotas commented Jul 18, 2024

Copy link
Copy Markdown
Member

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

We should not need a special signature instantiation like that in CoreCLR. I suspect that it is related to a special delegate calling convention used for delegate Invocation in some cases. The delegate target cannot be called via pointer - it must be called as Delegate.Invoke method so that the special calling convention kicks in.

Do you know if the Invoke method is used in the DI on a performance critical path?

This is proving to be much harder than what I thought it is going to be.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/method.hpp Outdated
@jkotas

Copy link
Copy Markdown
Member

I have pushed a commit with a small change to handle the new IL stub in stub manager. The manual debugger test from #104731 (comment) works fine now.

@jkotasjkotas left a comment

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.

LGTM. Thank you!

@jkotas

Copy link
Copy Markdown
Member

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

Do you plan to work on cleaning up the remaining code under the feature switch?

@huoyaoyuan
huoyaoyuan deleted the stubs-as-il branch September 19, 2024 16:18
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

Do you plan to work on cleaning up the remaining code under the feature switch?

Aaron suggested me to avoid converting COM interop related code because the effort needed for reviewing. I'm already busy now until October.

If you can confirm the review effort on behalf of interop team, I can start to investigate this when I finish urgent tasks.

@jkotas

Copy link
Copy Markdown
Member

I gave it a shot in #108048.

sirntar pushed a commit to sirntar/runtime that referenced this pull request Sep 30, 2024
* Use direct SinglecastDelegateInvokeStub on windows x86
* Cleanup ifdefs
* EmitDebugBreak is unused
* Use IL stub for Delegate.Invoke
* Remove SinglecastDelegateInvokeStub in asm
* Fix method name and argument count
* Code quality
* Delete JIT_InternalThrow and CorInfoException
* Apply the same codegen to ilc
* Add KeepAlive
* Emit recursive call instead
* Add tests for indirect delegate invocation
* Use public reflection instead.
* Use ldvirtftn to bypass this check
* Use winner from CompareExchange
* Return Stub from GetInvokeMethodStub
* Delete NEWSTUB_FL_MULTICAST and dependents
* Handle new stub in ILStubManager
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@huoyaoyuan@jkotas@mangod9@noahfalk
, '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

Cleanup some code under FEATURE_STUBS_AS_IL - #104731

Merged
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il
Sep 19, 2024
Merged

Cleanup some code under FEATURE_STUBS_AS_IL#104731
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il

Conversation

@huoyaoyuan

@huoyaoyuanhuoyaoyuan commented Jul 11, 2024

Copy link
Copy Markdown
Member

There's no actually no IL stubs under this feature switch now, only asm stubs.

This PR addresses the simple cases. On all platforms except Windows x86, single cast delegate is written in invariant assembly code.

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

@ghostghost added the area-VM-coreclr label Jul 11, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jul 11, 2024
@jkotasjkotas changed the title Cleanup some code under FEATURE_STUBS_AS_ALCleanup some code under FEATURE_STUBS_AS_ILJul 12, 2024
Comment threadsrc/coreclr/vm/i386/asmhelpers.asm Outdated
Comment threadsrc/coreclr/vm/jitinterface.h Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Code quality

If this helps with code quality, could you please make the same change in

codeStream.EmitLdArg(0);
codeStream.Emit(ILOpcode.ldfld,emit.NewToken(functionPointerField.InstantiateAsOpen()));
as well? It is naot equivalent of this stub.

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

if(method.OwningType.HasInstantiation)
{
// If the owning type is generic, the signature will contain T's and U's.
// We need !0's and !1's.
TypeDesc[]typesToReplace=newTypeDesc[method.OwningType.Instantiation.Length];
TypeDesc[]replacementTypes=newTypeDesc[typesToReplace.Length];
for(inti=0;i<typesToReplace.Length;i++)
{
typesToReplace[i]=method.OwningType.Instantiation[i];
replacementTypes[i]=context.GetSignatureVariable(i,method:false);
}
TypeDesc[]parameters=newTypeDesc[method.Signature.Length];
for(inti=0;i<parameters.Length;i++)
{
parameters[i]=method.Signature[i].ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
}
TypeDescreturnType=method.Signature.ReturnType.ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
signature=newMethodSignature(signature.Flags,signature.GenericParameterCount,returnType,parameters);
}
Is it also required for coreclr?

@jkotas

jkotas commented Jul 18, 2024

Copy link
Copy Markdown
Member

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

We should not need a special signature instantiation like that in CoreCLR. I suspect that it is related to a special delegate calling convention used for delegate Invocation in some cases. The delegate target cannot be called via pointer - it must be called as Delegate.Invoke method so that the special calling convention kicks in.

Do you know if the Invoke method is used in the DI on a performance critical path?

This is proving to be much harder than what I thought it is going to be.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/method.hpp Outdated
@jkotas

Copy link
Copy Markdown
Member

I have pushed a commit with a small change to handle the new IL stub in stub manager. The manual debugger test from #104731 (comment) works fine now.

@jkotasjkotas left a comment

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.

LGTM. Thank you!

@jkotas

Copy link
Copy Markdown
Member

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

Do you plan to work on cleaning up the remaining code under the feature switch?

@huoyaoyuan
huoyaoyuan deleted the stubs-as-il branch September 19, 2024 16:18
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

Do you plan to work on cleaning up the remaining code under the feature switch?

Aaron suggested me to avoid converting COM interop related code because the effort needed for reviewing. I'm already busy now until October.

If you can confirm the review effort on behalf of interop team, I can start to investigate this when I finish urgent tasks.

@jkotas

Copy link
Copy Markdown
Member

I gave it a shot in #108048.

sirntar pushed a commit to sirntar/runtime that referenced this pull request Sep 30, 2024
* Use direct SinglecastDelegateInvokeStub on windows x86
* Cleanup ifdefs
* EmitDebugBreak is unused
* Use IL stub for Delegate.Invoke
* Remove SinglecastDelegateInvokeStub in asm
* Fix method name and argument count
* Code quality
* Delete JIT_InternalThrow and CorInfoException
* Apply the same codegen to ilc
* Add KeepAlive
* Emit recursive call instead
* Add tests for indirect delegate invocation
* Use public reflection instead.
* Use ldvirtftn to bypass this check
* Use winner from CompareExchange
* Return Stub from GetInvokeMethodStub
* Delete NEWSTUB_FL_MULTICAST and dependents
* Handle new stub in ILStubManager
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@huoyaoyuan@jkotas@mangod9@noahfalk
, '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

Cleanup some code under FEATURE_STUBS_AS_IL - #104731

Merged
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il
Sep 19, 2024
Merged

Cleanup some code under FEATURE_STUBS_AS_IL#104731
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il

Conversation

@huoyaoyuan

@huoyaoyuanhuoyaoyuan commented Jul 11, 2024

Copy link
Copy Markdown
Member

There's no actually no IL stubs under this feature switch now, only asm stubs.

This PR addresses the simple cases. On all platforms except Windows x86, single cast delegate is written in invariant assembly code.

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

@ghostghost added the area-VM-coreclr label Jul 11, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jul 11, 2024
@jkotasjkotas changed the title Cleanup some code under FEATURE_STUBS_AS_ALCleanup some code under FEATURE_STUBS_AS_ILJul 12, 2024
Comment threadsrc/coreclr/vm/i386/asmhelpers.asm Outdated
Comment threadsrc/coreclr/vm/jitinterface.h Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Code quality

If this helps with code quality, could you please make the same change in

codeStream.EmitLdArg(0);
codeStream.Emit(ILOpcode.ldfld,emit.NewToken(functionPointerField.InstantiateAsOpen()));
as well? It is naot equivalent of this stub.

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

if(method.OwningType.HasInstantiation)
{
// If the owning type is generic, the signature will contain T's and U's.
// We need !0's and !1's.
TypeDesc[]typesToReplace=newTypeDesc[method.OwningType.Instantiation.Length];
TypeDesc[]replacementTypes=newTypeDesc[typesToReplace.Length];
for(inti=0;i<typesToReplace.Length;i++)
{
typesToReplace[i]=method.OwningType.Instantiation[i];
replacementTypes[i]=context.GetSignatureVariable(i,method:false);
}
TypeDesc[]parameters=newTypeDesc[method.Signature.Length];
for(inti=0;i<parameters.Length;i++)
{
parameters[i]=method.Signature[i].ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
}
TypeDescreturnType=method.Signature.ReturnType.ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
signature=newMethodSignature(signature.Flags,signature.GenericParameterCount,returnType,parameters);
}
Is it also required for coreclr?

@jkotas

jkotas commented Jul 18, 2024

Copy link
Copy Markdown
Member

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

We should not need a special signature instantiation like that in CoreCLR. I suspect that it is related to a special delegate calling convention used for delegate Invocation in some cases. The delegate target cannot be called via pointer - it must be called as Delegate.Invoke method so that the special calling convention kicks in.

Do you know if the Invoke method is used in the DI on a performance critical path?

This is proving to be much harder than what I thought it is going to be.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/method.hpp Outdated
@jkotas

Copy link
Copy Markdown
Member

I have pushed a commit with a small change to handle the new IL stub in stub manager. The manual debugger test from #104731 (comment) works fine now.

@jkotasjkotas left a comment

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.

LGTM. Thank you!

@jkotas

Copy link
Copy Markdown
Member

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

Do you plan to work on cleaning up the remaining code under the feature switch?

@huoyaoyuan
huoyaoyuan deleted the stubs-as-il branch September 19, 2024 16:18
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

Do you plan to work on cleaning up the remaining code under the feature switch?

Aaron suggested me to avoid converting COM interop related code because the effort needed for reviewing. I'm already busy now until October.

If you can confirm the review effort on behalf of interop team, I can start to investigate this when I finish urgent tasks.

@jkotas

Copy link
Copy Markdown
Member

I gave it a shot in #108048.

sirntar pushed a commit to sirntar/runtime that referenced this pull request Sep 30, 2024
* Use direct SinglecastDelegateInvokeStub on windows x86
* Cleanup ifdefs
* EmitDebugBreak is unused
* Use IL stub for Delegate.Invoke
* Remove SinglecastDelegateInvokeStub in asm
* Fix method name and argument count
* Code quality
* Delete JIT_InternalThrow and CorInfoException
* Apply the same codegen to ilc
* Add KeepAlive
* Emit recursive call instead
* Add tests for indirect delegate invocation
* Use public reflection instead.
* Use ldvirtftn to bypass this check
* Use winner from CompareExchange
* Return Stub from GetInvokeMethodStub
* Delete NEWSTUB_FL_MULTICAST and dependents
* Handle new stub in ILStubManager
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@huoyaoyuan@jkotas@mangod9@noahfalk
, '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

Cleanup some code under FEATURE_STUBS_AS_IL - #104731

Merged
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il
Sep 19, 2024
Merged

Cleanup some code under FEATURE_STUBS_AS_IL#104731
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il

Conversation

@huoyaoyuan

@huoyaoyuanhuoyaoyuan commented Jul 11, 2024

Copy link
Copy Markdown
Member

There's no actually no IL stubs under this feature switch now, only asm stubs.

This PR addresses the simple cases. On all platforms except Windows x86, single cast delegate is written in invariant assembly code.

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

@ghostghost added the area-VM-coreclr label Jul 11, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jul 11, 2024
@jkotasjkotas changed the title Cleanup some code under FEATURE_STUBS_AS_ALCleanup some code under FEATURE_STUBS_AS_ILJul 12, 2024
Comment threadsrc/coreclr/vm/i386/asmhelpers.asm Outdated
Comment threadsrc/coreclr/vm/jitinterface.h Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Code quality

If this helps with code quality, could you please make the same change in

codeStream.EmitLdArg(0);
codeStream.Emit(ILOpcode.ldfld,emit.NewToken(functionPointerField.InstantiateAsOpen()));
as well? It is naot equivalent of this stub.

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

if(method.OwningType.HasInstantiation)
{
// If the owning type is generic, the signature will contain T's and U's.
// We need !0's and !1's.
TypeDesc[]typesToReplace=newTypeDesc[method.OwningType.Instantiation.Length];
TypeDesc[]replacementTypes=newTypeDesc[typesToReplace.Length];
for(inti=0;i<typesToReplace.Length;i++)
{
typesToReplace[i]=method.OwningType.Instantiation[i];
replacementTypes[i]=context.GetSignatureVariable(i,method:false);
}
TypeDesc[]parameters=newTypeDesc[method.Signature.Length];
for(inti=0;i<parameters.Length;i++)
{
parameters[i]=method.Signature[i].ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
}
TypeDescreturnType=method.Signature.ReturnType.ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
signature=newMethodSignature(signature.Flags,signature.GenericParameterCount,returnType,parameters);
}
Is it also required for coreclr?

@jkotas

jkotas commented Jul 18, 2024

Copy link
Copy Markdown
Member

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

We should not need a special signature instantiation like that in CoreCLR. I suspect that it is related to a special delegate calling convention used for delegate Invocation in some cases. The delegate target cannot be called via pointer - it must be called as Delegate.Invoke method so that the special calling convention kicks in.

Do you know if the Invoke method is used in the DI on a performance critical path?

This is proving to be much harder than what I thought it is going to be.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/method.hpp Outdated
@jkotas

Copy link
Copy Markdown
Member

I have pushed a commit with a small change to handle the new IL stub in stub manager. The manual debugger test from #104731 (comment) works fine now.

@jkotasjkotas left a comment

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.

LGTM. Thank you!

@jkotas

Copy link
Copy Markdown
Member

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

Do you plan to work on cleaning up the remaining code under the feature switch?

@huoyaoyuan
huoyaoyuan deleted the stubs-as-il branch September 19, 2024 16:18
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

Do you plan to work on cleaning up the remaining code under the feature switch?

Aaron suggested me to avoid converting COM interop related code because the effort needed for reviewing. I'm already busy now until October.

If you can confirm the review effort on behalf of interop team, I can start to investigate this when I finish urgent tasks.

@jkotas

Copy link
Copy Markdown
Member

I gave it a shot in #108048.

sirntar pushed a commit to sirntar/runtime that referenced this pull request Sep 30, 2024
* Use direct SinglecastDelegateInvokeStub on windows x86
* Cleanup ifdefs
* EmitDebugBreak is unused
* Use IL stub for Delegate.Invoke
* Remove SinglecastDelegateInvokeStub in asm
* Fix method name and argument count
* Code quality
* Delete JIT_InternalThrow and CorInfoException
* Apply the same codegen to ilc
* Add KeepAlive
* Emit recursive call instead
* Add tests for indirect delegate invocation
* Use public reflection instead.
* Use ldvirtftn to bypass this check
* Use winner from CompareExchange
* Return Stub from GetInvokeMethodStub
* Delete NEWSTUB_FL_MULTICAST and dependents
* Handle new stub in ILStubManager
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@huoyaoyuan@jkotas@mangod9@noahfalk
, '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

Cleanup some code under FEATURE_STUBS_AS_IL - #104731

Merged
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il
Sep 19, 2024
Merged

Cleanup some code under FEATURE_STUBS_AS_IL#104731
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il

Conversation

@huoyaoyuan

@huoyaoyuanhuoyaoyuan commented Jul 11, 2024

Copy link
Copy Markdown
Member

There's no actually no IL stubs under this feature switch now, only asm stubs.

This PR addresses the simple cases. On all platforms except Windows x86, single cast delegate is written in invariant assembly code.

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

@ghostghost added the area-VM-coreclr label Jul 11, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jul 11, 2024
@jkotasjkotas changed the title Cleanup some code under FEATURE_STUBS_AS_ALCleanup some code under FEATURE_STUBS_AS_ILJul 12, 2024
Comment threadsrc/coreclr/vm/i386/asmhelpers.asm Outdated
Comment threadsrc/coreclr/vm/jitinterface.h Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Code quality

If this helps with code quality, could you please make the same change in

codeStream.EmitLdArg(0);
codeStream.Emit(ILOpcode.ldfld,emit.NewToken(functionPointerField.InstantiateAsOpen()));
as well? It is naot equivalent of this stub.

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

if(method.OwningType.HasInstantiation)
{
// If the owning type is generic, the signature will contain T's and U's.
// We need !0's and !1's.
TypeDesc[]typesToReplace=newTypeDesc[method.OwningType.Instantiation.Length];
TypeDesc[]replacementTypes=newTypeDesc[typesToReplace.Length];
for(inti=0;i<typesToReplace.Length;i++)
{
typesToReplace[i]=method.OwningType.Instantiation[i];
replacementTypes[i]=context.GetSignatureVariable(i,method:false);
}
TypeDesc[]parameters=newTypeDesc[method.Signature.Length];
for(inti=0;i<parameters.Length;i++)
{
parameters[i]=method.Signature[i].ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
}
TypeDescreturnType=method.Signature.ReturnType.ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
signature=newMethodSignature(signature.Flags,signature.GenericParameterCount,returnType,parameters);
}
Is it also required for coreclr?

@jkotas

jkotas commented Jul 18, 2024

Copy link
Copy Markdown
Member

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

We should not need a special signature instantiation like that in CoreCLR. I suspect that it is related to a special delegate calling convention used for delegate Invocation in some cases. The delegate target cannot be called via pointer - it must be called as Delegate.Invoke method so that the special calling convention kicks in.

Do you know if the Invoke method is used in the DI on a performance critical path?

This is proving to be much harder than what I thought it is going to be.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/method.hpp Outdated
@jkotas

Copy link
Copy Markdown
Member

I have pushed a commit with a small change to handle the new IL stub in stub manager. The manual debugger test from #104731 (comment) works fine now.

@jkotasjkotas left a comment

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.

LGTM. Thank you!

@jkotas

Copy link
Copy Markdown
Member

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

Do you plan to work on cleaning up the remaining code under the feature switch?

@huoyaoyuan
huoyaoyuan deleted the stubs-as-il branch September 19, 2024 16:18
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

Do you plan to work on cleaning up the remaining code under the feature switch?

Aaron suggested me to avoid converting COM interop related code because the effort needed for reviewing. I'm already busy now until October.

If you can confirm the review effort on behalf of interop team, I can start to investigate this when I finish urgent tasks.

@jkotas

Copy link
Copy Markdown
Member

I gave it a shot in #108048.

sirntar pushed a commit to sirntar/runtime that referenced this pull request Sep 30, 2024
* Use direct SinglecastDelegateInvokeStub on windows x86
* Cleanup ifdefs
* EmitDebugBreak is unused
* Use IL stub for Delegate.Invoke
* Remove SinglecastDelegateInvokeStub in asm
* Fix method name and argument count
* Code quality
* Delete JIT_InternalThrow and CorInfoException
* Apply the same codegen to ilc
* Add KeepAlive
* Emit recursive call instead
* Add tests for indirect delegate invocation
* Use public reflection instead.
* Use ldvirtftn to bypass this check
* Use winner from CompareExchange
* Return Stub from GetInvokeMethodStub
* Delete NEWSTUB_FL_MULTICAST and dependents
* Handle new stub in ILStubManager
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@huoyaoyuan@jkotas@mangod9@noahfalk
, '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

Cleanup some code under FEATURE_STUBS_AS_IL - #104731

Merged
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il
Sep 19, 2024
Merged

Cleanup some code under FEATURE_STUBS_AS_IL#104731
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il

Conversation

@huoyaoyuan

@huoyaoyuanhuoyaoyuan commented Jul 11, 2024

Copy link
Copy Markdown
Member

There's no actually no IL stubs under this feature switch now, only asm stubs.

This PR addresses the simple cases. On all platforms except Windows x86, single cast delegate is written in invariant assembly code.

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

@ghostghost added the area-VM-coreclr label Jul 11, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jul 11, 2024
@jkotasjkotas changed the title Cleanup some code under FEATURE_STUBS_AS_ALCleanup some code under FEATURE_STUBS_AS_ILJul 12, 2024
Comment threadsrc/coreclr/vm/i386/asmhelpers.asm Outdated
Comment threadsrc/coreclr/vm/jitinterface.h Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Code quality

If this helps with code quality, could you please make the same change in

codeStream.EmitLdArg(0);
codeStream.Emit(ILOpcode.ldfld,emit.NewToken(functionPointerField.InstantiateAsOpen()));
as well? It is naot equivalent of this stub.

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

if(method.OwningType.HasInstantiation)
{
// If the owning type is generic, the signature will contain T's and U's.
// We need !0's and !1's.
TypeDesc[]typesToReplace=newTypeDesc[method.OwningType.Instantiation.Length];
TypeDesc[]replacementTypes=newTypeDesc[typesToReplace.Length];
for(inti=0;i<typesToReplace.Length;i++)
{
typesToReplace[i]=method.OwningType.Instantiation[i];
replacementTypes[i]=context.GetSignatureVariable(i,method:false);
}
TypeDesc[]parameters=newTypeDesc[method.Signature.Length];
for(inti=0;i<parameters.Length;i++)
{
parameters[i]=method.Signature[i].ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
}
TypeDescreturnType=method.Signature.ReturnType.ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
signature=newMethodSignature(signature.Flags,signature.GenericParameterCount,returnType,parameters);
}
Is it also required for coreclr?

@jkotas

jkotas commented Jul 18, 2024

Copy link
Copy Markdown
Member

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

We should not need a special signature instantiation like that in CoreCLR. I suspect that it is related to a special delegate calling convention used for delegate Invocation in some cases. The delegate target cannot be called via pointer - it must be called as Delegate.Invoke method so that the special calling convention kicks in.

Do you know if the Invoke method is used in the DI on a performance critical path?

This is proving to be much harder than what I thought it is going to be.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/method.hpp Outdated
@jkotas

Copy link
Copy Markdown
Member

I have pushed a commit with a small change to handle the new IL stub in stub manager. The manual debugger test from #104731 (comment) works fine now.

@jkotasjkotas left a comment

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.

LGTM. Thank you!

@jkotas

Copy link
Copy Markdown
Member

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

Do you plan to work on cleaning up the remaining code under the feature switch?

@huoyaoyuan
huoyaoyuan deleted the stubs-as-il branch September 19, 2024 16:18
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

Do you plan to work on cleaning up the remaining code under the feature switch?

Aaron suggested me to avoid converting COM interop related code because the effort needed for reviewing. I'm already busy now until October.

If you can confirm the review effort on behalf of interop team, I can start to investigate this when I finish urgent tasks.

@jkotas

Copy link
Copy Markdown
Member

I gave it a shot in #108048.

sirntar pushed a commit to sirntar/runtime that referenced this pull request Sep 30, 2024
* Use direct SinglecastDelegateInvokeStub on windows x86
* Cleanup ifdefs
* EmitDebugBreak is unused
* Use IL stub for Delegate.Invoke
* Remove SinglecastDelegateInvokeStub in asm
* Fix method name and argument count
* Code quality
* Delete JIT_InternalThrow and CorInfoException
* Apply the same codegen to ilc
* Add KeepAlive
* Emit recursive call instead
* Add tests for indirect delegate invocation
* Use public reflection instead.
* Use ldvirtftn to bypass this check
* Use winner from CompareExchange
* Return Stub from GetInvokeMethodStub
* Delete NEWSTUB_FL_MULTICAST and dependents
* Handle new stub in ILStubManager
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@huoyaoyuan@jkotas@mangod9@noahfalk
, '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

Cleanup some code under FEATURE_STUBS_AS_IL - #104731

Merged
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il
Sep 19, 2024
Merged

Cleanup some code under FEATURE_STUBS_AS_IL#104731
jkotas merged 33 commits into
dotnet:mainfrom
huoyaoyuan:stubs-as-il

Conversation

@huoyaoyuan

@huoyaoyuanhuoyaoyuan commented Jul 11, 2024

Copy link
Copy Markdown
Member

There's no actually no IL stubs under this feature switch now, only asm stubs.

This PR addresses the simple cases. On all platforms except Windows x86, single cast delegate is written in invariant assembly code.

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

@ghostghost added the area-VM-coreclr label Jul 11, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jul 11, 2024
@jkotasjkotas changed the title Cleanup some code under FEATURE_STUBS_AS_ALCleanup some code under FEATURE_STUBS_AS_ILJul 12, 2024
Comment threadsrc/coreclr/vm/i386/asmhelpers.asm Outdated
Comment threadsrc/coreclr/vm/jitinterface.h Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
Comment threadsrc/coreclr/vm/stubmgr.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Code quality

If this helps with code quality, could you please make the same change in

codeStream.EmitLdArg(0);
codeStream.Emit(ILOpcode.ldfld,emit.NewToken(functionPointerField.InstantiateAsOpen()));
as well? It is naot equivalent of this stub.

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

if(method.OwningType.HasInstantiation)
{
// If the owning type is generic, the signature will contain T's and U's.
// We need !0's and !1's.
TypeDesc[]typesToReplace=newTypeDesc[method.OwningType.Instantiation.Length];
TypeDesc[]replacementTypes=newTypeDesc[typesToReplace.Length];
for(inti=0;i<typesToReplace.Length;i++)
{
typesToReplace[i]=method.OwningType.Instantiation[i];
replacementTypes[i]=context.GetSignatureVariable(i,method:false);
}
TypeDesc[]parameters=newTypeDesc[method.Signature.Length];
for(inti=0;i<parameters.Length;i++)
{
parameters[i]=method.Signature[i].ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
}
TypeDescreturnType=method.Signature.ReturnType.ReplaceTypesInConstructionOfType(typesToReplace,replacementTypes);
signature=newMethodSignature(signature.Flags,signature.GenericParameterCount,returnType,parameters);
}
Is it also required for coreclr?

@jkotas

jkotas commented Jul 18, 2024

Copy link
Copy Markdown
Member

The same tests in DI are still failing. Can it be related to the signature instantiation in ILC?

We should not need a special signature instantiation like that in CoreCLR. I suspect that it is related to a special delegate calling convention used for delegate Invocation in some cases. The delegate target cannot be called via pointer - it must be called as Delegate.Invoke method so that the special calling convention kicks in.

Do you know if the Invoke method is used in the DI on a performance critical path?

This is proving to be much harder than what I thought it is going to be.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/dllimport.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/stublink.h Outdated
Comment threadsrc/coreclr/vm/method.hpp Outdated
@jkotas

Copy link
Copy Markdown
Member

I have pushed a commit with a small change to handle the new IL stub in stub manager. The manual debugger test from #104731 (comment) works fine now.

@jkotasjkotas left a comment

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.

LGTM. Thank you!

@jkotas

Copy link
Copy Markdown
Member

Remaining code under the feature switch is COM call stub, which is more complicated and is better separated out.

Do you plan to work on cleaning up the remaining code under the feature switch?

@huoyaoyuan
huoyaoyuan deleted the stubs-as-il branch September 19, 2024 16:18
@huoyaoyuan

Copy link
Copy Markdown
MemberAuthor

Do you plan to work on cleaning up the remaining code under the feature switch?

Aaron suggested me to avoid converting COM interop related code because the effort needed for reviewing. I'm already busy now until October.

If you can confirm the review effort on behalf of interop team, I can start to investigate this when I finish urgent tasks.

@jkotas

Copy link
Copy Markdown
Member

I gave it a shot in #108048.

sirntar pushed a commit to sirntar/runtime that referenced this pull request Sep 30, 2024
* Use direct SinglecastDelegateInvokeStub on windows x86
* Cleanup ifdefs
* EmitDebugBreak is unused
* Use IL stub for Delegate.Invoke
* Remove SinglecastDelegateInvokeStub in asm
* Fix method name and argument count
* Code quality
* Delete JIT_InternalThrow and CorInfoException
* Apply the same codegen to ilc
* Add KeepAlive
* Emit recursive call instead
* Add tests for indirect delegate invocation
* Use public reflection instead.
* Use ldvirtftn to bypass this check
* Use winner from CompareExchange
* Return Stub from GetInvokeMethodStub
* Delete NEWSTUB_FL_MULTICAST and dependents
* Handle new stub in ILStubManager
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@huoyaoyuan@jkotas@mangod9@noahfalk